aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.mention-bot4
m---------3rdparty0
-rw-r--r--apps/comments/activity/extension.php11
-rw-r--r--apps/comments/l10n/cs_CZ.js1
-rw-r--r--apps/comments/l10n/cs_CZ.json1
-rw-r--r--apps/comments/l10n/da.js1
-rw-r--r--apps/comments/l10n/da.json1
-rw-r--r--apps/comments/l10n/de.js2
-rw-r--r--apps/comments/l10n/de.json2
-rw-r--r--apps/comments/l10n/de_DE.js2
-rw-r--r--apps/comments/l10n/de_DE.json2
-rw-r--r--apps/comments/l10n/el.js1
-rw-r--r--apps/comments/l10n/el.json1
-rw-r--r--apps/comments/l10n/en_GB.js3
-rw-r--r--apps/comments/l10n/en_GB.json3
-rw-r--r--apps/comments/l10n/eo.js1
-rw-r--r--apps/comments/l10n/eo.json1
-rw-r--r--apps/comments/l10n/es.js1
-rw-r--r--apps/comments/l10n/es.json1
-rw-r--r--apps/comments/l10n/et_EE.js1
-rw-r--r--apps/comments/l10n/et_EE.json1
-rw-r--r--apps/comments/l10n/fi_FI.js2
-rw-r--r--apps/comments/l10n/fi_FI.json2
-rw-r--r--apps/comments/l10n/fr.js1
-rw-r--r--apps/comments/l10n/fr.json1
-rw-r--r--apps/comments/l10n/he.js1
-rw-r--r--apps/comments/l10n/he.json1
-rw-r--r--apps/comments/l10n/hu_HU.js2
-rw-r--r--apps/comments/l10n/hu_HU.json2
-rw-r--r--apps/comments/l10n/id.js1
-rw-r--r--apps/comments/l10n/id.json1
-rw-r--r--apps/comments/l10n/is.js1
-rw-r--r--apps/comments/l10n/is.json1
-rw-r--r--apps/comments/l10n/it.js2
-rw-r--r--apps/comments/l10n/it.json2
-rw-r--r--apps/comments/l10n/ja.js1
-rw-r--r--apps/comments/l10n/ja.json1
-rw-r--r--apps/comments/l10n/ko.js1
-rw-r--r--apps/comments/l10n/ko.json1
-rw-r--r--apps/comments/l10n/nb_NO.js1
-rw-r--r--apps/comments/l10n/nb_NO.json1
-rw-r--r--apps/comments/l10n/nl.js2
-rw-r--r--apps/comments/l10n/nl.json2
-rw-r--r--apps/comments/l10n/pl.js1
-rw-r--r--apps/comments/l10n/pl.json1
-rw-r--r--apps/comments/l10n/pt_BR.js2
-rw-r--r--apps/comments/l10n/pt_BR.json2
-rw-r--r--apps/comments/l10n/pt_PT.js2
-rw-r--r--apps/comments/l10n/pt_PT.json2
-rw-r--r--apps/comments/l10n/ru.js1
-rw-r--r--apps/comments/l10n/ru.json1
-rw-r--r--apps/comments/l10n/sl.js2
-rw-r--r--apps/comments/l10n/sl.json2
-rw-r--r--apps/comments/l10n/sq.js2
-rw-r--r--apps/comments/l10n/sq.json2
-rw-r--r--apps/comments/l10n/sr.js1
-rw-r--r--apps/comments/l10n/sr.json1
-rw-r--r--apps/comments/l10n/sv.js1
-rw-r--r--apps/comments/l10n/sv.json1
-rw-r--r--apps/comments/l10n/th_TH.js8
-rw-r--r--apps/comments/l10n/th_TH.json8
-rw-r--r--apps/comments/l10n/tr.js1
-rw-r--r--apps/comments/l10n/tr.json1
-rw-r--r--apps/comments/l10n/uk.js1
-rw-r--r--apps/comments/l10n/uk.json1
-rw-r--r--apps/comments/l10n/zh_CN.js1
-rw-r--r--apps/comments/l10n/zh_CN.json1
-rw-r--r--apps/comments/l10n/zh_TW.js1
-rw-r--r--apps/comments/l10n/zh_TW.json1
-rw-r--r--apps/dav/appinfo/application.php60
-rw-r--r--apps/dav/appinfo/install.php2
-rw-r--r--apps/dav/appinfo/register_command.php4
-rw-r--r--apps/dav/appinfo/v1/publicwebdav.php5
-rw-r--r--apps/dav/bin/chunkperf.php76
-rw-r--r--apps/dav/command/migrateaddressbooks.php86
-rw-r--r--apps/dav/command/migratecalendars.php85
-rw-r--r--apps/dav/lib/caldav/calendar.php17
-rw-r--r--apps/dav/lib/caldav/calendarhome.php27
-rw-r--r--apps/dav/lib/connector/sabre/file.php2
-rw-r--r--apps/dav/lib/connector/sabre/filesplugin.php42
-rw-r--r--apps/dav/lib/connector/sabre/node.php39
-rw-r--r--apps/dav/lib/connector/sabre/serverfactory.php11
-rw-r--r--apps/dav/lib/hookmanager.php35
-rw-r--r--apps/dav/lib/migration/addressbookadapter.php106
-rw-r--r--apps/dav/lib/migration/calendaradapter.php102
-rw-r--r--apps/dav/lib/migration/migrateaddressbooks.php131
-rw-r--r--apps/dav/lib/migration/migratecalendars.php132
-rw-r--r--apps/dav/lib/rootcollection.php4
-rw-r--r--apps/dav/lib/server.php11
-rw-r--r--apps/dav/lib/upload/assemblystream.php234
-rw-r--r--apps/dav/lib/upload/futurefile.php103
-rw-r--r--apps/dav/lib/upload/rootcollection.php23
-rw-r--r--apps/dav/lib/upload/uploadfolder.php61
-rw-r--r--apps/dav/lib/upload/uploadhome.php74
-rw-r--r--apps/dav/tests/unit/caldav/caldavbackendtest.php15
-rw-r--r--apps/dav/tests/unit/caldav/calendartest.php37
-rw-r--r--apps/dav/tests/unit/connector/publicauth.php7
-rw-r--r--apps/dav/tests/unit/connector/sabre/filesplugin.php92
-rw-r--r--apps/dav/tests/unit/connector/sabre/filesreportplugin.php10
-rw-r--r--apps/dav/tests/unit/connector/sabre/node.php91
-rw-r--r--apps/dav/tests/unit/dav/HookManagerTest.php152
-rw-r--r--apps/dav/tests/unit/migration/addressbookadaptertest.php129
-rw-r--r--apps/dav/tests/unit/migration/calendar_schema.xml191
-rw-r--r--apps/dav/tests/unit/migration/calendaradaptertest.php131
-rw-r--r--apps/dav/tests/unit/migration/contacts_schema.xml151
-rw-r--r--apps/dav/tests/unit/migration/migrateaddressbooktest.php81
-rw-r--r--apps/dav/tests/unit/migration/migratecalendartest.php85
-rw-r--r--apps/dav/tests/unit/upload/assemblystreamtest.php47
-rw-r--r--apps/dav/tests/unit/upload/futurefiletest.php89
-rw-r--r--apps/encryption/appinfo/application.php6
-rw-r--r--apps/encryption/hooks/userhooks.php71
-rw-r--r--apps/encryption/l10n/de.js2
-rw-r--r--apps/encryption/l10n/de.json2
-rw-r--r--apps/encryption/l10n/de_AT.js7
-rw-r--r--apps/encryption/l10n/de_AT.json5
-rw-r--r--apps/encryption/l10n/th_TH.js4
-rw-r--r--apps/encryption/l10n/th_TH.json4
-rw-r--r--apps/encryption/lib/crypto/encryptall.php81
-rw-r--r--apps/encryption/lib/crypto/encryption.php13
-rw-r--r--apps/encryption/lib/keymanager.php26
-rw-r--r--apps/encryption/lib/users/setup.php22
-rw-r--r--apps/encryption/tests/hooks/UserHooksTest.php80
-rw-r--r--apps/encryption/tests/lib/crypto/encryptalltest.php50
-rw-r--r--apps/encryption/tests/lib/users/SetupTest.php59
-rw-r--r--apps/federatedfilesharing/appinfo/app.php6
-rw-r--r--apps/federatedfilesharing/appinfo/application.php88
-rw-r--r--apps/federatedfilesharing/css/3rdparty/gs-share/style.css (renamed from apps/files_sharing/css/3rdparty/gs-share/style.css)0
-rw-r--r--apps/federatedfilesharing/css/settings-personal.css (renamed from apps/files_sharing/css/settings-personal.css)0
-rw-r--r--apps/federatedfilesharing/img/social-diaspora.svg (renamed from apps/files_sharing/img/social-diaspora.svg)0
-rw-r--r--apps/federatedfilesharing/img/social-facebook.svg (renamed from apps/files_sharing/img/social-facebook.svg)0
-rw-r--r--apps/federatedfilesharing/img/social-gnu.svg (renamed from apps/files_sharing/img/social-gnu.svg)0
-rw-r--r--apps/federatedfilesharing/img/social-googleplus.svg (renamed from apps/files_sharing/img/social-googleplus.svg)0
-rw-r--r--apps/federatedfilesharing/img/social-twitter.svg (renamed from apps/files_sharing/img/social-twitter.svg)0
-rw-r--r--apps/federatedfilesharing/js/3rdparty/gs-share/gs-share.js (renamed from apps/files_sharing/js/3rdparty/gs-share/gs-share.js)0
-rw-r--r--apps/federatedfilesharing/js/settings-admin.js (renamed from apps/files_sharing/js/settings-admin.js)0
-rw-r--r--apps/federatedfilesharing/js/settings-personal.js (renamed from apps/files_sharing/js/settings-personal.js)0
-rw-r--r--apps/federatedfilesharing/l10n/az.js9
-rw-r--r--apps/federatedfilesharing/l10n/az.json7
-rw-r--r--apps/federatedfilesharing/l10n/bg_BG.js5
-rw-r--r--apps/federatedfilesharing/l10n/bg_BG.json5
-rw-r--r--apps/federatedfilesharing/l10n/ca.js3
-rw-r--r--apps/federatedfilesharing/l10n/ca.json3
-rw-r--r--apps/federatedfilesharing/l10n/cs_CZ.js14
-rw-r--r--apps/federatedfilesharing/l10n/cs_CZ.json14
-rw-r--r--apps/federatedfilesharing/l10n/da.js14
-rw-r--r--apps/federatedfilesharing/l10n/da.json14
-rw-r--r--apps/federatedfilesharing/l10n/de.js14
-rw-r--r--apps/federatedfilesharing/l10n/de.json14
-rw-r--r--apps/federatedfilesharing/l10n/de_DE.js14
-rw-r--r--apps/federatedfilesharing/l10n/de_DE.json14
-rw-r--r--apps/federatedfilesharing/l10n/el.js14
-rw-r--r--apps/federatedfilesharing/l10n/el.json14
-rw-r--r--apps/federatedfilesharing/l10n/en_GB.js14
-rw-r--r--apps/federatedfilesharing/l10n/en_GB.json14
-rw-r--r--apps/federatedfilesharing/l10n/eo.js12
-rw-r--r--apps/federatedfilesharing/l10n/eo.json12
-rw-r--r--apps/federatedfilesharing/l10n/es.js14
-rw-r--r--apps/federatedfilesharing/l10n/es.json14
-rw-r--r--apps/federatedfilesharing/l10n/et_EE.js9
-rw-r--r--apps/federatedfilesharing/l10n/et_EE.json9
-rw-r--r--apps/federatedfilesharing/l10n/eu.js5
-rw-r--r--apps/federatedfilesharing/l10n/eu.json5
-rw-r--r--apps/federatedfilesharing/l10n/fa.js7
-rw-r--r--apps/federatedfilesharing/l10n/fa.json5
-rw-r--r--apps/federatedfilesharing/l10n/fi_FI.js14
-rw-r--r--apps/federatedfilesharing/l10n/fi_FI.json14
-rw-r--r--apps/federatedfilesharing/l10n/fr.js14
-rw-r--r--apps/federatedfilesharing/l10n/fr.json14
-rw-r--r--apps/federatedfilesharing/l10n/gl.js13
-rw-r--r--apps/federatedfilesharing/l10n/gl.json13
-rw-r--r--apps/federatedfilesharing/l10n/he.js14
-rw-r--r--apps/federatedfilesharing/l10n/he.json14
-rw-r--r--apps/federatedfilesharing/l10n/hu_HU.js14
-rw-r--r--apps/federatedfilesharing/l10n/hu_HU.json14
-rw-r--r--apps/federatedfilesharing/l10n/id.js14
-rw-r--r--apps/federatedfilesharing/l10n/id.json14
-rw-r--r--apps/federatedfilesharing/l10n/is.js14
-rw-r--r--apps/federatedfilesharing/l10n/is.json14
-rw-r--r--apps/federatedfilesharing/l10n/it.js14
-rw-r--r--apps/federatedfilesharing/l10n/it.json14
-rw-r--r--apps/federatedfilesharing/l10n/ja.js14
-rw-r--r--apps/federatedfilesharing/l10n/ja.json14
-rw-r--r--apps/federatedfilesharing/l10n/ko.js14
-rw-r--r--apps/federatedfilesharing/l10n/ko.json14
-rw-r--r--apps/federatedfilesharing/l10n/lb.js6
-rw-r--r--apps/federatedfilesharing/l10n/lb.json4
-rw-r--r--apps/federatedfilesharing/l10n/lt_LT.js17
-rw-r--r--apps/federatedfilesharing/l10n/lt_LT.json15
-rw-r--r--apps/federatedfilesharing/l10n/lv.js9
-rw-r--r--apps/federatedfilesharing/l10n/lv.json7
-rw-r--r--apps/federatedfilesharing/l10n/mk.js13
-rw-r--r--apps/federatedfilesharing/l10n/mk.json11
-rw-r--r--apps/federatedfilesharing/l10n/nb_NO.js14
-rw-r--r--apps/federatedfilesharing/l10n/nb_NO.json14
-rw-r--r--apps/federatedfilesharing/l10n/nl.js14
-rw-r--r--apps/federatedfilesharing/l10n/nl.json14
-rw-r--r--apps/federatedfilesharing/l10n/oc.js14
-rw-r--r--apps/federatedfilesharing/l10n/oc.json14
-rw-r--r--apps/federatedfilesharing/l10n/pl.js4
-rw-r--r--apps/federatedfilesharing/l10n/pl.json4
-rw-r--r--apps/federatedfilesharing/l10n/pt_BR.js14
-rw-r--r--apps/federatedfilesharing/l10n/pt_BR.json14
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.js14
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.json14
-rw-r--r--apps/federatedfilesharing/l10n/ru.js14
-rw-r--r--apps/federatedfilesharing/l10n/ru.json14
-rw-r--r--apps/federatedfilesharing/l10n/sk_SK.js14
-rw-r--r--apps/federatedfilesharing/l10n/sk_SK.json14
-rw-r--r--apps/federatedfilesharing/l10n/sl.js14
-rw-r--r--apps/federatedfilesharing/l10n/sl.json14
-rw-r--r--apps/federatedfilesharing/l10n/sq.js14
-rw-r--r--apps/federatedfilesharing/l10n/sq.json14
-rw-r--r--apps/federatedfilesharing/l10n/sr.js9
-rw-r--r--apps/federatedfilesharing/l10n/sr.json9
-rw-r--r--apps/federatedfilesharing/l10n/sr@latin.js7
-rw-r--r--apps/federatedfilesharing/l10n/sr@latin.json5
-rw-r--r--apps/federatedfilesharing/l10n/sv.js14
-rw-r--r--apps/federatedfilesharing/l10n/sv.json14
-rw-r--r--apps/federatedfilesharing/l10n/th_TH.js14
-rw-r--r--apps/federatedfilesharing/l10n/th_TH.json14
-rw-r--r--apps/federatedfilesharing/l10n/tr.js14
-rw-r--r--apps/federatedfilesharing/l10n/tr.json14
-rw-r--r--apps/federatedfilesharing/l10n/uk.js8
-rw-r--r--apps/federatedfilesharing/l10n/uk.json8
-rw-r--r--apps/federatedfilesharing/l10n/zh_CN.js12
-rw-r--r--apps/federatedfilesharing/l10n/zh_CN.json12
-rw-r--r--apps/federatedfilesharing/l10n/zh_TW.js14
-rw-r--r--apps/federatedfilesharing/l10n/zh_TW.json14
-rw-r--r--apps/federatedfilesharing/lib/federatedshareprovider.php41
-rw-r--r--apps/federatedfilesharing/settings-admin.php (renamed from apps/files_sharing/settings-admin.php)11
-rw-r--r--apps/federatedfilesharing/settings-personal.php (renamed from apps/files_sharing/settings-personal.php)11
-rw-r--r--apps/federatedfilesharing/templates/settings-admin.php (renamed from apps/files_sharing/templates/settings-admin.php)2
-rw-r--r--apps/federatedfilesharing/templates/settings-personal.php (renamed from apps/files_sharing/templates/settings-personal.php)8
-rw-r--r--apps/federatedfilesharing/tests/federatedshareprovidertest.php46
-rw-r--r--apps/federation/l10n/bg_BG.js12
-rw-r--r--apps/federation/l10n/bg_BG.json10
-rw-r--r--apps/federation/l10n/oc.js9
-rw-r--r--apps/federation/l10n/oc.json7
-rw-r--r--apps/federation/l10n/th_TH.js6
-rw-r--r--apps/federation/l10n/th_TH.json6
-rw-r--r--apps/files/appinfo/application.php3
-rw-r--r--apps/files/appinfo/routes.php11
-rw-r--r--apps/files/command/transferownership.php6
-rw-r--r--apps/files/controller/apicontroller.php44
-rw-r--r--apps/files/controller/viewcontroller.php17
-rw-r--r--apps/files/css/files.css5
-rw-r--r--apps/files/js/app.js55
-rw-r--r--apps/files/js/file-upload.js2
-rw-r--r--apps/files/js/filelist.js80
-rw-r--r--apps/files/js/jquery.iframe-transport.js205
-rw-r--r--apps/files/l10n/cs_CZ.js1
-rw-r--r--apps/files/l10n/cs_CZ.json1
-rw-r--r--apps/files/l10n/de.js1
-rw-r--r--apps/files/l10n/de.json1
-rw-r--r--apps/files/l10n/de_AT.js2
-rw-r--r--apps/files/l10n/de_AT.json2
-rw-r--r--apps/files/l10n/de_DE.js1
-rw-r--r--apps/files/l10n/de_DE.json1
-rw-r--r--apps/files/l10n/en_GB.js1
-rw-r--r--apps/files/l10n/en_GB.json1
-rw-r--r--apps/files/l10n/fi_FI.js1
-rw-r--r--apps/files/l10n/fi_FI.json1
-rw-r--r--apps/files/l10n/fr.js1
-rw-r--r--apps/files/l10n/fr.json1
-rw-r--r--apps/files/l10n/hu_HU.js1
-rw-r--r--apps/files/l10n/hu_HU.json1
-rw-r--r--apps/files/l10n/it.js1
-rw-r--r--apps/files/l10n/it.json1
-rw-r--r--apps/files/l10n/nb_NO.js1
-rw-r--r--apps/files/l10n/nb_NO.json1
-rw-r--r--apps/files/l10n/nl.js1
-rw-r--r--apps/files/l10n/nl.json1
-rw-r--r--apps/files/l10n/pt_BR.js1
-rw-r--r--apps/files/l10n/pt_BR.json1
-rw-r--r--apps/files/l10n/pt_PT.js1
-rw-r--r--apps/files/l10n/pt_PT.json1
-rw-r--r--apps/files/l10n/sl.js1
-rw-r--r--apps/files/l10n/sl.json1
-rw-r--r--apps/files/l10n/sq.js1
-rw-r--r--apps/files/l10n/sq.json1
-rw-r--r--apps/files/l10n/th_TH.js1
-rw-r--r--apps/files/l10n/th_TH.json1
-rw-r--r--apps/files/templates/appnavigation.php10
-rw-r--r--apps/files/templates/index.php3
-rw-r--r--apps/files/tests/controller/ViewControllerTest.php24
-rw-r--r--apps/files/tests/controller/apicontrollertest.php69
-rw-r--r--apps/files/tests/js/filelistSpec.js16
-rw-r--r--apps/files_external/appinfo/app.php10
-rw-r--r--apps/files_external/appinfo/routes.php2
-rw-r--r--apps/files_external/l10n/de_AT.js1
-rw-r--r--apps/files_external/l10n/de_AT.json1
-rw-r--r--apps/files_external/l10n/oc.js1
-rw-r--r--apps/files_external/l10n/oc.json1
-rw-r--r--apps/files_external/l10n/sl.js2
-rw-r--r--apps/files_external/l10n/sl.json2
-rw-r--r--apps/files_external/l10n/th_TH.js7
-rw-r--r--apps/files_external/l10n/th_TH.json7
-rw-r--r--apps/files_external/lib/api.php2
-rw-r--r--apps/files_external/lib/backend/amazons3.php2
-rw-r--r--apps/files_external/lib/backend/dropbox.php2
-rw-r--r--apps/files_external/lib/backend/ftp.php2
-rw-r--r--apps/files_external/lib/backend/google.php2
-rw-r--r--apps/files_external/lib/backend/owncloud.php2
-rw-r--r--apps/files_external/lib/backend/sftp.php2
-rw-r--r--apps/files_external/lib/backend/sftp_key.php2
-rw-r--r--apps/files_external/lib/backend/smb.php2
-rw-r--r--apps/files_external/lib/backend/smb_oc.php2
-rw-r--r--apps/files_external/lib/backend/swift.php2
-rw-r--r--apps/files_external/lib/storage/amazons3.php (renamed from apps/files_external/lib/amazons3.php)2
-rw-r--r--apps/files_external/lib/storage/dropbox.php (renamed from apps/files_external/lib/dropbox.php)6
-rw-r--r--apps/files_external/lib/storage/ftp.php (renamed from apps/files_external/lib/ftp.php)6
-rw-r--r--apps/files_external/lib/storage/google.php (renamed from apps/files_external/lib/google.php)4
-rw-r--r--apps/files_external/lib/storage/owncloud.php (renamed from apps/files_external/lib/owncloud.php)2
-rw-r--r--apps/files_external/lib/storage/sftp.php (renamed from apps/files_external/lib/sftp.php)2
-rw-r--r--apps/files_external/lib/storage/smb.php (renamed from apps/files_external/lib/smb.php)4
-rw-r--r--apps/files_external/lib/storage/streamwrapper.php (renamed from apps/files_external/lib/streamwrapper.php)4
-rw-r--r--apps/files_external/lib/storage/swift.php (renamed from apps/files_external/lib/swift.php)2
-rw-r--r--apps/files_external/service/dbconfigservice.php13
-rw-r--r--apps/files_external/tests/amazons3migration.php10
-rw-r--r--apps/files_external/tests/controller/storagescontrollertest.php14
-rw-r--r--apps/files_external/tests/controller/userstoragescontrollertest.php4
-rw-r--r--apps/files_external/tests/owncloudfunctions.php6
-rw-r--r--apps/files_external/tests/service/dbconfigservicetest.php11
-rw-r--r--apps/files_external/tests/service/storagesservicetest.php6
-rw-r--r--apps/files_external/tests/storage/amazons3test.php (renamed from apps/files_external/tests/backends/amazons3.php)12
-rw-r--r--apps/files_external/tests/storage/dropboxtest.php (renamed from apps/files_external/tests/backends/dropbox.php)12
-rw-r--r--apps/files_external/tests/storage/ftptest.php (renamed from apps/files_external/tests/backends/ftp.php)26
-rw-r--r--apps/files_external/tests/storage/googletest.php (renamed from apps/files_external/tests/backends/google.php)12
-rw-r--r--apps/files_external/tests/storage/owncloudtest.php (renamed from apps/files_external/tests/backends/owncloud.php)12
-rw-r--r--apps/files_external/tests/storage/sftp_keytest.php (renamed from apps/files_external/tests/backends/sftp_key.php)12
-rw-r--r--apps/files_external/tests/storage/sftptest.php (renamed from apps/files_external/tests/backends/sftp.php)16
-rw-r--r--apps/files_external/tests/storage/smbtest.php (renamed from apps/files_external/tests/backends/smb.php)14
-rw-r--r--apps/files_external/tests/storage/swifttest.php (renamed from apps/files_external/tests/backends/swift.php)12
-rw-r--r--apps/files_external/tests/storage/webdavtest.php (renamed from apps/files_external/tests/backends/webdav.php)12
-rw-r--r--apps/files_sharing/ajax/external.php5
-rw-r--r--apps/files_sharing/ajax/shareinfo.php25
-rw-r--r--apps/files_sharing/api/ocssharewrapper.php4
-rw-r--r--apps/files_sharing/api/server2server.php18
-rw-r--r--apps/files_sharing/api/share20ocs.php63
-rw-r--r--apps/files_sharing/appinfo/app.php3
-rw-r--r--apps/files_sharing/appinfo/application.php7
-rw-r--r--apps/files_sharing/js/app.js9
-rw-r--r--apps/files_sharing/js/share.js2
-rw-r--r--apps/files_sharing/l10n/az.js6
-rw-r--r--apps/files_sharing/l10n/az.json6
-rw-r--r--apps/files_sharing/l10n/bg_BG.js4
-rw-r--r--apps/files_sharing/l10n/bg_BG.json4
-rw-r--r--apps/files_sharing/l10n/ca.js3
-rw-r--r--apps/files_sharing/l10n/ca.json3
-rw-r--r--apps/files_sharing/l10n/cs_CZ.js14
-rw-r--r--apps/files_sharing/l10n/cs_CZ.json14
-rw-r--r--apps/files_sharing/l10n/da.js14
-rw-r--r--apps/files_sharing/l10n/da.json14
-rw-r--r--apps/files_sharing/l10n/de.js14
-rw-r--r--apps/files_sharing/l10n/de.json14
-rw-r--r--apps/files_sharing/l10n/de_AT.js1
-rw-r--r--apps/files_sharing/l10n/de_AT.json1
-rw-r--r--apps/files_sharing/l10n/de_DE.js14
-rw-r--r--apps/files_sharing/l10n/de_DE.json14
-rw-r--r--apps/files_sharing/l10n/el.js14
-rw-r--r--apps/files_sharing/l10n/el.json14
-rw-r--r--apps/files_sharing/l10n/en_GB.js14
-rw-r--r--apps/files_sharing/l10n/en_GB.json14
-rw-r--r--apps/files_sharing/l10n/eo.js12
-rw-r--r--apps/files_sharing/l10n/eo.json12
-rw-r--r--apps/files_sharing/l10n/es.js14
-rw-r--r--apps/files_sharing/l10n/es.json14
-rw-r--r--apps/files_sharing/l10n/et_EE.js9
-rw-r--r--apps/files_sharing/l10n/et_EE.json9
-rw-r--r--apps/files_sharing/l10n/eu.js5
-rw-r--r--apps/files_sharing/l10n/eu.json5
-rw-r--r--apps/files_sharing/l10n/fa.js4
-rw-r--r--apps/files_sharing/l10n/fa.json4
-rw-r--r--apps/files_sharing/l10n/fi_FI.js14
-rw-r--r--apps/files_sharing/l10n/fi_FI.json14
-rw-r--r--apps/files_sharing/l10n/fr.js14
-rw-r--r--apps/files_sharing/l10n/fr.json14
-rw-r--r--apps/files_sharing/l10n/gl.js13
-rw-r--r--apps/files_sharing/l10n/gl.json13
-rw-r--r--apps/files_sharing/l10n/he.js14
-rw-r--r--apps/files_sharing/l10n/he.json14
-rw-r--r--apps/files_sharing/l10n/hu_HU.js14
-rw-r--r--apps/files_sharing/l10n/hu_HU.json14
-rw-r--r--apps/files_sharing/l10n/id.js14
-rw-r--r--apps/files_sharing/l10n/id.json14
-rw-r--r--apps/files_sharing/l10n/is.js14
-rw-r--r--apps/files_sharing/l10n/is.json14
-rw-r--r--apps/files_sharing/l10n/it.js14
-rw-r--r--apps/files_sharing/l10n/it.json14
-rw-r--r--apps/files_sharing/l10n/ja.js14
-rw-r--r--apps/files_sharing/l10n/ja.json14
-rw-r--r--apps/files_sharing/l10n/ko.js14
-rw-r--r--apps/files_sharing/l10n/ko.json14
-rw-r--r--apps/files_sharing/l10n/lb.js3
-rw-r--r--apps/files_sharing/l10n/lb.json3
-rw-r--r--apps/files_sharing/l10n/lt_LT.js14
-rw-r--r--apps/files_sharing/l10n/lt_LT.json14
-rw-r--r--apps/files_sharing/l10n/lv.js6
-rw-r--r--apps/files_sharing/l10n/lv.json6
-rw-r--r--apps/files_sharing/l10n/mk.js10
-rw-r--r--apps/files_sharing/l10n/mk.json10
-rw-r--r--apps/files_sharing/l10n/nb_NO.js14
-rw-r--r--apps/files_sharing/l10n/nb_NO.json14
-rw-r--r--apps/files_sharing/l10n/nl.js14
-rw-r--r--apps/files_sharing/l10n/nl.json14
-rw-r--r--apps/files_sharing/l10n/oc.js14
-rw-r--r--apps/files_sharing/l10n/oc.json14
-rw-r--r--apps/files_sharing/l10n/pl.js4
-rw-r--r--apps/files_sharing/l10n/pl.json4
-rw-r--r--apps/files_sharing/l10n/pt_BR.js14
-rw-r--r--apps/files_sharing/l10n/pt_BR.json14
-rw-r--r--apps/files_sharing/l10n/pt_PT.js14
-rw-r--r--apps/files_sharing/l10n/pt_PT.json14
-rw-r--r--apps/files_sharing/l10n/ru.js14
-rw-r--r--apps/files_sharing/l10n/ru.json14
-rw-r--r--apps/files_sharing/l10n/sk_SK.js14
-rw-r--r--apps/files_sharing/l10n/sk_SK.json14
-rw-r--r--apps/files_sharing/l10n/sl.js19
-rw-r--r--apps/files_sharing/l10n/sl.json19
-rw-r--r--apps/files_sharing/l10n/sq.js14
-rw-r--r--apps/files_sharing/l10n/sq.json14
-rw-r--r--apps/files_sharing/l10n/sr.js9
-rw-r--r--apps/files_sharing/l10n/sr.json9
-rw-r--r--apps/files_sharing/l10n/sr@latin.js4
-rw-r--r--apps/files_sharing/l10n/sr@latin.json4
-rw-r--r--apps/files_sharing/l10n/sv.js14
-rw-r--r--apps/files_sharing/l10n/sv.json14
-rw-r--r--apps/files_sharing/l10n/th_TH.js52
-rw-r--r--apps/files_sharing/l10n/th_TH.json52
-rw-r--r--apps/files_sharing/l10n/tr.js14
-rw-r--r--apps/files_sharing/l10n/tr.json14
-rw-r--r--apps/files_sharing/l10n/uk.js8
-rw-r--r--apps/files_sharing/l10n/uk.json8
-rw-r--r--apps/files_sharing/l10n/zh_CN.js12
-rw-r--r--apps/files_sharing/l10n/zh_CN.json12
-rw-r--r--apps/files_sharing/l10n/zh_TW.js14
-rw-r--r--apps/files_sharing/l10n/zh_TW.json14
-rw-r--r--apps/files_sharing/lib/controllers/sharecontroller.php10
-rw-r--r--apps/files_sharing/lib/external/manager.php2
-rw-r--r--apps/files_sharing/lib/external/storage.php16
-rw-r--r--apps/files_sharing/lib/helper.php20
-rw-r--r--apps/files_sharing/lib/mountprovider.php40
-rw-r--r--apps/files_sharing/lib/scanner.php6
-rw-r--r--apps/files_sharing/lib/share/file.php16
-rw-r--r--apps/files_sharing/lib/sharedmount.php116
-rw-r--r--apps/files_sharing/lib/sharedpropagator.php4
-rw-r--r--apps/files_sharing/lib/sharedstorage.php454
-rw-r--r--apps/files_sharing/lib/updater.php17
-rw-r--r--apps/files_sharing/templates/public.php1
-rw-r--r--apps/files_sharing/tests/api.php61
-rw-r--r--apps/files_sharing/tests/api/share20ocstest.php75
-rw-r--r--apps/files_sharing/tests/cache.php103
-rw-r--r--apps/files_sharing/tests/controller/sharecontroller.php12
-rw-r--r--apps/files_sharing/tests/encryptedsizepropagation.php41
-rw-r--r--apps/files_sharing/tests/etagpropagation.php148
-rw-r--r--apps/files_sharing/tests/groupetagpropagation.php30
-rw-r--r--apps/files_sharing/tests/locking.php8
-rw-r--r--apps/files_sharing/tests/permissions.php63
-rw-r--r--apps/files_sharing/tests/server2server.php11
-rw-r--r--apps/files_sharing/tests/share.php383
-rw-r--r--apps/files_sharing/tests/sharedmount.php194
-rw-r--r--apps/files_sharing/tests/sharedstorage.php226
-rw-r--r--apps/files_sharing/tests/sizepropagation.php61
-rw-r--r--apps/files_sharing/tests/testcase.php33
-rw-r--r--apps/files_sharing/tests/unsharechildren.php17
-rw-r--r--apps/files_sharing/tests/updater.php36
-rw-r--r--apps/files_sharing/tests/watcher.php34
-rw-r--r--apps/files_trashbin/js/app.js3
-rw-r--r--apps/files_trashbin/l10n/de_AT.js3
-rw-r--r--apps/files_trashbin/l10n/de_AT.json3
-rw-r--r--apps/files_trashbin/lib/backgroundjob/expiretrash.php51
-rw-r--r--apps/files_trashbin/tests/backgroundjob/expiretrash.php1
-rw-r--r--apps/files_trashbin/tests/storage.php22
-rw-r--r--apps/files_trashbin/tests/trashbin.php11
-rw-r--r--apps/files_versions/l10n/th_TH.js2
-rw-r--r--apps/files_versions/l10n/th_TH.json2
-rw-r--r--apps/files_versions/lib/backgroundjob/expireversions.php28
-rw-r--r--apps/files_versions/lib/storage.php1
-rw-r--r--apps/files_versions/tests/versions.php85
-rw-r--r--apps/systemtags/activity/extension.php35
-rw-r--r--apps/systemtags/js/app.js3
-rw-r--r--apps/systemtags/l10n/de.js1
-rw-r--r--apps/systemtags/l10n/de.json1
-rw-r--r--apps/systemtags/l10n/de_AT.js6
-rw-r--r--apps/systemtags/l10n/de_AT.json4
-rw-r--r--apps/systemtags/l10n/de_DE.js7
-rw-r--r--apps/systemtags/l10n/de_DE.json7
-rw-r--r--apps/systemtags/l10n/hu_HU.js7
-rw-r--r--apps/systemtags/l10n/hu_HU.json7
-rw-r--r--apps/systemtags/l10n/it.js7
-rw-r--r--apps/systemtags/l10n/it.json7
-rw-r--r--apps/systemtags/l10n/oc.js1
-rw-r--r--apps/systemtags/l10n/oc.json1
-rw-r--r--apps/systemtags/l10n/pt_BR.js7
-rw-r--r--apps/systemtags/l10n/pt_BR.json7
-rw-r--r--apps/systemtags/l10n/sq.js7
-rw-r--r--apps/systemtags/l10n/sq.json7
-rw-r--r--apps/systemtags/l10n/th_TH.js7
-rw-r--r--apps/systemtags/l10n/th_TH.json7
-rw-r--r--apps/updatenotification/appinfo/app.php7
-rw-r--r--apps/updatenotification/appinfo/application.php7
-rw-r--r--apps/updatenotification/l10n/oc.js1
-rw-r--r--apps/updatenotification/l10n/oc.json1
-rw-r--r--apps/updatenotification/l10n/th_TH.js8
-rw-r--r--apps/updatenotification/l10n/th_TH.json8
-rw-r--r--apps/updatenotification/lib/updatechecker.php8
-rw-r--r--apps/updatenotification/tests/UpdateCheckerTest.php2
-rw-r--r--apps/user_ldap/group_ldap.php32
-rw-r--r--apps/user_ldap/js/wizard/view.js11
-rw-r--r--apps/user_ldap/js/wizard/wizardTabGeneric.js2
-rw-r--r--apps/user_ldap/l10n/cs_CZ.js1
-rw-r--r--apps/user_ldap/l10n/cs_CZ.json1
-rw-r--r--apps/user_ldap/l10n/de.js1
-rw-r--r--apps/user_ldap/l10n/de.json1
-rw-r--r--apps/user_ldap/l10n/de_AT.js1
-rw-r--r--apps/user_ldap/l10n/de_AT.json1
-rw-r--r--apps/user_ldap/l10n/de_DE.js1
-rw-r--r--apps/user_ldap/l10n/de_DE.json1
-rw-r--r--apps/user_ldap/l10n/fr.js1
-rw-r--r--apps/user_ldap/l10n/fr.json1
-rw-r--r--apps/user_ldap/l10n/it.js1
-rw-r--r--apps/user_ldap/l10n/it.json1
-rw-r--r--apps/user_ldap/l10n/pt_BR.js1
-rw-r--r--apps/user_ldap/l10n/pt_BR.json1
-rw-r--r--apps/user_ldap/l10n/sl.js5
-rw-r--r--apps/user_ldap/l10n/sl.json5
-rw-r--r--apps/user_ldap/l10n/sq.js1
-rw-r--r--apps/user_ldap/l10n/sq.json1
-rw-r--r--apps/user_ldap/l10n/th_TH.js3
-rw-r--r--apps/user_ldap/l10n/th_TH.json3
-rw-r--r--apps/user_ldap/lib/access.php14
-rw-r--r--apps/user_ldap/lib/configuration.php3
-rw-r--r--apps/user_ldap/lib/connection.php34
-rw-r--r--apps/user_ldap/lib/user/user.php5
-rw-r--r--apps/user_ldap/lib/wizard.php2
-rw-r--r--apps/user_ldap/tests/group_ldap.php4
-rw-r--r--apps/user_ldap/tests/mapping/abstractmappingtest.php2
-rw-r--r--apps/user_ldap/user_ldap.php10
-rwxr-xr-xautotest-external.sh9
-rw-r--r--bower.json4
-rw-r--r--build/integration/features/bootstrap/WebDav.php51
-rw-r--r--build/integration/features/sharing-v1.feature66
-rw-r--r--build/integration/features/webdav-related.feature49
-rw-r--r--config/config.sample.php44
-rw-r--r--console.php13
-rw-r--r--core/Application.php15
-rw-r--r--core/Command/App/CheckCode.php18
-rw-r--r--core/Command/Maintenance/DataFingerprint.php53
-rw-r--r--core/Command/Maintenance/Repair.php28
-rw-r--r--core/Command/Upgrade.php1
-rw-r--r--core/Controller/LoginController.php160
-rw-r--r--core/ajax/update.php9
-rw-r--r--core/css/apps.css4
-rw-r--r--core/css/fonts.css6
-rw-r--r--core/css/header.css8
-rw-r--r--core/css/inputs.css3
-rw-r--r--core/css/jquery-ui-fixes.css28
-rw-r--r--core/css/mobile.css18
-rw-r--r--core/css/styles.css35
-rw-r--r--core/img/background.jpgbin0 -> 90185 bytes
-rw-r--r--core/js/core.json3
-rw-r--r--core/js/js.js49
-rw-r--r--core/js/lostpassword.js4
-rw-r--r--core/js/multiselect.js6
-rw-r--r--core/js/placeholder.js8
-rw-r--r--core/js/setupchecks.js2
-rw-r--r--core/js/sharedialoglinkshareview.js69
-rw-r--r--core/js/sharedialogmailview.js176
-rw-r--r--core/js/sharedialogshareelistview.js22
-rw-r--r--core/js/sharedialogview.js10
-rw-r--r--core/js/shareitemmodel.js32
-rw-r--r--core/js/tests/specs/coreSpec.js25
-rw-r--r--core/js/tests/specs/setupchecksSpec.js8
-rw-r--r--core/l10n/af_ZA.js4
-rw-r--r--core/l10n/af_ZA.json4
-rw-r--r--core/l10n/ar.js4
-rw-r--r--core/l10n/ar.json4
-rw-r--r--core/l10n/ast.js4
-rw-r--r--core/l10n/ast.json4
-rw-r--r--core/l10n/az.js2
-rw-r--r--core/l10n/az.json2
-rw-r--r--core/l10n/bg_BG.js4
-rw-r--r--core/l10n/bg_BG.json4
-rw-r--r--core/l10n/bn_BD.js4
-rw-r--r--core/l10n/bn_BD.json4
-rw-r--r--core/l10n/bs.js4
-rw-r--r--core/l10n/bs.json4
-rw-r--r--core/l10n/ca.js4
-rw-r--r--core/l10n/ca.json4
-rw-r--r--core/l10n/cs_CZ.js10
-rw-r--r--core/l10n/cs_CZ.json10
-rw-r--r--core/l10n/cy_GB.js4
-rw-r--r--core/l10n/cy_GB.json4
-rw-r--r--core/l10n/da.js4
-rw-r--r--core/l10n/da.json4
-rw-r--r--core/l10n/de.js10
-rw-r--r--core/l10n/de.json10
-rw-r--r--core/l10n/de_AT.js260
-rw-r--r--core/l10n/de_AT.json260
-rw-r--r--core/l10n/de_DE.js12
-rw-r--r--core/l10n/de_DE.json12
-rw-r--r--core/l10n/el.js4
-rw-r--r--core/l10n/el.json4
-rw-r--r--core/l10n/en_GB.js4
-rw-r--r--core/l10n/en_GB.json4
-rw-r--r--core/l10n/eo.js4
-rw-r--r--core/l10n/eo.json4
-rw-r--r--core/l10n/es.js4
-rw-r--r--core/l10n/es.json4
-rw-r--r--core/l10n/es_AR.js4
-rw-r--r--core/l10n/es_AR.json4
-rw-r--r--core/l10n/es_MX.js4
-rw-r--r--core/l10n/es_MX.json4
-rw-r--r--core/l10n/et_EE.js4
-rw-r--r--core/l10n/et_EE.json4
-rw-r--r--core/l10n/eu.js4
-rw-r--r--core/l10n/eu.json4
-rw-r--r--core/l10n/fa.js4
-rw-r--r--core/l10n/fa.json4
-rw-r--r--core/l10n/fi_FI.js9
-rw-r--r--core/l10n/fi_FI.json9
-rw-r--r--core/l10n/fr.js8
-rw-r--r--core/l10n/fr.json8
-rw-r--r--core/l10n/gl.js4
-rw-r--r--core/l10n/gl.json4
-rw-r--r--core/l10n/he.js4
-rw-r--r--core/l10n/he.json4
-rw-r--r--core/l10n/hi.js4
-rw-r--r--core/l10n/hi.json4
-rw-r--r--core/l10n/hr.js4
-rw-r--r--core/l10n/hr.json4
-rw-r--r--core/l10n/hu_HU.js58
-rw-r--r--core/l10n/hu_HU.json58
-rw-r--r--core/l10n/ia.js4
-rw-r--r--core/l10n/ia.json4
-rw-r--r--core/l10n/id.js4
-rw-r--r--core/l10n/id.json4
-rw-r--r--core/l10n/is.js4
-rw-r--r--core/l10n/is.json4
-rw-r--r--core/l10n/it.js10
-rw-r--r--core/l10n/it.json10
-rw-r--r--core/l10n/ja.js4
-rw-r--r--core/l10n/ja.json4
-rw-r--r--core/l10n/ka_GE.js4
-rw-r--r--core/l10n/ka_GE.json4
-rw-r--r--core/l10n/km.js4
-rw-r--r--core/l10n/km.json4
-rw-r--r--core/l10n/kn.js4
-rw-r--r--core/l10n/kn.json4
-rw-r--r--core/l10n/ko.js4
-rw-r--r--core/l10n/ko.json4
-rw-r--r--core/l10n/lb.js4
-rw-r--r--core/l10n/lb.json4
-rw-r--r--core/l10n/lt_LT.js4
-rw-r--r--core/l10n/lt_LT.json4
-rw-r--r--core/l10n/lv.js4
-rw-r--r--core/l10n/lv.json4
-rw-r--r--core/l10n/mk.js4
-rw-r--r--core/l10n/mk.json4
-rw-r--r--core/l10n/nb_NO.js4
-rw-r--r--core/l10n/nb_NO.json4
-rw-r--r--core/l10n/nl.js11
-rw-r--r--core/l10n/nl.json11
-rw-r--r--core/l10n/nn_NO.js4
-rw-r--r--core/l10n/nn_NO.json4
-rw-r--r--core/l10n/oc.js4
-rw-r--r--core/l10n/oc.json4
-rw-r--r--core/l10n/pl.js4
-rw-r--r--core/l10n/pl.json4
-rw-r--r--core/l10n/pt_BR.js10
-rw-r--r--core/l10n/pt_BR.json10
-rw-r--r--core/l10n/pt_PT.js26
-rw-r--r--core/l10n/pt_PT.json26
-rw-r--r--core/l10n/ro.js4
-rw-r--r--core/l10n/ro.json4
-rw-r--r--core/l10n/ru.js4
-rw-r--r--core/l10n/ru.json4
-rw-r--r--core/l10n/sk_SK.js28
-rw-r--r--core/l10n/sk_SK.json28
-rw-r--r--core/l10n/sl.js29
-rw-r--r--core/l10n/sl.json29
-rw-r--r--core/l10n/sq.js10
-rw-r--r--core/l10n/sq.json10
-rw-r--r--core/l10n/sr.js4
-rw-r--r--core/l10n/sr.json4
-rw-r--r--core/l10n/sr@latin.js4
-rw-r--r--core/l10n/sr@latin.json4
-rw-r--r--core/l10n/sv.js4
-rw-r--r--core/l10n/sv.json4
-rw-r--r--core/l10n/th_TH.js18
-rw-r--r--core/l10n/th_TH.json18
-rw-r--r--core/l10n/tr.js16
-rw-r--r--core/l10n/tr.json16
-rw-r--r--core/l10n/uk.js4
-rw-r--r--core/l10n/uk.json4
-rw-r--r--core/l10n/ur_PK.js4
-rw-r--r--core/l10n/ur_PK.json4
-rw-r--r--core/l10n/vi.js4
-rw-r--r--core/l10n/vi.json4
-rw-r--r--core/l10n/zh_CN.js17
-rw-r--r--core/l10n/zh_CN.json17
-rw-r--r--core/l10n/zh_HK.js4
-rw-r--r--core/l10n/zh_HK.json4
-rw-r--r--core/l10n/zh_TW.js4
-rw-r--r--core/l10n/zh_TW.json4
-rw-r--r--core/register_command.php3
-rw-r--r--core/routes.php2
-rw-r--r--core/templates/403.php2
-rw-r--r--core/templates/404.php3
-rw-r--r--core/templates/login.php4
-rw-r--r--core/templates/update.use-cli.php14
-rw-r--r--core/vendor/.gitignore6
-rw-r--r--core/vendor/es6-promise/.bower.json40
-rw-r--r--core/vendor/es6-promise/.npmignore11
-rw-r--r--core/vendor/es6-promise/.release.json17
-rw-r--r--core/vendor/es6-promise/.spmignore11
-rw-r--r--core/vendor/jquery-migrate/.bower.json16
-rw-r--r--core/vendor/jquery-migrate/component.json4
-rw-r--r--core/vendor/jquery-migrate/jquery-migrate.js1238
-rw-r--r--core/vendor/jquery-migrate/jquery-migrate.min.js4
-rw-r--r--core/vendor/jquery/.bower.json39
-rw-r--r--core/vendor/jquery/MIT-LICENSE.txt2
-rw-r--r--core/vendor/jquery/dist/jquery.js (renamed from core/vendor/jquery/jquery.js)8817
-rw-r--r--core/vendor/jquery/dist/jquery.min.js5
-rw-r--r--core/vendor/jquery/dist/jquery.min.map1
-rw-r--r--core/vendor/jquery/jquery.min.js6
-rw-r--r--core/vendor/jquery/jquery.min.map1
-rw-r--r--cron.php10
-rw-r--r--index.php8
-rw-r--r--issue_template.md2
-rw-r--r--lib/base.php142
-rw-r--r--lib/l10n/ast.js2
-rw-r--r--lib/l10n/ast.json2
-rw-r--r--lib/l10n/bg_BG.js2
-rw-r--r--lib/l10n/bg_BG.json2
-rw-r--r--lib/l10n/ca.js2
-rw-r--r--lib/l10n/ca.json2
-rw-r--r--lib/l10n/cs_CZ.js9
-rw-r--r--lib/l10n/cs_CZ.json9
-rw-r--r--lib/l10n/da.js8
-rw-r--r--lib/l10n/da.json8
-rw-r--r--lib/l10n/de.js10
-rw-r--r--lib/l10n/de.json10
-rw-r--r--lib/l10n/de_AT.js7
-rw-r--r--lib/l10n/de_AT.json7
-rw-r--r--lib/l10n/de_DE.js10
-rw-r--r--lib/l10n/de_DE.json10
-rw-r--r--lib/l10n/el.js2
-rw-r--r--lib/l10n/el.json2
-rw-r--r--lib/l10n/en_GB.js11
-rw-r--r--lib/l10n/en_GB.json11
-rw-r--r--lib/l10n/eo.js6
-rw-r--r--lib/l10n/eo.json6
-rw-r--r--lib/l10n/es.js11
-rw-r--r--lib/l10n/es.json11
-rw-r--r--lib/l10n/et_EE.js4
-rw-r--r--lib/l10n/et_EE.json4
-rw-r--r--lib/l10n/eu.js2
-rw-r--r--lib/l10n/eu.json2
-rw-r--r--lib/l10n/fi_FI.js8
-rw-r--r--lib/l10n/fi_FI.json8
-rw-r--r--lib/l10n/fr.js46
-rw-r--r--lib/l10n/fr.json46
-rw-r--r--lib/l10n/gl.js2
-rw-r--r--lib/l10n/gl.json2
-rw-r--r--lib/l10n/he.js8
-rw-r--r--lib/l10n/he.json8
-rw-r--r--lib/l10n/hr.js2
-rw-r--r--lib/l10n/hr.json2
-rw-r--r--lib/l10n/hu_HU.js2
-rw-r--r--lib/l10n/hu_HU.json2
-rw-r--r--lib/l10n/id.js2
-rw-r--r--lib/l10n/id.json2
-rw-r--r--lib/l10n/it.js34
-rw-r--r--lib/l10n/it.json34
-rw-r--r--lib/l10n/ja.js8
-rw-r--r--lib/l10n/ja.json8
-rw-r--r--lib/l10n/ko.js2
-rw-r--r--lib/l10n/ko.json2
-rw-r--r--lib/l10n/nb_NO.js8
-rw-r--r--lib/l10n/nb_NO.json8
-rw-r--r--lib/l10n/nl.js11
-rw-r--r--lib/l10n/nl.json11
-rw-r--r--lib/l10n/oc.js2
-rw-r--r--lib/l10n/oc.json2
-rw-r--r--lib/l10n/pl.js2
-rw-r--r--lib/l10n/pl.json2
-rw-r--r--lib/l10n/pt_BR.js10
-rw-r--r--lib/l10n/pt_BR.json10
-rw-r--r--lib/l10n/pt_PT.js34
-rw-r--r--lib/l10n/pt_PT.json34
-rw-r--r--lib/l10n/ro.js2
-rw-r--r--lib/l10n/ro.json2
-rw-r--r--lib/l10n/ru.js8
-rw-r--r--lib/l10n/ru.json8
-rw-r--r--lib/l10n/sk_SK.js2
-rw-r--r--lib/l10n/sk_SK.json2
-rw-r--r--lib/l10n/sl.js11
-rw-r--r--lib/l10n/sl.json11
-rw-r--r--lib/l10n/sq.js34
-rw-r--r--lib/l10n/sq.json34
-rw-r--r--lib/l10n/sr.js2
-rw-r--r--lib/l10n/sr.json2
-rw-r--r--lib/l10n/sv.js2
-rw-r--r--lib/l10n/sv.json2
-rw-r--r--lib/l10n/th_TH.js40
-rw-r--r--lib/l10n/th_TH.json40
-rw-r--r--lib/l10n/tr.js8
-rw-r--r--lib/l10n/tr.json8
-rw-r--r--lib/l10n/uk.js2
-rw-r--r--lib/l10n/uk.json2
-rw-r--r--lib/l10n/zh_CN.js2
-rw-r--r--lib/l10n/zh_CN.json2
-rw-r--r--lib/l10n/zh_TW.js8
-rw-r--r--lib/l10n/zh_TW.json8
-rw-r--r--lib/private/Activity/Event.php (renamed from lib/private/activity/event.php)0
-rw-r--r--lib/private/App/AppManager.php (renamed from lib/private/app/appmanager.php)0
-rw-r--r--lib/private/App/CodeChecker/AbstractCheck.php (renamed from lib/private/app/codechecker/abstractcheck.php)0
-rw-r--r--lib/private/App/CodeChecker/CodeChecker.php (renamed from lib/private/app/codechecker/codechecker.php)0
-rw-r--r--lib/private/App/CodeChecker/DeprecationCheck.php (renamed from lib/private/app/codechecker/deprecationcheck.php)0
-rw-r--r--lib/private/App/CodeChecker/EmptyCheck.php (renamed from lib/private/app/codechecker/emptycheck.php)0
-rw-r--r--lib/private/App/CodeChecker/ICheck.php (renamed from lib/private/app/codechecker/icheck.php)0
-rw-r--r--lib/private/App/CodeChecker/InfoChecker.php (renamed from lib/private/app/codechecker/infochecker.php)0
-rw-r--r--lib/private/App/CodeChecker/NodeVisitor.php (renamed from lib/private/app/codechecker/nodevisitor.php)0
-rw-r--r--lib/private/App/CodeChecker/PrivateCheck.php (renamed from lib/private/app/codechecker/privatecheck.php)0
-rw-r--r--lib/private/App/CodeChecker/StrongComparisonCheck.php (renamed from lib/private/app/codechecker/strongcomparisoncheck.php)0
-rw-r--r--lib/private/App/DependencyAnalyzer.php (renamed from lib/private/app/dependencyanalyzer.php)0
-rw-r--r--lib/private/App/InfoParser.php (renamed from lib/private/app/infoparser.php)52
-rw-r--r--lib/private/App/Platform.php (renamed from lib/private/app/platform.php)0
-rw-r--r--lib/private/App/PlatformRepository.php (renamed from lib/private/app/platformrepository.php)0
-rw-r--r--lib/private/AppFramework/App.php (renamed from lib/private/appframework/app.php)0
-rw-r--r--lib/private/AppFramework/Core/API.php (renamed from lib/private/appframework/core/api.php)0
-rw-r--r--lib/private/AppFramework/Db/Db.php (renamed from lib/private/appframework/db/db.php)0
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php (renamed from lib/private/appframework/dependencyinjection/dicontainer.php)4
-rw-r--r--lib/private/AppFramework/Http.php (renamed from lib/private/appframework/http.php)0
-rw-r--r--lib/private/AppFramework/Http/Dispatcher.php (renamed from lib/private/appframework/http/dispatcher.php)0
-rw-r--r--lib/private/AppFramework/Http/Output.php (renamed from lib/private/appframework/http/output.php)0
-rw-r--r--lib/private/AppFramework/Http/Request.php (renamed from lib/private/appframework/http/request.php)2
-rw-r--r--lib/private/AppFramework/Middleware/MiddlewareDispatcher.php (renamed from lib/private/appframework/middleware/middlewaredispatcher.php)0
-rw-r--r--lib/private/AppFramework/Middleware/Security/CORSMiddleware.php (renamed from lib/private/appframework/middleware/security/corsmiddleware.php)0
-rw-r--r--lib/private/AppFramework/Middleware/Security/Exceptions/AppNotEnabledException.php (renamed from lib/private/appframework/middleware/security/exceptions/appnotenabledexception.php)4
-rw-r--r--lib/private/AppFramework/Middleware/Security/Exceptions/CrossSiteRequestForgeryException.php (renamed from lib/private/appframework/middleware/security/exceptions/crosssiterequestforgeryexception.php)4
-rw-r--r--lib/private/AppFramework/Middleware/Security/Exceptions/NotAdminException.php (renamed from lib/private/appframework/middleware/security/exceptions/notadminexception.php)4
-rw-r--r--lib/private/AppFramework/Middleware/Security/Exceptions/NotLoggedInException.php (renamed from lib/private/appframework/middleware/security/exceptions/notloggedinexception.php)4
-rw-r--r--lib/private/AppFramework/Middleware/Security/Exceptions/SecurityException.php (renamed from lib/private/appframework/middleware/security/exceptions/securityexception.php)0
-rw-r--r--lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php (renamed from lib/private/appframework/middleware/security/securitymiddleware.php)17
-rw-r--r--lib/private/AppFramework/Middleware/SessionMiddleware.php (renamed from lib/private/appframework/middleware/sessionmiddleware.php)0
-rw-r--r--lib/private/AppFramework/Routing/RouteActionHandler.php (renamed from lib/private/appframework/routing/routeactionhandler.php)2
-rw-r--r--lib/private/AppFramework/Routing/RouteConfig.php (renamed from lib/private/appframework/routing/routeconfig.php)2
-rw-r--r--lib/private/AppFramework/Utility/ControllerMethodReflector.php (renamed from lib/private/appframework/utility/controllermethodreflector.php)0
-rw-r--r--lib/private/AppFramework/Utility/SimpleContainer.php (renamed from lib/private/appframework/utility/simplecontainer.php)0
-rw-r--r--lib/private/AppFramework/Utility/TimeFactory.php (renamed from lib/private/appframework/utility/timefactory.php)0
-rw-r--r--lib/private/BackgroundJob/Job.php (renamed from lib/private/backgroundjob/job.php)0
-rw-r--r--lib/private/BackgroundJob/JobList.php (renamed from lib/private/backgroundjob/joblist.php)6
-rw-r--r--lib/private/BackgroundJob/Legacy/QueuedJob.php (renamed from lib/private/backgroundjob/legacy/queuedjob.php)0
-rw-r--r--lib/private/BackgroundJob/Legacy/RegularJob.php (renamed from lib/private/backgroundjob/legacy/regularjob.php)0
-rw-r--r--lib/private/BackgroundJob/QueuedJob.php (renamed from lib/private/backgroundjob/queuedjob.php)0
-rw-r--r--lib/private/BackgroundJob/TimedJob.php (renamed from lib/private/backgroundjob/timedjob.php)0
-rw-r--r--lib/private/Cache/CappedMemoryCache.php (renamed from lib/private/cache/cappedmemorycache.php)0
-rw-r--r--lib/private/Cache/File.php (renamed from lib/private/cache/file.php)0
-rw-r--r--lib/private/Command/AsyncBus.php (renamed from lib/private/command/asyncbus.php)0
-rw-r--r--lib/private/Command/CallableJob.php (renamed from lib/private/command/callablejob.php)0
-rw-r--r--lib/private/Command/ClosureJob.php (renamed from lib/private/command/closurejob.php)0
-rw-r--r--lib/private/Command/CommandJob.php (renamed from lib/private/command/commandjob.php)0
-rw-r--r--lib/private/Command/FileAccess.php (renamed from lib/private/command/fileaccess.php)0
-rw-r--r--lib/private/Command/QueueBus.php (renamed from lib/private/command/queuebus.php)0
-rw-r--r--lib/private/Comments/Comment.php (renamed from lib/private/comments/comment.php)0
-rw-r--r--lib/private/Comments/Manager.php (renamed from lib/private/comments/manager.php)0
-rw-r--r--lib/private/Comments/ManagerFactory.php (renamed from lib/private/comments/managerfactory.php)0
-rw-r--r--lib/private/Console/Application.php (renamed from lib/private/console/application.php)0
-rw-r--r--lib/private/Console/TimestampFormatter.php (renamed from lib/private/console/timestampformatter.php)0
-rw-r--r--lib/private/DB/Adapter.php (renamed from lib/private/db/adapter.php)0
-rw-r--r--lib/private/DB/AdapterMySQL.php (renamed from lib/private/db/adaptermysql.php)0
-rw-r--r--lib/private/DB/AdapterOCI8.php (renamed from lib/private/db/adapteroci8.php)0
-rw-r--r--lib/private/DB/AdapterPgSql.php (renamed from lib/private/db/adapterpgsql.php)0
-rw-r--r--lib/private/DB/AdapterSqlite.php (renamed from lib/private/db/adaptersqlite.php)1
-rw-r--r--lib/private/DB/Connection.php (renamed from lib/private/db/connection.php)0
-rw-r--r--lib/private/DB/ConnectionFactory.php (renamed from lib/private/db/connectionfactory.php)0
-rw-r--r--lib/private/DB/MDB2SchemaManager.php (renamed from lib/private/db/mdb2schemamanager.php)0
-rw-r--r--lib/private/DB/MDB2SchemaReader.php (renamed from lib/private/db/mdb2schemareader.php)0
-rw-r--r--lib/private/DB/MDB2SchemaWriter.php (renamed from lib/private/db/mdb2schemawriter.php)0
-rw-r--r--lib/private/DB/MigrationException.php (renamed from lib/private/db/migrationexception.php)0
-rw-r--r--lib/private/DB/Migrator.php (renamed from lib/private/db/migrator.php)0
-rw-r--r--lib/private/DB/MySQLMigrator.php (renamed from lib/private/db/mysqlmigrator.php)0
-rw-r--r--lib/private/DB/NoCheckMigrator.php (renamed from lib/private/db/nocheckmigrator.php)0
-rw-r--r--lib/private/DB/OCSqlitePlatform.php (renamed from lib/private/db/ocsqliteplatform.php)0
-rw-r--r--lib/private/DB/OracleConnection.php (renamed from lib/private/db/oracleconnection.php)0
-rw-r--r--lib/private/DB/OracleMigrator.php (renamed from lib/private/db/oraclemigrator.php)0
-rw-r--r--lib/private/DB/PgSqlTools.php (renamed from lib/private/db/pgsqltools.php)0
-rw-r--r--lib/private/DB/QueryBuilder/CompositeExpression.php (renamed from lib/private/db/querybuilder/compositeexpression.php)0
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php (renamed from lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php)0
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php (renamed from lib/private/db/querybuilder/expressionbuilder/mysqlexpressionbuilder.php)0
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php (renamed from lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php)0
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php (renamed from lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php)0
-rw-r--r--lib/private/DB/QueryBuilder/Literal.php (renamed from lib/private/db/querybuilder/literal.php)0
-rw-r--r--lib/private/DB/QueryBuilder/Parameter.php (renamed from lib/private/db/querybuilder/parameter.php)0
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php (renamed from lib/private/db/querybuilder/querybuilder.php)0
-rw-r--r--lib/private/DB/QueryBuilder/QueryFunction.php (renamed from lib/private/db/querybuilder/queryfunction.php)0
-rw-r--r--lib/private/DB/QueryBuilder/QuoteHelper.php (renamed from lib/private/db/querybuilder/quotehelper.php)0
-rw-r--r--lib/private/DB/SQLiteMigrator.php (renamed from lib/private/db/sqlitemigrator.php)0
-rw-r--r--lib/private/DB/SQLiteSessionInit.php (renamed from lib/private/db/sqlitesessioninit.php)0
-rw-r--r--lib/private/Diagnostics/Event.php (renamed from lib/private/diagnostics/event.php)0
-rw-r--r--lib/private/Diagnostics/EventLogger.php (renamed from lib/private/diagnostics/eventlogger.php)0
-rw-r--r--lib/private/Diagnostics/NullEventLogger.php (renamed from lib/private/diagnostics/nulleventlogger.php)0
-rw-r--r--lib/private/Diagnostics/NullQueryLogger.php (renamed from lib/private/diagnostics/nullquerylogger.php)0
-rw-r--r--lib/private/Diagnostics/Query.php (renamed from lib/private/diagnostics/query.php)0
-rw-r--r--lib/private/Diagnostics/QueryLogger.php (renamed from lib/private/diagnostics/querylogger.php)0
-rw-r--r--lib/private/Encryption/DecryptAll.php (renamed from lib/private/encryption/decryptall.php)0
-rw-r--r--lib/private/Encryption/EncryptionWrapper.php (renamed from lib/private/encryption/encryptionwrapper.php)0
-rw-r--r--lib/private/Encryption/Exceptions/DecryptionFailedException.php (renamed from lib/private/encryption/exceptions/decryptionfailedexception.php)0
-rw-r--r--lib/private/Encryption/Exceptions/EmptyEncryptionDataException.php (renamed from lib/private/encryption/exceptions/emptyencryptiondataexception.php)0
-rw-r--r--lib/private/Encryption/Exceptions/EncryptionFailedException.php (renamed from lib/private/encryption/exceptions/encryptionfailedexception.php)0
-rw-r--r--lib/private/Encryption/Exceptions/EncryptionHeaderKeyExistsException.php (renamed from lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php)0
-rw-r--r--lib/private/Encryption/Exceptions/EncryptionHeaderToLargeException.php (renamed from lib/private/encryption/exceptions/encryptionheadertolargeexception.php)0
-rw-r--r--lib/private/Encryption/Exceptions/ModuleAlreadyExistsException.php (renamed from lib/private/encryption/exceptions/modulealreadyexistsexception.php)0
-rw-r--r--lib/private/Encryption/Exceptions/ModuleDoesNotExistsException.php (renamed from lib/private/encryption/exceptions/moduledoesnotexistsexception.php)0
-rw-r--r--lib/private/Encryption/Exceptions/UnknownCipherException.php (renamed from lib/private/encryption/exceptions/unknowncipherexception.php)0
-rw-r--r--lib/private/Encryption/File.php (renamed from lib/private/encryption/file.php)0
-rw-r--r--lib/private/Encryption/HookManager.php (renamed from lib/private/encryption/hookmanager.php)0
-rw-r--r--lib/private/Encryption/Keys/Storage.php (renamed from lib/private/encryption/keys/storage.php)0
-rw-r--r--lib/private/Encryption/Manager.php (renamed from lib/private/encryption/manager.php)19
-rw-r--r--lib/private/Encryption/Update.php (renamed from lib/private/encryption/update.php)0
-rw-r--r--lib/private/Encryption/Util.php (renamed from lib/private/encryption/util.php)0
-rw-r--r--lib/private/Files/Cache/Cache.php (renamed from lib/private/files/cache/cache.php)0
-rw-r--r--lib/private/Files/Cache/CacheEntry.php (renamed from lib/private/files/cache/cacheentry.php)0
-rw-r--r--lib/private/Files/Cache/FailedCache.php (renamed from lib/private/files/cache/failedcache.php)0
-rw-r--r--lib/private/Files/Cache/HomeCache.php (renamed from lib/private/files/cache/homecache.php)0
-rw-r--r--lib/private/Files/Cache/HomePropagator.php (renamed from lib/private/files/cache/homepropagator.php)9
-rw-r--r--lib/private/Files/Cache/MoveFromCacheTrait.php (renamed from lib/private/files/cache/movefromcachetrait.php)0
-rw-r--r--lib/private/Files/Cache/Propagator.php101
-rw-r--r--lib/private/Files/Cache/Scanner.php (renamed from lib/private/files/cache/scanner.php)61
-rw-r--r--lib/private/Files/Cache/Storage.php (renamed from lib/private/files/cache/storage.php)0
-rw-r--r--lib/private/Files/Cache/Updater.php (renamed from lib/private/files/cache/updater.php)21
-rw-r--r--lib/private/Files/Cache/Watcher.php (renamed from lib/private/files/cache/watcher.php)4
-rw-r--r--lib/private/Files/Cache/Wrapper/CacheJail.php (renamed from lib/private/files/cache/wrapper/cachejail.php)28
-rw-r--r--lib/private/Files/Cache/Wrapper/CachePermissionsMask.php (renamed from lib/private/files/cache/wrapper/cachepermissionsmask.php)0
-rw-r--r--lib/private/Files/Cache/Wrapper/CacheWrapper.php (renamed from lib/private/files/cache/wrapper/cachewrapper.php)10
-rw-r--r--lib/private/Files/Config/CachedMountInfo.php (renamed from lib/private/files/config/cachedmountinfo.php)14
-rw-r--r--lib/private/Files/Config/LazyStorageMountInfo.php74
-rw-r--r--lib/private/Files/Config/MountProviderCollection.php (renamed from lib/private/files/config/mountprovidercollection.php)0
-rw-r--r--lib/private/Files/Config/UserMountCache.php (renamed from lib/private/files/config/usermountcache.php)11
-rw-r--r--lib/private/Files/Config/UserMountCacheListener.php (renamed from lib/private/files/config/usermountcachelistener.php)0
-rw-r--r--lib/private/Files/FileInfo.php (renamed from lib/private/files/fileinfo.php)0
-rw-r--r--lib/private/Files/Filesystem.php (renamed from lib/private/files/filesystem.php)7
-rw-r--r--lib/private/Files/Mount/Manager.php (renamed from lib/private/files/mount/manager.php)0
-rw-r--r--lib/private/Files/Mount/MountPoint.php (renamed from lib/private/files/mount/mountpoint.php)9
-rw-r--r--lib/private/Files/Mount/MoveableMount.php (renamed from lib/private/files/mount/moveablemount.php)0
-rw-r--r--lib/private/Files/Node/File.php (renamed from lib/private/files/node/file.php)0
-rw-r--r--lib/private/Files/Node/Folder.php (renamed from lib/private/files/node/folder.php)0
-rw-r--r--lib/private/Files/Node/HookConnector.php (renamed from lib/private/files/node/hookconnector.php)0
-rw-r--r--lib/private/Files/Node/LazyRoot.php474
-rw-r--r--lib/private/Files/Node/Node.php (renamed from lib/private/files/node/node.php)0
-rw-r--r--lib/private/Files/Node/NonExistingFile.php (renamed from lib/private/files/node/nonexistingfile.php)0
-rw-r--r--lib/private/Files/Node/NonExistingFolder.php (renamed from lib/private/files/node/nonexistingfolder.php)0
-rw-r--r--lib/private/Files/Node/Root.php (renamed from lib/private/files/node/root.php)0
-rw-r--r--lib/private/Files/ObjectStore/HomeObjectStoreStorage.php (renamed from lib/private/files/objectstore/homeobjectstorestorage.php)0
-rw-r--r--lib/private/Files/ObjectStore/NoopScanner.php (renamed from lib/private/files/objectstore/noopscanner.php)0
-rw-r--r--lib/private/Files/ObjectStore/ObjectStoreStorage.php (renamed from lib/private/files/objectstore/objectstorestorage.php)0
-rw-r--r--lib/private/Files/ObjectStore/Swift.php (renamed from lib/private/files/objectstore/swift.php)0
-rw-r--r--lib/private/Files/Storage/Common.php (renamed from lib/private/files/storage/common.php)24
-rw-r--r--lib/private/Files/Storage/CommonTest.php (renamed from lib/private/files/storage/commontest.php)0
-rw-r--r--lib/private/Files/Storage/DAV.php (renamed from lib/private/files/storage/dav.php)6
-rw-r--r--lib/private/Files/Storage/FailedStorage.php (renamed from lib/private/files/storage/failedstorage.php)0
-rw-r--r--lib/private/Files/Storage/Flysystem.php (renamed from lib/private/files/storage/flysystem.php)0
-rw-r--r--lib/private/Files/Storage/Home.php (renamed from lib/private/files/storage/home.php)2
-rw-r--r--lib/private/Files/Storage/Local.php (renamed from lib/private/files/storage/local.php)3
-rw-r--r--lib/private/Files/Storage/LocalTempFileTrait.php (renamed from lib/private/files/storage/localtempfiletrait.php)0
-rw-r--r--lib/private/Files/Storage/PolyFill/CopyDirectory.php (renamed from lib/private/files/storage/polyfill/copydirectory.php)0
-rw-r--r--lib/private/Files/Storage/Storage.php (renamed from lib/private/files/storage/storage.php)0
-rw-r--r--lib/private/Files/Storage/StorageFactory.php (renamed from lib/private/files/storage/storagefactory.php)0
-rw-r--r--lib/private/Files/Storage/Temporary.php (renamed from lib/private/files/storage/temporary.php)0
-rw-r--r--lib/private/Files/Storage/Wrapper/Availability.php (renamed from lib/private/files/storage/wrapper/availability.php)0
-rw-r--r--lib/private/Files/Storage/Wrapper/Encryption.php (renamed from lib/private/files/storage/wrapper/encryption.php)7
-rw-r--r--lib/private/Files/Storage/Wrapper/Jail.php (renamed from lib/private/files/storage/wrapper/jail.php)46
-rw-r--r--lib/private/Files/Storage/Wrapper/PermissionsMask.php (renamed from lib/private/files/storage/wrapper/permissionsmask.php)0
-rw-r--r--lib/private/Files/Storage/Wrapper/Quota.php (renamed from lib/private/files/storage/wrapper/quota.php)0
-rw-r--r--lib/private/Files/Storage/Wrapper/Wrapper.php (renamed from lib/private/files/storage/wrapper/wrapper.php)6
-rw-r--r--lib/private/Files/Stream/Close.php (renamed from lib/private/files/stream/close.php)0
-rw-r--r--lib/private/Files/Stream/Dir.php (renamed from lib/private/files/stream/dir.php)0
-rw-r--r--lib/private/Files/Stream/Encryption.php (renamed from lib/private/files/stream/encryption.php)0
-rw-r--r--lib/private/Files/Stream/OC.php (renamed from lib/private/files/stream/oc.php)0
-rw-r--r--lib/private/Files/Stream/Quota.php (renamed from lib/private/files/stream/quota.php)0
-rw-r--r--lib/private/Files/Stream/StaticStream.php (renamed from lib/private/files/stream/staticstream.php)0
-rw-r--r--lib/private/Files/Type/Detection.php (renamed from lib/private/files/type/detection.php)0
-rw-r--r--lib/private/Files/Type/Loader.php (renamed from lib/private/files/type/loader.php)0
-rw-r--r--lib/private/Files/Type/TemplateManager.php (renamed from lib/private/files/type/templatemanager.php)0
-rw-r--r--lib/private/Files/Utils/Scanner.php (renamed from lib/private/files/utils/scanner.php)16
-rw-r--r--lib/private/Files/View.php (renamed from lib/private/files/view.php)2
-rw-r--r--lib/private/Hooks/BasicEmitter.php (renamed from lib/private/hooks/basicemitter.php)0
-rw-r--r--lib/private/Hooks/Emitter.php (renamed from lib/private/hooks/emitter.php)0
-rw-r--r--lib/private/Hooks/EmitterTrait.php (renamed from lib/private/hooks/emittertrait.php)0
-rw-r--r--lib/private/Hooks/ForwardingEmitter.php (renamed from lib/private/hooks/forwardingemitter.php)0
-rw-r--r--lib/private/Hooks/LegacyEmitter.php (renamed from lib/private/hooks/legacyemitter.php)0
-rw-r--r--lib/private/Hooks/PublicEmitter.php (renamed from lib/private/hooks/publicemitter.php)0
-rw-r--r--lib/private/IntegrityCheck/Checker.php (renamed from lib/private/integritycheck/checker.php)2
-rw-r--r--lib/private/IntegrityCheck/Exceptions/InvalidSignatureException.php (renamed from lib/private/integritycheck/exceptions/invalidsignatureexception.php)0
-rw-r--r--lib/private/IntegrityCheck/Helpers/AppLocator.php (renamed from lib/private/integritycheck/helpers/applocator.php)0
-rw-r--r--lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php (renamed from lib/private/integritycheck/helpers/environmenthelper.php)0
-rw-r--r--lib/private/IntegrityCheck/Helpers/FileAccessHelper.php (renamed from lib/private/integritycheck/helpers/fileaccesshelper.php)0
-rw-r--r--lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php (renamed from lib/private/integritycheck/iterator/excludefilebynamefilteriterator.php)0
-rw-r--r--lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php (renamed from lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php)0
-rw-r--r--lib/private/Lock/AbstractLockingProvider.php (renamed from lib/private/lock/abstractlockingprovider.php)0
-rw-r--r--lib/private/Lock/DBLockingProvider.php (renamed from lib/private/lock/dblockingprovider.php)25
-rw-r--r--lib/private/Lock/MemcacheLockingProvider.php (renamed from lib/private/lock/memcachelockingprovider.php)0
-rw-r--r--lib/private/Lock/NoopLockingProvider.php (renamed from lib/private/lock/nooplockingprovider.php)0
-rw-r--r--lib/private/Mail/Mailer.php (renamed from lib/private/mail/mailer.php)0
-rw-r--r--lib/private/Mail/Message.php (renamed from lib/private/mail/message.php)0
-rw-r--r--lib/private/Memcache/APC.php (renamed from lib/private/memcache/apc.php)0
-rw-r--r--lib/private/Memcache/APCu.php (renamed from lib/private/memcache/apcu.php)0
-rw-r--r--lib/private/Memcache/ArrayCache.php (renamed from lib/private/memcache/arraycache.php)0
-rw-r--r--lib/private/Memcache/CADTrait.php (renamed from lib/private/memcache/cadtrait.php)0
-rw-r--r--lib/private/Memcache/CASTrait.php (renamed from lib/private/memcache/castrait.php)0
-rw-r--r--lib/private/Memcache/Cache.php (renamed from lib/private/memcache/cache.php)0
-rw-r--r--lib/private/Memcache/Factory.php (renamed from lib/private/memcache/factory.php)0
-rw-r--r--lib/private/Memcache/Memcached.php (renamed from lib/private/memcache/memcached.php)0
-rw-r--r--lib/private/Memcache/NullCache.php (renamed from lib/private/memcache/nullcache.php)0
-rw-r--r--lib/private/Memcache/Redis.php (renamed from lib/private/memcache/redis.php)0
-rw-r--r--lib/private/Memcache/XCache.php (renamed from lib/private/memcache/xcache.php)0
-rw-r--r--lib/private/Notification/Action.php (renamed from lib/private/notification/action.php)0
-rw-r--r--lib/private/Notification/Manager.php (renamed from lib/private/notification/manager.php)0
-rw-r--r--lib/private/Notification/Notification.php (renamed from lib/private/notification/notification.php)0
-rw-r--r--lib/private/Preview/BMP.php (renamed from lib/private/preview/bmp.php)0
-rw-r--r--lib/private/Preview/Bitmap.php (renamed from lib/private/preview/bitmap.php)0
-rw-r--r--lib/private/Preview/Font.php (renamed from lib/private/preview/font.php)0
-rw-r--r--lib/private/Preview/GIF.php (renamed from lib/private/preview/gif.php)0
-rw-r--r--lib/private/Preview/Illustrator.php (renamed from lib/private/preview/illustrator.php)0
-rw-r--r--lib/private/Preview/Image.php (renamed from lib/private/preview/image.php)0
-rw-r--r--lib/private/Preview/JPEG.php (renamed from lib/private/preview/jpeg.php)0
-rw-r--r--lib/private/Preview/MP3.php (renamed from lib/private/preview/mp3.php)0
-rw-r--r--lib/private/Preview/MSOffice2003.php (renamed from lib/private/preview/msoffice2003.php)0
-rw-r--r--lib/private/Preview/MSOffice2007.php (renamed from lib/private/preview/msoffice2007.php)0
-rw-r--r--lib/private/Preview/MSOfficeDoc.php (renamed from lib/private/preview/msofficedoc.php)0
-rw-r--r--lib/private/Preview/MarkDown.php (renamed from lib/private/preview/markdown.php)0
-rw-r--r--lib/private/Preview/Movie.php (renamed from lib/private/preview/movie.php)0
-rw-r--r--lib/private/Preview/Office.php (renamed from lib/private/preview/office.php)0
-rw-r--r--lib/private/Preview/OpenDocument.php (renamed from lib/private/preview/opendocument.php)0
-rw-r--r--lib/private/Preview/PDF.php (renamed from lib/private/preview/pdf.php)0
-rw-r--r--lib/private/Preview/PNG.php (renamed from lib/private/preview/png.php)0
-rw-r--r--lib/private/Preview/Photoshop.php (renamed from lib/private/preview/photoshop.php)0
-rw-r--r--lib/private/Preview/Postscript.php (renamed from lib/private/preview/postscript.php)0
-rw-r--r--lib/private/Preview/Provider.php (renamed from lib/private/preview/provider.php)0
-rw-r--r--lib/private/Preview/SVG.php (renamed from lib/private/preview/svg.php)0
-rw-r--r--lib/private/Preview/StarOffice.php (renamed from lib/private/preview/staroffice.php)0
-rw-r--r--lib/private/Preview/TIFF.php (renamed from lib/private/preview/tiff.php)0
-rw-r--r--lib/private/Preview/TXT.php (renamed from lib/private/preview/txt.php)0
-rw-r--r--lib/private/Preview/XBitmap.php (renamed from lib/private/preview/xbitmap.php)0
-rw-r--r--lib/private/Repair/AssetCache.php (renamed from lib/private/repair/assetcache.php)12
-rw-r--r--lib/private/Repair/CleanTags.php (renamed from lib/private/repair/cleantags.php)27
-rw-r--r--lib/private/Repair/Collation.php (renamed from lib/private/repair/collation.php)11
-rw-r--r--lib/private/Repair/DropOldJobs.php (renamed from lib/private/repair/dropoldjobs.php)8
-rw-r--r--lib/private/Repair/DropOldTables.php (renamed from lib/private/repair/dropoldtables.php)19
-rw-r--r--lib/private/Repair/FillETags.php (renamed from lib/private/repair/filletags.php)9
-rw-r--r--lib/private/Repair/InnoDB.php (renamed from lib/private/repair/innodb.php)11
-rw-r--r--lib/private/Repair/OldGroupMembershipShares.php (renamed from lib/private/repair/oldgroupmembershipshares.php)11
-rw-r--r--lib/private/Repair/Preview.php (renamed from lib/private/repair/preview.php)9
-rw-r--r--lib/private/Repair/RemoveGetETagEntries.php (renamed from lib/private/repair/removegetetagentries.php)13
-rw-r--r--lib/private/Repair/RepairInvalidShares.php (renamed from lib/private/repair/repairinvalidshares.php)27
-rw-r--r--lib/private/Repair/RepairLegacyStorages.php (renamed from lib/private/repair/repairlegacystorages.php)27
-rw-r--r--lib/private/Repair/RepairMimeTypes.php (renamed from lib/private/repair/repairmimetypes.php)33
-rw-r--r--lib/private/Repair/SearchLuceneTables.php (renamed from lib/private/repair/searchlucenetables.php)11
-rw-r--r--lib/private/Repair/SharePropagation.php (renamed from lib/private/repair/sharepropagation.php)8
-rw-r--r--lib/private/Repair/SqliteAutoincrement.php (renamed from lib/private/repair/sqliteautoincrement.php)7
-rw-r--r--lib/private/Repair/UpdateCertificateStore.php (renamed from lib/private/repair/updatecertificatestore.php)8
-rw-r--r--lib/private/Repair/UpdateOutdatedOcsIds.php (renamed from lib/private/repair/updateoutdatedocsids.php)14
-rw-r--r--lib/private/Route/CachingRouter.php (renamed from lib/private/route/cachingrouter.php)0
-rw-r--r--lib/private/Route/Route.php (renamed from lib/private/route/route.php)0
-rw-r--r--lib/private/Route/Router.php (renamed from lib/private/route/router.php)0
-rw-r--r--lib/private/Search/Provider/File.php (renamed from lib/private/search/provider/file.php)0
-rw-r--r--lib/private/Search/Result/Audio.php (renamed from lib/private/search/result/audio.php)0
-rw-r--r--lib/private/Search/Result/File.php (renamed from lib/private/search/result/file.php)0
-rw-r--r--lib/private/Search/Result/Folder.php (renamed from lib/private/search/result/folder.php)0
-rw-r--r--lib/private/Search/Result/Image.php (renamed from lib/private/search/result/image.php)0
-rw-r--r--lib/private/Security/CSP/ContentSecurityPolicy.php (renamed from lib/private/security/csp/contentsecuritypolicy.php)0
-rw-r--r--lib/private/Security/CSP/ContentSecurityPolicyManager.php (renamed from lib/private/security/csp/contentsecuritypolicymanager.php)0
-rw-r--r--lib/private/Security/CSRF/CsrfToken.php (renamed from lib/private/security/csrf/csrftoken.php)0
-rw-r--r--lib/private/Security/CSRF/CsrfTokenGenerator.php (renamed from lib/private/security/csrf/csrftokengenerator.php)0
-rw-r--r--lib/private/Security/CSRF/CsrfTokenManager.php (renamed from lib/private/security/csrf/csrftokenmanager.php)0
-rw-r--r--lib/private/Security/CSRF/TokenStorage/SessionStorage.php (renamed from lib/private/security/csrf/tokenstorage/sessionstorage.php)0
-rw-r--r--lib/private/Security/Certificate.php (renamed from lib/private/security/certificate.php)7
-rw-r--r--lib/private/Security/CertificateManager.php (renamed from lib/private/security/certificatemanager.php)0
-rw-r--r--lib/private/Security/CredentialsManager.php (renamed from lib/private/security/credentialsmanager.php)0
-rw-r--r--lib/private/Security/Crypto.php (renamed from lib/private/security/crypto.php)0
-rw-r--r--lib/private/Security/Hasher.php (renamed from lib/private/security/hasher.php)0
-rw-r--r--lib/private/Security/SecureRandom.php (renamed from lib/private/security/securerandom.php)0
-rw-r--r--lib/private/Security/TrustedDomainHelper.php (renamed from lib/private/security/trusteddomainhelper.php)0
-rw-r--r--lib/private/Server.php22
-rw-r--r--lib/private/Session/CryptoSessionData.php (renamed from lib/private/session/cryptosessiondata.php)0
-rw-r--r--lib/private/Session/CryptoWrapper.php (renamed from lib/private/session/cryptowrapper.php)0
-rw-r--r--lib/private/Session/Internal.php (renamed from lib/private/session/internal.php)0
-rw-r--r--lib/private/Session/Memory.php (renamed from lib/private/session/memory.php)0
-rw-r--r--lib/private/Session/Session.php (renamed from lib/private/session/session.php)0
-rw-r--r--lib/private/Setup/AbstractDatabase.php (renamed from lib/private/setup/abstractdatabase.php)0
-rw-r--r--lib/private/Setup/MySQL.php (renamed from lib/private/setup/mysql.php)2
-rw-r--r--lib/private/Setup/OCI.php (renamed from lib/private/setup/oci.php)0
-rw-r--r--lib/private/Setup/PostgreSQL.php (renamed from lib/private/setup/postgresql.php)0
-rw-r--r--lib/private/Setup/Sqlite.php (renamed from lib/private/setup/sqlite.php)0
-rw-r--r--lib/private/Share20/DefaultShareProvider.php38
-rw-r--r--lib/private/Share20/Hooks.php4
-rw-r--r--lib/private/Share20/Manager.php61
-rw-r--r--lib/private/Share20/ProviderFactory.php5
-rw-r--r--lib/private/SystemTag/ManagerFactory.php (renamed from lib/private/systemtag/managerfactory.php)0
-rw-r--r--lib/private/SystemTag/SystemTag.php (renamed from lib/private/systemtag/systemtag.php)0
-rw-r--r--lib/private/SystemTag/SystemTagManager.php (renamed from lib/private/systemtag/systemtagmanager.php)0
-rw-r--r--lib/private/SystemTag/SystemTagObjectMapper.php (renamed from lib/private/systemtag/systemtagobjectmapper.php)0
-rw-r--r--lib/private/Tagging/Tag.php (renamed from lib/private/tagging/tag.php)0
-rw-r--r--lib/private/Tagging/TagMapper.php (renamed from lib/private/tagging/tagmapper.php)0
-rw-r--r--lib/private/Updater/VersionCheck.php133
-rw-r--r--lib/private/api.php2
-rw-r--r--lib/private/app.php49
-rw-r--r--lib/private/files/cache/propagator.php74
-rw-r--r--lib/private/helper.php2
-rw-r--r--lib/private/installer.php3
-rw-r--r--lib/private/legacy/db/statementwrapper.php (renamed from lib/private/db/statementwrapper.php)0
-rw-r--r--lib/private/log.php4
-rw-r--r--lib/private/log/errorhandler.php3
-rw-r--r--lib/private/repair.php89
-rw-r--r--lib/private/setup.php32
-rw-r--r--lib/private/share/hooks.php46
-rw-r--r--lib/private/share/share.php24
-rw-r--r--lib/private/template.php10
-rw-r--r--lib/private/template/base.php67
-rw-r--r--lib/private/templatelayout.php4
-rw-r--r--lib/private/updater.php100
-rw-r--r--lib/private/user.php22
-rw-r--r--lib/private/util.php41
-rw-r--r--lib/public/Share/IManager.php12
-rw-r--r--lib/public/Share/IShareProvider.php11
-rw-r--r--lib/public/appframework/app.php2
-rw-r--r--lib/public/encryption/iencryptionmodule.php12
-rw-r--r--lib/public/files/cache/ipropagator.php1
-rw-r--r--lib/public/files/mount/imountpoint.php8
-rw-r--r--lib/public/ilogger.php4
-rw-r--r--lib/public/irequest.php2
-rw-r--r--lib/public/mail/imailer.php7
-rw-r--r--lib/public/migration/ioutput.php61
-rw-r--r--lib/public/migration/irepairstep.php (renamed from lib/private/repairstep.php)9
-rw-r--r--lib/public/user.php2
-rw-r--r--ocs/routes.php3
-rw-r--r--public.php16
-rw-r--r--remote.php13
-rw-r--r--resources/config/mimetypealiases.dist.json2
-rw-r--r--settings/Controller/AppSettingsController.php25
-rw-r--r--settings/Middleware/SubadminMiddleware.php2
-rw-r--r--settings/admin.php3
-rw-r--r--settings/js/admin.js4
-rw-r--r--settings/js/apps.js10
-rw-r--r--settings/js/certificates.js4
-rw-r--r--settings/js/personal.js17
-rw-r--r--settings/js/users/deleteHandler.js2
-rw-r--r--settings/js/users/groups.js2
-rw-r--r--settings/l10n/bg_BG.js1
-rw-r--r--settings/l10n/bg_BG.json1
-rw-r--r--settings/l10n/cs_CZ.js2
-rw-r--r--settings/l10n/cs_CZ.json2
-rw-r--r--settings/l10n/de.js3
-rw-r--r--settings/l10n/de.json3
-rw-r--r--settings/l10n/de_AT.js9
-rw-r--r--settings/l10n/de_AT.json9
-rw-r--r--settings/l10n/de_DE.js1
-rw-r--r--settings/l10n/de_DE.json1
-rw-r--r--settings/l10n/en_GB.js7
-rw-r--r--settings/l10n/en_GB.json7
-rw-r--r--settings/l10n/es.js2
-rw-r--r--settings/l10n/es.json2
-rw-r--r--settings/l10n/fi_FI.js1
-rw-r--r--settings/l10n/fi_FI.json1
-rw-r--r--settings/l10n/hu_HU.js25
-rw-r--r--settings/l10n/hu_HU.json25
-rw-r--r--settings/l10n/it.js1
-rw-r--r--settings/l10n/it.json1
-rw-r--r--settings/l10n/nb_NO.js6
-rw-r--r--settings/l10n/nb_NO.json6
-rw-r--r--settings/l10n/nl.js1
-rw-r--r--settings/l10n/nl.json1
-rw-r--r--settings/l10n/pt_BR.js1
-rw-r--r--settings/l10n/pt_BR.json1
-rw-r--r--settings/l10n/pt_PT.js1
-rw-r--r--settings/l10n/pt_PT.json1
-rw-r--r--settings/l10n/sl.js2
-rw-r--r--settings/l10n/sl.json2
-rw-r--r--settings/l10n/sq.js1
-rw-r--r--settings/l10n/sq.json1
-rw-r--r--settings/l10n/sv.js1
-rw-r--r--settings/l10n/sv.json1
-rw-r--r--settings/l10n/th_TH.js15
-rw-r--r--settings/l10n/th_TH.json15
-rw-r--r--settings/personal.php3
-rw-r--r--settings/templates/apps.php8
-rw-r--r--settings/tests/js/users/deleteHandlerSpec.js14
-rw-r--r--tests/core/command/encryption/changekeystorageroottest.php4
-rw-r--r--tests/core/command/maintenance/datafingerprinttest.php64
-rw-r--r--tests/core/controller/LoginControllerTest.php267
-rw-r--r--tests/core/templates/templates.php20
-rw-r--r--tests/data/app/expected-info.json4
-rw-r--r--tests/lib/app/codechecker/infocheckertest.php2
-rw-r--r--tests/lib/app/infoparser.php16
-rw-r--r--tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php21
-rw-r--r--tests/lib/appframework/routing/RoutingTest.php2
-rw-r--r--tests/lib/backgroundjob/joblist.php17
-rw-r--r--tests/lib/files/filesystem.php44
-rw-r--r--tests/lib/files/storage/local.php14
-rw-r--r--tests/lib/files/storage/wrapper/encryption.php9
-rw-r--r--tests/lib/files/stream/encryption.php2
-rw-r--r--tests/lib/files/utils/scanner.php24
-rw-r--r--tests/lib/files/view.php20
-rw-r--r--tests/lib/group.php16
-rw-r--r--tests/lib/group/dummy.php2
-rw-r--r--tests/lib/group/manager.php2
-rw-r--r--tests/lib/repair.php10
-rw-r--r--tests/lib/repair/cleantags.php16
-rw-r--r--tests/lib/repair/dropoldjobs.php8
-rw-r--r--tests/lib/repair/dropoldtables.php8
-rw-r--r--tests/lib/repair/oldgroupmembershipsharestest.php8
-rw-r--r--tests/lib/repair/removegetetagentriestest.php8
-rw-r--r--tests/lib/repair/repaircollation.php9
-rw-r--r--tests/lib/repair/repairinnodb.php11
-rw-r--r--tests/lib/repair/repairinvalidsharestest.php18
-rw-r--r--tests/lib/repair/repairlegacystorage.php47
-rw-r--r--tests/lib/repair/repairmimetypes.php20
-rw-r--r--tests/lib/repair/repairsharepropagation.php8
-rw-r--r--tests/lib/repair/repairsqliteautoincrement.php8
-rw-r--r--tests/lib/repair/updateoutdatedocsids.php2
-rw-r--r--tests/lib/security/certificate.php8
-rw-r--r--tests/lib/share/share.php158
-rw-r--r--tests/lib/share20/defaultshareprovidertest.php58
-rw-r--r--tests/lib/share20/managertest.php50
-rw-r--r--tests/lib/testcase.php68
-rw-r--r--tests/lib/traits/encryptiontrait.php2
-rw-r--r--tests/lib/updater.php239
-rw-r--r--tests/lib/updater/versioncheck.php289
-rw-r--r--tests/lib/util/group/dummy.php (renamed from lib/private/group/dummy.php)6
-rw-r--r--tests/phpunit-autotest-external.xml2
-rw-r--r--tests/settings/middleware/subadminmiddlewaretest.php4
1233 files changed, 15387 insertions, 12162 deletions
diff --git a/.mention-bot b/.mention-bot
index 5997a7a03bb..91ad57d8509 100644
--- a/.mention-bot
+++ b/.mention-bot
@@ -11,8 +11,8 @@
{
"name": "nickvergessen",
"files": [
- "lib/private/activity/**",
- "lib/private/notification/**",
+ "lib/private/Activity/**",
+ "lib/private/Notification/**",
"lib/public/activity/**",
"lib/public/notification/**"
]
diff --git a/3rdparty b/3rdparty
-Subproject 631b7de7cebfb85f4877bbb77ff32c1b735c1ee
+Subproject 16f2894332848adba757cc7add9d21a4ff1a6d1
diff --git a/apps/comments/activity/extension.php b/apps/comments/activity/extension.php
index 6bf7cae5882..ef800e88abc 100644
--- a/apps/comments/activity/extension.php
+++ b/apps/comments/activity/extension.php
@@ -80,7 +80,10 @@ class Extension implements IExtension {
$l = $this->getL10N($languageCode);
return array(
- self::APP_NAME => (string) $l->t('<strong>Comments</strong> for files'),
+ self::APP_NAME => [
+ 'desc' => (string) $l->t('<strong>Comments</strong> for files <em>(always listed in stream)</em>'),
+ 'methods' => [self::METHOD_MAIL], // self::METHOD_STREAM is forced true by the default value
+ ],
);
}
@@ -274,7 +277,11 @@ class Extension implements IExtension {
*/
public function filterNotificationTypes($types, $filter) {
if ($filter === self::APP_NAME) {
- return array_intersect($types, [self::APP_NAME]);
+ return [self::APP_NAME];
+ }
+ if (in_array($filter, ['all', 'by', 'self', 'filter'])) {
+ $types[] = self::APP_NAME;
+ return $types;
}
return false;
}
diff --git a/apps/comments/l10n/cs_CZ.js b/apps/comments/l10n/cs_CZ.js
index 73190bcb567..872020eee66 100644
--- a/apps/comments/l10n/cs_CZ.js
+++ b/apps/comments/l10n/cs_CZ.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
"You commented" : "Okomentoval(a) jsi",
"%1$s commented" : "%1$s okomentován",
"You commented on %2$s" : "Okomentoval(a) jsi %2$s",
diff --git a/apps/comments/l10n/cs_CZ.json b/apps/comments/l10n/cs_CZ.json
index ca6f727bb0f..ab470d98989 100644
--- a/apps/comments/l10n/cs_CZ.json
+++ b/apps/comments/l10n/cs_CZ.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Komentáře</strong> souborů",
"You commented" : "Okomentoval(a) jsi",
"%1$s commented" : "%1$s okomentován",
"You commented on %2$s" : "Okomentoval(a) jsi %2$s",
diff --git a/apps/comments/l10n/da.js b/apps/comments/l10n/da.js
index 5725a7b57c6..196a298a61a 100644
--- a/apps/comments/l10n/da.js
+++ b/apps/comments/l10n/da.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> til filer",
"You commented" : "Du kommenterede",
"%1$s commented" : "%1$s kommenterede",
"You commented on %2$s" : "Du kommenterede %2$s",
diff --git a/apps/comments/l10n/da.json b/apps/comments/l10n/da.json
index a7b12851157..f9ce94f7d70 100644
--- a/apps/comments/l10n/da.json
+++ b/apps/comments/l10n/da.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> til filer",
"You commented" : "Du kommenterede",
"%1$s commented" : "%1$s kommenterede",
"You commented on %2$s" : "Du kommenterede %2$s",
diff --git a/apps/comments/l10n/de.js b/apps/comments/l10n/de.js
index 0e51b02662a..e9873ed9ad6 100644
--- a/apps/comments/l10n/de.js
+++ b/apps/comments/l10n/de.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
"You commented" : "Du hast kommentiert",
"%1$s commented" : "%1$s kommentierte",
"You commented on %2$s" : "Du hast %2$s kommentiert",
diff --git a/apps/comments/l10n/de.json b/apps/comments/l10n/de.json
index 8dc0bdb0427..1109a095af0 100644
--- a/apps/comments/l10n/de.json
+++ b/apps/comments/l10n/de.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
"You commented" : "Du hast kommentiert",
"%1$s commented" : "%1$s kommentierte",
"You commented on %2$s" : "Du hast %2$s kommentiert",
diff --git a/apps/comments/l10n/de_DE.js b/apps/comments/l10n/de_DE.js
index 424ae79e10e..bdd0d8516ce 100644
--- a/apps/comments/l10n/de_DE.js
+++ b/apps/comments/l10n/de_DE.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
"You commented" : "Durch dich kommentiert",
"%1$s commented" : "%1$s kommentiert",
"You commented on %2$s" : "Sie haben %2$s kommentiert",
diff --git a/apps/comments/l10n/de_DE.json b/apps/comments/l10n/de_DE.json
index 4fd810c7006..509cd837d54 100644
--- a/apps/comments/l10n/de_DE.json
+++ b/apps/comments/l10n/de_DE.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
"You commented" : "Durch dich kommentiert",
"%1$s commented" : "%1$s kommentiert",
"You commented on %2$s" : "Sie haben %2$s kommentiert",
diff --git a/apps/comments/l10n/el.js b/apps/comments/l10n/el.js
index 1ca7886fdc5..c88bf2c2ecc 100644
--- a/apps/comments/l10n/el.js
+++ b/apps/comments/l10n/el.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία",
"You commented" : "Σχολιάσατε",
"%1$s commented" : "%1$s σχολίασε",
"You commented on %2$s" : "Σχολιάσατε στο %2$s",
diff --git a/apps/comments/l10n/el.json b/apps/comments/l10n/el.json
index 234f6b79045..30c1fb9de34 100644
--- a/apps/comments/l10n/el.json
+++ b/apps/comments/l10n/el.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Σχόλια</strong> για αρχεία",
"You commented" : "Σχολιάσατε",
"%1$s commented" : "%1$s σχολίασε",
"You commented on %2$s" : "Σχολιάσατε στο %2$s",
diff --git a/apps/comments/l10n/en_GB.js b/apps/comments/l10n/en_GB.js
index 04a366a4f6d..cabce50d16d 100644
--- a/apps/comments/l10n/en_GB.js
+++ b/apps/comments/l10n/en_GB.js
@@ -1,8 +1,9 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
+ "You commented" : "You commented",
"%1$s commented" : "%1$s commented",
+ "You commented on %2$s" : "You commented on %2$s",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"Comments" : "Comments",
"Type in a new comment..." : "Type in a new comment...",
diff --git a/apps/comments/l10n/en_GB.json b/apps/comments/l10n/en_GB.json
index c43c1f4a629..2b4e51ccd80 100644
--- a/apps/comments/l10n/en_GB.json
+++ b/apps/comments/l10n/en_GB.json
@@ -1,6 +1,7 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
+ "You commented" : "You commented",
"%1$s commented" : "%1$s commented",
+ "You commented on %2$s" : "You commented on %2$s",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"Comments" : "Comments",
"Type in a new comment..." : "Type in a new comment...",
diff --git a/apps/comments/l10n/eo.js b/apps/comments/l10n/eo.js
index 515156d663b..2843625bc5b 100644
--- a/apps/comments/l10n/eo.js
+++ b/apps/comments/l10n/eo.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj",
"%1$s commented" : "%1$s komentis",
"%1$s commented on %2$s" : "%1$s komentis %2$s",
"Comments" : "Komentoj",
diff --git a/apps/comments/l10n/eo.json b/apps/comments/l10n/eo.json
index 33b8109abb9..3fcecdd4e34 100644
--- a/apps/comments/l10n/eo.json
+++ b/apps/comments/l10n/eo.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj",
"%1$s commented" : "%1$s komentis",
"%1$s commented on %2$s" : "%1$s komentis %2$s",
"Comments" : "Komentoj",
diff --git a/apps/comments/l10n/es.js b/apps/comments/l10n/es.js
index 02e45762e09..906b5643f04 100644
--- a/apps/comments/l10n/es.js
+++ b/apps/comments/l10n/es.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Comentarios</strong> en archivos",
"You commented" : "Has comentado",
"%1$s commented" : "%1$s comentados",
"You commented on %2$s" : "Has comentado en %2$s",
diff --git a/apps/comments/l10n/es.json b/apps/comments/l10n/es.json
index 232fea3a18b..7eeade965d2 100644
--- a/apps/comments/l10n/es.json
+++ b/apps/comments/l10n/es.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Comentarios</strong> en archivos",
"You commented" : "Has comentado",
"%1$s commented" : "%1$s comentados",
"You commented on %2$s" : "Has comentado en %2$s",
diff --git a/apps/comments/l10n/et_EE.js b/apps/comments/l10n/et_EE.js
index e950b52a14e..cba33642bfa 100644
--- a/apps/comments/l10n/et_EE.js
+++ b/apps/comments/l10n/et_EE.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Kommentaarid</strong> failidele",
"You commented" : "Sa kommenteerisid",
"%1$s commented" : "%1$s kommenteeris",
"You commented on %2$s" : "Sa kommenteerisid %2$s",
diff --git a/apps/comments/l10n/et_EE.json b/apps/comments/l10n/et_EE.json
index 6a983fd5191..be23a869c28 100644
--- a/apps/comments/l10n/et_EE.json
+++ b/apps/comments/l10n/et_EE.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Kommentaarid</strong> failidele",
"You commented" : "Sa kommenteerisid",
"%1$s commented" : "%1$s kommenteeris",
"You commented on %2$s" : "Sa kommenteerisid %2$s",
diff --git a/apps/comments/l10n/fi_FI.js b/apps/comments/l10n/fi_FI.js
index 741dea8252b..0c503a77586 100644
--- a/apps/comments/l10n/fi_FI.js
+++ b/apps/comments/l10n/fi_FI.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Kommentit</strong> tiedostoille",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentit</strong> tiedostoille <em>(aina listattu luettelossa)</em>",
"You commented" : "Kommentoit",
"%1$s commented" : "%1$s kommentoi",
"You commented on %2$s" : "Kommentoit %2$s",
diff --git a/apps/comments/l10n/fi_FI.json b/apps/comments/l10n/fi_FI.json
index 52a9f1955ef..2821281b0cc 100644
--- a/apps/comments/l10n/fi_FI.json
+++ b/apps/comments/l10n/fi_FI.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Kommentit</strong> tiedostoille",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentit</strong> tiedostoille <em>(aina listattu luettelossa)</em>",
"You commented" : "Kommentoit",
"%1$s commented" : "%1$s kommentoi",
"You commented on %2$s" : "Kommentoit %2$s",
diff --git a/apps/comments/l10n/fr.js b/apps/comments/l10n/fr.js
index fc065bd0db0..64f95662029 100644
--- a/apps/comments/l10n/fr.js
+++ b/apps/comments/l10n/fr.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Commentaires</strong> pour les fichiers",
"You commented" : "Vous avez commenté",
"%1$s commented" : "%1$s a commenté",
"You commented on %2$s" : "Vous avez commenté %2$s",
diff --git a/apps/comments/l10n/fr.json b/apps/comments/l10n/fr.json
index d69887540f9..5d1c1895447 100644
--- a/apps/comments/l10n/fr.json
+++ b/apps/comments/l10n/fr.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Commentaires</strong> pour les fichiers",
"You commented" : "Vous avez commenté",
"%1$s commented" : "%1$s a commenté",
"You commented on %2$s" : "Vous avez commenté %2$s",
diff --git a/apps/comments/l10n/he.js b/apps/comments/l10n/he.js
index 640ec297dd3..e8b5e22222f 100644
--- a/apps/comments/l10n/he.js
+++ b/apps/comments/l10n/he.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>תגובות</strong> לקבצים",
"You commented" : "הערות שלך",
"%1$s commented" : "התקבלו תגובות %1$s",
"You commented on %2$s" : "הערות שלך ב- %2$s",
diff --git a/apps/comments/l10n/he.json b/apps/comments/l10n/he.json
index 0f79918c472..8e38f34839e 100644
--- a/apps/comments/l10n/he.json
+++ b/apps/comments/l10n/he.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>תגובות</strong> לקבצים",
"You commented" : "הערות שלך",
"%1$s commented" : "התקבלו תגובות %1$s",
"You commented on %2$s" : "הערות שלך ב- %2$s",
diff --git a/apps/comments/l10n/hu_HU.js b/apps/comments/l10n/hu_HU.js
index cae1ae5e46f..8f789e19328 100644
--- a/apps/comments/l10n/hu_HU.js
+++ b/apps/comments/l10n/hu_HU.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Hozzászólások</strong> a fájlokhoz",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Hozzászólás</strong> a fájlokhoz <em>(mindig listázásra kerül a hírfolyamon)</em>",
"You commented" : "Hozzászólt",
"%1$s commented" : "%1$s hozzászólt",
"You commented on %2$s" : "Hozzászólt ehhez: %2$s",
diff --git a/apps/comments/l10n/hu_HU.json b/apps/comments/l10n/hu_HU.json
index 268bb7dd3d8..f10a740b510 100644
--- a/apps/comments/l10n/hu_HU.json
+++ b/apps/comments/l10n/hu_HU.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Hozzászólások</strong> a fájlokhoz",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Hozzászólás</strong> a fájlokhoz <em>(mindig listázásra kerül a hírfolyamon)</em>",
"You commented" : "Hozzászólt",
"%1$s commented" : "%1$s hozzászólt",
"You commented on %2$s" : "Hozzászólt ehhez: %2$s",
diff --git a/apps/comments/l10n/id.js b/apps/comments/l10n/id.js
index 28965c9e91e..87a17367b11 100644
--- a/apps/comments/l10n/id.js
+++ b/apps/comments/l10n/id.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Komentar</strong> untuk berkas",
"%1$s commented" : "%1$s dikomentari",
"%1$s commented on %2$s" : "%1$s dikomentari pada %2$s",
"Comments" : "Komentar",
diff --git a/apps/comments/l10n/id.json b/apps/comments/l10n/id.json
index f66594eca16..601e88987a8 100644
--- a/apps/comments/l10n/id.json
+++ b/apps/comments/l10n/id.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Komentar</strong> untuk berkas",
"%1$s commented" : "%1$s dikomentari",
"%1$s commented on %2$s" : "%1$s dikomentari pada %2$s",
"Comments" : "Komentar",
diff --git a/apps/comments/l10n/is.js b/apps/comments/l10n/is.js
index c55ebf7ef85..2330e6fe10b 100644
--- a/apps/comments/l10n/is.js
+++ b/apps/comments/l10n/is.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Athugasemdir</strong> við skrár",
"You commented" : "Þú settir inn athugasemd",
"%1$s commented" : "%1$s setti inn athugasemd",
"You commented on %2$s" : "Þú settir inn athugasemd við %2$s",
diff --git a/apps/comments/l10n/is.json b/apps/comments/l10n/is.json
index 1a73471addf..1fbd21f55dd 100644
--- a/apps/comments/l10n/is.json
+++ b/apps/comments/l10n/is.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Athugasemdir</strong> við skrár",
"You commented" : "Þú settir inn athugasemd",
"%1$s commented" : "%1$s setti inn athugasemd",
"You commented on %2$s" : "Þú settir inn athugasemd við %2$s",
diff --git a/apps/comments/l10n/it.js b/apps/comments/l10n/it.js
index 56660b5a779..c7ad15cf17f 100644
--- a/apps/comments/l10n/it.js
+++ b/apps/comments/l10n/it.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Commenti</strong> sui file",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commenti</strong> sui file <em>(elencati sempre nel flusso)</em>",
"You commented" : "Hai commentato",
"%1$s commented" : "%1$s ha commentato",
"You commented on %2$s" : "Hai commentato su %2$s",
diff --git a/apps/comments/l10n/it.json b/apps/comments/l10n/it.json
index 8d113baa6e4..deb0b5aea80 100644
--- a/apps/comments/l10n/it.json
+++ b/apps/comments/l10n/it.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Commenti</strong> sui file",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commenti</strong> sui file <em>(elencati sempre nel flusso)</em>",
"You commented" : "Hai commentato",
"%1$s commented" : "%1$s ha commentato",
"You commented on %2$s" : "Hai commentato su %2$s",
diff --git a/apps/comments/l10n/ja.js b/apps/comments/l10n/ja.js
index ff20dcedbc6..2a8cc5fb352 100644
--- a/apps/comments/l10n/ja.js
+++ b/apps/comments/l10n/ja.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "ファイルについての<strong>コメント</strong>",
"%1$s commented" : "%1$s がコメントを追加",
"%1$s commented on %2$s" : "%2$s について、%1$s がコメントしました",
"Comments" : "コメント",
diff --git a/apps/comments/l10n/ja.json b/apps/comments/l10n/ja.json
index 603d2e3d49b..d27a4b66160 100644
--- a/apps/comments/l10n/ja.json
+++ b/apps/comments/l10n/ja.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "ファイルについての<strong>コメント</strong>",
"%1$s commented" : "%1$s がコメントを追加",
"%1$s commented on %2$s" : "%2$s について、%1$s がコメントしました",
"Comments" : "コメント",
diff --git a/apps/comments/l10n/ko.js b/apps/comments/l10n/ko.js
index c1aafb01d9c..ac1ed9310cb 100644
--- a/apps/comments/l10n/ko.js
+++ b/apps/comments/l10n/ko.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "파일에 <strong>댓글</strong> 남기기",
"%1$s commented" : "%1$s 님의 댓글",
"%1$s commented on %2$s" : "%2$s에 %1$s 님이 댓글 남김",
"Comments" : "댓글",
diff --git a/apps/comments/l10n/ko.json b/apps/comments/l10n/ko.json
index 5ccd0dc52eb..08356aaf9fa 100644
--- a/apps/comments/l10n/ko.json
+++ b/apps/comments/l10n/ko.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "파일에 <strong>댓글</strong> 남기기",
"%1$s commented" : "%1$s 님의 댓글",
"%1$s commented on %2$s" : "%2$s에 %1$s 님이 댓글 남김",
"Comments" : "댓글",
diff --git a/apps/comments/l10n/nb_NO.js b/apps/comments/l10n/nb_NO.js
index 5d3732da827..fd1dc3c6508 100644
--- a/apps/comments/l10n/nb_NO.js
+++ b/apps/comments/l10n/nb_NO.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> for filer",
"%1$s commented" : "%1$s kommentert",
"%1$s commented on %2$s" : "%1$s kommenterte %2$s",
"Comments" : "Kommentarer",
diff --git a/apps/comments/l10n/nb_NO.json b/apps/comments/l10n/nb_NO.json
index 80724fff6de..151bac73e15 100644
--- a/apps/comments/l10n/nb_NO.json
+++ b/apps/comments/l10n/nb_NO.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> for filer",
"%1$s commented" : "%1$s kommentert",
"%1$s commented on %2$s" : "%1$s kommenterte %2$s",
"Comments" : "Kommentarer",
diff --git a/apps/comments/l10n/nl.js b/apps/comments/l10n/nl.js
index eb9faf55e1a..6accdedddc4 100644
--- a/apps/comments/l10n/nl.js
+++ b/apps/comments/l10n/nl.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Reacties</strong> voor bestanden",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Reacties</strong> voor bestanden <em>(altijd getoond in de stroom)</em>",
"You commented" : "U heeft gereageerd",
"%1$s commented" : "%1$s heeft gereageerd",
"You commented on %2$s" : "U heeft gereageerd op %2$s",
diff --git a/apps/comments/l10n/nl.json b/apps/comments/l10n/nl.json
index d2a811207f6..d4005c329e4 100644
--- a/apps/comments/l10n/nl.json
+++ b/apps/comments/l10n/nl.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Reacties</strong> voor bestanden",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Reacties</strong> voor bestanden <em>(altijd getoond in de stroom)</em>",
"You commented" : "U heeft gereageerd",
"%1$s commented" : "%1$s heeft gereageerd",
"You commented on %2$s" : "U heeft gereageerd op %2$s",
diff --git a/apps/comments/l10n/pl.js b/apps/comments/l10n/pl.js
index 09142286773..c0183e817d5 100644
--- a/apps/comments/l10n/pl.js
+++ b/apps/comments/l10n/pl.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Komentarze</strong> dla plików",
"%1$s commented" : "%1$s skomentował",
"%1$s commented on %2$s" : "%1$s skomentował %2$s",
"Comments" : "Komentarze",
diff --git a/apps/comments/l10n/pl.json b/apps/comments/l10n/pl.json
index 92b9f66bf1c..e2f70b11d90 100644
--- a/apps/comments/l10n/pl.json
+++ b/apps/comments/l10n/pl.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Komentarze</strong> dla plików",
"%1$s commented" : "%1$s skomentował",
"%1$s commented on %2$s" : "%1$s skomentował %2$s",
"Comments" : "Komentarze",
diff --git a/apps/comments/l10n/pt_BR.js b/apps/comments/l10n/pt_BR.js
index 9d143822a99..8130f5127bb 100644
--- a/apps/comments/l10n/pt_BR.js
+++ b/apps/comments/l10n/pt_BR.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Comentários</strong> por arquivos",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comemtários</strong> para arquivos <em>(sempre listados no fluxo)</em>",
"You commented" : "Você comentou",
"%1$s commented" : "%1$s comentado",
"You commented on %2$s" : "Você comentou em %2$s",
diff --git a/apps/comments/l10n/pt_BR.json b/apps/comments/l10n/pt_BR.json
index 10b32799a54..5a48a4d69d2 100644
--- a/apps/comments/l10n/pt_BR.json
+++ b/apps/comments/l10n/pt_BR.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Comentários</strong> por arquivos",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comemtários</strong> para arquivos <em>(sempre listados no fluxo)</em>",
"You commented" : "Você comentou",
"%1$s commented" : "%1$s comentado",
"You commented on %2$s" : "Você comentou em %2$s",
diff --git a/apps/comments/l10n/pt_PT.js b/apps/comments/l10n/pt_PT.js
index 5c874329fcd..458d0864735 100644
--- a/apps/comments/l10n/pt_PT.js
+++ b/apps/comments/l10n/pt_PT.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Comentários</strong> para ficheiros",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentários</strong> para ficheiros <em>(listados sempre na transmissão)</em>",
"You commented" : "Comentou",
"%1$s commented" : "%1$s comentou",
"You commented on %2$s" : "Comentou %2$s",
diff --git a/apps/comments/l10n/pt_PT.json b/apps/comments/l10n/pt_PT.json
index f5fc1d7070b..b46cbf864d6 100644
--- a/apps/comments/l10n/pt_PT.json
+++ b/apps/comments/l10n/pt_PT.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Comentários</strong> para ficheiros",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentários</strong> para ficheiros <em>(listados sempre na transmissão)</em>",
"You commented" : "Comentou",
"%1$s commented" : "%1$s comentou",
"You commented on %2$s" : "Comentou %2$s",
diff --git a/apps/comments/l10n/ru.js b/apps/comments/l10n/ru.js
index 755ca9e5d58..a7c2fbc1411 100644
--- a/apps/comments/l10n/ru.js
+++ b/apps/comments/l10n/ru.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Комментарии</strong> к файлам",
"You commented" : "Вы откомментировали",
"%1$s commented" : "%1$s откомментировано",
"You commented on %2$s" : "Вы откомментировали в %2$s",
diff --git a/apps/comments/l10n/ru.json b/apps/comments/l10n/ru.json
index 7c5d8aa10cc..eea01451765 100644
--- a/apps/comments/l10n/ru.json
+++ b/apps/comments/l10n/ru.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Комментарии</strong> к файлам",
"You commented" : "Вы откомментировали",
"%1$s commented" : "%1$s откомментировано",
"You commented on %2$s" : "Вы откомментировали в %2$s",
diff --git a/apps/comments/l10n/sl.js b/apps/comments/l10n/sl.js
index 79d8fc8e977..b4b78e55571 100644
--- a/apps/comments/l10n/sl.js
+++ b/apps/comments/l10n/sl.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Opombe</strong> datotek",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Opombe</strong> k datotekam <em>(vedno pokaži)</em>",
"You commented" : "Vaša opomba",
"%1$s commented" : "%1$s opomb",
"You commented on %2$s" : "Napisali ste opombo na %2$s",
diff --git a/apps/comments/l10n/sl.json b/apps/comments/l10n/sl.json
index 1e71acbec39..0a1af42d80c 100644
--- a/apps/comments/l10n/sl.json
+++ b/apps/comments/l10n/sl.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Opombe</strong> datotek",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Opombe</strong> k datotekam <em>(vedno pokaži)</em>",
"You commented" : "Vaša opomba",
"%1$s commented" : "%1$s opomb",
"You commented on %2$s" : "Napisali ste opombo na %2$s",
diff --git a/apps/comments/l10n/sq.js b/apps/comments/l10n/sq.js
index fdb47e2425a..da7185bfc13 100644
--- a/apps/comments/l10n/sq.js
+++ b/apps/comments/l10n/sq.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Komente</strong> për kartela",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komente</strong> për kartela <em>(përherë të pranishme në rrjedhë)</em>",
"You commented" : "Komentuat",
"%1$s commented" : "%1$s komentoi",
"You commented on %2$s" : "Komentuat te %2$s",
diff --git a/apps/comments/l10n/sq.json b/apps/comments/l10n/sq.json
index deaeceac8ce..ca3079d07ec 100644
--- a/apps/comments/l10n/sq.json
+++ b/apps/comments/l10n/sq.json
@@ -1,5 +1,5 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Komente</strong> për kartela",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komente</strong> për kartela <em>(përherë të pranishme në rrjedhë)</em>",
"You commented" : "Komentuat",
"%1$s commented" : "%1$s komentoi",
"You commented on %2$s" : "Komentuat te %2$s",
diff --git a/apps/comments/l10n/sr.js b/apps/comments/l10n/sr.js
index aae126ef40f..230f79c9214 100644
--- a/apps/comments/l10n/sr.js
+++ b/apps/comments/l10n/sr.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Коментари</strong> фајлова",
"%1$s commented" : "%1$s коментариса",
"%1$s commented on %2$s" : "%1$s коментариса на %2$s",
"Comments" : "Коментари",
diff --git a/apps/comments/l10n/sr.json b/apps/comments/l10n/sr.json
index 12cdb29deb5..a9940b644e1 100644
--- a/apps/comments/l10n/sr.json
+++ b/apps/comments/l10n/sr.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Коментари</strong> фајлова",
"%1$s commented" : "%1$s коментариса",
"%1$s commented on %2$s" : "%1$s коментариса на %2$s",
"Comments" : "Коментари",
diff --git a/apps/comments/l10n/sv.js b/apps/comments/l10n/sv.js
index 6c3b17555bc..b64ad9e8173 100644
--- a/apps/comments/l10n/sv.js
+++ b/apps/comments/l10n/sv.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> till filer",
"You commented" : "Du kommenterade",
"%1$s commented" : "%1$s har kommenterat",
"You commented on %2$s" : "Du kommenterade %2$s",
diff --git a/apps/comments/l10n/sv.json b/apps/comments/l10n/sv.json
index 6b2e9b7b71d..f7c9db11cf6 100644
--- a/apps/comments/l10n/sv.json
+++ b/apps/comments/l10n/sv.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Kommentarer</strong> till filer",
"You commented" : "Du kommenterade",
"%1$s commented" : "%1$s har kommenterat",
"You commented on %2$s" : "Du kommenterade %2$s",
diff --git a/apps/comments/l10n/th_TH.js b/apps/comments/l10n/th_TH.js
index ba0e9aa812c..0ca41de263a 100644
--- a/apps/comments/l10n/th_TH.js
+++ b/apps/comments/l10n/th_TH.js
@@ -1,8 +1,10 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>แสดงความคิดเห็น</strong> สำหรับไฟล์",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>ความคิดเห็น</strong> สำหรับไฟล์ <em>(ระบุไว้เสมอในสตรีม)</em>",
+ "You commented" : "คุณได้แสดงความคิดเห็นแล้ว",
"%1$s commented" : "%1$s ได้ถูกแสดงความคิดเห็น",
+ "You commented on %2$s" : "คุณได้แสดงความคิดเห็นบน %2$s",
"%1$s commented on %2$s" : "%1$s ได้ถูกแสดงความคิดเห็นบน %2$s",
"Comments" : "ความคิดเห็น",
"Type in a new comment..." : "พิมพ์ความคิดเห็นใหม่ ...",
@@ -11,7 +13,11 @@ OC.L10N.register(
"Cancel" : "ยกเลิก",
"Edit comment" : "แก้ไขความคิดเห็น",
"[Deleted user]" : "[ผู้ใช้ถูกลบไปแล้ว]",
+ "No other comments available" : "ยังไม่มีความคิดเห็นอื่นๆ",
+ "More comments..." : "ความคิดเห็นอื่นๆ ...",
"Save" : "บันทึก",
+ "Allowed characters {count} of {max}" : "อนุญาตให้ใช้ {count} จากทั้งหมด {max} ตัวอักษร",
+ "{count} unread comments" : "{count} ความคิดเห็นที่ยังไม่ได้อ่าน",
"Comment" : "แสดงความคิดเห็น"
},
"nplurals=1; plural=0;");
diff --git a/apps/comments/l10n/th_TH.json b/apps/comments/l10n/th_TH.json
index 02ce39195c7..3267fc6cbef 100644
--- a/apps/comments/l10n/th_TH.json
+++ b/apps/comments/l10n/th_TH.json
@@ -1,6 +1,8 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>แสดงความคิดเห็น</strong> สำหรับไฟล์",
+ "<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>ความคิดเห็น</strong> สำหรับไฟล์ <em>(ระบุไว้เสมอในสตรีม)</em>",
+ "You commented" : "คุณได้แสดงความคิดเห็นแล้ว",
"%1$s commented" : "%1$s ได้ถูกแสดงความคิดเห็น",
+ "You commented on %2$s" : "คุณได้แสดงความคิดเห็นบน %2$s",
"%1$s commented on %2$s" : "%1$s ได้ถูกแสดงความคิดเห็นบน %2$s",
"Comments" : "ความคิดเห็น",
"Type in a new comment..." : "พิมพ์ความคิดเห็นใหม่ ...",
@@ -9,7 +11,11 @@
"Cancel" : "ยกเลิก",
"Edit comment" : "แก้ไขความคิดเห็น",
"[Deleted user]" : "[ผู้ใช้ถูกลบไปแล้ว]",
+ "No other comments available" : "ยังไม่มีความคิดเห็นอื่นๆ",
+ "More comments..." : "ความคิดเห็นอื่นๆ ...",
"Save" : "บันทึก",
+ "Allowed characters {count} of {max}" : "อนุญาตให้ใช้ {count} จากทั้งหมด {max} ตัวอักษร",
+ "{count} unread comments" : "{count} ความคิดเห็นที่ยังไม่ได้อ่าน",
"Comment" : "แสดงความคิดเห็น"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/comments/l10n/tr.js b/apps/comments/l10n/tr.js
index ff5bbca4081..558684161cf 100644
--- a/apps/comments/l10n/tr.js
+++ b/apps/comments/l10n/tr.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "Dosyalar için <strong>yorumlar</strong>",
"You commented" : "Yorum yaptınız",
"%1$s commented" : "%1$s yorumlanmış",
"You commented on %2$s" : "%2$s için yorum yaptınız",
diff --git a/apps/comments/l10n/tr.json b/apps/comments/l10n/tr.json
index 724670c53ae..25d539e57e3 100644
--- a/apps/comments/l10n/tr.json
+++ b/apps/comments/l10n/tr.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "Dosyalar için <strong>yorumlar</strong>",
"You commented" : "Yorum yaptınız",
"%1$s commented" : "%1$s yorumlanmış",
"You commented on %2$s" : "%2$s için yorum yaptınız",
diff --git a/apps/comments/l10n/uk.js b/apps/comments/l10n/uk.js
index a7e1cbad958..e958597b40e 100644
--- a/apps/comments/l10n/uk.js
+++ b/apps/comments/l10n/uk.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>Коментарі</strong> до файлів",
"%1$s commented" : "%1$s прокоментовано",
"%1$s commented on %2$s" : "%1$s прокоментовано у %2$s",
"Comments" : "Коментарі",
diff --git a/apps/comments/l10n/uk.json b/apps/comments/l10n/uk.json
index ff3f3b7dc64..59fb9f7eb76 100644
--- a/apps/comments/l10n/uk.json
+++ b/apps/comments/l10n/uk.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>Коментарі</strong> до файлів",
"%1$s commented" : "%1$s прокоментовано",
"%1$s commented on %2$s" : "%1$s прокоментовано у %2$s",
"Comments" : "Коментарі",
diff --git a/apps/comments/l10n/zh_CN.js b/apps/comments/l10n/zh_CN.js
index edfd32a9926..79d12423208 100644
--- a/apps/comments/l10n/zh_CN.js
+++ b/apps/comments/l10n/zh_CN.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "<strong>评论文件</strong>",
"%1$s commented" : "%1$s 已评论",
"%1$s commented on %2$s" : "%1$s 评论了 %2$s",
"Comments" : "评论",
diff --git a/apps/comments/l10n/zh_CN.json b/apps/comments/l10n/zh_CN.json
index 0eaefb409b1..b27364e4638 100644
--- a/apps/comments/l10n/zh_CN.json
+++ b/apps/comments/l10n/zh_CN.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "<strong>评论文件</strong>",
"%1$s commented" : "%1$s 已评论",
"%1$s commented on %2$s" : "%1$s 评论了 %2$s",
"Comments" : "评论",
diff --git a/apps/comments/l10n/zh_TW.js b/apps/comments/l10n/zh_TW.js
index 41c0dd4b0f2..251752fedb8 100644
--- a/apps/comments/l10n/zh_TW.js
+++ b/apps/comments/l10n/zh_TW.js
@@ -1,7 +1,6 @@
OC.L10N.register(
"comments",
{
- "<strong>Comments</strong> for files" : "檔案的<strong>留言</strong>",
"You commented" : "您留言",
"%1$s commented" : "%1$s 留言",
"You commented on %2$s" : "您對 %2$s 留言",
diff --git a/apps/comments/l10n/zh_TW.json b/apps/comments/l10n/zh_TW.json
index 7fe1b0fb1fa..d75f11523b9 100644
--- a/apps/comments/l10n/zh_TW.json
+++ b/apps/comments/l10n/zh_TW.json
@@ -1,5 +1,4 @@
{ "translations": {
- "<strong>Comments</strong> for files" : "檔案的<strong>留言</strong>",
"You commented" : "您留言",
"%1$s commented" : "%1$s 留言",
"You commented on %2$s" : "您對 %2$s 留言",
diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php
index 593cd770be5..c3811a40845 100644
--- a/apps/dav/appinfo/application.php
+++ b/apps/dav/appinfo/application.php
@@ -30,10 +30,6 @@ use OCA\DAV\CardDAV\SyncService;
use OCA\DAV\Connector\Sabre\Principal;
use OCA\DAV\DAV\GroupPrincipalBackend;
use OCA\DAV\HookManager;
-use OCA\Dav\Migration\AddressBookAdapter;
-use OCA\Dav\Migration\CalendarAdapter;
-use OCA\Dav\Migration\MigrateAddressbooks;
-use OCA\Dav\Migration\MigrateCalendars;
use \OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
use OCP\Contacts\IManager;
@@ -98,30 +94,6 @@ class Application extends App {
return new CalDavBackend($db, $principal);
});
- $container->registerService('MigrateAddressbooks', function($c) {
- /** @var IAppContainer $c */
- $db = $c->getServer()->getDatabaseConnection();
- $logger = $c->getServer()->getLogger();
- return new MigrateAddressbooks(
- new AddressBookAdapter($db),
- $c->query('CardDavBackend'),
- $logger,
- null
- );
- });
-
- $container->registerService('MigrateCalendars', function($c) {
- /** @var IAppContainer $c */
- $db = $c->getServer()->getDatabaseConnection();
- $logger = $c->getServer()->getLogger();
- return new MigrateCalendars(
- new CalendarAdapter($db),
- $c->query('CalDavBackend'),
- $logger,
- null
- );
- });
-
$container->registerService('BirthdayService', function($c) {
/** @var IAppContainer $c */
$g = new GroupPrincipalBackend(
@@ -186,38 +158,6 @@ class Application extends App {
$jl->add(new SyncJob());
}
- public function migrateAddressbooks() {
- try {
- /** @var MigrateAddressbooks $migration */
- $migration = $this->getContainer()->query('MigrateAddressbooks');
- $migration->setup();
- $userManager = $this->getContainer()->getServer()->getUserManager();
-
- $userManager->callForAllUsers(function($user) use($migration) {
- /** @var IUser $user */
- $migration->migrateForUser($user->getUID());
- });
- } catch (\Exception $ex) {
- $this->getContainer()->getServer()->getLogger()->logException($ex);
- }
- }
-
- public function migrateCalendars() {
- try {
- /** @var MigrateCalendars $migration */
- $migration = $this->getContainer()->query('MigrateCalendars');
- $migration->setup();
- $userManager = $this->getContainer()->getServer()->getUserManager();
-
- $userManager->callForAllUsers(function($user) use($migration) {
- /** @var IUser $user */
- $migration->migrateForUser($user->getUID());
- });
- } catch (\Exception $ex) {
- $this->getContainer()->getServer()->getLogger()->logException($ex);
- }
- }
-
public function generateBirthdays() {
try {
/** @var BirthdayService $migration */
diff --git a/apps/dav/appinfo/install.php b/apps/dav/appinfo/install.php
index dc5ae39226e..fbd41d25f49 100644
--- a/apps/dav/appinfo/install.php
+++ b/apps/dav/appinfo/install.php
@@ -23,6 +23,4 @@ use OCA\Dav\AppInfo\Application;
$app = new Application();
$app->setupCron();
-$app->migrateAddressbooks();
-$app->migrateCalendars();
$app->generateBirthdays();
diff --git a/apps/dav/appinfo/register_command.php b/apps/dav/appinfo/register_command.php
index 570848f0b23..b3ab25a99e3 100644
--- a/apps/dav/appinfo/register_command.php
+++ b/apps/dav/appinfo/register_command.php
@@ -21,8 +21,6 @@
use OCA\Dav\AppInfo\Application;
use OCA\DAV\Command\CreateAddressBook;
use OCA\DAV\Command\CreateCalendar;
-use OCA\Dav\Command\MigrateAddressbooks;
-use OCA\Dav\Command\MigrateCalendars;
use OCA\DAV\Command\SyncBirthdayCalendar;
use OCA\DAV\Command\SyncSystemAddressBook;
@@ -37,5 +35,3 @@ $application->add(new CreateCalendar($userManager, $groupManager, $dbConnection)
$application->add(new CreateAddressBook($userManager, $app->getContainer()->query('CardDavBackend')));
$application->add(new SyncSystemAddressBook($app->getSyncService()));
$application->add(new SyncBirthdayCalendar($userManager, $app->getContainer()->query('BirthdayService')));
-$application->add(new MigrateAddressbooks($userManager, $app->getContainer()->query('MigrateAddressbooks')));
-$application->add(new MigrateCalendars($userManager, $app->getContainer()->query('MigrateCalendars')));
diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php
index b26e9ebe7c8..39c169728b9 100644
--- a/apps/dav/appinfo/v1/publicwebdav.php
+++ b/apps/dav/appinfo/v1/publicwebdav.php
@@ -30,6 +30,7 @@ $RUNTIME_APPTYPES = ['filesystem', 'authentication', 'logging'];
OC_App::loadApps($RUNTIME_APPTYPES);
OC_Util::obEnd();
+\OC::$server->getSession()->close();
// Backends
$authBackend = new OCA\DAV\Connector\PublicAuth(
@@ -54,7 +55,9 @@ $linkCheckPlugin = new \OCA\DAV\Files\Sharing\PublicLinkCheckPlugin();
$server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, function (\Sabre\DAV\Server $server) use ($authBackend, $linkCheckPlugin) {
$isAjax = (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest');
- if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false && !$isAjax) {
+ $federatedSharingApp = new \OCA\FederatedFileSharing\AppInfo\Application('federatedfilesharing');
+ $federatedShareProvider = $federatedSharingApp->getFederatedShareProvider();
+ if ($federatedShareProvider->isOutgoingServer2serverShareEnabled() === false && !$isAjax) {
// this is what is thrown when trying to access a non-existing share
throw new \Sabre\DAV\Exception\NotAuthenticated();
}
diff --git a/apps/dav/bin/chunkperf.php b/apps/dav/bin/chunkperf.php
new file mode 100644
index 00000000000..a193f001a41
--- /dev/null
+++ b/apps/dav/bin/chunkperf.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+require '../../../../3rdparty/autoload.php';
+
+if ($argc !== 6) {
+ echo "Invalid number of arguments" . PHP_EOL;
+ exit;
+}
+
+/**
+ * @param \Sabre\DAV\Client $client
+ * @param $uploadUrl
+ * @return mixed
+ */
+function request($client, $method, $uploadUrl, $data = null, $headers = []) {
+ echo "$method $uploadUrl ... ";
+ $t0 = microtime(true);
+ $result = $client->request($method, $uploadUrl, $data, $headers);
+ $t1 = microtime(true);
+ echo $result['statusCode'] . " - " . ($t1 - $t0) . ' seconds' . PHP_EOL;
+ if (!in_array($result['statusCode'], [200, 201])) {
+ echo $result['body'] . PHP_EOL;
+ }
+ return $result;
+}
+
+$baseUri = $argv[1];
+$userName = $argv[2];
+$password = $argv[3];
+$file = $argv[4];
+$chunkSize = $argv[5] * 1024 * 1024;
+
+$client = new \Sabre\DAV\Client([
+ 'baseUri' => $baseUri,
+ 'userName' => $userName,
+ 'password' => $password
+]);
+
+$transfer = uniqid('transfer', true);
+$uploadUrl = "$baseUri/uploads/$userName/$transfer";
+
+request($client, 'MKCOL', $uploadUrl);
+
+$size = filesize($file);
+$stream = fopen($file, 'r');
+
+$index = 0;
+while(!feof($stream)) {
+ request($client, 'PUT', "$uploadUrl/$index", fread($stream, $chunkSize));
+ $index++;
+}
+
+$destination = pathinfo($file, PATHINFO_BASENAME);
+//echo "Moving $uploadUrl/.file to it's final destination $baseUri/files/$userName/$destination" . PHP_EOL;
+request($client, 'MOVE', "$uploadUrl/.file", null, [
+ 'Destination' => "$baseUri/files/$userName/$destination"
+]);
diff --git a/apps/dav/command/migrateaddressbooks.php b/apps/dav/command/migrateaddressbooks.php
deleted file mode 100644
index 562f19a2300..00000000000
--- a/apps/dav/command/migrateaddressbooks.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Dav\Command;
-
-use OCP\IUser;
-use OCP\IUserManager;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Helper\ProgressBar;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class MigrateAddressbooks extends Command {
-
- /** @var IUserManager */
- protected $userManager;
-
- /** @var \OCA\Dav\Migration\MigrateAddressbooks */
- private $service;
-
- /**
- * @param IUserManager $userManager
- * @param \OCA\Dav\Migration\MigrateAddressbooks $service
- */
- function __construct(IUserManager $userManager,
- \OCA\Dav\Migration\MigrateAddressbooks $service
- ) {
- parent::__construct();
- $this->userManager = $userManager;
- $this->service = $service;
- }
-
- protected function configure() {
- $this
- ->setName('dav:migrate-addressbooks')
- ->setDescription('Migrate addressbooks from the contacts app to core')
- ->addArgument('user',
- InputArgument::OPTIONAL,
- 'User for whom all addressbooks will be migrated');
- }
-
- protected function execute(InputInterface $input, OutputInterface $output) {
- $this->service->setup();
-
- $user = $input->getArgument('user');
- if (!is_null($user)) {
- if (!$this->userManager->userExists($user)) {
- throw new \InvalidArgumentException("User <$user> in unknown.");
- }
- $output->writeln("Start migration for $user");
- $this->service->migrateForUser($user);
- return;
- }
- $output->writeln("Start migration of all known users ...");
- $p = new ProgressBar($output);
- $p->start();
- $this->userManager->callForAllUsers(function($user) use ($p) {
- $p->advance();
- /** @var IUser $user */
- $this->service->migrateForUser($user->getUID());
- });
-
- $p->finish();
- $output->writeln('');
- }
-}
diff --git a/apps/dav/command/migratecalendars.php b/apps/dav/command/migratecalendars.php
deleted file mode 100644
index d887309ac3e..00000000000
--- a/apps/dav/command/migratecalendars.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\Dav\Command;
-
-use OCP\IUser;
-use OCP\IUserManager;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Helper\ProgressBar;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class MigrateCalendars extends Command {
-
- /** @var IUserManager */
- protected $userManager;
-
- /** @var \OCA\Dav\Migration\MigrateCalendars */
- private $service;
-
- /**
- * @param IUserManager $userManager
- * @param \OCA\Dav\Migration\MigrateCalendars $service
- */
- function __construct(IUserManager $userManager,
- \OCA\Dav\Migration\MigrateCalendars $service
- ) {
- parent::__construct();
- $this->userManager = $userManager;
- $this->service = $service;
- }
-
- protected function configure() {
- $this
- ->setName('dav:migrate-calendars')
- ->setDescription('Migrate calendars from the calendar app to core')
- ->addArgument('user',
- InputArgument::OPTIONAL,
- 'User for whom all calendars will be migrated');
- }
-
- protected function execute(InputInterface $input, OutputInterface $output) {
- $this->service->setup();
-
- $user = $input->getArgument('user');
- if (!is_null($user)) {
- if (!$this->userManager->userExists($user)) {
- throw new \InvalidArgumentException("User <$user> in unknown.");
- }
- $output->writeln("Start migration for $user");
- $this->service->migrateForUser($user);
- return;
- }
- $output->writeln("Start migration of all known users ...");
- $p = new ProgressBar($output);
- $p->start();
- $this->userManager->callForAllUsers(function($user) use ($p) {
- $p->advance();
- /** @var IUser $user */
- $this->service->migrateForUser($user->getUID());
- });
-
- $p->finish();
- $output->writeln('');
- }
-}
diff --git a/apps/dav/lib/caldav/calendar.php b/apps/dav/lib/caldav/calendar.php
index 5072d96107e..f3637692e43 100644
--- a/apps/dav/lib/caldav/calendar.php
+++ b/apps/dav/lib/caldav/calendar.php
@@ -22,17 +22,18 @@
namespace OCA\DAV\CalDAV;
use OCA\DAV\DAV\Sharing\IShareable;
+use OCP\IL10N;
use Sabre\CalDAV\Backend\BackendInterface;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\PropPatch;
class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
- public function __construct(BackendInterface $caldavBackend, $calendarInfo) {
+ public function __construct(BackendInterface $caldavBackend, $calendarInfo, IL10N $l10n) {
parent::__construct($caldavBackend, $calendarInfo);
if ($this->getName() === BirthdayService::BIRTHDAY_CALENDAR_URI) {
- $this->calendarInfo['{http://sabredav.org/ns}read-only'] = true;
+ $this->calendarInfo['{DAV:}displayname'] = $l10n->t('Contact birthdays');
}
}
@@ -92,11 +93,13 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable {
'principal' => $this->getOwner(),
'protected' => true,
]];
- $acl[] = [
- 'privilege' => '{DAV:}write',
- 'principal' => $this->getOwner(),
- 'protected' => true,
- ];
+ if ($this->getName() !== BirthdayService::BIRTHDAY_CALENDAR_URI) {
+ $acl[] = [
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ];
+ }
if ($this->getOwner() !== parent::getOwner()) {
$acl[] = [
'privilege' => '{DAV:}read',
diff --git a/apps/dav/lib/caldav/calendarhome.php b/apps/dav/lib/caldav/calendarhome.php
index 87b8d4bb320..a4c485a8983 100644
--- a/apps/dav/lib/caldav/calendarhome.php
+++ b/apps/dav/lib/caldav/calendarhome.php
@@ -21,6 +21,7 @@
*/
namespace OCA\DAV\CalDAV;
+use Sabre\CalDAV\Backend\BackendInterface;
use Sabre\CalDAV\Backend\NotificationSupport;
use Sabre\CalDAV\Backend\SchedulingSupport;
use Sabre\CalDAV\Backend\SubscriptionSupport;
@@ -31,34 +32,42 @@ use Sabre\DAV\Exception\NotFound;
class CalendarHome extends \Sabre\CalDAV\CalendarHome {
+ /** @var \OCP\IL10N */
+ private $l10n;
+
+ public function __construct(BackendInterface $caldavBackend, $principalInfo) {
+ parent::__construct($caldavBackend, $principalInfo);
+ $this->l10n = \OC::$server->getL10N('dav');
+ }
+
/**
* @inheritdoc
*/
function getChildren() {
$calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']);
- $objs = [];
+ $objects = [];
foreach ($calendars as $calendar) {
- $objs[] = new Calendar($this->caldavBackend, $calendar);
+ $objects[] = new Calendar($this->caldavBackend, $calendar, $this->l10n);
}
if ($this->caldavBackend instanceof SchedulingSupport) {
- $objs[] = new Inbox($this->caldavBackend, $this->principalInfo['uri']);
- $objs[] = new Outbox($this->principalInfo['uri']);
+ $objects[] = new Inbox($this->caldavBackend, $this->principalInfo['uri']);
+ $objects[] = new Outbox($this->principalInfo['uri']);
}
// We're adding a notifications node, if it's supported by the backend.
if ($this->caldavBackend instanceof NotificationSupport) {
- $objs[] = new \Sabre\CalDAV\Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']);
+ $objects[] = new \Sabre\CalDAV\Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']);
}
// If the backend supports subscriptions, we'll add those as well,
if ($this->caldavBackend instanceof SubscriptionSupport) {
foreach ($this->caldavBackend->getSubscriptionsForUser($this->principalInfo['uri']) as $subscription) {
- $objs[] = new Subscription($this->caldavBackend, $subscription);
+ $objects[] = new Subscription($this->caldavBackend, $subscription);
}
}
- return $objs;
+ return $objects;
}
/**
@@ -79,7 +88,7 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
// Calendars
foreach ($this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']) as $calendar) {
if ($calendar['uri'] === $name) {
- return new Calendar($this->caldavBackend, $calendar);
+ return new Calendar($this->caldavBackend, $calendar, $this->l10n);
}
}
@@ -94,4 +103,4 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
throw new NotFound('Node with name \'' . $name . '\' could not be found');
}
-} \ No newline at end of file
+}
diff --git a/apps/dav/lib/connector/sabre/file.php b/apps/dav/lib/connector/sabre/file.php
index 6b698c6e5a9..943e9150e74 100644
--- a/apps/dav/lib/connector/sabre/file.php
+++ b/apps/dav/lib/connector/sabre/file.php
@@ -143,7 +143,7 @@ class File extends Node implements IFile {
// if content length is sent by client:
// double check if the file was fully received
// compare expected and actual size
- if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['REQUEST_METHOD'] !== 'LOCK') {
+ if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['REQUEST_METHOD'] === 'PUT') {
$expected = $_SERVER['CONTENT_LENGTH'];
if ($count != $expected) {
throw new BadRequest('expected filesize ' . $expected . ' got ' . $count);
diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php
index 8b54291793a..8822deb1661 100644
--- a/apps/dav/lib/connector/sabre/filesplugin.php
+++ b/apps/dav/lib/connector/sabre/filesplugin.php
@@ -28,24 +28,27 @@
namespace OCA\DAV\Connector\Sabre;
use OC\Files\View;
+use OCA\DAV\Upload\FutureFile;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\IFile;
use \Sabre\DAV\PropFind;
use \Sabre\DAV\PropPatch;
+use Sabre\DAV\ServerPlugin;
use Sabre\DAV\Tree;
use \Sabre\HTTP\RequestInterface;
use \Sabre\HTTP\ResponseInterface;
use OCP\Files\StorageNotAvailableException;
+use OCP\IConfig;
-class FilesPlugin extends \Sabre\DAV\ServerPlugin {
+class FilesPlugin extends ServerPlugin {
// namespace
const NS_OWNCLOUD = 'http://owncloud.org/ns';
const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id';
const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid';
const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions';
- const SHARE_PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}share-permissions';
+ const SHARE_PERMISSIONS_PROPERTYNAME = '{http://open-collaboration-services.org/ns}share-permissions';
const DOWNLOADURL_PROPERTYNAME = '{http://owncloud.org/ns}downloadURL';
const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size';
const GETETAG_PROPERTYNAME = '{DAV:}getetag';
@@ -53,6 +56,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id';
const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums';
+ const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint';
/**
* Reference to main server object
@@ -85,6 +89,11 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
private $downloadAttachment;
/**
+ * @var IConfig
+ */
+ private $config;
+
+ /**
* @param Tree $tree
* @param View $view
* @param bool $isPublic
@@ -92,10 +101,12 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
*/
public function __construct(Tree $tree,
View $view,
+ IConfig $config,
$isPublic = false,
$downloadAttachment = true) {
$this->tree = $tree;
$this->fileView = $view;
+ $this->config = $config;
$this->isPublic = $isPublic;
$this->downloadAttachment = $downloadAttachment;
}
@@ -123,6 +134,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
$server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME;
$server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
$server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME;
+ $server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME;
// normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
$allowedProperties = ['{DAV:}getetag'];
@@ -146,11 +158,17 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
/**
* Plugin that checks if a move can actually be performed.
+ *
* @param string $source source path
* @param string $destination destination path
* @throws Forbidden
+ * @throws NotFound
*/
function checkMove($source, $destination) {
+ $sourceNode = $this->tree->getNodeForPath($source);
+ if ($sourceNode instanceof FutureFile) {
+ return;
+ }
list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($source);
list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destination);
@@ -228,6 +246,8 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
*/
public function handleGetProperties(PropFind $propFind, \Sabre\DAV\INode $node) {
+ $httpRequest = $this->server->httpRequest;
+
if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
$propFind->handle(self::FILEID_PROPERTYNAME, function() use ($node) {
@@ -247,8 +267,10 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
return $perms;
});
- $propFind->handle(self::SHARE_PERMISSIONS_PROPERTYNAME, function() use ($node) {
- return $node->getSharePermissions();
+ $propFind->handle(self::SHARE_PERMISSIONS_PROPERTYNAME, function() use ($node, $httpRequest) {
+ return $node->getSharePermissions(
+ $httpRequest->getRawServerValue('PHP_AUTH_USER')
+ );
});
$propFind->handle(self::GETETAG_PROPERTYNAME, function() use ($node) {
@@ -264,6 +286,18 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
$displayName = $owner->getDisplayName();
return $displayName;
});
+
+ $propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
+ if ($node->getPath() === '/') {
+ return $this->config->getSystemValue('data-fingerprint', '');
+ }
+ });
+ }
+
+ if ($node instanceof \OCA\DAV\Files\FilesHome) {
+ $propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
+ return $this->config->getSystemValue('data-fingerprint', '');
+ });
}
if ($node instanceof \OCA\DAV\Connector\Sabre\File) {
diff --git a/apps/dav/lib/connector/sabre/node.php b/apps/dav/lib/connector/sabre/node.php
index 9867fe66cd3..ccc035063cd 100644
--- a/apps/dav/lib/connector/sabre/node.php
+++ b/apps/dav/lib/connector/sabre/node.php
@@ -32,6 +32,8 @@ namespace OCA\DAV\Connector\Sabre;
use OC\Files\Mount\MoveableMount;
use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
+use OCP\Share\Exceptions\ShareNotFound;
+use OCP\Share\IManager;
abstract class Node implements \Sabre\DAV\INode {
@@ -61,15 +63,26 @@ abstract class Node implements \Sabre\DAV\INode {
protected $info;
/**
+ * @var IManager
+ */
+ protected $shareManager;
+
+ /**
* Sets up the node, expects a full path name
*
* @param \OC\Files\View $view
* @param \OCP\Files\FileInfo $info
+ * @param IManager $shareManager
*/
- public function __construct($view, $info) {
+ public function __construct($view, $info, IManager $shareManager = null) {
$this->fileView = $view;
$this->path = $this->fileView->getRelativePath($info->getPath());
$this->info = $info;
+ if ($shareManager) {
+ $this->shareManager = $shareManager;
+ } else {
+ $this->shareManager = \OC::$server->getShareManager();
+ }
}
protected function refreshInfo() {
@@ -215,16 +228,28 @@ abstract class Node implements \Sabre\DAV\INode {
}
/**
+ * @param string $user
* @return int
*/
- public function getSharePermissions() {
+ public function getSharePermissions($user) {
+
+ // check of we access a federated share
+ if ($user !== null) {
+ try {
+ $share = $this->shareManager->getShareByToken($user);
+ return $share->getPermissions();
+ } catch (ShareNotFound $e) {
+ // ignore
+ }
+ }
+
$storage = $this->info->getStorage();
$path = $this->info->getInternalPath();
if ($storage->instanceOfStorage('\OC\Files\Storage\Shared')) {
/** @var \OC\Files\Storage\Shared $storage */
- $permissions = (int)$storage->getShare()['permissions'];
+ $permissions = (int)$storage->getShare()->getPermissions();
} else {
$permissions = $storage->getPermissions($path);
}
@@ -246,14 +271,6 @@ abstract class Node implements \Sabre\DAV\INode {
}
/*
- * Without sharing permissions there are also no other permissions
- */
- if (!($permissions & \OCP\Constants::PERMISSION_SHARE) ||
- !($permissions & \OCP\Constants::PERMISSION_READ)) {
- return 0;
- }
-
- /*
* Files can't have create or delete permissions
*/
if ($this->info->getType() === \OCP\Files\FileInfo::TYPE_FILE) {
diff --git a/apps/dav/lib/connector/sabre/serverfactory.php b/apps/dav/lib/connector/sabre/serverfactory.php
index cab7a85d19f..5853370778d 100644
--- a/apps/dav/lib/connector/sabre/serverfactory.php
+++ b/apps/dav/lib/connector/sabre/serverfactory.php
@@ -137,8 +137,15 @@ class ServerFactory {
}
$objectTree->init($root, $view, $this->mountManager);
- $server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($objectTree, $view, false,
- !$this->config->getSystemValue('debug', false)));
+ $server->addPlugin(
+ new \OCA\DAV\Connector\Sabre\FilesPlugin(
+ $objectTree,
+ $view,
+ $this->config,
+ false,
+ !$this->config->getSystemValue('debug', false)
+ )
+ );
$server->addPlugin(new \OCA\DAV\Connector\Sabre\QuotaPlugin($view));
if($this->userSession->isLoggedIn()) {
diff --git a/apps/dav/lib/hookmanager.php b/apps/dav/lib/hookmanager.php
index c3d68a3ee2a..aa3777088f8 100644
--- a/apps/dav/lib/hookmanager.php
+++ b/apps/dav/lib/hookmanager.php
@@ -20,6 +20,7 @@
*/
namespace OCA\DAV;
+use OCA\DAV\CalDAV\BirthdayService;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\SyncService;
@@ -100,24 +101,26 @@ class HookManager {
public function postLogin($params) {
$user = $this->userManager->get($params['uid']);
-
- $principal = 'principals/users/' . $user->getUID();
- $calendars = $this->calDav->getCalendarsForUser($principal);
- if (empty($calendars)) {
- try {
- $this->calDav->createCalendar($principal, 'default', []);
- } catch (\Exception $ex) {
- \OC::$server->getLogger()->logException($ex);
+ if (!is_null($user)) {
+ $principal = 'principals/users/' . $user->getUID();
+ $calendars = $this->calDav->getCalendarsForUser($principal);
+ if (empty($calendars) || (count($calendars) === 1 && $calendars[0]['uri'] === BirthdayService::BIRTHDAY_CALENDAR_URI)) {
+ try {
+ $this->calDav->createCalendar($principal, 'personal', [
+ '{DAV:}displayname' => 'Personal']);
+ } catch (\Exception $ex) {
+ \OC::$server->getLogger()->logException($ex);
+ }
}
- }
- $books = $this->cardDav->getAddressBooksForUser($principal);
- if (empty($books)) {
- try {
- $this->cardDav->createAddressBook($principal, 'default', []);
- } catch (\Exception $ex) {
- \OC::$server->getLogger()->logException($ex);
+ $books = $this->cardDav->getAddressBooksForUser($principal);
+ if (empty($books)) {
+ try {
+ $this->cardDav->createAddressBook($principal, 'contacts', [
+ '{DAV:}displayname' => 'Contacts']);
+ } catch (\Exception $ex) {
+ \OC::$server->getLogger()->logException($ex);
+ }
}
}
-
}
}
diff --git a/apps/dav/lib/migration/addressbookadapter.php b/apps/dav/lib/migration/addressbookadapter.php
deleted file mode 100644
index 5264747a004..00000000000
--- a/apps/dav/lib/migration/addressbookadapter.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\Dav\Migration;
-
-use OCP\IDBConnection;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class AddressBookAdapter {
-
- /** @var \OCP\IDBConnection */
- protected $dbConnection;
-
- /** @var string */
- private $sourceBookTable;
-
- /** @var string */
- private $sourceCardsTable;
-
- /**
- * @param IDBConnection $dbConnection
- * @param string $sourceBookTable
- * @param string $sourceCardsTable
- */
- function __construct(IDBConnection $dbConnection,
- $sourceBookTable = 'contacts_addressbooks',
- $sourceCardsTable = 'contacts_cards') {
- $this->dbConnection = $dbConnection;
- $this->sourceBookTable = $sourceBookTable;
- $this->sourceCardsTable = $sourceCardsTable;
- }
-
- /**
- * @param string $user
- * @param \Closure $callBack
- */
- public function foreachBook($user, \Closure $callBack) {
- // get all addressbooks of that user
- $query = $this->dbConnection->getQueryBuilder();
- $stmt = $query->select('*')->from($this->sourceBookTable)
- ->where($query->expr()->eq('userid', $query->createNamedParameter($user)))
- ->execute();
-
- while($row = $stmt->fetch()) {
- $callBack($row);
- }
- }
-
- public function setup() {
- if (!$this->dbConnection->tableExists($this->sourceBookTable)) {
- throw new \DomainException('Contacts tables are missing. Nothing to do.');
- }
- }
-
- /**
- * @param int $addressBookId
- * @param \Closure $callBack
- */
- public function foreachCard($addressBookId, \Closure $callBack) {
- $query = $this->dbConnection->getQueryBuilder();
- $stmt = $query->select('*')->from($this->sourceCardsTable)
- ->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId)))
- ->execute();
-
- while($row = $stmt->fetch()) {
- $callBack($row);
- }
- }
-
- /**
- * @param int $addressBookId
- * @return array
- */
- public function getShares($addressBookId) {
- $query = $this->dbConnection->getQueryBuilder();
- $shares = $query->select('*')->from('share')
- ->where($query->expr()->eq('item_source', $query->createNamedParameter($addressBookId)))
- ->andWhere($query->expr()->eq('item_type', $query->expr()->literal('addressbook')))
- ->andWhere($query->expr()->in('share_type', [ $query->expr()->literal(0), $query->expr()->literal(1)]))
- ->execute()
- ->fetchAll();
-
- return $shares;
- }
-}
diff --git a/apps/dav/lib/migration/calendaradapter.php b/apps/dav/lib/migration/calendaradapter.php
deleted file mode 100644
index d02f2256c34..00000000000
--- a/apps/dav/lib/migration/calendaradapter.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\Dav\Migration;
-
-use OCP\IDBConnection;
-
-class CalendarAdapter {
-
- /** @var \OCP\IDBConnection */
- protected $dbConnection;
-
- /** @var string */
- private $sourceCalendarTable;
-
- /** @var string */
- private $sourceCalObjTable;
-
- /**
- * @param IDBConnection $dbConnection
- * @param string $sourceCalendarTable
- * @param string $sourceCalObjTable
- */
- function __construct(IDBConnection $dbConnection,
- $sourceCalendarTable = 'clndr_calendars',
- $sourceCalObjTable = 'clndr_objects') {
- $this->dbConnection = $dbConnection;
- $this->sourceCalendarTable = $sourceCalendarTable;
- $this->sourceCalObjTable = $sourceCalObjTable;
- }
-
- /**
- * @param string $user
- * @param \Closure $callBack
- */
- public function foreachCalendar($user, \Closure $callBack) {
- // get all calendars of that user
- $query = $this->dbConnection->getQueryBuilder();
- $stmt = $query->select('*')->from($this->sourceCalendarTable)
- ->where($query->expr()->eq('userid', $query->createNamedParameter($user)))
- ->execute();
-
- while($row = $stmt->fetch()) {
- $callBack($row);
- }
- }
-
- public function setup() {
- if (!$this->dbConnection->tableExists($this->sourceCalendarTable)) {
- throw new \DomainException('Calendar tables are missing. Nothing to do.');
- }
- }
-
- /**
- * @param int $calendarId
- * @param \Closure $callBack
- */
- public function foreachCalendarObject($calendarId, \Closure $callBack) {
- $query = $this->dbConnection->getQueryBuilder();
- $stmt = $query->select('*')->from($this->sourceCalObjTable)
- ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
- ->execute();
-
- while($row = $stmt->fetch()) {
- $callBack($row);
- }
- }
-
- /**
- * @param int $addressBookId
- * @return array
- */
- public function getShares($addressBookId) {
- $query = $this->dbConnection->getQueryBuilder();
- $shares = $query->select('*')->from('share')
- ->where($query->expr()->eq('item_source', $query->createNamedParameter($addressBookId)))
- ->andWhere($query->expr()->eq('item_type', $query->expr()->literal('calendar')))
- ->andWhere($query->expr()->in('share_type', [ $query->expr()->literal(0), $query->expr()->literal(1)]))
- ->execute()
- ->fetchAll();
-
- return $shares;
- }
-}
diff --git a/apps/dav/lib/migration/migrateaddressbooks.php b/apps/dav/lib/migration/migrateaddressbooks.php
deleted file mode 100644
index 7e1f47ea75e..00000000000
--- a/apps/dav/lib/migration/migrateaddressbooks.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\Dav\Migration;
-
-use OCA\DAV\CardDAV\AddressBook;
-use OCA\DAV\CardDAV\CardDavBackend;
-use OCP\ILogger;
-use Sabre\CardDAV\Plugin;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class MigrateAddressbooks {
-
- /** @var AddressBookAdapter */
- protected $adapter;
-
- /** @var CardDavBackend */
- private $backend;
-
- /** @var ILogger */
- private $logger;
-
- /** @var OutputInterface */
- private $consoleOutput;
-
-
- /**
- * @param AddressBookAdapter $adapter
- * @param CardDavBackend $backend
- */
- function __construct(AddressBookAdapter $adapter,
- CardDavBackend $backend,
- ILogger $logger,
- OutputInterface $consoleOutput = null
- ) {
- $this->adapter = $adapter;
- $this->backend = $backend;
- $this->logger = $logger;
- $this->consoleOutput = $consoleOutput;
- }
-
- /**
- * @param string $user
- */
- public function migrateForUser($user) {
-
- $this->adapter->foreachBook($user, function($book) use ($user) {
- $principal = "principals/users/$user";
- $knownBooks = $this->backend->getAddressBooksByUri($principal, $book['uri']);
- if (!is_null($knownBooks)) {
- return;
- }
-
- $newId = $this->backend->createAddressBook($principal, $book['uri'], [
- '{DAV:}displayname' => $book['displayname'],
- '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $book['description']
- ]);
-
- $this->migrateBook($book['id'], $newId);
- $this->migrateShares($book['id'], $newId);
- });
- }
-
- public function setup() {
- $this->adapter->setup();
- }
-
- /**
- * @param int $addressBookId
- * @param int $newAddressBookId
- */
- private function migrateBook($addressBookId, $newAddressBookId) {
- $this->adapter->foreachCard($addressBookId, function($card) use ($newAddressBookId) {
- try {
- $this->backend->createCard($newAddressBookId, $card['uri'], $card['carddata']);
- } catch (\Exception $ex) {
- $eventId = $card['id'];
- $addressBookId = $card['addressbookid'];
- $msg = "One event could not be migrated. (id: $eventId, addressbookid: $addressBookId)";
- $this->logger->logException($ex, ['app' => 'dav', 'message' => $msg]);
- if (!is_null($this->consoleOutput)) {
- $this->consoleOutput->writeln($msg);
- }
- }
- });
- }
-
- /**
- * @param int $addressBookId
- * @param int $newAddressBookId
- */
- private function migrateShares($addressBookId, $newAddressBookId) {
- $shares =$this->adapter->getShares($addressBookId);
- if (empty($shares)) {
- return;
- }
-
- $add = array_map(function($s) {
- $prefix = 'principal:principals/users/';
- if ((int)$s['share_type'] === 1) {
- $prefix = 'principal:principals/groups/';
- }
- return [
- 'href' => $prefix . $s['share_with'],
- 'readOnly' => !((int)$s['permissions'] === 31)
- ];
- }, $shares);
-
- $newAddressBook = $this->backend->getAddressBookById($newAddressBookId);
- $book = new AddressBook($this->backend, $newAddressBook);
- $this->backend->updateShares($book, $add, []);
- }
-}
diff --git a/apps/dav/lib/migration/migratecalendars.php b/apps/dav/lib/migration/migratecalendars.php
deleted file mode 100644
index 3c1487761c2..00000000000
--- a/apps/dav/lib/migration/migratecalendars.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-/**
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\Dav\Migration;
-
-use OCA\DAV\CalDAV\CalDavBackend;
-use OCA\DAV\CalDAV\Calendar;
-use OCP\ILogger;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class MigrateCalendars {
-
- /** @var CalendarAdapter */
- protected $adapter;
-
- /** @var CalDavBackend */
- private $backend;
-
- /** @var ILogger */
- private $logger;
-
- /** @var OutputInterface */
- private $consoleOutput;
-
- /**
- * @param CalendarAdapter $adapter
- * @param CalDavBackend $backend
- */
- function __construct(CalendarAdapter $adapter,
- CalDavBackend $backend,
- ILogger $logger,
- OutputInterface $consoleOutput = null
- ) {
- $this->adapter = $adapter;
- $this->backend = $backend;
- $this->logger = $logger;
- $this->consoleOutput = $consoleOutput;
- }
-
- /**
- * @param string $user
- */
- public function migrateForUser($user) {
-
- $this->adapter->foreachCalendar($user, function($calendar) use ($user) {
- $principal = "principals/users/$user";
- $calendarByUri = $this->backend->getCalendarByUri($principal, $calendar['uri']);
- if (!is_null($calendarByUri)) {
- return;
- }
-
- $newId = $this->backend->createCalendar($principal, $calendar['uri'], [
- '{DAV:}displayname' => $calendar['displayname'],
- '{urn:ietf:params:xml:ns:caldav}calendar-description' => $calendar['displayname'],
- '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => $calendar['timezone'],
- '{http://apple.com/ns/ical/}calendar-order' => $calendar['calendarorder'],
- '{http://apple.com/ns/ical/}calendar-color' => $calendar['calendarcolor'],
- ]);
-
- $this->migrateCalendar($calendar['id'], $newId);
- $this->migrateShares($calendar['id'], $newId);
- });
- }
-
- public function setup() {
- $this->adapter->setup();
- }
-
- /**
- * @param int $calendarId
- * @param int $newCalendarId
- */
- private function migrateCalendar($calendarId, $newCalendarId) {
- $this->adapter->foreachCalendarObject($calendarId, function($calObject) use ($newCalendarId) {
- try {
- $this->backend->createCalendarObject($newCalendarId, $calObject['uri'], $calObject['calendardata']);
- } catch (\Exception $ex) {
- $eventId = $calObject['id'];
- $calendarId = $calObject['calendarId'];
- $msg = "One event could not be migrated. (id: $eventId, calendarid: $calendarId)";
- $this->logger->logException($ex, ['app' => 'dav', 'message' => $msg]);
- if (!is_null($this->consoleOutput)) {
- $this->consoleOutput->writeln($msg);
- }
- }
- });
- }
-
- /**
- * @param int $calendarId
- * @param int $newCalendarId
- */
- private function migrateShares($calendarId, $newCalendarId) {
- $shares =$this->adapter->getShares($calendarId);
- if (empty($shares)) {
- return;
- }
-
- $add = array_map(function($s) {
- $prefix = 'principal:principals/users/';
- if ((int)$s['share_type'] === 1) {
- $prefix = 'principal:principals/groups/';
- }
- return [
- 'href' => $prefix . $s['share_with'],
- 'readOnly' => !((int)$s['permissions'] === 31)
- ];
- }, $shares);
-
- $newCalendar = $this->backend->getCalendarById($newCalendarId);
- $calendar = new Calendar($this->backend, $newCalendar);
- $this->backend->updateShares($calendar, $add, []);
- }
-}
diff --git a/apps/dav/lib/rootcollection.php b/apps/dav/lib/rootcollection.php
index ea796c09175..b6e1747e990 100644
--- a/apps/dav/lib/rootcollection.php
+++ b/apps/dav/lib/rootcollection.php
@@ -89,6 +89,9 @@ class RootCollection extends SimpleCollection {
$systemAddressBookRoot = new AddressBookRoot(new SystemPrincipalBackend(), $systemCardDavBackend, 'principals/system');
$systemAddressBookRoot->disableListing = $disableListing;
+ $uploadCollection = new Upload\RootCollection($userPrincipalBackend, 'principals/users');
+ $uploadCollection->disableListing = $disableListing;
+
$children = [
new SimpleCollection('principals', [
$userPrincipals,
@@ -102,6 +105,7 @@ class RootCollection extends SimpleCollection {
$systemTagCollection,
$systemTagRelationsCollection,
$commentsCollection,
+ $uploadCollection,
];
parent::__construct('root', $children);
diff --git a/apps/dav/lib/server.php b/apps/dav/lib/server.php
index e6668556448..73e24c9a292 100644
--- a/apps/dav/lib/server.php
+++ b/apps/dav/lib/server.php
@@ -132,8 +132,15 @@ class Server {
$user = \OC::$server->getUserSession()->getUser();
if (!is_null($user)) {
$view = \OC\Files\Filesystem::getView();
- $this->server->addPlugin(new FilesPlugin($this->server->tree, $view, false,
- !\OC::$server->getConfig()->getSystemValue('debug', false)));
+ $this->server->addPlugin(
+ new FilesPlugin(
+ $this->server->tree,
+ $view,
+ \OC::$server->getConfig(),
+ false,
+ !\OC::$server->getConfig()->getSystemValue('debug', false)
+ )
+ );
$this->server->addPlugin(
new \Sabre\DAV\PropertyStorage\Plugin(
diff --git a/apps/dav/lib/upload/assemblystream.php b/apps/dav/lib/upload/assemblystream.php
new file mode 100644
index 00000000000..4b80a591ce4
--- /dev/null
+++ b/apps/dav/lib/upload/assemblystream.php
@@ -0,0 +1,234 @@
+<?php
+
+namespace OCA\DAV\Upload;
+
+use Sabre\DAV\IFile;
+
+/**
+ * Class AssemblyStream
+ *
+ * The assembly stream is a virtual stream that wraps multiple chunks.
+ * Reading from the stream transparently accessed the underlying chunks and
+ * give a representation as if they were already merged together.
+ *
+ * @package OCA\DAV\Upload
+ */
+class AssemblyStream implements \Icewind\Streams\File {
+
+ /** @var resource */
+ private $context;
+
+ /** @var IFile[] */
+ private $nodes;
+
+ /** @var int */
+ private $pos = 0;
+
+ /** @var array */
+ private $sortedNodes;
+
+ /** @var int */
+ private $size;
+
+ /**
+ * @param string $path
+ * @param string $mode
+ * @param int $options
+ * @param string &$opened_path
+ * @return bool
+ */
+ public function stream_open($path, $mode, $options, &$opened_path) {
+ $this->loadContext('assembly');
+
+ // sort the nodes
+ $nodes = $this->nodes;
+ // http://stackoverflow.com/a/10985500
+ @usort($nodes, function(IFile $a, IFile $b) {
+ return strcmp($a->getName(), $b->getName());
+ });
+ $this->nodes = $nodes;
+
+ // build additional information
+ $this->sortedNodes = [];
+ $start = 0;
+ foreach($this->nodes as $node) {
+ $size = $node->getSize();
+ $name = $node->getName();
+ $this->sortedNodes[$name] = ['node' => $node, 'start' => $start, 'end' => $start + $size];
+ $start += $size;
+ $this->size = $start;
+ }
+ return true;
+ }
+
+ /**
+ * @param string $offset
+ * @param int $whence
+ * @return bool
+ */
+ public function stream_seek($offset, $whence = SEEK_SET) {
+ return false;
+ }
+
+ /**
+ * @return int
+ */
+ public function stream_tell() {
+ return $this->pos;
+ }
+
+ /**
+ * @param int $count
+ * @return string
+ */
+ public function stream_read($count) {
+
+ list($node, $posInNode) = $this->getNodeForPosition($this->pos);
+ if (is_null($node)) {
+ return null;
+ }
+ $stream = $this->getStream($node);
+
+ fseek($stream, $posInNode);
+ $data = fread($stream, $count);
+ $read = strlen($data);
+
+ // update position
+ $this->pos += $read;
+ return $data;
+ }
+
+ /**
+ * @param string $data
+ * @return int
+ */
+ public function stream_write($data) {
+ return false;
+ }
+
+ /**
+ * @param int $option
+ * @param int $arg1
+ * @param int $arg2
+ * @return bool
+ */
+ public function stream_set_option($option, $arg1, $arg2) {
+ return false;
+ }
+
+ /**
+ * @param int $size
+ * @return bool
+ */
+ public function stream_truncate($size) {
+ return false;
+ }
+
+ /**
+ * @return array
+ */
+ public function stream_stat() {
+ return [];
+ }
+
+ /**
+ * @param int $operation
+ * @return bool
+ */
+ public function stream_lock($operation) {
+ return false;
+ }
+
+ /**
+ * @return bool
+ */
+ public function stream_flush() {
+ return false;
+ }
+
+ /**
+ * @return bool
+ */
+ public function stream_eof() {
+ return $this->pos >= $this->size;
+ }
+
+ /**
+ * @return bool
+ */
+ public function stream_close() {
+ return true;
+ }
+
+
+ /**
+ * Load the source from the stream context and return the context options
+ *
+ * @param string $name
+ * @return array
+ * @throws \Exception
+ */
+ protected function loadContext($name) {
+ $context = stream_context_get_options($this->context);
+ if (isset($context[$name])) {
+ $context = $context[$name];
+ } else {
+ throw new \BadMethodCallException('Invalid context, "' . $name . '" options not set');
+ }
+ if (isset($context['nodes']) and is_array($context['nodes'])) {
+ $this->nodes = $context['nodes'];
+ } else {
+ throw new \BadMethodCallException('Invalid context, nodes not set');
+ }
+ return $context;
+ }
+
+ /**
+ * @param IFile[] $nodes
+ * @return resource
+ *
+ * @throws \BadMethodCallException
+ */
+ public static function wrap(array $nodes) {
+ $context = stream_context_create([
+ 'assembly' => [
+ 'nodes' => $nodes]
+ ]);
+ stream_wrapper_register('assembly', '\OCA\DAV\Upload\AssemblyStream');
+ try {
+ $wrapped = fopen('assembly://', 'r', null, $context);
+ } catch (\BadMethodCallException $e) {
+ stream_wrapper_unregister('assembly');
+ throw $e;
+ }
+ stream_wrapper_unregister('assembly');
+ return $wrapped;
+ }
+
+ /**
+ * @param $pos
+ * @return IFile | null
+ */
+ private function getNodeForPosition($pos) {
+ foreach($this->sortedNodes as $node) {
+ if ($pos >= $node['start'] && $pos < $node['end']) {
+ return [$node['node'], $pos - $node['start']];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param IFile $node
+ * @return resource
+ */
+ private function getStream(IFile $node) {
+ $data = $node->get();
+ if (is_resource($data)) {
+ return $data;
+ }
+
+ return fopen('data://text/plain,' . $data,'r');
+ }
+
+}
diff --git a/apps/dav/lib/upload/futurefile.php b/apps/dav/lib/upload/futurefile.php
new file mode 100644
index 00000000000..aca81afc055
--- /dev/null
+++ b/apps/dav/lib/upload/futurefile.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace OCA\DAV\Upload;
+
+use OCA\DAV\Connector\Sabre\Directory;
+use OCA\DAV\Upload\AssemblyStream;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\IFile;
+
+/**
+ * Class FutureFile
+ *
+ * The FutureFile is a SabreDav IFile which connects the chunked upload directory
+ * with the AssemblyStream, who does the final assembly job
+ *
+ * @package OCA\DAV\Upload
+ */
+class FutureFile implements \Sabre\DAV\IFile {
+
+ /** @var Directory */
+ private $root;
+ /** @var string */
+ private $name;
+
+ /**
+ * @param Directory $root
+ * @param string $name
+ */
+ function __construct(Directory $root, $name) {
+ $this->root = $root;
+ $this->name = $name;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function put($data) {
+ throw new Forbidden('Permission denied to put into this file');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function get() {
+ $nodes = $this->root->getChildren();
+ return AssemblyStream::wrap($nodes);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function getContentType() {
+ return 'application/octet-stream';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function getETag() {
+ return $this->root->getETag();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function getSize() {
+ $children = $this->root->getChildren();
+ $sizes = array_map(function($node) {
+ /** @var IFile $node */
+ return $node->getSize();
+ }, $children);
+
+ return array_sum($sizes);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function delete() {
+ $this->root->delete();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function getName() {
+ return $this->name;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function setName($name) {
+ throw new Forbidden('Permission denied to rename this file');
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function getLastModified() {
+ return $this->root->getLastModified();
+ }
+}
diff --git a/apps/dav/lib/upload/rootcollection.php b/apps/dav/lib/upload/rootcollection.php
new file mode 100644
index 00000000000..673a3734318
--- /dev/null
+++ b/apps/dav/lib/upload/rootcollection.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace OCA\DAV\Upload;
+
+use Sabre\DAVACL\AbstractPrincipalCollection;
+
+class RootCollection extends AbstractPrincipalCollection {
+
+ /**
+ * @inheritdoc
+ */
+ function getChildForPrincipal(array $principalInfo) {
+ return new UploadHome($principalInfo);
+ }
+
+ /**
+ * @inheritdoc
+ */
+ function getName() {
+ return 'uploads';
+ }
+
+}
diff --git a/apps/dav/lib/upload/uploadfolder.php b/apps/dav/lib/upload/uploadfolder.php
new file mode 100644
index 00000000000..01fbf1f8dc9
--- /dev/null
+++ b/apps/dav/lib/upload/uploadfolder.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace OCA\DAV\Upload;
+
+use OCA\DAV\Connector\Sabre\Directory;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\ICollection;
+
+class UploadFolder implements ICollection {
+
+ private $node;
+
+ function __construct(Directory $node) {
+ $this->node = $node;
+ }
+
+ function createFile($name, $data = null) {
+ // TODO: verify name - should be a simple number
+ $this->node->createFile($name, $data);
+ }
+
+ function createDirectory($name) {
+ throw new Forbidden('Permission denied to create file (filename ' . $name . ')');
+ }
+
+ function getChild($name) {
+ if ($name === '.file') {
+ return new FutureFile($this->node, '.file');
+ }
+ return $this->node->getChild($name);
+ }
+
+ function getChildren() {
+ $children = $this->node->getChildren();
+ $children[] = new FutureFile($this->node, '.file');
+ return $children;
+ }
+
+ function childExists($name) {
+ if ($name === '.file') {
+ return true;
+ }
+ return $this->node->childExists($name);
+ }
+
+ function delete() {
+ $this->node->delete();
+ }
+
+ function getName() {
+ return $this->node->getName();
+ }
+
+ function setName($name) {
+ throw new Forbidden('Permission denied to rename this folder');
+ }
+
+ function getLastModified() {
+ return $this->node->getLastModified();
+ }
+}
diff --git a/apps/dav/lib/upload/uploadhome.php b/apps/dav/lib/upload/uploadhome.php
new file mode 100644
index 00000000000..ae4dcfa4931
--- /dev/null
+++ b/apps/dav/lib/upload/uploadhome.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace OCA\DAV\Upload;
+
+use OC\Files\Filesystem;
+use OC\Files\View;
+use OCA\DAV\Connector\Sabre\Directory;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\ICollection;
+
+class UploadHome implements ICollection {
+ /**
+ * FilesHome constructor.
+ *
+ * @param array $principalInfo
+ */
+ public function __construct($principalInfo) {
+ $this->principalInfo = $principalInfo;
+ }
+
+ function createFile($name, $data = null) {
+ throw new Forbidden('Permission denied to create file (filename ' . $name . ')');
+ }
+
+ function createDirectory($name) {
+ $this->impl()->createDirectory($name);
+ }
+
+ function getChild($name) {
+ return new UploadFolder($this->impl()->getChild($name));
+ }
+
+ function getChildren() {
+ return array_map(function($node) {
+ return new UploadFolder($node);
+ }, $this->impl()->getChildren());
+ }
+
+ function childExists($name) {
+ return !is_null($this->getChild($name));
+ }
+
+ function delete() {
+ $this->impl()->delete();
+ }
+
+ function getName() {
+ return 'uploads';
+ }
+
+ function setName($name) {
+ throw new Forbidden('Permission denied to rename this folder');
+ }
+
+ function getLastModified() {
+ return $this->impl()->getLastModified();
+ }
+
+ /**
+ * @return Directory
+ */
+ private function impl() {
+ $rootView = new View();
+ $user = \OC::$server->getUserSession()->getUser();
+ Filesystem::initMountPoints($user->getUID());
+ if (!$rootView->file_exists('/' . $user->getUID() . '/uploads')) {
+ $rootView->mkdir('/' . $user->getUID() . '/uploads');
+ }
+ $view = new View('/' . $user->getUID() . '/uploads');
+ $rootInfo = $view->getFileInfo('');
+ $impl = new Directory($view, $rootInfo);
+ return $impl;
+ }
+}
diff --git a/apps/dav/tests/unit/caldav/caldavbackendtest.php b/apps/dav/tests/unit/caldav/caldavbackendtest.php
index 87a700a473d..440db7636e1 100644
--- a/apps/dav/tests/unit/caldav/caldavbackendtest.php
+++ b/apps/dav/tests/unit/caldav/caldavbackendtest.php
@@ -25,6 +25,7 @@ use DateTimeZone;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\Calendar;
use OCA\DAV\Connector\Sabre\Principal;
+use OCP\IL10N;
use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
use Sabre\DAV\PropPatch;
use Sabre\DAV\Xml\Property\Href;
@@ -136,14 +137,24 @@ class CalDavBackendTest extends TestCase {
*/
public function testCalendarSharing($userCanRead, $userCanWrite, $groupCanRead, $groupCanWrite, $add) {
+ /** @var IL10N | \PHPUnit_Framework_MockObject_MockObject $l10n */
+ $l10n = $this->getMockBuilder('\OCP\IL10N')
+ ->disableOriginalConstructor()->getMock();
+ $l10n
+ ->expects($this->any())
+ ->method('t')
+ ->will($this->returnCallback(function ($text, $parameters = array()) {
+ return vsprintf($text, $parameters);
+ }));
+
$calendarId = $this->createTestCalendar();
$books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
$this->assertEquals(1, count($books));
- $calendar = new Calendar($this->backend, $books[0]);
+ $calendar = new Calendar($this->backend, $books[0], $l10n);
$this->backend->updateShares($calendar, $add, []);
$books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1);
$this->assertEquals(1, count($books));
- $calendar = new Calendar($this->backend, $books[0]);
+ $calendar = new Calendar($this->backend, $books[0], $l10n);
$acl = $calendar->getACL();
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl);
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl);
diff --git a/apps/dav/tests/unit/caldav/calendartest.php b/apps/dav/tests/unit/caldav/calendartest.php
index 9e0c3c6c7e4..f13edde6085 100644
--- a/apps/dav/tests/unit/caldav/calendartest.php
+++ b/apps/dav/tests/unit/caldav/calendartest.php
@@ -21,13 +21,30 @@
namespace OCA\DAV\Tests\Unit\CalDAV;
+use OCA\DAV\CalDAV\BirthdayService;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\Calendar;
+use OCP\IL10N;
use Sabre\DAV\PropPatch;
use Test\TestCase;
class CalendarTest extends TestCase {
+ /** @var IL10N */
+ private $l10n;
+
+ public function setUp() {
+ parent::setUp();
+ $this->l10n = $this->getMockBuilder('\OCP\IL10N')
+ ->disableOriginalConstructor()->getMock();
+ $this->l10n
+ ->expects($this->any())
+ ->method('t')
+ ->will($this->returnCallback(function ($text, $parameters = array()) {
+ return vsprintf($text, $parameters);
+ }));
+ }
+
public function testDelete() {
/** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */
$backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock();
@@ -41,7 +58,7 @@ class CalendarTest extends TestCase {
'id' => 666,
'uri' => 'cal',
];
- $c = new Calendar($backend, $calendarInfo);
+ $c = new Calendar($backend, $calendarInfo, $this->l10n);
$c->delete();
}
@@ -61,7 +78,7 @@ class CalendarTest extends TestCase {
'id' => 666,
'uri' => 'cal',
];
- $c = new Calendar($backend, $calendarInfo);
+ $c = new Calendar($backend, $calendarInfo, $this->l10n);
$c->delete();
}
@@ -93,7 +110,7 @@ class CalendarTest extends TestCase {
'id' => 666,
'uri' => 'default'
];
- $c = new Calendar($backend, $calendarInfo);
+ $c = new Calendar($backend, $calendarInfo, $this->l10n);
if ($throws) {
$this->setExpectedException('\Sabre\DAV\Exception\Forbidden');
@@ -107,14 +124,14 @@ class CalendarTest extends TestCase {
/**
* @dataProvider providesReadOnlyInfo
*/
- public function testAcl($expectsWrite, $readOnlyValue, $hasOwnerSet) {
+ public function testAcl($expectsWrite, $readOnlyValue, $hasOwnerSet, $uri = 'default') {
/** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */
$backend = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')->disableOriginalConstructor()->getMock();
$backend->expects($this->any())->method('applyShareAcl')->willReturnArgument(1);
$calendarInfo = [
'principaluri' => 'user2',
'id' => 666,
- 'uri' => 'default'
+ 'uri' => $uri
];
if (!is_null($readOnlyValue)) {
$calendarInfo['{http://owncloud.org/ns}read-only'] = $readOnlyValue;
@@ -122,7 +139,7 @@ class CalendarTest extends TestCase {
if ($hasOwnerSet) {
$calendarInfo['{http://owncloud.org/ns}owner-principal'] = 'user1';
}
- $c = new Calendar($backend, $calendarInfo);
+ $c = new Calendar($backend, $calendarInfo, $this->l10n);
$acl = $c->getACL();
$childAcl = $c->getChildACL();
@@ -135,6 +152,13 @@ class CalendarTest extends TestCase {
'principal' => $hasOwnerSet ? 'user1' : 'user2',
'protected' => true
]];
+ if ($uri === BirthdayService::BIRTHDAY_CALENDAR_URI) {
+ $expectedAcl = [[
+ 'privilege' => '{DAV:}read',
+ 'principal' => $hasOwnerSet ? 'user1' : 'user2',
+ 'protected' => true
+ ]];
+ }
if ($hasOwnerSet) {
$expectedAcl[] = [
'privilege' => '{DAV:}read',
@@ -161,6 +185,7 @@ class CalendarTest extends TestCase {
'read-only property not set and no owner' => [true, null, false],
'read-only property is false and no owner' => [true, false, false],
'read-only property is true and no owner' => [false, true, false],
+ 'birthday calendar' => [false, false, false, BirthdayService::BIRTHDAY_CALENDAR_URI]
];
}
}
diff --git a/apps/dav/tests/unit/connector/publicauth.php b/apps/dav/tests/unit/connector/publicauth.php
index 5f46651d372..76a6e1ac6a1 100644
--- a/apps/dav/tests/unit/connector/publicauth.php
+++ b/apps/dav/tests/unit/connector/publicauth.php
@@ -7,6 +7,13 @@ use OCP\ISession;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
+/**
+ * Class PublicAuth
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\Connector
+ */
class PublicAuth extends \Test\TestCase {
/** @var ISession|\PHPUnit_Framework_MockObject_MockObject */
diff --git a/apps/dav/tests/unit/connector/sabre/filesplugin.php b/apps/dav/tests/unit/connector/sabre/filesplugin.php
index fb08ee170c4..fb5d658b39c 100644
--- a/apps/dav/tests/unit/connector/sabre/filesplugin.php
+++ b/apps/dav/tests/unit/connector/sabre/filesplugin.php
@@ -23,6 +23,9 @@
namespace OCA\DAV\Tests\Unit\Connector\Sabre;
use OCP\Files\StorageNotAvailableException;
+use Sabre\DAV\PropFind;
+use Sabre\DAV\PropPatch;
+use Test\TestCase;
/**
* Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
@@ -30,7 +33,7 @@ use OCP\Files\StorageNotAvailableException;
* later.
* See the COPYING-README file.
*/
-class FilesPlugin extends \Test\TestCase {
+class FilesPlugin extends TestCase {
const GETETAG_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME;
const FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME;
const INTERNAL_FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::INTERNAL_FILEID_PROPERTYNAME;
@@ -40,14 +43,15 @@ class FilesPlugin extends \Test\TestCase {
const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME;
const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME;
const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
+ const DATA_FINGERPRINT_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME;
/**
- * @var \Sabre\DAV\Server
+ * @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject
*/
private $server;
/**
- * @var \Sabre\DAV\Tree
+ * @var \Sabre\DAV\Tree | \PHPUnit_Framework_MockObject_MockObject
*/
private $tree;
@@ -57,10 +61,15 @@ class FilesPlugin extends \Test\TestCase {
private $plugin;
/**
- * @var \OC\Files\View
+ * @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject
*/
private $view;
+ /**
+ * @var \OCP\IConfig | \PHPUnit_Framework_MockObject_MockObject
+ */
+ private $config;
+
public function setUp() {
parent::setUp();
$this->server = $this->getMockBuilder('\Sabre\DAV\Server')
@@ -72,13 +81,22 @@ class FilesPlugin extends \Test\TestCase {
$this->view = $this->getMockBuilder('\OC\Files\View')
->disableOriginalConstructor()
->getMock();
-
- $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view);
+ $this->config = $this->getMock('\OCP\IConfig');
+ $this->config->method('getSystemValue')
+ ->with($this->equalTo('data-fingerprint'), $this->equalTo(''))
+ ->willReturn('my_fingerprint');
+
+ $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin(
+ $this->tree,
+ $this->view,
+ $this->config
+ );
$this->plugin->initialize($this->server);
}
/**
* @param string $class
+ * @return \PHPUnit_Framework_MockObject_MockObject
*/
private function createTestNode($class) {
$node = $this->getMockBuilder($class)
@@ -111,9 +129,10 @@ class FilesPlugin extends \Test\TestCase {
}
public function testGetPropertiesForFile() {
+ /** @var \OCA\DAV\Connector\Sabre\File | \PHPUnit_Framework_MockObject_MockObject $node */
$node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File');
- $propFind = new \Sabre\DAV\PropFind(
+ $propFind = new PropFind(
'/dummyPath',
array(
self::GETETAG_PROPERTYNAME,
@@ -123,7 +142,8 @@ class FilesPlugin extends \Test\TestCase {
self::PERMISSIONS_PROPERTYNAME,
self::DOWNLOADURL_PROPERTYNAME,
self::OWNER_ID_PROPERTYNAME,
- self::OWNER_DISPLAY_NAME_PROPERTYNAME
+ self::OWNER_DISPLAY_NAME_PROPERTYNAME,
+ self::DATA_FINGERPRINT_PROPERTYNAME,
),
0
);
@@ -161,15 +181,16 @@ class FilesPlugin extends \Test\TestCase {
$this->assertEquals('http://example.com/', $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
$this->assertEquals('foo', $propFind->get(self::OWNER_ID_PROPERTYNAME));
$this->assertEquals('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME));
- $this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties());
+ $this->assertEquals([self::SIZE_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
}
public function testGetPropertiesForFileHome() {
+ /** @var \OCA\DAV\Files\FilesHome | \PHPUnit_Framework_MockObject_MockObject $node */
$node = $this->getMockBuilder('\OCA\DAV\Files\FilesHome')
->disableOriginalConstructor()
->getMock();
- $propFind = new \Sabre\DAV\PropFind(
+ $propFind = new PropFind(
'/dummyPath',
array(
self::GETETAG_PROPERTYNAME,
@@ -179,7 +200,8 @@ class FilesPlugin extends \Test\TestCase {
self::PERMISSIONS_PROPERTYNAME,
self::DOWNLOADURL_PROPERTYNAME,
self::OWNER_ID_PROPERTYNAME,
- self::OWNER_DISPLAY_NAME_PROPERTYNAME
+ self::OWNER_DISPLAY_NAME_PROPERTYNAME,
+ self::DATA_FINGERPRINT_PROPERTYNAME,
),
0
);
@@ -211,12 +233,14 @@ class FilesPlugin extends \Test\TestCase {
'{http://owncloud.org/ns}owner-id',
'{http://owncloud.org/ns}owner-display-name'
], $propFind->get404Properties());
+ $this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
}
public function testGetPropertiesStorageNotAvailable() {
+ /** @var \OCA\DAV\Connector\Sabre\File | \PHPUnit_Framework_MockObject_MockObject $node */
$node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File');
- $propFind = new \Sabre\DAV\PropFind(
+ $propFind = new PropFind(
'/dummyPath',
array(
self::DOWNLOADURL_PROPERTYNAME,
@@ -237,10 +261,14 @@ class FilesPlugin extends \Test\TestCase {
}
public function testGetPublicPermissions() {
- $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view, true);
+ $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin(
+ $this->tree,
+ $this->view,
+ $this->config,
+ true);
$this->plugin->initialize($this->server);
- $propFind = new \Sabre\DAV\PropFind(
+ $propFind = new PropFind(
'/dummyPath',
[
self::PERMISSIONS_PROPERTYNAME,
@@ -248,6 +276,7 @@ class FilesPlugin extends \Test\TestCase {
0
);
+ /** @var \OCA\DAV\Connector\Sabre\File | \PHPUnit_Framework_MockObject_MockObject $node */
$node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File');
$node->expects($this->any())
->method('getDavPermissions')
@@ -262,9 +291,10 @@ class FilesPlugin extends \Test\TestCase {
}
public function testGetPropertiesForDirectory() {
+ /** @var \OCA\DAV\Connector\Sabre\Directory | \PHPUnit_Framework_MockObject_MockObject $node */
$node = $this->createTestNode('\OCA\DAV\Connector\Sabre\Directory');
- $propFind = new \Sabre\DAV\PropFind(
+ $propFind = new PropFind(
'/dummyPath',
array(
self::GETETAG_PROPERTYNAME,
@@ -272,6 +302,7 @@ class FilesPlugin extends \Test\TestCase {
self::SIZE_PROPERTYNAME,
self::PERMISSIONS_PROPERTYNAME,
self::DOWNLOADURL_PROPERTYNAME,
+ self::DATA_FINGERPRINT_PROPERTYNAME,
),
0
);
@@ -290,7 +321,30 @@ class FilesPlugin extends \Test\TestCase {
$this->assertEquals(1025, $propFind->get(self::SIZE_PROPERTYNAME));
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
$this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
- $this->assertEquals(array(self::DOWNLOADURL_PROPERTYNAME), $propFind->get404Properties());
+ $this->assertEquals([self::DOWNLOADURL_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
+ }
+
+ public function testGetPropertiesForRootDirectory() {
+ /** @var \OCA\DAV\Connector\Sabre\Directory | \PHPUnit_Framework_MockObject_MockObject $node */
+ $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->method('getPath')->willReturn('/');
+
+ $propFind = new PropFind(
+ '/',
+ [
+ self::DATA_FINGERPRINT_PROPERTYNAME,
+ ],
+ 0
+ );
+
+ $this->plugin->handleGetProperties(
+ $propFind,
+ $node
+ );
+
+ $this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
}
public function testUpdateProps() {
@@ -308,7 +362,7 @@ class FilesPlugin extends \Test\TestCase {
->will($this->returnValue(true));
// properties to set
- $propPatch = new \Sabre\DAV\PropPatch(array(
+ $propPatch = new PropPatch(array(
self::GETETAG_PROPERTYNAME => 'newetag',
self::LASTMODIFIED_PROPERTYNAME => $testDate
));
@@ -328,9 +382,7 @@ class FilesPlugin extends \Test\TestCase {
}
public function testUpdatePropsForbidden() {
- $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File');
-
- $propPatch = new \Sabre\DAV\PropPatch(array(
+ $propPatch = new PropPatch(array(
self::OWNER_ID_PROPERTYNAME => 'user2',
self::OWNER_DISPLAY_NAME_PROPERTYNAME => 'User Two',
self::FILEID_PROPERTYNAME => 12345,
diff --git a/apps/dav/tests/unit/connector/sabre/filesreportplugin.php b/apps/dav/tests/unit/connector/sabre/filesreportplugin.php
index 87973ef0071..ffe1a19ee56 100644
--- a/apps/dav/tests/unit/connector/sabre/filesreportplugin.php
+++ b/apps/dav/tests/unit/connector/sabre/filesreportplugin.php
@@ -336,7 +336,15 @@ class FilesReportPlugin extends \Test\TestCase {
->method('getSize')
->will($this->returnValue(1024));
- $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view));
+ $config = $this->getMock('\OCP\IConfig');
+
+ $this->server->addPlugin(
+ new \OCA\DAV\Connector\Sabre\FilesPlugin(
+ $this->tree,
+ $this->view,
+ $config
+ )
+ );
$this->plugin->initialize($this->server);
$responses = $this->plugin->prepareResponses($requestedProps, [$node1, $node2]);
diff --git a/apps/dav/tests/unit/connector/sabre/node.php b/apps/dav/tests/unit/connector/sabre/node.php
index cde8e746dc3..f70d1ee3faf 100644
--- a/apps/dav/tests/unit/connector/sabre/node.php
+++ b/apps/dav/tests/unit/connector/sabre/node.php
@@ -23,6 +23,12 @@
namespace OCA\DAV\Tests\Unit\Connector\Sabre;
+/**
+ * Class Node
+ *
+ * @group DB
+ * @package OCA\DAV\Tests\Unit\Connector\Sabre
+ */
class Node extends \Test\TestCase {
public function davPermissionsProvider() {
return array(
@@ -66,52 +72,64 @@ class Node extends \Test\TestCase {
public function sharePermissionsProvider() {
return [
- [\OCP\Files\FileInfo::TYPE_FILE, 1, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 3, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 5, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 7, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 9, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 11, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 13, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 15, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 17, 17],
- [\OCP\Files\FileInfo::TYPE_FILE, 19, 19],
- [\OCP\Files\FileInfo::TYPE_FILE, 21, 17],
- [\OCP\Files\FileInfo::TYPE_FILE, 23, 19],
- [\OCP\Files\FileInfo::TYPE_FILE, 25, 17],
- [\OCP\Files\FileInfo::TYPE_FILE, 27, 19],
- [\OCP\Files\FileInfo::TYPE_FILE, 29, 17],
- [\OCP\Files\FileInfo::TYPE_FILE, 30, 0],
- [\OCP\Files\FileInfo::TYPE_FILE, 31, 19],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 1, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 3, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 5, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 7, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 9, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 11, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 13, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 15, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 17, 17],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 19, 19],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 21, 21],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 23, 23],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 25, 25],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 27, 27],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 29, 29],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 30, 0],
- [\OCP\Files\FileInfo::TYPE_FOLDER, 31, 31],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 1, 1],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 3, 3],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 5, 1],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 7, 3],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 9, 1],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 11, 3],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 13, 1],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 15, 3],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 17, 17],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 19, 19],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 21, 17],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 23, 19],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 25, 17],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 27, 19],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 29, 17],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 30, 18],
+ [\OCP\Files\FileInfo::TYPE_FILE, null, 31, 19],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 1, 1],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 3, 3],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 5, 5],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 7, 7],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 9, 9],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 11, 11],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 13, 13],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 15, 15],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 17, 17],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 19, 19],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 21, 21],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 23, 23],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 25, 25],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 27, 27],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 29, 29],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 30, 30],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, null, 31, 31],
+ [\OCP\Files\FileInfo::TYPE_FOLDER, 'shareToken', 7, 7],
];
}
/**
* @dataProvider sharePermissionsProvider
*/
- public function testSharePermissions($type, $permissions, $expected) {
+ public function testSharePermissions($type, $user, $permissions, $expected) {
$storage = $this->getMock('\OCP\Files\Storage');
$storage->method('getPermissions')->willReturn($permissions);
$mountpoint = $this->getMock('\OCP\Files\Mount\IMountPoint');
$mountpoint->method('getMountPoint')->willReturn('myPath');
+ $shareManager = $this->getMockBuilder('OCP\Share\IManager')->disableOriginalConstructor()->getMock();
+ $share = $this->getMockBuilder('OCP\Share\IShare')->disableOriginalConstructor()->getMock();
+
+ if ($user === null) {
+ $shareManager->expects($this->never())->method('getShareByToken');
+ $share->expects($this->never())->method('getPermissions');
+ } else {
+ $shareManager->expects($this->once())->method('getShareByToken')->with($user)
+ ->willReturn($share);
+ $share->expects($this->once())->method('getPermissions')->willReturn($permissions);
+ }
$info = $this->getMockBuilder('\OC\Files\FileInfo')
->disableOriginalConstructor()
@@ -125,6 +143,7 @@ class Node extends \Test\TestCase {
$view = $this->getMock('\OC\Files\View');
$node = new \OCA\DAV\Connector\Sabre\File($view, $info);
- $this->assertEquals($expected, $node->getSharePermissions());
+ $this->invokePrivate($node, 'shareManager', [$shareManager]);
+ $this->assertEquals($expected, $node->getSharePermissions($user));
}
}
diff --git a/apps/dav/tests/unit/dav/HookManagerTest.php b/apps/dav/tests/unit/dav/HookManagerTest.php
new file mode 100644
index 00000000000..5c36d0d785c
--- /dev/null
+++ b/apps/dav/tests/unit/dav/HookManagerTest.php
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\DAV\Tests\Unit\DAV;
+
+use OCA\DAV\CalDAV\BirthdayService;
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\CardDAV\CardDavBackend;
+use OCA\DAV\CardDAV\SyncService;
+use OCA\DAV\HookManager;
+use OCP\IUserManager;
+use Test\TestCase;
+
+class HookManagerTest extends TestCase {
+ public function test() {
+ $user = $this->getMockBuilder('\OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $user->expects($this->once())->method('getUID')->willReturn('newUser');
+
+ /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
+ $userManager = $this->getMockBuilder('\OCP\IUserManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $userManager->expects($this->once())->method('get')->willReturn($user);
+
+ /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
+ $syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ /** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
+ $cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $cal->expects($this->once())->method('getCalendarsForUser')->willReturn([]);
+ $cal->expects($this->once())->method('createCalendar')->with(
+ 'principals/users/newUser',
+ 'personal', ['{DAV:}displayname' => 'Personal']);
+
+ /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
+ $card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $card->expects($this->once())->method('getAddressBooksForUser')->willReturn([]);
+ $card->expects($this->once())->method('createAddressBook')->with(
+ 'principals/users/newUser',
+ 'contacts', ['{DAV:}displayname' => 'Contacts']);
+
+ $hm = new HookManager($userManager, $syncService, $cal, $card);
+ $hm->postLogin(['uid' => 'newUser']);
+ }
+
+ public function testWithExisting() {
+ $user = $this->getMockBuilder('\OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $user->expects($this->once())->method('getUID')->willReturn('newUser');
+
+ /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
+ $userManager = $this->getMockBuilder('\OCP\IUserManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $userManager->expects($this->once())->method('get')->willReturn($user);
+
+ /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
+ $syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ /** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
+ $cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $cal->expects($this->once())->method('getCalendarsForUser')->willReturn([
+ ['uri' => 'my-events']
+ ]);
+ $cal->expects($this->never())->method('createCalendar');
+
+ /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
+ $card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $card->expects($this->once())->method('getAddressBooksForUser')->willReturn([
+ ['uri' => 'my-contacts']
+ ]);
+ $card->expects($this->never())->method('createAddressBook');
+
+ $hm = new HookManager($userManager, $syncService, $cal, $card);
+ $hm->postLogin(['uid' => 'newUser']);
+ }
+
+ public function testWithBirthdayCalendar() {
+ $user = $this->getMockBuilder('\OCP\IUser')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $user->expects($this->once())->method('getUID')->willReturn('newUser');
+
+ /** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
+ $userManager = $this->getMockBuilder('\OCP\IUserManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $userManager->expects($this->once())->method('get')->willReturn($user);
+
+ /** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
+ $syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ /** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
+ $cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $cal->expects($this->once())->method('getCalendarsForUser')->willReturn([
+ ['uri' => BirthdayService::BIRTHDAY_CALENDAR_URI]
+ ]);
+ $cal->expects($this->once())->method('createCalendar')->with(
+ 'principals/users/newUser',
+ 'personal', ['{DAV:}displayname' => 'Personal']);
+
+ /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
+ $card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $card->expects($this->once())->method('getAddressBooksForUser')->willReturn([]);
+ $card->expects($this->once())->method('createAddressBook')->with(
+ 'principals/users/newUser',
+ 'contacts', ['{DAV:}displayname' => 'Contacts']);
+
+ $hm = new HookManager($userManager, $syncService, $cal, $card);
+ $hm->postLogin(['uid' => 'newUser']);
+ }
+}
diff --git a/apps/dav/tests/unit/migration/addressbookadaptertest.php b/apps/dav/tests/unit/migration/addressbookadaptertest.php
deleted file mode 100644
index e6e57049a93..00000000000
--- a/apps/dav/tests/unit/migration/addressbookadaptertest.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-/**
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\DAV\Tests\Unit\Migration;
-
-use DomainException;
-use OCA\Dav\Migration\AddressBookAdapter;
-use OCP\IDBConnection;
-use Test\TestCase;
-
-/**
- * Class AddressbookAdapterTest
- *
- * @group DB
- *
- * @package OCA\DAV\Tests\Unit\Migration
- */
-class AddressbookAdapterTest extends TestCase {
-
- /** @var IDBConnection */
- private $db;
- /** @var AddressBookAdapter */
- private $adapter;
- /** @var array */
- private $books = [];
- /** @var array */
- private $cards = [];
-
- public function setUp() {
- parent::setUp();
- $this->db = \OC::$server->getDatabaseConnection();
-
- $manager = new \OC\DB\MDB2SchemaManager($this->db);
- $manager->createDbFromStructure(__DIR__ . '/contacts_schema.xml');
-
- $this->adapter = new AddressBookAdapter($this->db);
- }
-
- public function tearDown() {
- $this->db->dropTable('contacts_addressbooks');
- $this->db->dropTable('contacts_cards');
- parent::tearDown();
- }
-
- /**
- * @expectedException DomainException
- */
- public function testOldTablesDoNotExist() {
- $adapter = new AddressBookAdapter(\OC::$server->getDatabaseConnection(), 'crazy_table_that_does_no_exist');
- $adapter->setup();
- }
-
- public function test() {
-
- // insert test data
- $builder = $this->db->getQueryBuilder();
- $builder->insert('contacts_addressbooks')
- ->values([
- 'userid' => $builder->createNamedParameter('test-user-666'),
- 'displayname' => $builder->createNamedParameter('Display Name'),
- 'uri' => $builder->createNamedParameter('contacts'),
- 'description' => $builder->createNamedParameter('An address book for testing'),
- 'ctag' => $builder->createNamedParameter('112233'),
- 'active' => $builder->createNamedParameter('1')
- ])
- ->execute();
- $builder = $this->db->getQueryBuilder();
- $builder->insert('contacts_cards')
- ->values([
- 'addressbookid' => $builder->createNamedParameter(6666),
- 'fullname' => $builder->createNamedParameter('Full Name'),
- 'carddata' => $builder->createNamedParameter('datadatadata'),
- 'uri' => $builder->createNamedParameter('some-card.vcf'),
- 'lastmodified' => $builder->createNamedParameter('112233'),
- ])
- ->execute();
- $builder = $this->db->getQueryBuilder();
- $builder->insert('share')
- ->values([
- 'share_type' => $builder->createNamedParameter(1),
- 'share_with' => $builder->createNamedParameter('user01'),
- 'uid_owner' => $builder->createNamedParameter('user02'),
- 'item_type' => $builder->createNamedParameter('addressbook'),
- 'item_source' => $builder->createNamedParameter(6666),
- 'item_target' => $builder->createNamedParameter('Contacts (user02)'),
- ])
- ->execute();
-
- // test the adapter
- $this->adapter->foreachBook('test-user-666', function($row) {
- $this->books[] = $row;
- });
- $this->assertArrayHasKey('id', $this->books[0]);
- $this->assertEquals('test-user-666', $this->books[0]['userid']);
- $this->assertEquals('Display Name', $this->books[0]['displayname']);
- $this->assertEquals('contacts', $this->books[0]['uri']);
- $this->assertEquals('An address book for testing', $this->books[0]['description']);
- $this->assertEquals('112233', $this->books[0]['ctag']);
-
- $this->adapter->foreachCard(6666, function($row) {
- $this->cards[]= $row;
- });
- $this->assertArrayHasKey('id', $this->cards[0]);
- $this->assertEquals(6666, $this->cards[0]['addressbookid']);
-
- // test getShares
- $shares = $this->adapter->getShares(6666);
- $this->assertEquals(1, count($shares));
-
- }
-
-}
diff --git a/apps/dav/tests/unit/migration/calendar_schema.xml b/apps/dav/tests/unit/migration/calendar_schema.xml
deleted file mode 100644
index 6c88b596a3f..00000000000
--- a/apps/dav/tests/unit/migration/calendar_schema.xml
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<database>
-
- <name>*dbname*</name>
- <create>true</create>
- <overwrite>false</overwrite>
-
- <charset>utf8</charset>
-
- <table>
-
- <name>*dbprefix*clndr_objects</name>
-
- <declaration>
-
- <field>
- <name>id</name>
- <type>integer</type>
- <default>0</default>
- <notnull>true</notnull>
- <autoincrement>1</autoincrement>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>calendarid</name>
- <type>integer</type>
- <default></default>
- <notnull>true</notnull>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>objecttype</name>
- <type>text</type>
- <default></default>
- <notnull>true</notnull>
- <length>40</length>
- </field>
-
- <field>
- <name>startdate</name>
- <type>timestamp</type>
- <default>1970-01-01 00:00:00</default>
- <notnull>false</notnull>
- </field>
-
- <field>
- <name>enddate</name>
- <type>timestamp</type>
- <default>1970-01-01 00:00:00</default>
- <notnull>false</notnull>
- </field>
-
- <field>
- <name>repeating</name>
- <type>integer</type>
- <default></default>
- <notnull>false</notnull>
- <length>4</length>
- </field>
-
- <field>
- <name>summary</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>calendardata</name>
- <type>clob</type>
- <notnull>false</notnull>
- </field>
-
- <field>
- <name>uri</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>lastmodified</name>
- <type>integer</type>
- <default></default>
- <notnull>false</notnull>
- <length>4</length>
- </field>
-
- </declaration>
-
- </table>
-
- <table>
-
- <name>*dbprefix*clndr_calendars</name>
-
- <declaration>
-
- <field>
- <name>id</name>
- <type>integer</type>
- <default>0</default>
- <notnull>true</notnull>
- <autoincrement>1</autoincrement>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>userid</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>displayname</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>100</length>
- </field>
-
- <field>
- <name>uri</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>active</name>
- <type>integer</type>
- <default>1</default>
- <notnull>true</notnull>
- <length>4</length>
- </field>
-
- <field>
- <name>ctag</name>
- <type>integer</type>
- <default>0</default>
- <notnull>true</notnull>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>calendarorder</name>
- <type>integer</type>
- <default>0</default>
- <notnull>true</notnull>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>calendarcolor</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>10</length>
- </field>
-
- <field>
- <name>timezone</name>
- <type>clob</type>
- <notnull>false</notnull>
- </field>
-
- <field>
- <name>components</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>100</length>
- </field>
-
- </declaration>
-
- </table>
-
-</database>
diff --git a/apps/dav/tests/unit/migration/calendaradaptertest.php b/apps/dav/tests/unit/migration/calendaradaptertest.php
deleted file mode 100644
index f92774ef6ad..00000000000
--- a/apps/dav/tests/unit/migration/calendaradaptertest.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-/**
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\DAV\Tests\Unit\Migration;
-
-use DomainException;
-use OCA\Dav\Migration\AddressBookAdapter;
-use OCA\Dav\Migration\CalendarAdapter;
-use OCP\IDBConnection;
-use Test\TestCase;
-
-/**
- * Class CalendarAdapterTest
- *
- * @group DB
- *
- * @package OCA\DAV\Tests\Unit\Migration
- */
-class CalendarAdapterTest extends TestCase {
-
- /** @var IDBConnection */
- private $db;
- /** @var CalendarAdapter */
- private $adapter;
- /** @var array */
- private $cals = [];
- /** @var array */
- private $calObjs = [];
-
- public function setUp() {
- parent::setUp();
- $this->db = \OC::$server->getDatabaseConnection();
-
- $manager = new \OC\DB\MDB2SchemaManager($this->db);
- $manager->createDbFromStructure(__DIR__ . '/calendar_schema.xml');
-
- $this->adapter = new CalendarAdapter($this->db);
- }
-
- public function tearDown() {
- $this->db->dropTable('clndr_calendars');
- $this->db->dropTable('clndr_objects');
- parent::tearDown();
- }
-
- /**
- * @expectedException DomainException
- */
- public function testOldTablesDoNotExist() {
- $adapter = new AddressBookAdapter(\OC::$server->getDatabaseConnection(), 'crazy_table_that_does_no_exist');
- $adapter->setup();
- }
-
- public function test() {
-
- // insert test data
- $builder = $this->db->getQueryBuilder();
- $builder->insert('clndr_calendars')
- ->values([
- 'userid' => $builder->createNamedParameter('test-user-666'),
- 'displayname' => $builder->createNamedParameter('Display Name'),
- 'uri' => $builder->createNamedParameter('events'),
- 'ctag' => $builder->createNamedParameter('112233'),
- 'active' => $builder->createNamedParameter('1')
- ])
- ->execute();
- $builder = $this->db->getQueryBuilder();
- $builder->insert('clndr_objects')
- ->values([
- 'calendarid' => $builder->createNamedParameter(6666),
- 'objecttype' => $builder->createNamedParameter('VEVENT'),
- 'startdate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
- 'enddate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
- 'repeating' => $builder->createNamedParameter(0),
- 'summary' => $builder->createNamedParameter('Something crazy will happen'),
- 'uri' => $builder->createNamedParameter('event.ics'),
- 'lastmodified' => $builder->createNamedParameter('112233'),
- ])
- ->execute();
- $builder = $this->db->getQueryBuilder();
- $builder->insert('share')
- ->values([
- 'share_type' => $builder->createNamedParameter(1),
- 'share_with' => $builder->createNamedParameter('user01'),
- 'uid_owner' => $builder->createNamedParameter('user02'),
- 'item_type' => $builder->createNamedParameter('calendar'),
- 'item_source' => $builder->createNamedParameter(6666),
- 'item_target' => $builder->createNamedParameter('Contacts (user02)'),
- ])
- ->execute();
-
- // test the adapter
- $this->adapter->foreachCalendar('test-user-666', function($row) {
- $this->cals[] = $row;
- });
- $this->assertArrayHasKey('id', $this->cals[0]);
- $this->assertEquals('test-user-666', $this->cals[0]['userid']);
- $this->assertEquals('Display Name', $this->cals[0]['displayname']);
- $this->assertEquals('events', $this->cals[0]['uri']);
- $this->assertEquals('112233', $this->cals[0]['ctag']);
-
- $this->adapter->foreachCalendarObject(6666, function($row) {
- $this->calObjs[]= $row;
- });
- $this->assertArrayHasKey('id', $this->calObjs[0]);
- $this->assertEquals(6666, $this->calObjs[0]['calendarid']);
-
- // test getShares
- $shares = $this->adapter->getShares(6666);
- $this->assertEquals(1, count($shares));
-
- }
-
-}
diff --git a/apps/dav/tests/unit/migration/contacts_schema.xml b/apps/dav/tests/unit/migration/contacts_schema.xml
deleted file mode 100644
index 51836a1e0c6..00000000000
--- a/apps/dav/tests/unit/migration/contacts_schema.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<database>
-
- <name>*dbname*</name>
- <create>true</create>
- <overwrite>false</overwrite>
- <charset>utf8</charset>
- <table>
-
- <name>*dbprefix*contacts_addressbooks</name>
-
- <declaration>
-
- <field>
- <name>id</name>
- <type>integer</type>
- <default>0</default>
- <notnull>true</notnull>
- <autoincrement>1</autoincrement>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>userid</name>
- <type>text</type>
- <default></default>
- <notnull>true</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>displayname</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>uri</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>200</length>
- </field>
-
- <field>
- <name>description</name>
- <type>text</type>
- <notnull>false</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>ctag</name>
- <type>integer</type>
- <default>1</default>
- <notnull>true</notnull>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>active</name>
- <type>integer</type>
- <default>1</default>
- <notnull>true</notnull>
- <length>4</length>
- </field>
-
- <index>
- <name>c_addressbook_userid_index</name>
- <field>
- <name>userid</name>
- <sorting>ascending</sorting>
- </field>
- </index>
- </declaration>
-
- </table>
-
- <table>
-
- <name>*dbprefix*contacts_cards</name>
-
- <declaration>
-
- <field>
- <name>id</name>
- <type>integer</type>
- <default>0</default>
- <notnull>true</notnull>
- <autoincrement>1</autoincrement>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>addressbookid</name>
- <type>integer</type>
- <default></default>
- <notnull>true</notnull>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
- <field>
- <name>fullname</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>255</length>
- </field>
-
- <field>
- <name>carddata</name>
- <type>clob</type>
- <notnull>false</notnull>
- </field>
-
- <field>
- <name>uri</name>
- <type>text</type>
- <default></default>
- <notnull>false</notnull>
- <length>200</length>
- </field>
-
- <field>
- <name>lastmodified</name>
- <type>integer</type>
- <default></default>
- <notnull>false</notnull>
- <unsigned>true</unsigned>
- <length>4</length>
- </field>
-
-
- <index>
- <name>c_addressbookid_index</name>
- <field>
- <name>addressbookid</name>
- <sorting>ascending</sorting>
- </field>
- </index>
- </declaration>
-
- </table>
-
-</database>
diff --git a/apps/dav/tests/unit/migration/migrateaddressbooktest.php b/apps/dav/tests/unit/migration/migrateaddressbooktest.php
deleted file mode 100644
index 31cb16265c0..00000000000
--- a/apps/dav/tests/unit/migration/migrateaddressbooktest.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-/**
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\DAV\Tests\Unit\Migration;
-
-use OCA\DAV\CardDAV\CardDavBackend;
-use OCA\Dav\Migration\AddressBookAdapter;
-use OCP\ILogger;
-use Test\TestCase;
-
-class MigrateAddressbookTest extends TestCase {
-
- public function testMigration() {
- /** @var AddressBookAdapter | \PHPUnit_Framework_MockObject_MockObject $adapter */
- $adapter = $this->mockAdapter([
- ['share_type' => '1', 'share_with' => 'users', 'permissions' => '31'],
- ['share_type' => '2', 'share_with' => 'adam', 'permissions' => '1'],
- ]);
-
- /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $cardDav */
- $cardDav = $this->getMockBuilder('\OCA\Dav\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock();
- $cardDav->expects($this->any())->method('createAddressBook')->willReturn(666);
- $cardDav->expects($this->any())->method('getAddressBookById')->willReturn([]);
- $cardDav->expects($this->once())->method('createAddressBook')->with('principals/users/test01', 'test_contacts');
- $cardDav->expects($this->once())->method('createCard')->with(666, '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.vcf', 'BEGIN:VCARD');
- $cardDav->expects($this->once())->method('updateShares')->with($this->anything(), [
- ['href' => 'principal:principals/groups/users', 'readOnly' => false],
- ['href' => 'principal:principals/users/adam', 'readOnly' => true]
- ]);
- /** @var ILogger $logger */
- $logger = $this->getMockBuilder('\OCP\ILogger')->disableOriginalConstructor()->getMock();
-
- $m = new \OCA\Dav\Migration\MigrateAddressbooks($adapter, $cardDav, $logger, null);
- $m->migrateForUser('test01');
- }
-
- /**
- * @return \PHPUnit_Framework_MockObject_MockObject
- */
- private function mockAdapter($shares = []) {
- $adapter = $this->getMockBuilder('\OCA\Dav\Migration\AddressBookAdapter')->disableOriginalConstructor()->getMock();
- $adapter->expects($this->any())->method('foreachBook')->willReturnCallback(function ($user, \Closure $callBack) {
- $callBack([
- 'id' => 0,
- 'userid' => $user,
- 'displayname' => 'Test Contacts',
- 'uri' => 'test_contacts',
- 'description' => 'Contacts to test with',
- 'ctag' => 1234567890,
- 'active' => 1
- ]);
- });
- $adapter->expects($this->any())->method('foreachCard')->willReturnCallback(function ($addressBookId, \Closure $callBack) {
- $callBack([
- 'userid' => $addressBookId,
- 'uri' => '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.vcf',
- 'carddata' => 'BEGIN:VCARD'
- ]);
- });
- $adapter->expects($this->any())->method('getShares')->willReturn($shares);
- return $adapter;
- }
-
-}
diff --git a/apps/dav/tests/unit/migration/migratecalendartest.php b/apps/dav/tests/unit/migration/migratecalendartest.php
deleted file mode 100644
index e62970aef34..00000000000
--- a/apps/dav/tests/unit/migration/migratecalendartest.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-/**
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCA\DAV\Tests\Unit\Migration;
-
-use OCA\DAV\CalDAV\CalDavBackend;
-use OCA\Dav\Migration\CalendarAdapter;
-use OCP\ILogger;
-use Test\TestCase;
-
-class MigrateCalendarTest extends TestCase {
-
- public function testMigration() {
- /** @var CalendarAdapter | \PHPUnit_Framework_MockObject_MockObject $adapter */
- $adapter = $this->mockAdapter([
- ['share_type' => '1', 'share_with' => 'users', 'permissions' => '31'],
- ['share_type' => '2', 'share_with' => 'adam', 'permissions' => '1'],
- ]);
-
- /** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cardDav */
- $cardDav = $this->getMockBuilder('\OCA\Dav\CalDAV\CalDAVBackend')->disableOriginalConstructor()->getMock();
- $cardDav->expects($this->any())->method('createCalendar')->willReturn(666);
- $cardDav->expects($this->once())->method('createCalendar')->with('principals/users/test01', 'test_contacts');
- $cardDav->expects($this->once())->method('createCalendarObject')->with(666, '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics', 'BEGIN:VCARD');
- $cardDav->expects($this->once())->method('updateShares')->with($this->anything(), [
- ['href' => 'principal:principals/groups/users', 'readOnly' => false],
- ['href' => 'principal:principals/users/adam', 'readOnly' => true]
- ]);
- /** @var ILogger $logger */
- $logger = $this->getMockBuilder('\OCP\ILogger')->disableOriginalConstructor()->getMock();
-
- $m = new \OCA\Dav\Migration\MigrateCalendars($adapter, $cardDav, $logger, null);
- $m->migrateForUser('test01');
- }
-
- /**
- * @return \PHPUnit_Framework_MockObject_MockObject
- */
- private function mockAdapter($shares = [], $calData = 'BEGIN:VCARD') {
- $adapter = $this->getMockBuilder('\OCA\Dav\Migration\CalendarAdapter')
- ->disableOriginalConstructor()
- ->getMock();
- $adapter->expects($this->any())->method('foreachCalendar')->willReturnCallback(function ($user, \Closure $callBack) {
- $callBack([
- // calendarorder | calendarcolor | timezone | components
- 'id' => 0,
- 'userid' => $user,
- 'displayname' => 'Test Contacts',
- 'uri' => 'test_contacts',
- 'ctag' => 1234567890,
- 'active' => 1,
- 'calendarorder' => '0',
- 'calendarcolor' => '#b3dc6c',
- 'timezone' => null,
- 'components' => 'VEVENT,VTODO,VJOURNAL'
- ]);
- });
- $adapter->expects($this->any())->method('foreachCalendarObject')->willReturnCallback(function ($addressBookId, \Closure $callBack) use ($calData) {
- $callBack([
- 'userid' => $addressBookId,
- 'uri' => '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics',
- 'calendardata' => $calData
- ]);
- });
- $adapter->expects($this->any())->method('getShares')->willReturn($shares);
- return $adapter;
- }
-}
diff --git a/apps/dav/tests/unit/upload/assemblystreamtest.php b/apps/dav/tests/unit/upload/assemblystreamtest.php
new file mode 100644
index 00000000000..373d525a9dd
--- /dev/null
+++ b/apps/dav/tests/unit/upload/assemblystreamtest.php
@@ -0,0 +1,47 @@
+<?php
+
+class AssemblyStreamTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider providesNodes()
+ */
+ public function testGetContents($expected, $nodes) {
+ $stream = \OCA\DAV\Upload\AssemblyStream::wrap($nodes);
+ $content = stream_get_contents($stream);
+
+ $this->assertEquals($expected, $content);
+ }
+
+ function providesNodes() {
+ return[
+ 'one node only' => ['1234567890', [
+ $this->buildNode('0', '1234567890')
+ ]],
+ 'two nodes' => ['1234567890', [
+ $this->buildNode('1', '67890'),
+ $this->buildNode('0', '12345')
+ ]]
+ ];
+ }
+
+ private function buildNode($name, $data) {
+ $node = $this->getMockBuilder('\Sabre\DAV\File')
+ ->setMethods(['getName', 'get', 'getSize'])
+ ->getMockForAbstractClass();
+
+ $node->expects($this->any())
+ ->method('getName')
+ ->willReturn($name);
+
+ $node->expects($this->any())
+ ->method('get')
+ ->willReturn($data);
+
+ $node->expects($this->any())
+ ->method('getSize')
+ ->willReturn(strlen($data));
+
+ return $node;
+ }
+}
+
diff --git a/apps/dav/tests/unit/upload/futurefiletest.php b/apps/dav/tests/unit/upload/futurefiletest.php
new file mode 100644
index 00000000000..c0c14bf04d7
--- /dev/null
+++ b/apps/dav/tests/unit/upload/futurefiletest.php
@@ -0,0 +1,89 @@
+<?php
+
+class FutureFileTest extends \PHPUnit_Framework_TestCase {
+
+ public function testGetContentType() {
+ $f = $this->mockFutureFile();
+ $this->assertEquals('application/octet-stream', $f->getContentType());
+ }
+
+ public function testGetETag() {
+ $f = $this->mockFutureFile();
+ $this->assertEquals('1234567890', $f->getETag());
+ }
+
+ public function testGetName() {
+ $f = $this->mockFutureFile();
+ $this->assertEquals('foo.txt', $f->getName());
+ }
+
+ public function testGetLastModified() {
+ $f = $this->mockFutureFile();
+ $this->assertEquals(12121212, $f->getLastModified());
+ }
+
+ public function testGetSize() {
+ $f = $this->mockFutureFile();
+ $this->assertEquals(0, $f->getSize());
+ }
+
+ public function testGet() {
+ $f = $this->mockFutureFile();
+ $stream = $f->get();
+ $this->assertTrue(is_resource($stream));
+ }
+
+ public function testDelete() {
+ $d = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->setMethods(['delete'])
+ ->getMock();
+
+ $d->expects($this->once())
+ ->method('delete');
+
+ $f = new \OCA\DAV\Upload\FutureFile($d, 'foo.txt');
+ $f->delete();
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testPut() {
+ $f = $this->mockFutureFile();
+ $f->put('');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testSetName() {
+ $f = $this->mockFutureFile();
+ $f->setName('');
+ }
+
+ /**
+ * @return \OCA\DAV\Upload\FutureFile
+ */
+ private function mockFutureFile() {
+ $d = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->setMethods(['getETag', 'getLastModified', 'getChildren'])
+ ->getMock();
+
+ $d->expects($this->any())
+ ->method('getETag')
+ ->willReturn('1234567890');
+
+ $d->expects($this->any())
+ ->method('getLastModified')
+ ->willReturn(12121212);
+
+ $d->expects($this->any())
+ ->method('getChildren')
+ ->willReturn([]);
+
+ return new \OCA\DAV\Upload\FutureFile($d, 'foo.txt');
+ }
+}
+
diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php
index 6d01d3e8353..c7c8d2a3d31 100644
--- a/apps/encryption/appinfo/application.php
+++ b/apps/encryption/appinfo/application.php
@@ -66,6 +66,11 @@ class Application extends \OCP\AppFramework\App {
$session = $this->getContainer()->query('Session');
$session->setStatus(Session::RUN_MIGRATION);
}
+ if ($this->encryptionManager->isEnabled() && $encryptionSystemReady) {
+ /** @var Setup $setup */
+ $setup = $this->getContainer()->query('UserSetup');
+ $setup->setupSystem();
+ }
}
/**
@@ -237,6 +242,7 @@ class Application extends \OCP\AppFramework\App {
$c->getServer()->getUserManager(),
new View(),
$c->query('KeyManager'),
+ $c->query('Util'),
$server->getConfig(),
$server->getMailer(),
$server->getL10N('encryption'),
diff --git a/apps/encryption/hooks/userhooks.php b/apps/encryption/hooks/userhooks.php
index 62acd168909..136a1832101 100644
--- a/apps/encryption/hooks/userhooks.php
+++ b/apps/encryption/hooks/userhooks.php
@@ -24,6 +24,7 @@
namespace OCA\Encryption\Hooks;
+use OC\Files\Filesystem;
use OCP\IUserManager;
use OCP\Util as OCUtil;
use OCA\Encryption\Hooks\Contracts\IHook;
@@ -117,22 +118,29 @@ class UserHooks implements IHook {
public function addHooks() {
OCUtil::connectHook('OC_User', 'post_login', $this, 'login');
OCUtil::connectHook('OC_User', 'logout', $this, 'logout');
- OCUtil::connectHook('OC_User',
- 'post_setPassword',
- $this,
- 'setPassphrase');
- OCUtil::connectHook('OC_User',
- 'pre_setPassword',
- $this,
- 'preSetPassphrase');
- OCUtil::connectHook('OC_User',
- 'post_createUser',
- $this,
- 'postCreateUser');
- OCUtil::connectHook('OC_User',
- 'post_deleteUser',
- $this,
- 'postDeleteUser');
+
+ // this hooks only make sense if no master key is used
+ if ($this->util->isMasterKeyEnabled() === false) {
+ OCUtil::connectHook('OC_User',
+ 'post_setPassword',
+ $this,
+ 'setPassphrase');
+
+ OCUtil::connectHook('OC_User',
+ 'pre_setPassword',
+ $this,
+ 'preSetPassphrase');
+
+ OCUtil::connectHook('OC_User',
+ 'post_createUser',
+ $this,
+ 'postCreateUser');
+
+ OCUtil::connectHook('OC_User',
+ 'post_deleteUser',
+ $this,
+ 'postDeleteUser');
+ }
}
@@ -151,12 +159,10 @@ class UserHooks implements IHook {
// ensure filesystem is loaded
if (!\OC\Files\Filesystem::$loaded) {
- \OC_Util::setupFS($params['uid']);
+ $this->setupFS($params['uid']);
}
-
- // setup user, if user not ready force relogin
- if (!$this->userSetup->setupUser($params['uid'], $params['password'])) {
- return false;
+ if ($this->util->isMasterKeyEnabled() === false) {
+ $this->userSetup->setupUser($params['uid'], $params['password']);
}
$this->keyManager->init($params['uid'], $params['password']);
@@ -243,6 +249,7 @@ class UserHooks implements IHook {
// used to decrypt it has changed
} else { // admin changed the password for a different user, create new keys and re-encrypt file keys
$user = $params['uid'];
+ $this->initMountPoints($user);
$recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null;
// we generate new keys if...
@@ -281,6 +288,15 @@ class UserHooks implements IHook {
}
}
+ /**
+ * init mount points for given user
+ *
+ * @param string $user
+ * @throws \OC\User\NoUserException
+ */
+ protected function initMountPoints($user) {
+ Filesystem::initMountPoints($user);
+ }
/**
@@ -291,7 +307,16 @@ class UserHooks implements IHook {
public function postPasswordReset($params) {
$password = $params['password'];
- $this->keyManager->replaceUserKeys($params['uid']);
- $this->userSetup->setupServerSide($params['uid'], $password);
+ $this->keyManager->deleteUserKeys($params['uid']);
+ $this->userSetup->setupUser($params['uid'], $password);
+ }
+
+ /**
+ * setup file system for user
+ *
+ * @param string $uid user id
+ */
+ protected function setupFS($uid) {
+ \OC_Util::setupFS($uid);
}
}
diff --git a/apps/encryption/l10n/de.js b/apps/encryption/l10n/de.js
index de064986950..4b3e9e44520 100644
--- a/apps/encryption/l10n/de.js
+++ b/apps/encryption/l10n/de.js
@@ -34,7 +34,7 @@ OC.L10N.register(
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hey,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melde dich im Web-Interface an, gehe in deine persönlichen Einstellungen. Dort findest du die Option 'ownCloud-Basisverschlüsselungsmodul' und aktualisiere dort dein Verschlüsselungspasswort indem du das Passwort in das 'alte Log - in Passwort' und in das 'aktuellen Login - Passwort' Feld eingibst.<br><br>",
- "Encrypt the home storage" : "verschlüssel den Speicher",
+ "Encrypt the home storage" : "Verschlüssle den Speicher",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",
"Enable recovery key" : "Wiederherstellungsschlüssel aktivieren",
"Disable recovery key" : "Wiederherstellungsschlüssel deaktivieren",
diff --git a/apps/encryption/l10n/de.json b/apps/encryption/l10n/de.json
index 53754dcc4c8..f37c9e040fb 100644
--- a/apps/encryption/l10n/de.json
+++ b/apps/encryption/l10n/de.json
@@ -32,7 +32,7 @@
"The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
"Cheers!" : "Noch einen schönen Tag!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hey,<br><br>der Administrator hat die servereitige Verschlüsselung aktiviert. Die Dateien wurden mit dem Kennwort <strong>%s</strong> verschlüsselt.<br><br>Bitte melde dich im Web-Interface an, gehe in deine persönlichen Einstellungen. Dort findest du die Option 'ownCloud-Basisverschlüsselungsmodul' und aktualisiere dort dein Verschlüsselungspasswort indem du das Passwort in das 'alte Log - in Passwort' und in das 'aktuellen Login - Passwort' Feld eingibst.<br><br>",
- "Encrypt the home storage" : "verschlüssel den Speicher",
+ "Encrypt the home storage" : "Verschlüssle den Speicher",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Die Aktivierung dieser Option verschlüsselt alle Dateien die auf dem Hauptspeicher gespeichert sind, ansonsten werden nur Dateien auf dem externen Speicher verschlüsselt",
"Enable recovery key" : "Wiederherstellungsschlüssel aktivieren",
"Disable recovery key" : "Wiederherstellungsschlüssel deaktivieren",
diff --git a/apps/encryption/l10n/de_AT.js b/apps/encryption/l10n/de_AT.js
new file mode 100644
index 00000000000..164a02092f9
--- /dev/null
+++ b/apps/encryption/l10n/de_AT.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "encryption",
+ {
+ "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
+ "Cheers!" : "Noch einen schönen Tag!"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/encryption/l10n/de_AT.json b/apps/encryption/l10n/de_AT.json
new file mode 100644
index 00000000000..a8313eeb7aa
--- /dev/null
+++ b/apps/encryption/l10n/de_AT.json
@@ -0,0 +1,5 @@
+{ "translations": {
+ "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
+ "Cheers!" : "Noch einen schönen Tag!"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/encryption/l10n/th_TH.js b/apps/encryption/l10n/th_TH.js
index 37f505060cc..36ad6a1d6a3 100644
--- a/apps/encryption/l10n/th_TH.js
+++ b/apps/encryption/l10n/th_TH.js
@@ -20,11 +20,13 @@ OC.L10N.register(
"Could not update the private key password." : "ไม่สามารถอัพเดทรหัสการเข้ารหัสส่วนตัว",
"The old password was not correct, please try again." : "รหัสผ่านเดิมไม่ถูกต้องโปรดลองอีกครั้ง",
"The current log-in password was not correct, please try again." : "รหัสผ่านเข้าสู่ระบบในปัจจุบันไม่ถูกต้องโปรดลองอีกครั้ง",
- "Private key password successfully updated." : "รหัสการเข้ารหัสส่วนตัวถูกอัพเดทเรียบร้อยแล้ว",
+ "Private key password successfully updated." : "อัพเดทรหัส Private key เรียบร้อยแล้ว",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "คุณจำเป็นต้องย้ายรหัสการเข้ารหัสลับของคุณจากการเข้ารหัสเก่า (ownCloud ที่มีเวอร์ชันต่ำกว่าหรือเท่ากับ 8.0) ไปเวอร์ชันใหม่ โปรดเรียกใช้ 'occ encryption:migrate' หรือติดต่อผู้ดูแลระบบ",
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "รหัสส่วนตัวไม่ถูกต้องสำหรับการเข้ารหัสแอพฯ กรุณาอัพเดทรหัสการเข้ารหัสผ่านส่วนตัวของคุณในการตั้งค่าส่วนบุคคลและในการกู้คืนการเข้าถึงไฟล์ที่มีการเข้ารหัสของคุณ",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "การเข้ารหัสแอพฯ ถูกเปิดใช้งานแต่รหัสของคุณยังไม่ได้เริ่มต้นใช้ โปรดออกและเข้าสู่ระบบอีกครั้ง",
"Encryption App is enabled and ready" : "เข้ารหัสแอพถูกเปิดใช้งานและพร้อมทำงาน",
+ "Bad Signature" : "ลายเซ็นไม่ดี",
+ "Missing Signature" : "ลายเซ็นขาดหายไป",
"one-time password for server-side-encryption" : "รหัสผ่านเพียงครั้งเดียว สำหรับเข้ารหัสฝั่งเซิร์ฟเวอร์",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "ไม่สามารถถอดรหัสไฟล์นี้ มันอาจเป็นไฟล์ที่ใช้งานร่วมกัน กรุณาถามเจ้าของไฟล์เพื่อยกเลิกการใช้งานร่วมกัน ",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "ไม่สามารถอ่านไฟล์นี้ มันอาจเป็นไฟล์ที่ใช้งานร่วมกัน กรุณาสอบถามเจ้าของไฟล์เพื่อแชร์ไฟล์กับคุณ",
diff --git a/apps/encryption/l10n/th_TH.json b/apps/encryption/l10n/th_TH.json
index b87b5a848e8..470e3282680 100644
--- a/apps/encryption/l10n/th_TH.json
+++ b/apps/encryption/l10n/th_TH.json
@@ -18,11 +18,13 @@
"Could not update the private key password." : "ไม่สามารถอัพเดทรหัสการเข้ารหัสส่วนตัว",
"The old password was not correct, please try again." : "รหัสผ่านเดิมไม่ถูกต้องโปรดลองอีกครั้ง",
"The current log-in password was not correct, please try again." : "รหัสผ่านเข้าสู่ระบบในปัจจุบันไม่ถูกต้องโปรดลองอีกครั้ง",
- "Private key password successfully updated." : "รหัสการเข้ารหัสส่วนตัวถูกอัพเดทเรียบร้อยแล้ว",
+ "Private key password successfully updated." : "อัพเดทรหัส Private key เรียบร้อยแล้ว",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "คุณจำเป็นต้องย้ายรหัสการเข้ารหัสลับของคุณจากการเข้ารหัสเก่า (ownCloud ที่มีเวอร์ชันต่ำกว่าหรือเท่ากับ 8.0) ไปเวอร์ชันใหม่ โปรดเรียกใช้ 'occ encryption:migrate' หรือติดต่อผู้ดูแลระบบ",
"Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "รหัสส่วนตัวไม่ถูกต้องสำหรับการเข้ารหัสแอพฯ กรุณาอัพเดทรหัสการเข้ารหัสผ่านส่วนตัวของคุณในการตั้งค่าส่วนบุคคลและในการกู้คืนการเข้าถึงไฟล์ที่มีการเข้ารหัสของคุณ",
"Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "การเข้ารหัสแอพฯ ถูกเปิดใช้งานแต่รหัสของคุณยังไม่ได้เริ่มต้นใช้ โปรดออกและเข้าสู่ระบบอีกครั้ง",
"Encryption App is enabled and ready" : "เข้ารหัสแอพถูกเปิดใช้งานและพร้อมทำงาน",
+ "Bad Signature" : "ลายเซ็นไม่ดี",
+ "Missing Signature" : "ลายเซ็นขาดหายไป",
"one-time password for server-side-encryption" : "รหัสผ่านเพียงครั้งเดียว สำหรับเข้ารหัสฝั่งเซิร์ฟเวอร์",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "ไม่สามารถถอดรหัสไฟล์นี้ มันอาจเป็นไฟล์ที่ใช้งานร่วมกัน กรุณาถามเจ้าของไฟล์เพื่อยกเลิกการใช้งานร่วมกัน ",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "ไม่สามารถอ่านไฟล์นี้ มันอาจเป็นไฟล์ที่ใช้งานร่วมกัน กรุณาสอบถามเจ้าของไฟล์เพื่อแชร์ไฟล์กับคุณ",
diff --git a/apps/encryption/lib/crypto/encryptall.php b/apps/encryption/lib/crypto/encryptall.php
index 18e93d2e120..0037c213265 100644
--- a/apps/encryption/lib/crypto/encryptall.php
+++ b/apps/encryption/lib/crypto/encryptall.php
@@ -28,12 +28,12 @@ use OC\Encryption\Exceptions\DecryptionFailedException;
use OC\Files\View;
use OCA\Encryption\KeyManager;
use OCA\Encryption\Users\Setup;
+use OCA\Encryption\Util;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IUserManager;
use OCP\Mail\IMailer;
use OCP\Security\ISecureRandom;
-use OCP\Util;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Helper\Table;
@@ -55,6 +55,9 @@ class EncryptAll {
/** @var KeyManager */
protected $keyManager;
+ /** @var Util */
+ protected $util;
+
/** @var array */
protected $userPasswords;
@@ -84,6 +87,7 @@ class EncryptAll {
* @param IUserManager $userManager
* @param View $rootView
* @param KeyManager $keyManager
+ * @param Util $util
* @param IConfig $config
* @param IMailer $mailer
* @param IL10N $l
@@ -95,6 +99,7 @@ class EncryptAll {
IUserManager $userManager,
View $rootView,
KeyManager $keyManager,
+ Util $util,
IConfig $config,
IMailer $mailer,
IL10N $l,
@@ -105,6 +110,7 @@ class EncryptAll {
$this->userManager = $userManager;
$this->rootView = $rootView;
$this->keyManager = $keyManager;
+ $this->util = $util;
$this->config = $config;
$this->mailer = $mailer;
$this->l = $l;
@@ -129,16 +135,21 @@ class EncryptAll {
$this->output->writeln("\n");
$this->output->writeln($headline);
$this->output->writeln(str_pad('', strlen($headline), '='));
-
- //create private/public keys for each user and store the private key password
$this->output->writeln("\n");
- $this->output->writeln('Create key-pair for every user');
- $this->output->writeln('------------------------------');
- $this->output->writeln('');
- $this->output->writeln('This module will encrypt all files in the users files folder initially.');
- $this->output->writeln('Already existing versions and files in the trash bin will not be encrypted.');
- $this->output->writeln('');
- $this->createKeyPairs();
+
+ if ($this->util->isMasterKeyEnabled()) {
+ $this->output->writeln('Use master key to encrypt all files.');
+ $this->keyManager->validateMasterKey();
+ } else {
+ //create private/public keys for each user and store the private key password
+ $this->output->writeln('Create key-pair for every user');
+ $this->output->writeln('------------------------------');
+ $this->output->writeln('');
+ $this->output->writeln('This module will encrypt all files in the users files folder initially.');
+ $this->output->writeln('Already existing versions and files in the trash bin will not be encrypted.');
+ $this->output->writeln('');
+ $this->createKeyPairs();
+ }
//setup users file system and encrypt all files one by one (take should encrypt setting of storage into account)
$this->output->writeln("\n");
@@ -146,12 +157,14 @@ class EncryptAll {
$this->output->writeln('----------------------------');
$this->output->writeln('');
$this->encryptAllUsersFiles();
- //send-out or display password list and write it to a file
- $this->output->writeln("\n");
- $this->output->writeln('Generated encryption key passwords');
- $this->output->writeln('----------------------------------');
- $this->output->writeln('');
- $this->outputPasswords();
+ if ($this->util->isMasterKeyEnabled() === false) {
+ //send-out or display password list and write it to a file
+ $this->output->writeln("\n");
+ $this->output->writeln('Generated encryption key passwords');
+ $this->output->writeln('----------------------------------');
+ $this->output->writeln('');
+ $this->outputPasswords();
+ }
$this->output->writeln("\n");
}
@@ -200,10 +213,14 @@ class EncryptAll {
$progress->start();
$numberOfUsers = count($this->userPasswords);
$userNo = 1;
- foreach ($this->userPasswords as $uid => $password) {
- $userCount = "$uid ($userNo of $numberOfUsers)";
- $this->encryptUsersFiles($uid, $progress, $userCount);
- $userNo++;
+ if ($this->util->isMasterKeyEnabled()) {
+ $this->encryptAllUserFilesWithMasterKey($progress);
+ } else {
+ foreach ($this->userPasswords as $uid => $password) {
+ $userCount = "$uid ($userNo of $numberOfUsers)";
+ $this->encryptUsersFiles($uid, $progress, $userCount);
+ $userNo++;
+ }
}
$progress->setMessage("all files encrypted");
$progress->finish();
@@ -211,6 +228,28 @@ class EncryptAll {
}
/**
+ * encrypt all user files with the master key
+ *
+ * @param ProgressBar $progress
+ */
+ protected function encryptAllUserFilesWithMasterKey(ProgressBar $progress) {
+ $userNo = 1;
+ foreach($this->userManager->getBackends() as $backend) {
+ $limit = 500;
+ $offset = 0;
+ do {
+ $users = $backend->getUsers('', $limit, $offset);
+ foreach ($users as $user) {
+ $userCount = "$user ($userNo)";
+ $this->encryptUsersFiles($user, $progress, $userCount);
+ $userNo++;
+ }
+ $offset += $limit;
+ } while(count($users) >= $limit);
+ }
+ }
+
+ /**
* encrypt files from the given user
*
* @param string $uid
@@ -384,7 +423,7 @@ class EncryptAll {
$message->setHtmlBody($htmlBody);
$message->setPlainBody($textBody);
$message->setFrom([
- Util::getDefaultEmailAddress('admin-noreply')
+ \OCP\Util::getDefaultEmailAddress('admin-noreply')
]);
$this->mailer->send($message);
diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php
index 907a6437f5b..6eff66e72be 100644
--- a/apps/encryption/lib/crypto/encryption.php
+++ b/apps/encryption/lib/crypto/encryption.php
@@ -547,4 +547,17 @@ class Encryption implements IEncryptionModule {
return $path;
}
+ /**
+ * Check if the module is ready to be used by that specific user.
+ * In case a module is not ready - because e.g. key pairs have not been generated
+ * upon login this method can return false before any operation starts and might
+ * cause issues during operations.
+ *
+ * @param string $user
+ * @return boolean
+ * @since 9.1.0
+ */
+ public function isReadyForUser($user) {
+ return $this->keyManager->userHasKeys($user);
+ }
}
diff --git a/apps/encryption/lib/keymanager.php b/apps/encryption/lib/keymanager.php
index 12fa5f92bd5..4f22c3def63 100644
--- a/apps/encryption/lib/keymanager.php
+++ b/apps/encryption/lib/keymanager.php
@@ -174,6 +174,11 @@ class KeyManager {
* check if a key pair for the master key exists, if not we create one
*/
public function validateMasterKey() {
+
+ if ($this->util->isMasterKeyEnabled() === false) {
+ return;
+ }
+
$masterKey = $this->getPublicMasterKey();
if (empty($masterKey)) {
$keyPair = $this->crypt->createKeyPair();
@@ -334,7 +339,7 @@ class KeyManager {
/**
* Decrypt private key and store it
*
- * @param string $uid userid
+ * @param string $uid user id
* @param string $passPhrase users password
* @return boolean
*/
@@ -342,7 +347,6 @@ class KeyManager {
$this->session->setStatus(Session::INIT_EXECUTED);
-
try {
if($this->util->isMasterKeyEnabled()) {
$uid = $this->getMasterKeyId();
@@ -390,17 +394,20 @@ class KeyManager {
public function getFileKey($path, $uid) {
$encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId, Encryption::ID);
+ if (empty($encryptedFileKey)) {
+ return '';
+ }
+
+ if ($this->util->isMasterKeyEnabled()) {
+ $uid = $this->getMasterKeyId();
+ }
+
if (is_null($uid)) {
$uid = $this->getPublicShareKeyId();
$shareKey = $this->getShareKey($path, $uid);
$privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.privateKey', Encryption::ID);
$privateKey = $this->crypt->decryptPrivateKey($privateKey);
} else {
-
- if ($this->util->isMasterKeyEnabled()) {
- $uid = $this->getMasterKeyId();
- }
-
$shareKey = $this->getShareKey($path, $uid);
$privateKey = $this->session->getPrivateKey();
}
@@ -493,6 +500,7 @@ class KeyManager {
*/
public function userHasKeys($userId) {
$privateKey = $publicKey = true;
+ $exception = null;
try {
$this->getPrivateKey($userId);
@@ -553,9 +561,11 @@ class KeyManager {
}
/**
+ * creat a backup of the users private and public key and then delete it
+ *
* @param string $uid
*/
- public function replaceUserKeys($uid) {
+ public function deleteUserKeys($uid) {
$this->backupAllKeys('password_reset');
$this->deletePublicKey($uid);
$this->deletePrivateKey($uid);
diff --git a/apps/encryption/lib/users/setup.php b/apps/encryption/lib/users/setup.php
index 0b5fb351aca..e59340c4ce2 100644
--- a/apps/encryption/lib/users/setup.php
+++ b/apps/encryption/lib/users/setup.php
@@ -66,29 +66,23 @@ class Setup {
}
/**
- * @param string $uid userid
+ * @param string $uid user id
* @param string $password user password
* @return bool
*/
public function setupUser($uid, $password) {
- return $this->setupServerSide($uid, $password);
+ if (!$this->keyManager->userHasKeys($uid)) {
+ return $this->keyManager->storeKeyPair($uid, $password,
+ $this->crypt->createKeyPair());
+ }
+ return true;
}
/**
- * check if user has a key pair, if not we create one
- *
- * @param string $uid userid
- * @param string $password user password
- * @return bool
+ * make sure that all system keys exists
*/
- public function setupServerSide($uid, $password) {
+ public function setupSystem() {
$this->keyManager->validateShareKey();
$this->keyManager->validateMasterKey();
- // Check if user already has keys
- if (!$this->keyManager->userHasKeys($uid)) {
- return $this->keyManager->storeKeyPair($uid, $password,
- $this->crypt->createKeyPair());
- }
- return true;
}
}
diff --git a/apps/encryption/tests/hooks/UserHooksTest.php b/apps/encryption/tests/hooks/UserHooksTest.php
index 08d1981266c..df3d12b3401 100644
--- a/apps/encryption/tests/hooks/UserHooksTest.php
+++ b/apps/encryption/tests/hooks/UserHooksTest.php
@@ -29,6 +29,12 @@ use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\Hooks\UserHooks;
use Test\TestCase;
+/**
+ * Class UserHooksTest
+ *
+ * @group DB
+ * @package OCA\Encryption\Tests\Hooks
+ */
class UserHooksTest extends TestCase {
/**
* @var \PHPUnit_Framework_MockObject_MockObject
@@ -71,7 +77,7 @@ class UserHooksTest extends TestCase {
private $params = ['uid' => 'testUser', 'password' => 'password'];
public function testLogin() {
- $this->userSetupMock->expects($this->exactly(2))
+ $this->userSetupMock->expects($this->once())
->method('setupUser')
->willReturnOnConsecutiveCalls(true, false);
@@ -80,7 +86,6 @@ class UserHooksTest extends TestCase {
->with('testUser', 'password');
$this->assertNull($this->instance->login($this->params));
- $this->assertFalse($this->instance->login($this->params));
}
public function testLogout() {
@@ -190,6 +195,23 @@ class UserHooksTest extends TestCase {
->willReturnOnConsecutiveCalls(true, false);
+ $this->instance = $this->getMockBuilder('OCA\Encryption\Hooks\UserHooks')
+ ->setConstructorArgs(
+ [
+ $this->keyManagerMock,
+ $this->userManagerMock,
+ $this->loggerMock,
+ $this->userSetupMock,
+ $this->userSessionMock,
+ $this->utilMock,
+ $this->sessionMock,
+ $this->cryptMock,
+ $this->recoveryMock
+ ]
+ )->setMethods(['initMountPoints'])->getMock();
+
+ $this->instance->expects($this->exactly(3))->method('initMountPoints');
+
// Test first if statement
$this->assertNull($this->instance->setPassphrase($this->params));
@@ -236,27 +258,31 @@ class UserHooksTest extends TestCase {
->with('testUser')
->willReturn(false);
- $userHooks = new UserHooks($this->keyManagerMock,
- $this->userManagerMock,
- $this->loggerMock,
- $this->userSetupMock,
- $userSessionMock,
- $this->utilMock,
- $this->sessionMock,
- $this->cryptMock,
- $this->recoveryMock
- );
+ $userHooks = $this->getMockBuilder('OCA\Encryption\Hooks\UserHooks')
+ ->setConstructorArgs(
+ [
+ $this->keyManagerMock,
+ $this->userManagerMock,
+ $this->loggerMock,
+ $this->userSetupMock,
+ $userSessionMock,
+ $this->utilMock,
+ $this->sessionMock,
+ $this->cryptMock,
+ $this->recoveryMock
+ ]
+ )->setMethods(['initMountPoints'])->getMock();
$this->assertNull($userHooks->setPassphrase($this->params));
}
public function testPostPasswordReset() {
$this->keyManagerMock->expects($this->once())
- ->method('replaceUserKeys')
+ ->method('deleteUserKeys')
->with('testUser');
$this->userSetupMock->expects($this->once())
- ->method('setupServerSide')
+ ->method('setupUser')
->with('testUser', 'password');
$this->assertNull($this->instance->postPasswordReset($this->params));
@@ -312,16 +338,22 @@ class UserHooksTest extends TestCase {
$this->sessionMock = $sessionMock;
$this->recoveryMock = $recoveryMock;
$this->utilMock = $utilMock;
- $this->instance = new UserHooks($this->keyManagerMock,
- $this->userManagerMock,
- $this->loggerMock,
- $this->userSetupMock,
- $this->userSessionMock,
- $this->utilMock,
- $this->sessionMock,
- $this->cryptMock,
- $this->recoveryMock
- );
+ $this->utilMock->expects($this->any())->method('isMasterKeyEnabled')->willReturn(false);
+
+ $this->instance = $this->getMockBuilder('OCA\Encryption\Hooks\UserHooks')
+ ->setConstructorArgs(
+ [
+ $this->keyManagerMock,
+ $this->userManagerMock,
+ $this->loggerMock,
+ $this->userSetupMock,
+ $this->userSessionMock,
+ $this->utilMock,
+ $this->sessionMock,
+ $this->cryptMock,
+ $this->recoveryMock
+ ]
+ )->setMethods(['setupFS'])->getMock();
}
diff --git a/apps/encryption/tests/lib/crypto/encryptalltest.php b/apps/encryption/tests/lib/crypto/encryptalltest.php
index 04d931342a7..d31f58377c4 100644
--- a/apps/encryption/tests/lib/crypto/encryptalltest.php
+++ b/apps/encryption/tests/lib/crypto/encryptalltest.php
@@ -31,6 +31,9 @@ class EncryptAllTest extends TestCase {
/** @var \PHPUnit_Framework_MockObject_MockObject | \OCA\Encryption\KeyManager */
protected $keyManager;
+ /** @var \PHPUnit_Framework_MockObject_MockObject | \OCA\Encryption\Util */
+ protected $util;
+
/** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IUserManager */
protected $userManager;
@@ -73,6 +76,8 @@ class EncryptAllTest extends TestCase {
->disableOriginalConstructor()->getMock();
$this->keyManager = $this->getMockBuilder('OCA\Encryption\KeyManager')
->disableOriginalConstructor()->getMock();
+ $this->util = $this->getMockBuilder('OCA\Encryption\Util')
+ ->disableOriginalConstructor()->getMock();
$this->userManager = $this->getMockBuilder('OCP\IUserManager')
->disableOriginalConstructor()->getMock();
$this->view = $this->getMockBuilder('OC\Files\View')
@@ -110,6 +115,7 @@ class EncryptAllTest extends TestCase {
$this->userManager,
$this->view,
$this->keyManager,
+ $this->util,
$this->config,
$this->mailer,
$this->l,
@@ -127,6 +133,7 @@ class EncryptAllTest extends TestCase {
$this->userManager,
$this->view,
$this->keyManager,
+ $this->util,
$this->config,
$this->mailer,
$this->l,
@@ -137,6 +144,7 @@ class EncryptAllTest extends TestCase {
->setMethods(['createKeyPairs', 'encryptAllUsersFiles', 'outputPasswords'])
->getMock();
+ $this->util->expects($this->any())->method('isMasterKeyEnabled')->willReturn(false);
$encryptAll->expects($this->at(0))->method('createKeyPairs')->with();
$encryptAll->expects($this->at(1))->method('encryptAllUsersFiles')->with();
$encryptAll->expects($this->at(2))->method('outputPasswords')->with();
@@ -145,6 +153,36 @@ class EncryptAllTest extends TestCase {
}
+ public function testEncryptAllWithMasterKey() {
+ /** @var EncryptAll | \PHPUnit_Framework_MockObject_MockObject $encryptAll */
+ $encryptAll = $this->getMockBuilder('OCA\Encryption\Crypto\EncryptAll')
+ ->setConstructorArgs(
+ [
+ $this->setupUser,
+ $this->userManager,
+ $this->view,
+ $this->keyManager,
+ $this->util,
+ $this->config,
+ $this->mailer,
+ $this->l,
+ $this->questionHelper,
+ $this->secureRandom
+ ]
+ )
+ ->setMethods(['createKeyPairs', 'encryptAllUsersFiles', 'outputPasswords'])
+ ->getMock();
+
+ $this->util->expects($this->any())->method('isMasterKeyEnabled')->willReturn(true);
+ $encryptAll->expects($this->never())->method('createKeyPairs');
+ $this->keyManager->expects($this->once())->method('validateMasterKey');
+ $encryptAll->expects($this->at(0))->method('encryptAllUsersFiles')->with();
+ $encryptAll->expects($this->never())->method('outputPasswords');
+
+ $encryptAll->encryptAll($this->inputInterface, $this->outputInterface);
+
+ }
+
public function testCreateKeyPairs() {
/** @var EncryptAll | \PHPUnit_Framework_MockObject_MockObject $encryptAll */
$encryptAll = $this->getMockBuilder('OCA\Encryption\Crypto\EncryptAll')
@@ -154,6 +192,7 @@ class EncryptAllTest extends TestCase {
$this->userManager,
$this->view,
$this->keyManager,
+ $this->util,
$this->config,
$this->mailer,
$this->l,
@@ -202,6 +241,7 @@ class EncryptAllTest extends TestCase {
$this->userManager,
$this->view,
$this->keyManager,
+ $this->util,
$this->config,
$this->mailer,
$this->l,
@@ -212,6 +252,8 @@ class EncryptAllTest extends TestCase {
->setMethods(['encryptUsersFiles'])
->getMock();
+ $this->util->expects($this->any())->method('isMasterKeyEnabled')->willReturn(false);
+
// set protected property $output
$this->invokePrivate($encryptAll, 'output', [$this->outputInterface]);
$this->invokePrivate($encryptAll, 'userPasswords', [['user1' => 'pwd1', 'user2' => 'pwd2']]);
@@ -232,6 +274,7 @@ class EncryptAllTest extends TestCase {
$this->userManager,
$this->view,
$this->keyManager,
+ $this->util,
$this->config,
$this->mailer,
$this->l,
@@ -239,9 +282,10 @@ class EncryptAllTest extends TestCase {
$this->secureRandom
]
)
- ->setMethods(['encryptFile'])
+ ->setMethods(['encryptFile', 'setupUserFS'])
->getMock();
+ $this->util->expects($this->any())->method('isMasterKeyEnabled')->willReturn(false);
$this->view->expects($this->at(0))->method('getDirectoryContent')
->with('/user1/files')->willReturn(
@@ -268,8 +312,8 @@ class EncryptAllTest extends TestCase {
}
);
- $encryptAll->expects($this->at(0))->method('encryptFile')->with('/user1/files/bar');
- $encryptAll->expects($this->at(1))->method('encryptFile')->with('/user1/files/foo/subfile');
+ $encryptAll->expects($this->at(1))->method('encryptFile')->with('/user1/files/bar');
+ $encryptAll->expects($this->at(2))->method('encryptFile')->with('/user1/files/foo/subfile');
$progressBar = $this->getMockBuilder('Symfony\Component\Console\Helper\ProgressBar')
->disableOriginalConstructor()->getMock();
diff --git a/apps/encryption/tests/lib/users/SetupTest.php b/apps/encryption/tests/lib/users/SetupTest.php
index 0cc59384b16..e7d8afbb102 100644
--- a/apps/encryption/tests/lib/users/SetupTest.php
+++ b/apps/encryption/tests/lib/users/SetupTest.php
@@ -41,26 +41,6 @@ class SetupTest extends TestCase {
*/
private $instance;
- public function testSetupServerSide() {
- $this->keyManagerMock->expects($this->exactly(2))->method('validateShareKey');
- $this->keyManagerMock->expects($this->exactly(2))->method('validateMasterKey');
- $this->keyManagerMock->expects($this->exactly(2))
- ->method('userHasKeys')
- ->with('admin')
- ->willReturnOnConsecutiveCalls(true, false);
-
- $this->assertTrue($this->instance->setupServerSide('admin',
- 'password'));
-
- $this->keyManagerMock->expects($this->once())
- ->method('storeKeyPair')
- ->with('admin', 'password')
- ->willReturn(false);
-
- $this->assertFalse($this->instance->setupServerSide('admin',
- 'password'));
- }
-
protected function setUp() {
parent::setUp();
$logMock = $this->getMock('OCP\ILogger');
@@ -81,4 +61,43 @@ class SetupTest extends TestCase {
$this->keyManagerMock);
}
+
+ public function testSetupSystem() {
+ $this->keyManagerMock->expects($this->once())->method('validateShareKey');
+ $this->keyManagerMock->expects($this->once())->method('validateMasterKey');
+
+ $this->instance->setupSystem();
+ }
+
+ /**
+ * @dataProvider dataTestSetupUser
+ *
+ * @param bool $hasKeys
+ * @param bool $expected
+ */
+ public function testSetupUser($hasKeys, $expected) {
+
+ $this->keyManagerMock->expects($this->once())->method('userHasKeys')
+ ->with('uid')->willReturn($hasKeys);
+
+ if ($hasKeys) {
+ $this->keyManagerMock->expects($this->never())->method('storeKeyPair');
+ } else {
+ $this->cryptMock->expects($this->once())->method('createKeyPair')->willReturn('keyPair');
+ $this->keyManagerMock->expects($this->once())->method('storeKeyPair')
+ ->with('uid', 'password', 'keyPair')->willReturn(true);
+ }
+
+ $this->assertSame($expected,
+ $this->instance->setupUser('uid', 'password')
+ );
+ }
+
+ public function dataTestSetupUser() {
+ return [
+ [true, true],
+ [false, true]
+ ];
+ }
+
}
diff --git a/apps/federatedfilesharing/appinfo/app.php b/apps/federatedfilesharing/appinfo/app.php
index 804ab69759c..23af62037a3 100644
--- a/apps/federatedfilesharing/appinfo/app.php
+++ b/apps/federatedfilesharing/appinfo/app.php
@@ -21,7 +21,5 @@
namespace OCA\FederatedFileSharing\AppInfo;
-use OCP\AppFramework\App;
-
-new App('federatedfilesharing');
-
+$app = new Application('federatedfilesharing');
+$app->registerSettings();
diff --git a/apps/federatedfilesharing/appinfo/application.php b/apps/federatedfilesharing/appinfo/application.php
new file mode 100644
index 00000000000..5a213aec8e2
--- /dev/null
+++ b/apps/federatedfilesharing/appinfo/application.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\FederatedFileSharing\AppInfo;
+
+
+use OCA\FederatedFileSharing\FederatedShareProvider;
+use OCP\AppFramework\App;
+
+class Application extends App {
+
+ /** @var FederatedShareProvider */
+ protected $federatedShareProvider;
+
+ /**
+ * register personal and admin settings page
+ */
+ public function registerSettings() {
+ \OCP\App::registerAdmin('federatedfilesharing', 'settings-admin');
+ \OCP\App::registerPersonal('federatedfilesharing', 'settings-personal');
+ }
+
+ /**
+ * get instance of federated share provider
+ *
+ * @return FederatedShareProvider
+ */
+ public function getFederatedShareProvider() {
+ if ($this->federatedShareProvider === null) {
+ $this->initFederatedShareProvider();
+ }
+ return $this->federatedShareProvider;
+ }
+
+ /**
+ * initialize federated share provider
+ */
+ protected function initFederatedShareProvider() {
+ $addressHandler = new \OCA\FederatedFileSharing\AddressHandler(
+ \OC::$server->getURLGenerator(),
+ \OC::$server->getL10N('federatedfilesharing')
+ );
+ $discoveryManager = new \OCA\FederatedFileSharing\DiscoveryManager(
+ \OC::$server->getMemCacheFactory(),
+ \OC::$server->getHTTPClientService()
+ );
+ $notifications = new \OCA\FederatedFileSharing\Notifications(
+ $addressHandler,
+ \OC::$server->getHTTPClientService(),
+ $discoveryManager,
+ \OC::$server->getJobList()
+ );
+ $tokenHandler = new \OCA\FederatedFileSharing\TokenHandler(
+ \OC::$server->getSecureRandom()
+ );
+
+ $this->federatedShareProvider = new \OCA\FederatedFileSharing\FederatedShareProvider(
+ \OC::$server->getDatabaseConnection(),
+ $addressHandler,
+ $notifications,
+ $tokenHandler,
+ \OC::$server->getL10N('federatedfilesharing'),
+ \OC::$server->getLogger(),
+ \OC::$server->getLazyRootFolder(),
+ \OC::$server->getConfig()
+ );
+ }
+
+}
diff --git a/apps/files_sharing/css/3rdparty/gs-share/style.css b/apps/federatedfilesharing/css/3rdparty/gs-share/style.css
index c699ddb3db5..c699ddb3db5 100644
--- a/apps/files_sharing/css/3rdparty/gs-share/style.css
+++ b/apps/federatedfilesharing/css/3rdparty/gs-share/style.css
diff --git a/apps/files_sharing/css/settings-personal.css b/apps/federatedfilesharing/css/settings-personal.css
index f53365c9371..f53365c9371 100644
--- a/apps/files_sharing/css/settings-personal.css
+++ b/apps/federatedfilesharing/css/settings-personal.css
diff --git a/apps/files_sharing/img/social-diaspora.svg b/apps/federatedfilesharing/img/social-diaspora.svg
index 1d5131129a9..1d5131129a9 100644
--- a/apps/files_sharing/img/social-diaspora.svg
+++ b/apps/federatedfilesharing/img/social-diaspora.svg
diff --git a/apps/files_sharing/img/social-facebook.svg b/apps/federatedfilesharing/img/social-facebook.svg
index aad02bc3853..aad02bc3853 100644
--- a/apps/files_sharing/img/social-facebook.svg
+++ b/apps/federatedfilesharing/img/social-facebook.svg
diff --git a/apps/files_sharing/img/social-gnu.svg b/apps/federatedfilesharing/img/social-gnu.svg
index 24556aaa024..24556aaa024 100644
--- a/apps/files_sharing/img/social-gnu.svg
+++ b/apps/federatedfilesharing/img/social-gnu.svg
diff --git a/apps/files_sharing/img/social-googleplus.svg b/apps/federatedfilesharing/img/social-googleplus.svg
index 123273f2d38..123273f2d38 100644
--- a/apps/files_sharing/img/social-googleplus.svg
+++ b/apps/federatedfilesharing/img/social-googleplus.svg
diff --git a/apps/files_sharing/img/social-twitter.svg b/apps/federatedfilesharing/img/social-twitter.svg
index 00ce390de6b..00ce390de6b 100644
--- a/apps/files_sharing/img/social-twitter.svg
+++ b/apps/federatedfilesharing/img/social-twitter.svg
diff --git a/apps/files_sharing/js/3rdparty/gs-share/gs-share.js b/apps/federatedfilesharing/js/3rdparty/gs-share/gs-share.js
index fd4442708a4..fd4442708a4 100644
--- a/apps/files_sharing/js/3rdparty/gs-share/gs-share.js
+++ b/apps/federatedfilesharing/js/3rdparty/gs-share/gs-share.js
diff --git a/apps/files_sharing/js/settings-admin.js b/apps/federatedfilesharing/js/settings-admin.js
index 95578bff548..95578bff548 100644
--- a/apps/files_sharing/js/settings-admin.js
+++ b/apps/federatedfilesharing/js/settings-admin.js
diff --git a/apps/files_sharing/js/settings-personal.js b/apps/federatedfilesharing/js/settings-personal.js
index 14a9b7bbfa7..14a9b7bbfa7 100644
--- a/apps/files_sharing/js/settings-personal.js
+++ b/apps/federatedfilesharing/js/settings-personal.js
diff --git a/apps/federatedfilesharing/l10n/az.js b/apps/federatedfilesharing/l10n/az.js
new file mode 100644
index 00000000000..023c4560256
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/az.js
@@ -0,0 +1,9 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Federated Cloud Sharing" : "Federal Cloud Paylaşım",
+ "Open documentation" : "Sənədləri aç",
+ "Allow users on this server to send shares to other servers" : "Bu serverdən digər serverlərə istifadəçilər tərəfindən paylaşımın göndərilməsinə izin vermək",
+ "Allow users on this server to receive shares from other servers" : "Digər serverlərdən bu serverə istifadəçilər tərəfindən paylaşımın ötürülməsinə izin vermək"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/az.json b/apps/federatedfilesharing/l10n/az.json
new file mode 100644
index 00000000000..c6c2f05ad13
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/az.json
@@ -0,0 +1,7 @@
+{ "translations": {
+ "Federated Cloud Sharing" : "Federal Cloud Paylaşım",
+ "Open documentation" : "Sənədləri aç",
+ "Allow users on this server to send shares to other servers" : "Bu serverdən digər serverlərə istifadəçilər tərəfindən paylaşımın göndərilməsinə izin vermək",
+ "Allow users on this server to receive shares from other servers" : "Digər serverlərdən bu serverə istifadəçilər tərəfindən paylaşımın ötürülməsinə izin vermək"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/bg_BG.js b/apps/federatedfilesharing/l10n/bg_BG.js
index e65e1d0ce3a..4221613faeb 100644
--- a/apps/federatedfilesharing/l10n/bg_BG.js
+++ b/apps/federatedfilesharing/l10n/bg_BG.js
@@ -2,6 +2,9 @@ OC.L10N.register(
"federatedfilesharing",
{
"Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен.",
+ "Open documentation" : "Отвори документацията",
+ "Allow users on this server to send shares to other servers" : "Позволи на потребители от този сървър да споделят папки с други сървъри",
+ "Allow users on this server to receive shares from other servers" : "Позволи на потребители на този сървър да получават споделени папки от други сървъри"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/bg_BG.json b/apps/federatedfilesharing/l10n/bg_BG.json
index 5e78abddff6..4a80df95c1d 100644
--- a/apps/federatedfilesharing/l10n/bg_BG.json
+++ b/apps/federatedfilesharing/l10n/bg_BG.json
@@ -1,5 +1,8 @@
{ "translations": {
"Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен.",
+ "Open documentation" : "Отвори документацията",
+ "Allow users on this server to send shares to other servers" : "Позволи на потребители от този сървър да споделят папки с други сървъри",
+ "Allow users on this server to receive shares from other servers" : "Позволи на потребители на този сървър да получават споделени папки от други сървъри"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/ca.js b/apps/federatedfilesharing/l10n/ca.js
index 0b5c16a0239..bc2ea1e51c6 100644
--- a/apps/federatedfilesharing/l10n/ca.js
+++ b/apps/federatedfilesharing/l10n/ca.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"federatedfilesharing",
{
- "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s"
+ "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s",
+ "Open documentation" : "Obre la documentació"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/ca.json b/apps/federatedfilesharing/l10n/ca.json
index efff946dabd..9ac1be24429 100644
--- a/apps/federatedfilesharing/l10n/ca.json
+++ b/apps/federatedfilesharing/l10n/ca.json
@@ -1,4 +1,5 @@
{ "translations": {
- "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s"
+ "Sharing %s failed, because this item is already shared with %s" : "Ha fallat en compartir %s, perquè l'element ja està compartit amb %s",
+ "Open documentation" : "Obre la documentació"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/cs_CZ.js b/apps/federatedfilesharing/l10n/cs_CZ.js
index fc3eeda97b3..2a5790b4584 100644
--- a/apps/federatedfilesharing/l10n/cs_CZ.js
+++ b/apps/federatedfilesharing/l10n/cs_CZ.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Neplatné sdružené cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Sdílení položky %s selhalo, protože položka již je s uživatelem %s sdílena",
"Not allowed to create a federated share with the same user" : "Není povoleno vytvořit propojené sdílení s tím samým uživatelem",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sdílení %s selhalo, %s se nepodařilo nalézt, server pravděpodobně právě není dostupný."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sdílení %s selhalo, %s se nepodařilo nalézt, server pravděpodobně právě není dostupný.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID",
+ "Federated Cloud Sharing" : "Propojené cloudové sdílení",
+ "Open documentation" : "Otevřít dokumentaci",
+ "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
+ "Allow users on this server to receive shares from other servers" : "Povolit uživatelům z tohoto serveru přijímat sdílení z jiných serverů",
+ "Federated Cloud" : "Sdružený cloud",
+ "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
+ "Share it:" : "Sdílet:",
+ "Add to your website" : "Přidat na svou webovou stránku",
+ "Share with me via ownCloud" : "Sdíleno se mnou přes ownCloud",
+ "HTML Code:" : "HTML kód:"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/federatedfilesharing/l10n/cs_CZ.json b/apps/federatedfilesharing/l10n/cs_CZ.json
index 04ce3315c7f..f3c057af1b0 100644
--- a/apps/federatedfilesharing/l10n/cs_CZ.json
+++ b/apps/federatedfilesharing/l10n/cs_CZ.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Neplatné sdružené cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Sdílení položky %s selhalo, protože položka již je s uživatelem %s sdílena",
"Not allowed to create a federated share with the same user" : "Není povoleno vytvořit propojené sdílení s tím samým uživatelem",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sdílení %s selhalo, %s se nepodařilo nalézt, server pravděpodobně právě není dostupný."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sdílení %s selhalo, %s se nepodařilo nalézt, server pravděpodobně právě není dostupný.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID",
+ "Federated Cloud Sharing" : "Propojené cloudové sdílení",
+ "Open documentation" : "Otevřít dokumentaci",
+ "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
+ "Allow users on this server to receive shares from other servers" : "Povolit uživatelům z tohoto serveru přijímat sdílení z jiných serverů",
+ "Federated Cloud" : "Sdružený cloud",
+ "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
+ "Share it:" : "Sdílet:",
+ "Add to your website" : "Přidat na svou webovou stránku",
+ "Share with me via ownCloud" : "Sdíleno se mnou přes ownCloud",
+ "HTML Code:" : "HTML kód:"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/da.js b/apps/federatedfilesharing/l10n/da.js
index 0b113d6ae4f..7d9959e030b 100644
--- a/apps/federatedfilesharing/l10n/da.js
+++ b/apps/federatedfilesharing/l10n/da.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Ugyldigt Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Der skete en fejl ved deling af %s, objektet er allerede delt med %s",
"Not allowed to create a federated share with the same user" : "Det er ikke tilladt at danne et datafællesskab med samme bruger",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling af %s mislykkedes - kunne ikke finde %s. Måske er serveren ikke tilgængelig i øjeblikket."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling af %s mislykkedes - kunne ikke finde %s. Måske er serveren ikke tilgængelig i øjeblikket.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med mig gennem min #ownCloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Del med mig gennem min #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Sammensluttet Cloud deling",
+ "Open documentation" : "Åben dokumentation",
+ "Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere",
+ "Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Din Federated Cloud ID:",
+ "Share it:" : "Del:",
+ "Add to your website" : "Tilføj til dit websted",
+ "Share with me via ownCloud" : "Del med mig gennem ownCloud",
+ "HTML Code:" : "HTMLkode:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/da.json b/apps/federatedfilesharing/l10n/da.json
index 3f4e82b0528..1994feb6884 100644
--- a/apps/federatedfilesharing/l10n/da.json
+++ b/apps/federatedfilesharing/l10n/da.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Ugyldigt Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Der skete en fejl ved deling af %s, objektet er allerede delt med %s",
"Not allowed to create a federated share with the same user" : "Det er ikke tilladt at danne et datafællesskab med samme bruger",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling af %s mislykkedes - kunne ikke finde %s. Måske er serveren ikke tilgængelig i øjeblikket."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling af %s mislykkedes - kunne ikke finde %s. Måske er serveren ikke tilgængelig i øjeblikket.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med mig gennem min #ownCloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Del med mig gennem min #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Sammensluttet Cloud deling",
+ "Open documentation" : "Åben dokumentation",
+ "Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere",
+ "Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Din Federated Cloud ID:",
+ "Share it:" : "Del:",
+ "Add to your website" : "Tilføj til dit websted",
+ "Share with me via ownCloud" : "Del med mig gennem ownCloud",
+ "HTML Code:" : "HTMLkode:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/de.js b/apps/federatedfilesharing/l10n/de.js
index 4831e514990..ab90b424dc5 100644
--- a/apps/federatedfilesharing/l10n/de.js
+++ b/apps/federatedfilesharing/l10n/de.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"Sharing %s failed, because this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird",
"Not allowed to create a federated share with the same user" : "Das Erstellen einer Federated Cloud Freigabe mit dem gleichen Benutzer ist nicht erlaubt",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Freigabe von %s fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Freigabe von %s fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
+ "Open documentation" : "Dokumentation öffnen",
+ "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
+ "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:",
+ "Share it:" : "Zum Teilen:",
+ "Add to your website" : "Zu deiner Webseite hinzufügen",
+ "Share with me via ownCloud" : "Teile mit mir über ownCloud",
+ "HTML Code:" : "HTML-Code:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/de.json b/apps/federatedfilesharing/l10n/de.json
index b6ea0174877..3fd04ae7ec6 100644
--- a/apps/federatedfilesharing/l10n/de.json
+++ b/apps/federatedfilesharing/l10n/de.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"Sharing %s failed, because this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird",
"Not allowed to create a federated share with the same user" : "Das Erstellen einer Federated Cloud Freigabe mit dem gleichen Benutzer ist nicht erlaubt",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Freigabe von %s fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Freigabe von %s fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
+ "Open documentation" : "Dokumentation öffnen",
+ "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
+ "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:",
+ "Share it:" : "Zum Teilen:",
+ "Add to your website" : "Zu deiner Webseite hinzufügen",
+ "Share with me via ownCloud" : "Teile mit mir über ownCloud",
+ "HTML Code:" : "HTML-Code:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/de_DE.js b/apps/federatedfilesharing/l10n/de_DE.js
index bbedbf1da43..c2c336ad9db 100644
--- a/apps/federatedfilesharing/l10n/de_DE.js
+++ b/apps/federatedfilesharing/l10n/de_DE.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"Sharing %s failed, because this item is already shared with %s" : "Die Freigabe von %s ist fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird",
"Not allowed to create a federated share with the same user" : "Das Erstellen einer Federated Cloud Freigabe mit dem gleichen Benutzer ist nicht erlaubt",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Die Freigabe von %s ist fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Die Freigabe von %s ist fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
+ "Open documentation" : "Dokumentation öffnen",
+ "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
+ "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
+ "Share it:" : "Zum Teilen:",
+ "Add to your website" : "Zu Ihrer Website hinzufügen",
+ "Share with me via ownCloud" : "Teilen Sie mit mir über ownCloud",
+ "HTML Code:" : "HTML-Code:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/de_DE.json b/apps/federatedfilesharing/l10n/de_DE.json
index 6fb0aead190..840827cbb08 100644
--- a/apps/federatedfilesharing/l10n/de_DE.json
+++ b/apps/federatedfilesharing/l10n/de_DE.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"Sharing %s failed, because this item is already shared with %s" : "Die Freigabe von %s ist fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird",
"Not allowed to create a federated share with the same user" : "Das Erstellen einer Federated Cloud Freigabe mit dem gleichen Benutzer ist nicht erlaubt",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Die Freigabe von %s ist fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Die Freigabe von %s ist fehlgeschlagen, da %s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID",
+ "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
+ "Open documentation" : "Dokumentation öffnen",
+ "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
+ "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
+ "Share it:" : "Zum Teilen:",
+ "Add to your website" : "Zu Ihrer Website hinzufügen",
+ "Share with me via ownCloud" : "Teilen Sie mit mir über ownCloud",
+ "HTML Code:" : "HTML-Code:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/el.js b/apps/federatedfilesharing/l10n/el.js
index b501a4007ea..23d0c9ae6cf 100644
--- a/apps/federatedfilesharing/l10n/el.js
+++ b/apps/federatedfilesharing/l10n/el.js
@@ -3,6 +3,18 @@ OC.L10N.register(
{
"Invalid Federated Cloud ID" : "Μη έγκυρο Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο ήδη με τον χρήστη %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Αποτυχία διαμοιρασμού %s, δεν βρέθηκε το %s, μπορεί ο διακομιστής να είναι προσωρινά απροσπέλαστος."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Αποτυχία διαμοιρασμού %s, δεν βρέθηκε το %s, μπορεί ο διακομιστής να είναι προσωρινά απροσπέλαστος.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου",
+ "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ",
+ "Open documentation" : "Ανοιχτή τεκμηρίωση.",
+ "Allow users on this server to send shares to other servers" : "Να επιτρέπεται σε χρήστες αυτού του διακομιστή να στέλνουν διαμοιρασμένους φακέλους σε άλλους διακομιστές",
+ "Allow users on this server to receive shares from other servers" : "Να επιτρέπεται στους χρίστες του διακομιστή να λαμβάνουν διαμοιρασμένα αρχεία από άλλους διακομιστές",
+ "Federated Cloud" : "Federated σύννεφο",
+ "Your Federated Cloud ID:" : "Το ID σας στο Federated Cloud:",
+ "Share it:" : "Μοιραστείτε το:",
+ "Add to your website" : "Προσθήκη στην ιστοσελίδα σας",
+ "Share with me via ownCloud" : "Διαμοιρασμός με εμένα μέσω του ",
+ "HTML Code:" : "Κώδικας HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/el.json b/apps/federatedfilesharing/l10n/el.json
index ece127aa7d1..bd133b05cd2 100644
--- a/apps/federatedfilesharing/l10n/el.json
+++ b/apps/federatedfilesharing/l10n/el.json
@@ -1,6 +1,18 @@
{ "translations": {
"Invalid Federated Cloud ID" : "Μη έγκυρο Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Ο διαμοιρασμός του %s απέτυχε, γιατί το αντικείμενο είναι διαμοιρασμένο ήδη με τον χρήστη %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Αποτυχία διαμοιρασμού %s, δεν βρέθηκε το %s, μπορεί ο διακομιστής να είναι προσωρινά απροσπέλαστος."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Αποτυχία διαμοιρασμού %s, δεν βρέθηκε το %s, μπορεί ο διακομιστής να είναι προσωρινά απροσπέλαστος.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου",
+ "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ",
+ "Open documentation" : "Ανοιχτή τεκμηρίωση.",
+ "Allow users on this server to send shares to other servers" : "Να επιτρέπεται σε χρήστες αυτού του διακομιστή να στέλνουν διαμοιρασμένους φακέλους σε άλλους διακομιστές",
+ "Allow users on this server to receive shares from other servers" : "Να επιτρέπεται στους χρίστες του διακομιστή να λαμβάνουν διαμοιρασμένα αρχεία από άλλους διακομιστές",
+ "Federated Cloud" : "Federated σύννεφο",
+ "Your Federated Cloud ID:" : "Το ID σας στο Federated Cloud:",
+ "Share it:" : "Μοιραστείτε το:",
+ "Add to your website" : "Προσθήκη στην ιστοσελίδα σας",
+ "Share with me via ownCloud" : "Διαμοιρασμός με εμένα μέσω του ",
+ "HTML Code:" : "Κώδικας HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/en_GB.js b/apps/federatedfilesharing/l10n/en_GB.js
index 9b4cccd8731..de214687f99 100644
--- a/apps/federatedfilesharing/l10n/en_GB.js
+++ b/apps/federatedfilesharing/l10n/en_GB.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Invalid Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Sharing %s failed, because this item is already shared with %s",
"Not allowed to create a federated share with the same user" : "Not allowed to create a federated share with the same user",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sharing %s failed, could not find %s, maybe the server is currently unreachable."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sharing %s failed, could not find %s, maybe the server is currently unreachable.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Share with me through my #ownCloud Federated Cloud ID, see %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Share with me through my #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Open documentation",
+ "Allow users on this server to send shares to other servers" : "Allow users on this server to send shares to other servers",
+ "Allow users on this server to receive shares from other servers" : "Allow users on this server to receive shares from other servers",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Your Federated Cloud ID:",
+ "Share it:" : "Share it:",
+ "Add to your website" : "Add to your website",
+ "Share with me via ownCloud" : "Share with me via ownCloud",
+ "HTML Code:" : "HTML Code:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/en_GB.json b/apps/federatedfilesharing/l10n/en_GB.json
index 3193b3e59d9..05215fead67 100644
--- a/apps/federatedfilesharing/l10n/en_GB.json
+++ b/apps/federatedfilesharing/l10n/en_GB.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Invalid Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Sharing %s failed, because this item is already shared with %s",
"Not allowed to create a federated share with the same user" : "Not allowed to create a federated share with the same user",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sharing %s failed, could not find %s, maybe the server is currently unreachable."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sharing %s failed, could not find %s, maybe the server is currently unreachable.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Share with me through my #ownCloud Federated Cloud ID, see %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Share with me through my #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Open documentation",
+ "Allow users on this server to send shares to other servers" : "Allow users on this server to send shares to other servers",
+ "Allow users on this server to receive shares from other servers" : "Allow users on this server to receive shares from other servers",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Your Federated Cloud ID:",
+ "Share it:" : "Share it:",
+ "Add to your website" : "Add to your website",
+ "Share with me via ownCloud" : "Share with me via ownCloud",
+ "HTML Code:" : "HTML Code:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/eo.js b/apps/federatedfilesharing/l10n/eo.js
index 706f4ff43af..18a502628bf 100644
--- a/apps/federatedfilesharing/l10n/eo.js
+++ b/apps/federatedfilesharing/l10n/eo.js
@@ -2,6 +2,16 @@ OC.L10N.register(
"federatedfilesharing",
{
"Sharing %s failed, because this item is already shared with %s" : "Kunhavigo de %s malsukcesis, ĉar la ero jam kunhavatas kun %s",
- "Not allowed to create a federated share with the same user" : "Vi ne permesas krei federan kunhavon kun la sama uzanto"
+ "Not allowed to create a federated share with the same user" : "Vi ne permesas krei federan kunhavon kun la sama uzanto",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Kunhavigi kun mi per mia identigilo de #ownCloud-federnuba identigilo; vidu %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Kunhavigi kun mi per mia #ownCloud-federnuba identigilo",
+ "Federated Cloud Sharing" : "Federnuba kunhavado",
+ "Open documentation" : "Malfermi la dokumentaron",
+ "Federated Cloud" : "Federa nubo",
+ "Your Federated Cloud ID:" : "Via federnuba identigilo:",
+ "Share it:" : "Kunhavigi ĝin:",
+ "Add to your website" : "Aldoni al via TTT-ejo",
+ "Share with me via ownCloud" : "Kunhavigi kun mi per ownCloud",
+ "HTML Code:" : "HTML-kodo:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/eo.json b/apps/federatedfilesharing/l10n/eo.json
index 169e5314f39..3396c643076 100644
--- a/apps/federatedfilesharing/l10n/eo.json
+++ b/apps/federatedfilesharing/l10n/eo.json
@@ -1,5 +1,15 @@
{ "translations": {
"Sharing %s failed, because this item is already shared with %s" : "Kunhavigo de %s malsukcesis, ĉar la ero jam kunhavatas kun %s",
- "Not allowed to create a federated share with the same user" : "Vi ne permesas krei federan kunhavon kun la sama uzanto"
+ "Not allowed to create a federated share with the same user" : "Vi ne permesas krei federan kunhavon kun la sama uzanto",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Kunhavigi kun mi per mia identigilo de #ownCloud-federnuba identigilo; vidu %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Kunhavigi kun mi per mia #ownCloud-federnuba identigilo",
+ "Federated Cloud Sharing" : "Federnuba kunhavado",
+ "Open documentation" : "Malfermi la dokumentaron",
+ "Federated Cloud" : "Federa nubo",
+ "Your Federated Cloud ID:" : "Via federnuba identigilo:",
+ "Share it:" : "Kunhavigi ĝin:",
+ "Add to your website" : "Aldoni al via TTT-ejo",
+ "Share with me via ownCloud" : "Kunhavigi kun mi per ownCloud",
+ "HTML Code:" : "HTML-kodo:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/es.js b/apps/federatedfilesharing/l10n/es.js
index 4fdd8545ece..9b39eb669ad 100644
--- a/apps/federatedfilesharing/l10n/es.js
+++ b/apps/federatedfilesharing/l10n/es.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "ID Nube federada inválida",
"Sharing %s failed, because this item is already shared with %s" : "Se falló al compartir %s, ya que este elemento ya está compartido con %s",
"Not allowed to create a federated share with the same user" : "No se permite crear un recurso compartido federado con el mismo usuario",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Se falló al compartir %s. No se pudo hallar %s, quizás haya un problema de conexión con el servidor."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Se falló al compartir %s. No se pudo hallar %s, quizás haya un problema de conexión con el servidor.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud",
+ "Federated Cloud Sharing" : "Compartido en Cloud Federado",
+ "Open documentation" : "Documentación abierta",
+ "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores",
+ "Federated Cloud" : "Nube Federada",
+ "Your Federated Cloud ID:" : "Su ID Nube Federada:",
+ "Share it:" : "Compartir:",
+ "Add to your website" : "Añadir a su sitio web",
+ "Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud",
+ "HTML Code:" : "Código HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/es.json b/apps/federatedfilesharing/l10n/es.json
index 532139b87a6..a23dfe6c2e9 100644
--- a/apps/federatedfilesharing/l10n/es.json
+++ b/apps/federatedfilesharing/l10n/es.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "ID Nube federada inválida",
"Sharing %s failed, because this item is already shared with %s" : "Se falló al compartir %s, ya que este elemento ya está compartido con %s",
"Not allowed to create a federated share with the same user" : "No se permite crear un recurso compartido federado con el mismo usuario",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Se falló al compartir %s. No se pudo hallar %s, quizás haya un problema de conexión con el servidor."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Se falló al compartir %s. No se pudo hallar %s, quizás haya un problema de conexión con el servidor.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud",
+ "Federated Cloud Sharing" : "Compartido en Cloud Federado",
+ "Open documentation" : "Documentación abierta",
+ "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores",
+ "Federated Cloud" : "Nube Federada",
+ "Your Federated Cloud ID:" : "Su ID Nube Federada:",
+ "Share it:" : "Compartir:",
+ "Add to your website" : "Añadir a su sitio web",
+ "Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud",
+ "HTML Code:" : "Código HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/et_EE.js b/apps/federatedfilesharing/l10n/et_EE.js
index ccb134f4878..13ba34661e9 100644
--- a/apps/federatedfilesharing/l10n/et_EE.js
+++ b/apps/federatedfilesharing/l10n/et_EE.js
@@ -1,6 +1,13 @@
OC.L10N.register(
"federatedfilesharing",
{
- "Sharing %s failed, because this item is already shared with %s" : "%s jagamine ebaõnnestus, kuna see üksus on juba jagatud %s"
+ "Sharing %s failed, because this item is already shared with %s" : "%s jagamine ebaõnnestus, kuna see üksus on juba jagatud %s",
+ "Open documentation" : "Ava dokumentatsioon",
+ "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse",
+ "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest",
+ "Share it:" : "Jaga seda:",
+ "Add to your website" : "Lisa oma veebisaidile",
+ "Share with me via ownCloud" : "Jaga minuga läbi ownCloudiga",
+ "HTML Code:" : "HTML kood:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/et_EE.json b/apps/federatedfilesharing/l10n/et_EE.json
index 58ddf74c295..fc605a5c4b1 100644
--- a/apps/federatedfilesharing/l10n/et_EE.json
+++ b/apps/federatedfilesharing/l10n/et_EE.json
@@ -1,4 +1,11 @@
{ "translations": {
- "Sharing %s failed, because this item is already shared with %s" : "%s jagamine ebaõnnestus, kuna see üksus on juba jagatud %s"
+ "Sharing %s failed, because this item is already shared with %s" : "%s jagamine ebaõnnestus, kuna see üksus on juba jagatud %s",
+ "Open documentation" : "Ava dokumentatsioon",
+ "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse",
+ "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest",
+ "Share it:" : "Jaga seda:",
+ "Add to your website" : "Lisa oma veebisaidile",
+ "Share with me via ownCloud" : "Jaga minuga läbi ownCloudiga",
+ "HTML Code:" : "HTML kood:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/eu.js b/apps/federatedfilesharing/l10n/eu.js
index 6e033874bee..3539dcbfc34 100644
--- a/apps/federatedfilesharing/l10n/eu.js
+++ b/apps/federatedfilesharing/l10n/eu.js
@@ -2,6 +2,9 @@ OC.L10N.register(
"federatedfilesharing",
{
"Sharing %s failed, because this item is already shared with %s" : "%s elkarbanatzeak huts egin du, dagoeneko %s erabiltzailearekin elkarbanatuta dagoelako",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s partekatzeak huts egin du, ezin da %s aurkitu, agian zerbitzaria orain ez dago eskuragarri."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s partekatzeak huts egin du, ezin da %s aurkitu, agian zerbitzaria orain ez dago eskuragarri.",
+ "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea",
+ "Allow users on this server to send shares to other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzariekin partekatzera",
+ "Allow users on this server to receive shares from other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzarietatik partekatutakoak jasotzen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/eu.json b/apps/federatedfilesharing/l10n/eu.json
index 6c223f57545..c7df411a1a6 100644
--- a/apps/federatedfilesharing/l10n/eu.json
+++ b/apps/federatedfilesharing/l10n/eu.json
@@ -1,5 +1,8 @@
{ "translations": {
"Sharing %s failed, because this item is already shared with %s" : "%s elkarbanatzeak huts egin du, dagoeneko %s erabiltzailearekin elkarbanatuta dagoelako",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s partekatzeak huts egin du, ezin da %s aurkitu, agian zerbitzaria orain ez dago eskuragarri."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s partekatzeak huts egin du, ezin da %s aurkitu, agian zerbitzaria orain ez dago eskuragarri.",
+ "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea",
+ "Allow users on this server to send shares to other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzariekin partekatzera",
+ "Allow users on this server to receive shares from other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzarietatik partekatutakoak jasotzen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/fa.js b/apps/federatedfilesharing/l10n/fa.js
new file mode 100644
index 00000000000..a96919f5252
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/fa.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Open documentation" : "بازکردن مستند",
+ "HTML Code:" : "کد HTML :"
+},
+"nplurals=1; plural=0;");
diff --git a/apps/federatedfilesharing/l10n/fa.json b/apps/federatedfilesharing/l10n/fa.json
new file mode 100644
index 00000000000..131e83df6d8
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/fa.json
@@ -0,0 +1,5 @@
+{ "translations": {
+ "Open documentation" : "بازکردن مستند",
+ "HTML Code:" : "کد HTML :"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/fi_FI.js b/apps/federatedfilesharing/l10n/fi_FI.js
index 13d536cfe2c..5380916d11a 100644
--- a/apps/federatedfilesharing/l10n/fi_FI.js
+++ b/apps/federatedfilesharing/l10n/fi_FI.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Virheellinen federoidun pilven tunniste",
"Sharing %s failed, because this item is already shared with %s" : "Kohteen %s jakaminen epäonnistui, koska kohde on jo jaettu käyttäjän %s kanssa",
"Not allowed to create a federated share with the same user" : "Saman käyttäjän kanssa ei ole sallittua luoda federoitua jakoa",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Kohteen %s jakaminen epäonnistui, kohdetta %s ei löytynyt. Kenties palvelin ei ole juuri nyt tavoitettavissa."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Kohteen %s jakaminen epäonnistui, kohdetta %s ei löytynyt. Kenties palvelin ei ole juuri nyt tavoitettavissa.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta, katso %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta",
+ "Federated Cloud Sharing" : "Federoitu pilvijakaminen",
+ "Open documentation" : "Avaa dokumentaatio",
+ "Allow users on this server to send shares to other servers" : "Salli tämän palvelimen käyttäjien lähettää jakoja muille palvelimille",
+ "Allow users on this server to receive shares from other servers" : "Salli tämän palvelimen käyttäjien vastaanottaa jakoja muilta palvelimilta",
+ "Federated Cloud" : "Federoitu pilvi",
+ "Your Federated Cloud ID:" : "Federoidun pilvesi tunniste:",
+ "Share it:" : "Jaa se:",
+ "Add to your website" : "Lisää verkkosivuillesi",
+ "Share with me via ownCloud" : "Jaa kanssani ownCloudin kautta",
+ "HTML Code:" : "HTML-koodi:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/fi_FI.json b/apps/federatedfilesharing/l10n/fi_FI.json
index e96f4c0582d..526c3883ef4 100644
--- a/apps/federatedfilesharing/l10n/fi_FI.json
+++ b/apps/federatedfilesharing/l10n/fi_FI.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Virheellinen federoidun pilven tunniste",
"Sharing %s failed, because this item is already shared with %s" : "Kohteen %s jakaminen epäonnistui, koska kohde on jo jaettu käyttäjän %s kanssa",
"Not allowed to create a federated share with the same user" : "Saman käyttäjän kanssa ei ole sallittua luoda federoitua jakoa",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Kohteen %s jakaminen epäonnistui, kohdetta %s ei löytynyt. Kenties palvelin ei ole juuri nyt tavoitettavissa."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Kohteen %s jakaminen epäonnistui, kohdetta %s ei löytynyt. Kenties palvelin ei ole juuri nyt tavoitettavissa.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta, katso %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta",
+ "Federated Cloud Sharing" : "Federoitu pilvijakaminen",
+ "Open documentation" : "Avaa dokumentaatio",
+ "Allow users on this server to send shares to other servers" : "Salli tämän palvelimen käyttäjien lähettää jakoja muille palvelimille",
+ "Allow users on this server to receive shares from other servers" : "Salli tämän palvelimen käyttäjien vastaanottaa jakoja muilta palvelimilta",
+ "Federated Cloud" : "Federoitu pilvi",
+ "Your Federated Cloud ID:" : "Federoidun pilvesi tunniste:",
+ "Share it:" : "Jaa se:",
+ "Add to your website" : "Lisää verkkosivuillesi",
+ "Share with me via ownCloud" : "Jaa kanssani ownCloudin kautta",
+ "HTML Code:" : "HTML-koodi:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/fr.js b/apps/federatedfilesharing/l10n/fr.js
index b9f4d3d9807..c13b161125e 100644
--- a/apps/federatedfilesharing/l10n/fr.js
+++ b/apps/federatedfilesharing/l10n/fr.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "ID Federated Cloud incorrect",
"Sharing %s failed, because this item is already shared with %s" : "Le partage de %s a échoué car cet élément est déjà partagé avec %s",
"Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Voir la documentation",
+ "Allow users on this server to send shares to other servers" : "Autoriser les utilisateurs de ce serveur à envoyer des partages vers d'autres serveurs",
+ "Allow users on this server to receive shares from other servers" : "Autoriser les utilisateurs de ce serveur à recevoir des partages d'autres serveurs",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :",
+ "Share it:" : "Partager :",
+ "Add to your website" : "Ajouter à votre site web",
+ "Share with me via ownCloud" : "Partagez avec moi via ownCloud",
+ "HTML Code:" : "Code HTML :"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/federatedfilesharing/l10n/fr.json b/apps/federatedfilesharing/l10n/fr.json
index 5f5ba5f6c16..651b14a210b 100644
--- a/apps/federatedfilesharing/l10n/fr.json
+++ b/apps/federatedfilesharing/l10n/fr.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "ID Federated Cloud incorrect",
"Sharing %s failed, because this item is already shared with %s" : "Le partage de %s a échoué car cet élément est déjà partagé avec %s",
"Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Voir la documentation",
+ "Allow users on this server to send shares to other servers" : "Autoriser les utilisateurs de ce serveur à envoyer des partages vers d'autres serveurs",
+ "Allow users on this server to receive shares from other servers" : "Autoriser les utilisateurs de ce serveur à recevoir des partages d'autres serveurs",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :",
+ "Share it:" : "Partager :",
+ "Add to your website" : "Ajouter à votre site web",
+ "Share with me via ownCloud" : "Partagez avec moi via ownCloud",
+ "HTML Code:" : "Code HTML :"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/gl.js b/apps/federatedfilesharing/l10n/gl.js
index b63658ea439..0c3acb791ff 100644
--- a/apps/federatedfilesharing/l10n/gl.js
+++ b/apps/federatedfilesharing/l10n/gl.js
@@ -4,6 +4,17 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "ID de nube federada incorrecto",
"Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s",
"Not allowed to create a federated share with the same user" : "Non está permitido crear unha compartición federada co mesmo usuario",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallou a compartición de %s, non foi posíbel atopar %s,é probábel que o servidor non estea accesíbel."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallou a compartición de %s, non foi posíbel atopar %s,é probábel que o servidor non estea accesíbel.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
+ "Federated Cloud Sharing" : "Nube federada compartida",
+ "Open documentation" : "Abrir a documentación",
+ "Allow users on this server to send shares to other servers" : "Permitir aos usuarios deste servidor enviar comparticións a outros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir aos usuarios deste servidor recibir comparticións de outros servidores",
+ "Federated Cloud" : "Nube federada",
+ "Your Federated Cloud ID:" : "ID da súa nube federada:",
+ "Share it:" : "Compártao:",
+ "Share with me via ownCloud" : "Comparte comigo a través do ownCloud",
+ "HTML Code:" : "Código HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/gl.json b/apps/federatedfilesharing/l10n/gl.json
index 555ffa51968..aeba950d052 100644
--- a/apps/federatedfilesharing/l10n/gl.json
+++ b/apps/federatedfilesharing/l10n/gl.json
@@ -2,6 +2,17 @@
"Invalid Federated Cloud ID" : "ID de nube federada incorrecto",
"Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s",
"Not allowed to create a federated share with the same user" : "Non está permitido crear unha compartición federada co mesmo usuario",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallou a compartición de %s, non foi posíbel atopar %s,é probábel que o servidor non estea accesíbel."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallou a compartición de %s, non foi posíbel atopar %s,é probábel que o servidor non estea accesíbel.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
+ "Federated Cloud Sharing" : "Nube federada compartida",
+ "Open documentation" : "Abrir a documentación",
+ "Allow users on this server to send shares to other servers" : "Permitir aos usuarios deste servidor enviar comparticións a outros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir aos usuarios deste servidor recibir comparticións de outros servidores",
+ "Federated Cloud" : "Nube federada",
+ "Your Federated Cloud ID:" : "ID da súa nube federada:",
+ "Share it:" : "Compártao:",
+ "Share with me via ownCloud" : "Comparte comigo a través do ownCloud",
+ "HTML Code:" : "Código HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/he.js b/apps/federatedfilesharing/l10n/he.js
index 74cb9ee2672..15c0bde9aa8 100644
--- a/apps/federatedfilesharing/l10n/he.js
+++ b/apps/federatedfilesharing/l10n/he.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "זיהוי ענן מאוגד לא חוקי",
"Sharing %s failed, because this item is already shared with %s" : "שיתוף %s נכשל, כיוון שפריט זה כבר משותף עם %s",
"Not allowed to create a federated share with the same user" : "אסור ליצור שיתוף מאוגד עם אותו משתמש",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "שיתוף %s נכשל, לא ניתן לאתר %s, ייתכן שהשרת לא ניתן להשגה כרגע."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "שיתוף %s נכשל, לא ניתן לאתר %s, ייתכן שהשרת לא ניתן להשגה כרגע.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי, ניתן לראות %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי",
+ "Federated Cloud Sharing" : "ענן שיתוף מאוגד",
+ "Open documentation" : "תיעוד פתוח",
+ "Allow users on this server to send shares to other servers" : "מאפשר למשתמשים בשרת זה לשלוח שיתופים לשרתים אחרים",
+ "Allow users on this server to receive shares from other servers" : "מאפשר למשתמשים בשרת זה לקבל שיתופים משרתים אחרים",
+ "Federated Cloud" : "ענן מאוגד",
+ "Your Federated Cloud ID:" : "מספר זיהוי הענן המאוגד שלך:",
+ "Share it:" : "שיתוף שלו:",
+ "Add to your website" : "הוספה לאתר האינטרנט שלך",
+ "Share with me via ownCloud" : "שיתוף איתי באמצעות ownCloud",
+ "HTML Code:" : "קוד HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/he.json b/apps/federatedfilesharing/l10n/he.json
index a9cd4313568..a0f156f42e8 100644
--- a/apps/federatedfilesharing/l10n/he.json
+++ b/apps/federatedfilesharing/l10n/he.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "זיהוי ענן מאוגד לא חוקי",
"Sharing %s failed, because this item is already shared with %s" : "שיתוף %s נכשל, כיוון שפריט זה כבר משותף עם %s",
"Not allowed to create a federated share with the same user" : "אסור ליצור שיתוף מאוגד עם אותו משתמש",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "שיתוף %s נכשל, לא ניתן לאתר %s, ייתכן שהשרת לא ניתן להשגה כרגע."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "שיתוף %s נכשל, לא ניתן לאתר %s, ייתכן שהשרת לא ניתן להשגה כרגע.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי, ניתן לראות %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי",
+ "Federated Cloud Sharing" : "ענן שיתוף מאוגד",
+ "Open documentation" : "תיעוד פתוח",
+ "Allow users on this server to send shares to other servers" : "מאפשר למשתמשים בשרת זה לשלוח שיתופים לשרתים אחרים",
+ "Allow users on this server to receive shares from other servers" : "מאפשר למשתמשים בשרת זה לקבל שיתופים משרתים אחרים",
+ "Federated Cloud" : "ענן מאוגד",
+ "Your Federated Cloud ID:" : "מספר זיהוי הענן המאוגד שלך:",
+ "Share it:" : "שיתוף שלו:",
+ "Add to your website" : "הוספה לאתר האינטרנט שלך",
+ "Share with me via ownCloud" : "שיתוף איתי באמצעות ownCloud",
+ "HTML Code:" : "קוד HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/hu_HU.js b/apps/federatedfilesharing/l10n/hu_HU.js
index 0f4785e6665..4e17934c032 100644
--- a/apps/federatedfilesharing/l10n/hu_HU.js
+++ b/apps/federatedfilesharing/l10n/hu_HU.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Érvénytelen Egyesített Felhő Azonosító",
"Sharing %s failed, because this item is already shared with %s" : "%s megosztása nem sikerült, mert ez már meg van osztva vele: %s",
"Not allowed to create a federated share with the same user" : "Azonos felhasználóval nem lehet létrehozni egyesített megosztást",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s megosztása sikertelen, mert %s nem található; talán a szerver jelenleg nem elérhető."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s megosztása sikertelen, mert %s nem található; talán a szerver jelenleg nem elérhető.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
+ "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
+ "Open documentation" : "Dokumentáció megnyitása",
+ "Allow users on this server to send shares to other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy fájlokat osszanak meg más szerverekkel.",
+ "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől",
+ "Federated Cloud" : "Egyesített felhő",
+ "Your Federated Cloud ID:" : "Egyesített felhő azonosító:",
+ "Share it:" : "Ossza meg:",
+ "Add to your website" : "Adja hozzá saját weboldalához",
+ "Share with me via ownCloud" : "Ossza meg velem ownCloud-on keresztül",
+ "HTML Code:" : "HTML kód:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/hu_HU.json b/apps/federatedfilesharing/l10n/hu_HU.json
index 7297ea1bd4f..0ceac624c27 100644
--- a/apps/federatedfilesharing/l10n/hu_HU.json
+++ b/apps/federatedfilesharing/l10n/hu_HU.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Érvénytelen Egyesített Felhő Azonosító",
"Sharing %s failed, because this item is already shared with %s" : "%s megosztása nem sikerült, mert ez már meg van osztva vele: %s",
"Not allowed to create a federated share with the same user" : "Azonos felhasználóval nem lehet létrehozni egyesített megosztást",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s megosztása sikertelen, mert %s nem található; talán a szerver jelenleg nem elérhető."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s megosztása sikertelen, mert %s nem található; talán a szerver jelenleg nem elérhető.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
+ "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
+ "Open documentation" : "Dokumentáció megnyitása",
+ "Allow users on this server to send shares to other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy fájlokat osszanak meg más szerverekkel.",
+ "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől",
+ "Federated Cloud" : "Egyesített felhő",
+ "Your Federated Cloud ID:" : "Egyesített felhő azonosító:",
+ "Share it:" : "Ossza meg:",
+ "Add to your website" : "Adja hozzá saját weboldalához",
+ "Share with me via ownCloud" : "Ossza meg velem ownCloud-on keresztül",
+ "HTML Code:" : "HTML kód:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/id.js b/apps/federatedfilesharing/l10n/id.js
index b5ec0340304..fa407c02af8 100644
--- a/apps/federatedfilesharing/l10n/id.js
+++ b/apps/federatedfilesharing/l10n/id.js
@@ -3,6 +3,18 @@ OC.L10N.register(
{
"Invalid Federated Cloud ID" : "Federated Cloud ID tidak sah",
"Sharing %s failed, because this item is already shared with %s" : "Gagal membagkan %s, karena item ini sudah dibagikan dengan %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Berbagi %s gagal, tidak menemukan %s, kemungkinan saat ini server tidak dapat dijangkau."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Berbagi %s gagal, tidak menemukan %s, kemungkinan saat ini server tidak dapat dijangkau.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Buka dokumentasi",
+ "Allow users on this server to send shares to other servers" : "Izinkan para pengguna di server ini untuk mengirimkan berbagi ke server lainnya.",
+ "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Federated Cloud ID Anda:",
+ "Share it:" : "Bagikan:",
+ "Add to your website" : "Tambahkan pada situs web Anda",
+ "Share with me via ownCloud" : "Dibagikan pada saya via ownCloud",
+ "HTML Code:" : "Kode HTML:"
},
"nplurals=1; plural=0;");
diff --git a/apps/federatedfilesharing/l10n/id.json b/apps/federatedfilesharing/l10n/id.json
index 9f349e97533..d21649ba386 100644
--- a/apps/federatedfilesharing/l10n/id.json
+++ b/apps/federatedfilesharing/l10n/id.json
@@ -1,6 +1,18 @@
{ "translations": {
"Invalid Federated Cloud ID" : "Federated Cloud ID tidak sah",
"Sharing %s failed, because this item is already shared with %s" : "Gagal membagkan %s, karena item ini sudah dibagikan dengan %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Berbagi %s gagal, tidak menemukan %s, kemungkinan saat ini server tidak dapat dijangkau."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Berbagi %s gagal, tidak menemukan %s, kemungkinan saat ini server tidak dapat dijangkau.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Buka dokumentasi",
+ "Allow users on this server to send shares to other servers" : "Izinkan para pengguna di server ini untuk mengirimkan berbagi ke server lainnya.",
+ "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Federated Cloud ID Anda:",
+ "Share it:" : "Bagikan:",
+ "Add to your website" : "Tambahkan pada situs web Anda",
+ "Share with me via ownCloud" : "Dibagikan pada saya via ownCloud",
+ "HTML Code:" : "Kode HTML:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/is.js b/apps/federatedfilesharing/l10n/is.js
index 54c9fa5bf14..fbe6d2ee2d5 100644
--- a/apps/federatedfilesharing/l10n/is.js
+++ b/apps/federatedfilesharing/l10n/is.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Ógilt skýjasambandsauðkenni (Federated Cloud ID)",
"Sharing %s failed, because this item is already shared with %s" : "Deiling %s mistókst, því þessu atriði er þegar deilt með %s",
"Not allowed to create a federated share with the same user" : "Ekki er heimilt að búa til skýjasambandssameign með sama notanda",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deiling %s mistókst, gat ekki fundið %s, hugsanlega er þjónninn ekki tiltækur í augnablikinu."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deiling %s mistókst, gat ekki fundið %s, hugsanlega er þjónninn ekki tiltækur í augnablikinu.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID, sjá %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Deiling með skýjasambandi",
+ "Open documentation" : "Opna hjálparskjöl",
+ "Allow users on this server to send shares to other servers" : "Leyfa notendum á þessum þjóni að senda sameignir til annarra þjóna",
+ "Allow users on this server to receive shares from other servers" : "Leyfa notendum á þessum þjóni að taka á móti sameignum frá öðrum þjónum",
+ "Federated Cloud" : "Skýjasamband (federated)",
+ "Your Federated Cloud ID:" : "Skýjasambandsauðkennið þitt (Federated Cloud ID):",
+ "Share it:" : "Deila því:",
+ "Add to your website" : "Bæta við vefsvæðið þitt",
+ "Share with me via ownCloud" : "Deila með mér í gegnum ownCloud",
+ "HTML Code:" : "HTML-kóði:"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/federatedfilesharing/l10n/is.json b/apps/federatedfilesharing/l10n/is.json
index e5989d430ff..9600e01aed3 100644
--- a/apps/federatedfilesharing/l10n/is.json
+++ b/apps/federatedfilesharing/l10n/is.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Ógilt skýjasambandsauðkenni (Federated Cloud ID)",
"Sharing %s failed, because this item is already shared with %s" : "Deiling %s mistókst, því þessu atriði er þegar deilt með %s",
"Not allowed to create a federated share with the same user" : "Ekki er heimilt að búa til skýjasambandssameign með sama notanda",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deiling %s mistókst, gat ekki fundið %s, hugsanlega er þjónninn ekki tiltækur í augnablikinu."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deiling %s mistókst, gat ekki fundið %s, hugsanlega er þjónninn ekki tiltækur í augnablikinu.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID, sjá %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Deiling með skýjasambandi",
+ "Open documentation" : "Opna hjálparskjöl",
+ "Allow users on this server to send shares to other servers" : "Leyfa notendum á þessum þjóni að senda sameignir til annarra þjóna",
+ "Allow users on this server to receive shares from other servers" : "Leyfa notendum á þessum þjóni að taka á móti sameignum frá öðrum þjónum",
+ "Federated Cloud" : "Skýjasamband (federated)",
+ "Your Federated Cloud ID:" : "Skýjasambandsauðkennið þitt (Federated Cloud ID):",
+ "Share it:" : "Deila því:",
+ "Add to your website" : "Bæta við vefsvæðið þitt",
+ "Share with me via ownCloud" : "Deila með mér í gegnum ownCloud",
+ "HTML Code:" : "HTML-kóði:"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/it.js b/apps/federatedfilesharing/l10n/it.js
index be449b92dfa..142a976f45f 100644
--- a/apps/federatedfilesharing/l10n/it.js
+++ b/apps/federatedfilesharing/l10n/it.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "ID di cloud federata non valido",
"Sharing %s failed, because this item is already shared with %s" : "Condivisione di %s non riuscita, poiché l'oggetto è già condiviso con %s",
"Not allowed to create a federated share with the same user" : "Non è consentito creare una condivisione federata con lo stesso utente",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La condivisione di %s non è riuscita, impossibile trovare %s, è probabile che il server non sia al momento raggiungibile."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La condivisione di %s non è riuscita, impossibile trovare %s, è probabile che il server non sia al momento raggiungibile.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud, vedi %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud",
+ "Federated Cloud Sharing" : "Condivisione cloud federata",
+ "Open documentation" : "Apri la documentazione",
+ "Allow users on this server to send shares to other servers" : "Consenti agli utenti su questo server di inviare condivisioni ad altri server",
+ "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server",
+ "Federated Cloud" : "Cloud federata",
+ "Your Federated Cloud ID:" : "Il tuo ID di cloud federata:",
+ "Share it:" : "Condividilo:",
+ "Add to your website" : "Aggiungilo al tuo sito web",
+ "Share with me via ownCloud" : "Condividi con me tramite ownCloud",
+ "HTML Code:" : "Codice HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/it.json b/apps/federatedfilesharing/l10n/it.json
index 133cf7d0281..553e9504501 100644
--- a/apps/federatedfilesharing/l10n/it.json
+++ b/apps/federatedfilesharing/l10n/it.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "ID di cloud federata non valido",
"Sharing %s failed, because this item is already shared with %s" : "Condivisione di %s non riuscita, poiché l'oggetto è già condiviso con %s",
"Not allowed to create a federated share with the same user" : "Non è consentito creare una condivisione federata con lo stesso utente",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La condivisione di %s non è riuscita, impossibile trovare %s, è probabile che il server non sia al momento raggiungibile."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "La condivisione di %s non è riuscita, impossibile trovare %s, è probabile che il server non sia al momento raggiungibile.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud, vedi %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud",
+ "Federated Cloud Sharing" : "Condivisione cloud federata",
+ "Open documentation" : "Apri la documentazione",
+ "Allow users on this server to send shares to other servers" : "Consenti agli utenti su questo server di inviare condivisioni ad altri server",
+ "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server",
+ "Federated Cloud" : "Cloud federata",
+ "Your Federated Cloud ID:" : "Il tuo ID di cloud federata:",
+ "Share it:" : "Condividilo:",
+ "Add to your website" : "Aggiungilo al tuo sito web",
+ "Share with me via ownCloud" : "Condividi con me tramite ownCloud",
+ "HTML Code:" : "Codice HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/ja.js b/apps/federatedfilesharing/l10n/ja.js
index 539557dfec6..5522ae279e6 100644
--- a/apps/federatedfilesharing/l10n/ja.js
+++ b/apps/federatedfilesharing/l10n/ja.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
"Sharing %s failed, because this item is already shared with %s" : "%s を共有できませんでした。このアイテムはすでに %s に共有されています。",
"Not allowed to create a federated share with the same user" : "同じユーザーでフェデレーション共有を作成することは出来ません",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
+ "Federated Cloud Sharing" : "統合されたクラウド共有",
+ "Open documentation" : "ドキュメントを開く",
+ "Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する",
+ "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する",
+ "Federated Cloud" : "クラウド連携",
+ "Your Federated Cloud ID:" : "あなたのクラウド連携ID:",
+ "Share it:" : "以下で共有:",
+ "Add to your website" : "ウェブサイトに追加",
+ "Share with me via ownCloud" : "OwnCloud経由で共有",
+ "HTML Code:" : "HTMLコード:"
},
"nplurals=1; plural=0;");
diff --git a/apps/federatedfilesharing/l10n/ja.json b/apps/federatedfilesharing/l10n/ja.json
index 40cd02b7385..6a7ca1b59d5 100644
--- a/apps/federatedfilesharing/l10n/ja.json
+++ b/apps/federatedfilesharing/l10n/ja.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
"Sharing %s failed, because this item is already shared with %s" : "%s を共有できませんでした。このアイテムはすでに %s に共有されています。",
"Not allowed to create a federated share with the same user" : "同じユーザーでフェデレーション共有を作成することは出来ません",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
+ "Federated Cloud Sharing" : "統合されたクラウド共有",
+ "Open documentation" : "ドキュメントを開く",
+ "Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する",
+ "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する",
+ "Federated Cloud" : "クラウド連携",
+ "Your Federated Cloud ID:" : "あなたのクラウド連携ID:",
+ "Share it:" : "以下で共有:",
+ "Add to your website" : "ウェブサイトに追加",
+ "Share with me via ownCloud" : "OwnCloud経由で共有",
+ "HTML Code:" : "HTMLコード:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/ko.js b/apps/federatedfilesharing/l10n/ko.js
index 87eb7f9c206..4e6294e66ca 100644
--- a/apps/federatedfilesharing/l10n/ko.js
+++ b/apps/federatedfilesharing/l10n/ko.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "잘못된 연합 클라우드 ID",
"Sharing %s failed, because this item is already shared with %s" : "%s을(를) 공유할 수 없습니다. 이미 %s 님과 공유되어 있습니다",
"Not allowed to create a federated share with the same user" : "같은 사용자와 연합 공유를 만들 수 없음",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s을(를) 공유할 수 없습니다. %s을(를) 찾을 수 없습니다. 서버에 접근하지 못할 수도 있습니다."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s을(를) 공유할 수 없습니다. %s을(를) 찾을 수 없습니다. 서버에 접근하지 못할 수도 있습니다.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨",
+ "Federated Cloud Sharing" : "클라우드 연합 공유",
+ "Open documentation" : "문서 열기",
+ "Allow users on this server to send shares to other servers" : "이 서버의 사용자가 다른 서버와 공유할 수 있도록 허용",
+ "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용",
+ "Federated Cloud" : "연합 클라우드",
+ "Your Federated Cloud ID:" : "내 연합 클라우드 ID:",
+ "Share it:" : "공유하기:",
+ "Add to your website" : "내 웹 사이트에 추가",
+ "Share with me via ownCloud" : "ownCloud로 나와 공유하기",
+ "HTML Code:" : "HTML 코드:"
},
"nplurals=1; plural=0;");
diff --git a/apps/federatedfilesharing/l10n/ko.json b/apps/federatedfilesharing/l10n/ko.json
index 8fcae0e8e66..0e1a2247ba9 100644
--- a/apps/federatedfilesharing/l10n/ko.json
+++ b/apps/federatedfilesharing/l10n/ko.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "잘못된 연합 클라우드 ID",
"Sharing %s failed, because this item is already shared with %s" : "%s을(를) 공유할 수 없습니다. 이미 %s 님과 공유되어 있습니다",
"Not allowed to create a federated share with the same user" : "같은 사용자와 연합 공유를 만들 수 없음",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s을(를) 공유할 수 없습니다. %s을(를) 찾을 수 없습니다. 서버에 접근하지 못할 수도 있습니다."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s을(를) 공유할 수 없습니다. %s을(를) 찾을 수 없습니다. 서버에 접근하지 못할 수도 있습니다.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨",
+ "Federated Cloud Sharing" : "클라우드 연합 공유",
+ "Open documentation" : "문서 열기",
+ "Allow users on this server to send shares to other servers" : "이 서버의 사용자가 다른 서버와 공유할 수 있도록 허용",
+ "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용",
+ "Federated Cloud" : "연합 클라우드",
+ "Your Federated Cloud ID:" : "내 연합 클라우드 ID:",
+ "Share it:" : "공유하기:",
+ "Add to your website" : "내 웹 사이트에 추가",
+ "Share with me via ownCloud" : "ownCloud로 나와 공유하기",
+ "HTML Code:" : "HTML 코드:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/lb.js b/apps/federatedfilesharing/l10n/lb.js
new file mode 100644
index 00000000000..8515e8eada4
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/lb.js
@@ -0,0 +1,6 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Open documentation" : "Dokumentatioun opmaachen"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/lb.json b/apps/federatedfilesharing/l10n/lb.json
new file mode 100644
index 00000000000..66e7cf9e135
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/lb.json
@@ -0,0 +1,4 @@
+{ "translations": {
+ "Open documentation" : "Dokumentatioun opmaachen"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/lt_LT.js b/apps/federatedfilesharing/l10n/lt_LT.js
new file mode 100644
index 00000000000..c6d05f617a4
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/lt_LT.js
@@ -0,0 +1,17 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Pasidalink su manimi per #ownCloud padebesius, plačiau %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Pasidalink su manimi per #ownCloud padebesius",
+ "Federated Cloud Sharing" : "Viešas dalijimasis padebesiu",
+ "Open documentation" : "Atidaryti dokumentą",
+ "Allow users on this server to send shares to other servers" : "Leisti vartotojams šiame serveryje dalintis su kitais serveriais",
+ "Allow users on this server to receive shares from other servers" : "Leisti vartotojams šiame serveryje priimti dalijimusis iš kitų serverių",
+ "Federated Cloud" : "Viešas debesis",
+ "Your Federated Cloud ID:" : "Tavo debesies ID:",
+ "Share it:" : "Pasidalink:",
+ "Add to your website" : "Pridėti tavo puslapį",
+ "Share with me via ownCloud" : "Pasidalink su manimi per ownCloud",
+ "HTML Code:" : "HTML kodas:"
+},
+"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/federatedfilesharing/l10n/lt_LT.json b/apps/federatedfilesharing/l10n/lt_LT.json
new file mode 100644
index 00000000000..4b295d4c1b7
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/lt_LT.json
@@ -0,0 +1,15 @@
+{ "translations": {
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Pasidalink su manimi per #ownCloud padebesius, plačiau %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Pasidalink su manimi per #ownCloud padebesius",
+ "Federated Cloud Sharing" : "Viešas dalijimasis padebesiu",
+ "Open documentation" : "Atidaryti dokumentą",
+ "Allow users on this server to send shares to other servers" : "Leisti vartotojams šiame serveryje dalintis su kitais serveriais",
+ "Allow users on this server to receive shares from other servers" : "Leisti vartotojams šiame serveryje priimti dalijimusis iš kitų serverių",
+ "Federated Cloud" : "Viešas debesis",
+ "Your Federated Cloud ID:" : "Tavo debesies ID:",
+ "Share it:" : "Pasidalink:",
+ "Add to your website" : "Pridėti tavo puslapį",
+ "Share with me via ownCloud" : "Pasidalink su manimi per ownCloud",
+ "HTML Code:" : "HTML kodas:"
+},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/lv.js b/apps/federatedfilesharing/l10n/lv.js
new file mode 100644
index 00000000000..aa26ac01d65
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/lv.js
@@ -0,0 +1,9 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
+ "Open documentation" : "Atvērt dokumentāciju",
+ "Allow users on this server to send shares to other servers" : "Atļaut šī servera lietotājiem sūtīt koplietotnes uz citiem serveriem",
+ "Allow users on this server to receive shares from other servers" : "Atļaut šī servera lietotājiem saņem koplietotnes no citiem serveriem"
+},
+"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/federatedfilesharing/l10n/lv.json b/apps/federatedfilesharing/l10n/lv.json
new file mode 100644
index 00000000000..986c430151b
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/lv.json
@@ -0,0 +1,7 @@
+{ "translations": {
+ "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
+ "Open documentation" : "Atvērt dokumentāciju",
+ "Allow users on this server to send shares to other servers" : "Atļaut šī servera lietotājiem sūtīt koplietotnes uz citiem serveriem",
+ "Allow users on this server to receive shares from other servers" : "Atļaut šī servera lietotājiem saņem koplietotnes no citiem serveriem"
+},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/mk.js b/apps/federatedfilesharing/l10n/mk.js
new file mode 100644
index 00000000000..4d5fc92658b
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/mk.js
@@ -0,0 +1,13 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Federated Cloud Sharing" : "Федерирано клауд споделување",
+ "Open documentation" : "Отвори ја документацијата",
+ "Federated Cloud" : "Федериран клауд",
+ "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:",
+ "Share it:" : "Сподели го:",
+ "Add to your website" : "Додади на твојот веб сајт",
+ "Share with me via ownCloud" : "Сподели со мене преку ownCloud",
+ "HTML Code:" : "HTML код:"
+},
+"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/apps/federatedfilesharing/l10n/mk.json b/apps/federatedfilesharing/l10n/mk.json
new file mode 100644
index 00000000000..9862c2ecf89
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/mk.json
@@ -0,0 +1,11 @@
+{ "translations": {
+ "Federated Cloud Sharing" : "Федерирано клауд споделување",
+ "Open documentation" : "Отвори ја документацијата",
+ "Federated Cloud" : "Федериран клауд",
+ "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:",
+ "Share it:" : "Сподели го:",
+ "Add to your website" : "Додади на твојот веб сајт",
+ "Share with me via ownCloud" : "Сподели со мене преку ownCloud",
+ "HTML Code:" : "HTML код:"
+},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/nb_NO.js b/apps/federatedfilesharing/l10n/nb_NO.js
index 6b04d4b4b35..c6ee1cc632f 100644
--- a/apps/federatedfilesharing/l10n/nb_NO.js
+++ b/apps/federatedfilesharing/l10n/nb_NO.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Ugyldig ID for sammenknyttet sky",
"Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s",
"Not allowed to create a federated share with the same user" : "Ikke tillatt å opprette en Sammenknyttet sky-deling med den samme brukeren",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky",
+ "Federated Cloud Sharing" : "Sammenknyttet sky-deling",
+ "Open documentation" : "Åpne dokumentasjonen",
+ "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne serveren sender delinger til andre servere",
+ "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne serveren mottar delinger fra andre servere",
+ "Federated Cloud" : "Sammenknyttet sky",
+ "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:",
+ "Share it:" : "Del den:",
+ "Add to your website" : "Legg på websiden din",
+ "Share with me via ownCloud" : "Del med meg via ownCloud",
+ "HTML Code:" : "HTML-kode:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/nb_NO.json b/apps/federatedfilesharing/l10n/nb_NO.json
index 777a3b4c963..89a23700e5c 100644
--- a/apps/federatedfilesharing/l10n/nb_NO.json
+++ b/apps/federatedfilesharing/l10n/nb_NO.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Ugyldig ID for sammenknyttet sky",
"Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s",
"Not allowed to create a federated share with the same user" : "Ikke tillatt å opprette en Sammenknyttet sky-deling med den samme brukeren",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky",
+ "Federated Cloud Sharing" : "Sammenknyttet sky-deling",
+ "Open documentation" : "Åpne dokumentasjonen",
+ "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne serveren sender delinger til andre servere",
+ "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne serveren mottar delinger fra andre servere",
+ "Federated Cloud" : "Sammenknyttet sky",
+ "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:",
+ "Share it:" : "Del den:",
+ "Add to your website" : "Legg på websiden din",
+ "Share with me via ownCloud" : "Del med meg via ownCloud",
+ "HTML Code:" : "HTML-kode:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/nl.js b/apps/federatedfilesharing/l10n/nl.js
index 718a7504b34..d46f7c30389 100644
--- a/apps/federatedfilesharing/l10n/nl.js
+++ b/apps/federatedfilesharing/l10n/nl.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Ongeldige Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Delen van %s is mislukt, omdat het object al wordt gedeeld met %s",
"Not allowed to create a federated share with the same user" : "Het is niet toegestaan om een gefedereerde share met dezelfde gebruikersserver te maken",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deel met mij via mijn #ownCloud federated Cloud ID, zie %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Deel met mij via mijn #ownCloud federated Cloud ID",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Open documentatie",
+ "Allow users on this server to send shares to other servers" : "Toestaan dat gebruikers op deze server shares sturen naar andere servers",
+ "Allow users on this server to receive shares from other servers" : "Toestaan dat gebruikers op deze server shares ontvangen van andere servers",
+ "Federated Cloud" : "Gefedereerde Cloud",
+ "Your Federated Cloud ID:" : "Uw Federated Cloud ID:",
+ "Share it:" : "Deel het:",
+ "Add to your website" : "Toevoegen aan uw website",
+ "Share with me via ownCloud" : "Deel met mij via ownCloud",
+ "HTML Code:" : "HTML Code:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json
index 7b1c35c7355..849af078f92 100644
--- a/apps/federatedfilesharing/l10n/nl.json
+++ b/apps/federatedfilesharing/l10n/nl.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Ongeldige Federated Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Delen van %s is mislukt, omdat het object al wordt gedeeld met %s",
"Not allowed to create a federated share with the same user" : "Het is niet toegestaan om een gefedereerde share met dezelfde gebruikersserver te maken",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Delen van %s mislukt, kon %s niet vinden, misschien is de server niet bereikbaar.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deel met mij via mijn #ownCloud federated Cloud ID, zie %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Deel met mij via mijn #ownCloud federated Cloud ID",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Open documentatie",
+ "Allow users on this server to send shares to other servers" : "Toestaan dat gebruikers op deze server shares sturen naar andere servers",
+ "Allow users on this server to receive shares from other servers" : "Toestaan dat gebruikers op deze server shares ontvangen van andere servers",
+ "Federated Cloud" : "Gefedereerde Cloud",
+ "Your Federated Cloud ID:" : "Uw Federated Cloud ID:",
+ "Share it:" : "Deel het:",
+ "Add to your website" : "Toevoegen aan uw website",
+ "Share with me via ownCloud" : "Deel met mij via ownCloud",
+ "HTML Code:" : "HTML Code:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/oc.js b/apps/federatedfilesharing/l10n/oc.js
index f83325956b3..c337f1ca2b1 100644
--- a/apps/federatedfilesharing/l10n/oc.js
+++ b/apps/federatedfilesharing/l10n/oc.js
@@ -3,6 +3,18 @@ OC.L10N.register(
{
"Invalid Federated Cloud ID" : "ID Federated Cloud incorrècte",
"Sharing %s failed, because this item is already shared with %s" : "Lo partiment de %s a fracassat perque aqueste objècte es ja partejat amb %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Veire la documentacion",
+ "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors",
+ "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :",
+ "Share it:" : "Partejar :",
+ "Add to your website" : "Apondre a vòstre site web",
+ "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud",
+ "HTML Code:" : "Còde HTML :"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/federatedfilesharing/l10n/oc.json b/apps/federatedfilesharing/l10n/oc.json
index 140cabe0282..81bce1d1577 100644
--- a/apps/federatedfilesharing/l10n/oc.json
+++ b/apps/federatedfilesharing/l10n/oc.json
@@ -1,6 +1,18 @@
{ "translations": {
"Invalid Federated Cloud ID" : "ID Federated Cloud incorrècte",
"Sharing %s failed, because this item is already shared with %s" : "Lo partiment de %s a fracassat perque aqueste objècte es ja partejat amb %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Lo partiment de %s a fracassat : impossible de trobar %s. Benlèu que lo servidor es momentanèament injonhable.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
+ "Federated Cloud Sharing" : "Federated Cloud Sharing",
+ "Open documentation" : "Veire la documentacion",
+ "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors",
+ "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :",
+ "Share it:" : "Partejar :",
+ "Add to your website" : "Apondre a vòstre site web",
+ "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud",
+ "HTML Code:" : "Còde HTML :"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/pl.js b/apps/federatedfilesharing/l10n/pl.js
index d82967ae5db..7293e72689e 100644
--- a/apps/federatedfilesharing/l10n/pl.js
+++ b/apps/federatedfilesharing/l10n/pl.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"federatedfilesharing",
{
"Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny.",
+ "Open documentation" : "Otwórz dokumentację",
+ "Add to your website" : "Dodaj do swojej strony"
},
"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/federatedfilesharing/l10n/pl.json b/apps/federatedfilesharing/l10n/pl.json
index 19c9b8029ac..d8b5219b963 100644
--- a/apps/federatedfilesharing/l10n/pl.json
+++ b/apps/federatedfilesharing/l10n/pl.json
@@ -1,5 +1,7 @@
{ "translations": {
"Sharing %s failed, because this item is already shared with %s" : "Współdzielenie %s nie powiodło się, ponieważ element jest już współdzielony z %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Współdzielenie %s nie powiodło się, nie można odnaleźć %s. Prawdopobnie serwer nie jest teraz osiągalny.",
+ "Open documentation" : "Otwórz dokumentację",
+ "Add to your website" : "Dodaj do swojej strony"
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/pt_BR.js b/apps/federatedfilesharing/l10n/pt_BR.js
index 550fc8d5c94..34c6357b8e0 100644
--- a/apps/federatedfilesharing/l10n/pt_BR.js
+++ b/apps/federatedfilesharing/l10n/pt_BR.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Inválida Associação de Nuvem ID",
"Sharing %s failed, because this item is already shared with %s" : "Compartilhamento %s falhou, porque este ítem já está compartilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é permitido criar um compartilhamento associado com o mesmo usuário",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "O compartilhamento %s falhou, porque não foi possível encontrar %s, talvez o servidor esteja inacessível."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "O compartilhamento %s falhou, porque não foi possível encontrar %s, talvez o servidor esteja inacessível.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada, veja %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada",
+ "Federated Cloud Sharing" : "Compartilhamento de Nuvem Associada",
+ "Open documentation" : "Abrir documentação",
+ "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir que os usuários nesse servidor recebam compartilhamentos de outros servidores",
+ "Federated Cloud" : "Nuvem Associada",
+ "Your Federated Cloud ID:" : "Sua ID na Nuvem Associada:",
+ "Share it:" : "Compartilhe:",
+ "Add to your website" : "Adicione ao seu website",
+ "Share with me via ownCloud" : "Compartilhe comigo via ownCloud",
+ "HTML Code:" : "Código HTML:"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/federatedfilesharing/l10n/pt_BR.json b/apps/federatedfilesharing/l10n/pt_BR.json
index 29fe0c4dbf3..2fdb6a45f4d 100644
--- a/apps/federatedfilesharing/l10n/pt_BR.json
+++ b/apps/federatedfilesharing/l10n/pt_BR.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Inválida Associação de Nuvem ID",
"Sharing %s failed, because this item is already shared with %s" : "Compartilhamento %s falhou, porque este ítem já está compartilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é permitido criar um compartilhamento associado com o mesmo usuário",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "O compartilhamento %s falhou, porque não foi possível encontrar %s, talvez o servidor esteja inacessível."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "O compartilhamento %s falhou, porque não foi possível encontrar %s, talvez o servidor esteja inacessível.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada, veja %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada",
+ "Federated Cloud Sharing" : "Compartilhamento de Nuvem Associada",
+ "Open documentation" : "Abrir documentação",
+ "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir que os usuários nesse servidor recebam compartilhamentos de outros servidores",
+ "Federated Cloud" : "Nuvem Associada",
+ "Your Federated Cloud ID:" : "Sua ID na Nuvem Associada:",
+ "Share it:" : "Compartilhe:",
+ "Add to your website" : "Adicione ao seu website",
+ "Share with me via ownCloud" : "Compartilhe comigo via ownCloud",
+ "HTML Code:" : "Código HTML:"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/pt_PT.js b/apps/federatedfilesharing/l10n/pt_PT.js
index ecdab299d20..f11078268a4 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.js
+++ b/apps/federatedfilesharing/l10n/pt_PT.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
"Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque o item já está a ser partilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud, veja %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud",
+ "Federated Cloud Sharing" : "Partilha de Nuvem Federada",
+ "Open documentation" : "Abrir documentação",
+ "Allow users on this server to send shares to other servers" : "Permitir utilizadores neste servidor para enviar as partilhas para outros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir utilizadores neste servidor para receber as partilhas de outros servidores",
+ "Federated Cloud" : "Nuvem Federada",
+ "Your Federated Cloud ID:" : "A Sua Id. da Nuvem Federada",
+ "Share it:" : "Partilhe:",
+ "Add to your website" : "Adicione ao seu sítio da Web",
+ "Share with me via ownCloud" : "Partilhe comigo via ownCloud",
+ "HTML Code:" : "Código HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/pt_PT.json b/apps/federatedfilesharing/l10n/pt_PT.json
index d7e79940097..5f254812859 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.json
+++ b/apps/federatedfilesharing/l10n/pt_PT.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
"Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque o item já está a ser partilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud, veja %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud",
+ "Federated Cloud Sharing" : "Partilha de Nuvem Federada",
+ "Open documentation" : "Abrir documentação",
+ "Allow users on this server to send shares to other servers" : "Permitir utilizadores neste servidor para enviar as partilhas para outros servidores",
+ "Allow users on this server to receive shares from other servers" : "Permitir utilizadores neste servidor para receber as partilhas de outros servidores",
+ "Federated Cloud" : "Nuvem Federada",
+ "Your Federated Cloud ID:" : "A Sua Id. da Nuvem Federada",
+ "Share it:" : "Partilhe:",
+ "Add to your website" : "Adicione ao seu sítio da Web",
+ "Share with me via ownCloud" : "Partilhe comigo via ownCloud",
+ "HTML Code:" : "Código HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/ru.js b/apps/federatedfilesharing/l10n/ru.js
index 9ddb75f8cb8..f8f5c998e84 100644
--- a/apps/federatedfilesharing/l10n/ru.js
+++ b/apps/federatedfilesharing/l10n/ru.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Неверный ID в объединении облачных хранилищ.",
"Sharing %s failed, because this item is already shared with %s" : "Не удалось поделиться %s, пользователь %s уже имеет доступ к этому элементу",
"Not allowed to create a federated share with the same user" : "Не допускается создание федеративного общего ресурса с тем-же пользователем",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не удалось поделиться %s, не удалось найти %s, возможно, сервер не доступен."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не удалось поделиться %s, не удалось найти %s, возможно, сервер не доступен.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ",
+ "Federated Cloud Sharing" : "Объединение облачных хранилищ",
+ "Open documentation" : "Открыть документацию",
+ "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов",
+ "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов",
+ "Federated Cloud" : "Объединение облачных хранилищ",
+ "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:",
+ "Share it:" : "Поделись этим:",
+ "Add to your website" : "Добавить к себе на сайт",
+ "Share with me via ownCloud" : "Поделитесь мной через ownCloud",
+ "HTML Code:" : "HTML код:"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/federatedfilesharing/l10n/ru.json b/apps/federatedfilesharing/l10n/ru.json
index a03bfe118cb..713f61d0982 100644
--- a/apps/federatedfilesharing/l10n/ru.json
+++ b/apps/federatedfilesharing/l10n/ru.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Неверный ID в объединении облачных хранилищ.",
"Sharing %s failed, because this item is already shared with %s" : "Не удалось поделиться %s, пользователь %s уже имеет доступ к этому элементу",
"Not allowed to create a federated share with the same user" : "Не допускается создание федеративного общего ресурса с тем-же пользователем",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не удалось поделиться %s, не удалось найти %s, возможно, сервер не доступен."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не удалось поделиться %s, не удалось найти %s, возможно, сервер не доступен.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ",
+ "Federated Cloud Sharing" : "Объединение облачных хранилищ",
+ "Open documentation" : "Открыть документацию",
+ "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов",
+ "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов",
+ "Federated Cloud" : "Объединение облачных хранилищ",
+ "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:",
+ "Share it:" : "Поделись этим:",
+ "Add to your website" : "Добавить к себе на сайт",
+ "Share with me via ownCloud" : "Поделитесь мной через ownCloud",
+ "HTML Code:" : "HTML код:"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/sk_SK.js b/apps/federatedfilesharing/l10n/sk_SK.js
index d08679d19f1..61bf85b79d5 100644
--- a/apps/federatedfilesharing/l10n/sk_SK.js
+++ b/apps/federatedfilesharing/l10n/sk_SK.js
@@ -3,6 +3,18 @@ OC.L10N.register(
{
"Invalid Federated Cloud ID" : "Neplatné združené Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Zdieľanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server v súčasnej dobe nedostupný."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Zdieľanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server v súčasnej dobe nedostupný.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Združené cloudové zdieľanie",
+ "Open documentation" : "Otvoriť dokumentáciu",
+ "Allow users on this server to send shares to other servers" : "Povoliť používateľom z tohoto servera posielať zdieľania na iné servery",
+ "Allow users on this server to receive shares from other servers" : "Povoliť používateľom z tohoto servera prijímať zdieľania z iných serverov",
+ "Federated Cloud" : "Združený Cloud",
+ "Your Federated Cloud ID:" : "Vaše združené Cloud ID",
+ "Share it:" : "Zdieľať:",
+ "Add to your website" : "Pridať na svoju webstránku",
+ "Share with me via ownCloud" : "Zdieľané so mnou cez ownCloud",
+ "HTML Code:" : "HTML kód:"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/federatedfilesharing/l10n/sk_SK.json b/apps/federatedfilesharing/l10n/sk_SK.json
index 2dd753a961b..4c56aaa23b6 100644
--- a/apps/federatedfilesharing/l10n/sk_SK.json
+++ b/apps/federatedfilesharing/l10n/sk_SK.json
@@ -1,6 +1,18 @@
{ "translations": {
"Invalid Federated Cloud ID" : "Neplatné združené Cloud ID",
"Sharing %s failed, because this item is already shared with %s" : "Zdieľanie %s zlyhalo, pretože táto položka už je zdieľaná s %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Zdieľanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server v súčasnej dobe nedostupný."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Zdieľanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server v súčasnej dobe nedostupný.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Združené cloudové zdieľanie",
+ "Open documentation" : "Otvoriť dokumentáciu",
+ "Allow users on this server to send shares to other servers" : "Povoliť používateľom z tohoto servera posielať zdieľania na iné servery",
+ "Allow users on this server to receive shares from other servers" : "Povoliť používateľom z tohoto servera prijímať zdieľania z iných serverov",
+ "Federated Cloud" : "Združený Cloud",
+ "Your Federated Cloud ID:" : "Vaše združené Cloud ID",
+ "Share it:" : "Zdieľať:",
+ "Add to your website" : "Pridať na svoju webstránku",
+ "Share with me via ownCloud" : "Zdieľané so mnou cez ownCloud",
+ "HTML Code:" : "HTML kód:"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/sl.js b/apps/federatedfilesharing/l10n/sl.js
index 3c7d08882ff..04c97908a1f 100644
--- a/apps/federatedfilesharing/l10n/sl.js
+++ b/apps/federatedfilesharing/l10n/sl.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Neveljaven ID zveznega oblaka ownCloud",
"Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletelo, ker je ima uporabnik %s predmet že v souporabi.",
"Not allowed to create a federated share with the same user" : "Ni dovoljeno ustvariti souporabe zveznega oblaka z istim uporabnikom",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Omogočanje souporabe %s je spodletelo, ker ni mogoče najti %s. Najverjetneje je strežnik nedosegljiv."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Omogočanje souporabe %s je spodletelo, ker ni mogoče najti %s. Najverjetneje je strežnik nedosegljiv.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka, več na %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka",
+ "Federated Cloud Sharing" : "Souporaba zveznega oblaka",
+ "Open documentation" : "Odpri dokumentacijo",
+ "Allow users on this server to send shares to other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo na druge strežnike.",
+ "Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map za souporabo z drugih strežnikov.",
+ "Federated Cloud" : "Zvezni oblak",
+ "Your Federated Cloud ID:" : "Vaš ID zveznega oblaka:",
+ "Share it:" : "Omogoči souporabo:",
+ "Add to your website" : "Dodaj na spletišče",
+ "Share with me via ownCloud" : "Omogoči souporabo prek oblaka ownCloud",
+ "HTML Code:" : "Koda HTML:"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/federatedfilesharing/l10n/sl.json b/apps/federatedfilesharing/l10n/sl.json
index 6f374bbe917..aa17e71e4ac 100644
--- a/apps/federatedfilesharing/l10n/sl.json
+++ b/apps/federatedfilesharing/l10n/sl.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Neveljaven ID zveznega oblaka ownCloud",
"Sharing %s failed, because this item is already shared with %s" : "Nastavljanje souporabe %s je spodletelo, ker je ima uporabnik %s predmet že v souporabi.",
"Not allowed to create a federated share with the same user" : "Ni dovoljeno ustvariti souporabe zveznega oblaka z istim uporabnikom",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Omogočanje souporabe %s je spodletelo, ker ni mogoče najti %s. Najverjetneje je strežnik nedosegljiv."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Omogočanje souporabe %s je spodletelo, ker ni mogoče najti %s. Najverjetneje je strežnik nedosegljiv.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka, več na %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka",
+ "Federated Cloud Sharing" : "Souporaba zveznega oblaka",
+ "Open documentation" : "Odpri dokumentacijo",
+ "Allow users on this server to send shares to other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo na druge strežnike.",
+ "Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map za souporabo z drugih strežnikov.",
+ "Federated Cloud" : "Zvezni oblak",
+ "Your Federated Cloud ID:" : "Vaš ID zveznega oblaka:",
+ "Share it:" : "Omogoči souporabo:",
+ "Add to your website" : "Dodaj na spletišče",
+ "Share with me via ownCloud" : "Omogoči souporabo prek oblaka ownCloud",
+ "HTML Code:" : "Koda HTML:"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/sq.js b/apps/federatedfilesharing/l10n/sq.js
index 31fdefd4df7..5e2393f11c7 100644
--- a/apps/federatedfilesharing/l10n/sq.js
+++ b/apps/federatedfilesharing/l10n/sq.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme",
"Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s",
"Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud, shihni %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud",
+ "Federated Cloud Sharing" : "Ndarje Në Re të Federuar ",
+ "Open documentation" : "Hap dokumentimin",
+ "Allow users on this server to send shares to other servers" : "Lejoju përdoruesve në këtë shërbyes të dërgojnë ndarje në shërbyes të tjerë",
+ "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë",
+ "Federated Cloud" : "Re e Federuar",
+ "Your Federated Cloud ID:" : "ID-ja juaj për Re të Federuar:",
+ "Share it:" : "Ndajeni:",
+ "Add to your website" : "Shtojeni te sajti juaj",
+ "Share with me via ownCloud" : "Ndani me mua përmes ownCloud-it",
+ "HTML Code:" : "Kod HTML:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/sq.json b/apps/federatedfilesharing/l10n/sq.json
index a415ae125d8..cead371d182 100644
--- a/apps/federatedfilesharing/l10n/sq.json
+++ b/apps/federatedfilesharing/l10n/sq.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme",
"Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s",
"Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud, shihni %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud",
+ "Federated Cloud Sharing" : "Ndarje Në Re të Federuar ",
+ "Open documentation" : "Hap dokumentimin",
+ "Allow users on this server to send shares to other servers" : "Lejoju përdoruesve në këtë shërbyes të dërgojnë ndarje në shërbyes të tjerë",
+ "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë",
+ "Federated Cloud" : "Re e Federuar",
+ "Your Federated Cloud ID:" : "ID-ja juaj për Re të Federuar:",
+ "Share it:" : "Ndajeni:",
+ "Add to your website" : "Shtojeni te sajti juaj",
+ "Share with me via ownCloud" : "Ndani me mua përmes ownCloud-it",
+ "HTML Code:" : "Kod HTML:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/sr.js b/apps/federatedfilesharing/l10n/sr.js
index 1377d133e50..7613ffa928e 100644
--- a/apps/federatedfilesharing/l10n/sr.js
+++ b/apps/federatedfilesharing/l10n/sr.js
@@ -3,6 +3,13 @@ OC.L10N.register(
{
"Invalid Federated Cloud ID" : "Неисправан ИД Здруженог облака",
"Sharing %s failed, because this item is already shared with %s" : "Дељење %s није успело зато што се ова ставка већ дели са %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Дељење %s није успело, није могуће пронаћи %s, можда сервер тренутно није доступан."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Дељење %s није успело, није могуће пронаћи %s, можда сервер тренутно није доступан.",
+ "Federated Cloud Sharing" : "Здружено дељење у облаку",
+ "Open documentation" : "Отвори документацију",
+ "Allow users on this server to send shares to other servers" : "Дозвољава корисницима овог сервера да шаљу дељења на друге сервере",
+ "Allow users on this server to receive shares from other servers" : "Дозвољава корисницима овог сервера да примају дељења са других сервера",
+ "Federated Cloud" : "Здружени облак",
+ "Your Federated Cloud ID:" : "ИД вашег здруженог облака:",
+ "HTML Code:" : "ХТМЛ кôд:"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/federatedfilesharing/l10n/sr.json b/apps/federatedfilesharing/l10n/sr.json
index 6b3cb347d1f..89d8a38c521 100644
--- a/apps/federatedfilesharing/l10n/sr.json
+++ b/apps/federatedfilesharing/l10n/sr.json
@@ -1,6 +1,13 @@
{ "translations": {
"Invalid Federated Cloud ID" : "Неисправан ИД Здруженог облака",
"Sharing %s failed, because this item is already shared with %s" : "Дељење %s није успело зато што се ова ставка већ дели са %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Дељење %s није успело, није могуће пронаћи %s, можда сервер тренутно није доступан."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Дељење %s није успело, није могуће пронаћи %s, можда сервер тренутно није доступан.",
+ "Federated Cloud Sharing" : "Здружено дељење у облаку",
+ "Open documentation" : "Отвори документацију",
+ "Allow users on this server to send shares to other servers" : "Дозвољава корисницима овог сервера да шаљу дељења на друге сервере",
+ "Allow users on this server to receive shares from other servers" : "Дозвољава корисницима овог сервера да примају дељења са других сервера",
+ "Federated Cloud" : "Здружени облак",
+ "Your Federated Cloud ID:" : "ИД вашег здруженог облака:",
+ "HTML Code:" : "ХТМЛ кôд:"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/sr@latin.js b/apps/federatedfilesharing/l10n/sr@latin.js
new file mode 100644
index 00000000000..b06f53393e0
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/sr@latin.js
@@ -0,0 +1,7 @@
+OC.L10N.register(
+ "federatedfilesharing",
+ {
+ "Allow users on this server to send shares to other servers" : "Dozvoli korisnicima na ovom serveru da šalju deljene resurse na druge servere",
+ "Allow users on this server to receive shares from other servers" : "Dozvoli korisnicima na ovom serveru da primaju deljene resurse sa drugih servera"
+},
+"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/federatedfilesharing/l10n/sr@latin.json b/apps/federatedfilesharing/l10n/sr@latin.json
new file mode 100644
index 00000000000..64463cf1ebc
--- /dev/null
+++ b/apps/federatedfilesharing/l10n/sr@latin.json
@@ -0,0 +1,5 @@
+{ "translations": {
+ "Allow users on this server to send shares to other servers" : "Dozvoli korisnicima na ovom serveru da šalju deljene resurse na druge servere",
+ "Allow users on this server to receive shares from other servers" : "Dozvoli korisnicima na ovom serveru da primaju deljene resurse sa drugih servera"
+},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
+} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/sv.js b/apps/federatedfilesharing/l10n/sv.js
index 54f98bcb34f..fc9f0c824e5 100644
--- a/apps/federatedfilesharing/l10n/sv.js
+++ b/apps/federatedfilesharing/l10n/sv.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Ogiltig Federerad Cloud-ID",
"Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s",
"Not allowed to create a federated share with the same user" : "Ej tillåtet att skapa en federerad delning med samma användare",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dela med mig genom min #owncloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dela med mig genom min #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Federate Cloud delning",
+ "Open documentation" : "Öppna dokumentation",
+ "Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar",
+ "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Ditt Federated Cloud ID",
+ "Share it:" : "Dela detta:",
+ "Add to your website" : "Lägg till på din hemsida",
+ "Share with me via ownCloud" : "Dela med mig via Owncloud",
+ "HTML Code:" : "HTML Kod:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/sv.json b/apps/federatedfilesharing/l10n/sv.json
index 70a11577280..5a4164a3c47 100644
--- a/apps/federatedfilesharing/l10n/sv.json
+++ b/apps/federatedfilesharing/l10n/sv.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Ogiltig Federerad Cloud-ID",
"Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s",
"Not allowed to create a federated share with the same user" : "Ej tillåtet att skapa en federerad delning med samma användare",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dela med mig genom min #owncloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dela med mig genom min #ownCloud Federated Cloud ID",
+ "Federated Cloud Sharing" : "Federate Cloud delning",
+ "Open documentation" : "Öppna dokumentation",
+ "Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar",
+ "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Ditt Federated Cloud ID",
+ "Share it:" : "Dela detta:",
+ "Add to your website" : "Lägg till på din hemsida",
+ "Share with me via ownCloud" : "Dela med mig via Owncloud",
+ "HTML Code:" : "HTML Kod:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/th_TH.js b/apps/federatedfilesharing/l10n/th_TH.js
index cb8e2622ffb..2ee6c54047d 100644
--- a/apps/federatedfilesharing/l10n/th_TH.js
+++ b/apps/federatedfilesharing/l10n/th_TH.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ สามารถดูได้ที่ %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ",
+ "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
+ "Open documentation" : "เปิดเอกสาร",
+ "Allow users on this server to send shares to other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ส่งแชร์ไปยังเซิร์ฟเวอร์อื่นๆ",
+ "Allow users on this server to receive shares from other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ได้รับการแชร์จากเซิร์ฟเวอร์อื่นๆ",
+ "Federated Cloud" : "สหพันธ์คลาวด์",
+ "Your Federated Cloud ID:" : "ไอดีคลาวด์ของคุณ:",
+ "Share it:" : "แชร์มัน:",
+ "Add to your website" : "เพิ่มไปยังเว็บไซต์",
+ "Share with me via ownCloud" : "แชร์ร่วมกับฉันผ่าน ownCloud",
+ "HTML Code:" : "โค้ด HTML:"
},
"nplurals=1; plural=0;");
diff --git a/apps/federatedfilesharing/l10n/th_TH.json b/apps/federatedfilesharing/l10n/th_TH.json
index 79ff6056026..b1ca0b43f90 100644
--- a/apps/federatedfilesharing/l10n/th_TH.json
+++ b/apps/federatedfilesharing/l10n/th_TH.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ สามารถดูได้ที่ %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ",
+ "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
+ "Open documentation" : "เปิดเอกสาร",
+ "Allow users on this server to send shares to other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ส่งแชร์ไปยังเซิร์ฟเวอร์อื่นๆ",
+ "Allow users on this server to receive shares from other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ได้รับการแชร์จากเซิร์ฟเวอร์อื่นๆ",
+ "Federated Cloud" : "สหพันธ์คลาวด์",
+ "Your Federated Cloud ID:" : "ไอดีคลาวด์ของคุณ:",
+ "Share it:" : "แชร์มัน:",
+ "Add to your website" : "เพิ่มไปยังเว็บไซต์",
+ "Share with me via ownCloud" : "แชร์ร่วมกับฉันผ่าน ownCloud",
+ "HTML Code:" : "โค้ด HTML:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/tr.js b/apps/federatedfilesharing/l10n/tr.js
index c0e9f843271..a4f4ad92329 100644
--- a/apps/federatedfilesharing/l10n/tr.js
+++ b/apps/federatedfilesharing/l10n/tr.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
"Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaş, bkz %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaş",
+ "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
+ "Open documentation" : "Belgelendirmeyi aç",
+ "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver",
+ "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver",
+ "Federated Cloud" : "Birleşmiş Bulut",
+ "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:",
+ "Share it:" : "Paylaşın:",
+ "Add to your website" : "Web sitenize ekleyin",
+ "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşın",
+ "HTML Code:" : "HTML Kodu:"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/federatedfilesharing/l10n/tr.json b/apps/federatedfilesharing/l10n/tr.json
index dc9bd7a8f46..23477fdd9c3 100644
--- a/apps/federatedfilesharing/l10n/tr.json
+++ b/apps/federatedfilesharing/l10n/tr.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
"Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir.",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaş, bkz %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaş",
+ "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
+ "Open documentation" : "Belgelendirmeyi aç",
+ "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver",
+ "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver",
+ "Federated Cloud" : "Birleşmiş Bulut",
+ "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:",
+ "Share it:" : "Paylaşın:",
+ "Add to your website" : "Web sitenize ekleyin",
+ "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşın",
+ "HTML Code:" : "HTML Kodu:"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/uk.js b/apps/federatedfilesharing/l10n/uk.js
index c25fd3ad8c8..fe92bd9440c 100644
--- a/apps/federatedfilesharing/l10n/uk.js
+++ b/apps/federatedfilesharing/l10n/uk.js
@@ -2,6 +2,12 @@ OC.L10N.register(
"federatedfilesharing",
{
"Sharing %s failed, because this item is already shared with %s" : "Не вдалося поділитися %s, оскільки файл вже в загальному доступі з %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не вдалося поділитися %s, не вдалося знайти %s, можливо, сервер не доступний."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не вдалося поділитися %s, не вдалося знайти %s, можливо, сервер не доступний.",
+ "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
+ "Open documentation" : "Відкрити документацію",
+ "Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах",
+ "Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів",
+ "Share it:" : "Поділитися цим:",
+ "HTML Code:" : "HTML код:"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/federatedfilesharing/l10n/uk.json b/apps/federatedfilesharing/l10n/uk.json
index 61a4f3a2c9c..5f3c2002f39 100644
--- a/apps/federatedfilesharing/l10n/uk.json
+++ b/apps/federatedfilesharing/l10n/uk.json
@@ -1,5 +1,11 @@
{ "translations": {
"Sharing %s failed, because this item is already shared with %s" : "Не вдалося поділитися %s, оскільки файл вже в загальному доступі з %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не вдалося поділитися %s, не вдалося знайти %s, можливо, сервер не доступний."
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Не вдалося поділитися %s, не вдалося знайти %s, можливо, сервер не доступний.",
+ "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
+ "Open documentation" : "Відкрити документацію",
+ "Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах",
+ "Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів",
+ "Share it:" : "Поділитися цим:",
+ "HTML Code:" : "HTML код:"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/zh_CN.js b/apps/federatedfilesharing/l10n/zh_CN.js
index 9a3b8e0d06a..9126112cf8b 100644
--- a/apps/federatedfilesharing/l10n/zh_CN.js
+++ b/apps/federatedfilesharing/l10n/zh_CN.js
@@ -4,6 +4,16 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "联合云ID不正确",
"Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为它已经共享给 %s",
"Not allowed to create a federated share with the same user" : "不能给你自己分享文件",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,联合云无法找到 %s,请检查设置或联系管理员。"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,联合云无法找到 %s,请检查设置或联系管理员。",
+ "Federated Cloud Sharing" : "联合云共享",
+ "Open documentation" : "打开文档",
+ "Allow users on this server to send shares to other servers" : "允许用户分享文件给其他服务器上的用户",
+ "Allow users on this server to receive shares from other servers" : "允许用户从其他服务器接收分享",
+ "Federated Cloud" : "联合云",
+ "Your Federated Cloud ID:" : "你的联合云ID:",
+ "Share it:" : "分享它:",
+ "Add to your website" : "添加到您的网站",
+ "Share with me via ownCloud" : "通过联合云与我共享",
+ "HTML Code:" : "HTML 代码:"
},
"nplurals=1; plural=0;");
diff --git a/apps/federatedfilesharing/l10n/zh_CN.json b/apps/federatedfilesharing/l10n/zh_CN.json
index 6a3c1843682..b8d473f2d12 100644
--- a/apps/federatedfilesharing/l10n/zh_CN.json
+++ b/apps/federatedfilesharing/l10n/zh_CN.json
@@ -2,6 +2,16 @@
"Invalid Federated Cloud ID" : "联合云ID不正确",
"Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为它已经共享给 %s",
"Not allowed to create a federated share with the same user" : "不能给你自己分享文件",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,联合云无法找到 %s,请检查设置或联系管理员。"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,联合云无法找到 %s,请检查设置或联系管理员。",
+ "Federated Cloud Sharing" : "联合云共享",
+ "Open documentation" : "打开文档",
+ "Allow users on this server to send shares to other servers" : "允许用户分享文件给其他服务器上的用户",
+ "Allow users on this server to receive shares from other servers" : "允许用户从其他服务器接收分享",
+ "Federated Cloud" : "联合云",
+ "Your Federated Cloud ID:" : "你的联合云ID:",
+ "Share it:" : "分享它:",
+ "Add to your website" : "添加到您的网站",
+ "Share with me via ownCloud" : "通过联合云与我共享",
+ "HTML Code:" : "HTML 代码:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/zh_TW.js b/apps/federatedfilesharing/l10n/zh_TW.js
index cfdeb1f8bc1..1a687eb0416 100644
--- a/apps/federatedfilesharing/l10n/zh_TW.js
+++ b/apps/federatedfilesharing/l10n/zh_TW.js
@@ -4,6 +4,18 @@ OC.L10N.register(
"Invalid Federated Cloud ID" : "無效的雲端聯盟ID:",
"Sharing %s failed, because this item is already shared with %s" : "分享 %s 失敗,因為此項目目前已經與 %s 分享",
"Not allowed to create a federated share with the same user" : "不允許與同一個使用者建立聯盟式分享",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享%s失敗,找不到%s,或許目前無法連線到該伺服器"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享%s失敗,找不到%s,或許目前無法連線到該伺服器",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享,請看 %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享",
+ "Federated Cloud Sharing" : "聯盟式雲端分享",
+ "Open documentation" : "開啟說明文件",
+ "Allow users on this server to send shares to other servers" : "允許這台伺服器上的使用者發送分享給其他伺服器",
+ "Allow users on this server to receive shares from other servers" : "允許這台伺服器上的使用者發送接收來自其他伺服器的分享",
+ "Federated Cloud" : "聯盟式雲端",
+ "Your Federated Cloud ID:" : "您的雲端聯盟 ID:",
+ "Share it:" : "分享它:",
+ "Add to your website" : "新增至您的網站",
+ "Share with me via ownCloud" : "透過 ownCloud 與我分享",
+ "HTML Code:" : "HTML Code:"
},
"nplurals=1; plural=0;");
diff --git a/apps/federatedfilesharing/l10n/zh_TW.json b/apps/federatedfilesharing/l10n/zh_TW.json
index 6207be0d519..81d4833ce47 100644
--- a/apps/federatedfilesharing/l10n/zh_TW.json
+++ b/apps/federatedfilesharing/l10n/zh_TW.json
@@ -2,6 +2,18 @@
"Invalid Federated Cloud ID" : "無效的雲端聯盟ID:",
"Sharing %s failed, because this item is already shared with %s" : "分享 %s 失敗,因為此項目目前已經與 %s 分享",
"Not allowed to create a federated share with the same user" : "不允許與同一個使用者建立聯盟式分享",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享%s失敗,找不到%s,或許目前無法連線到該伺服器"
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享%s失敗,找不到%s,或許目前無法連線到該伺服器",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享,請看 %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享",
+ "Federated Cloud Sharing" : "聯盟式雲端分享",
+ "Open documentation" : "開啟說明文件",
+ "Allow users on this server to send shares to other servers" : "允許這台伺服器上的使用者發送分享給其他伺服器",
+ "Allow users on this server to receive shares from other servers" : "允許這台伺服器上的使用者發送接收來自其他伺服器的分享",
+ "Federated Cloud" : "聯盟式雲端",
+ "Your Federated Cloud ID:" : "您的雲端聯盟 ID:",
+ "Share it:" : "分享它:",
+ "Add to your website" : "新增至您的網站",
+ "Share with me via ownCloud" : "透過 ownCloud 與我分享",
+ "HTML Code:" : "HTML Code:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/lib/federatedshareprovider.php b/apps/federatedfilesharing/lib/federatedshareprovider.php
index 64e4b6de4f1..d014a6219a3 100644
--- a/apps/federatedfilesharing/lib/federatedshareprovider.php
+++ b/apps/federatedfilesharing/lib/federatedshareprovider.php
@@ -25,6 +25,8 @@ namespace OCA\FederatedFileSharing;
use OC\Share20\Share;
use OCP\Files\IRootFolder;
+use OCP\IAppConfig;
+use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use OCP\Share\IShare;
@@ -65,6 +67,9 @@ class FederatedShareProvider implements IShareProvider {
/** @var IRootFolder */
private $rootFolder;
+ /** @var IConfig */
+ private $config;
+
/**
* DefaultShareProvider constructor.
*
@@ -75,6 +80,7 @@ class FederatedShareProvider implements IShareProvider {
* @param IL10N $l10n
* @param ILogger $logger
* @param IRootFolder $rootFolder
+ * @param IConfig $config
*/
public function __construct(
IDBConnection $connection,
@@ -83,7 +89,8 @@ class FederatedShareProvider implements IShareProvider {
TokenHandler $tokenHandler,
IL10N $l10n,
ILogger $logger,
- IRootFolder $rootFolder
+ IRootFolder $rootFolder,
+ IConfig $config
) {
$this->dbConnection = $connection;
$this->addressHandler = $addressHandler;
@@ -92,6 +99,7 @@ class FederatedShareProvider implements IShareProvider {
$this->l = $l10n;
$this->logger = $logger;
$this->rootFolder = $rootFolder;
+ $this->config = $config;
}
/**
@@ -590,4 +598,35 @@ class FederatedShareProvider implements IShareProvider {
// We don't handle groups here
return;
}
+
+ /**
+ * This provider does not handle groups
+ *
+ * @param string $uid
+ * @param string $gid
+ */
+ public function userDeletedFromGroup($uid, $gid) {
+ // We don't handle groups here
+ return;
+ }
+
+ /**
+ * check if users from other ownCloud instances are allowed to mount public links share by this instance
+ *
+ * @return bool
+ */
+ public function isOutgoingServer2serverShareEnabled() {
+ $result = $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes');
+ return ($result === 'yes') ? true : false;
+ }
+
+ /**
+ * check if users are allowed to mount public links from other ownClouds
+ *
+ * @return bool
+ */
+ public function isIncomingServer2serverShareEnabled() {
+ $result = $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes');
+ return ($result === 'yes') ? true : false;
+ }
}
diff --git a/apps/files_sharing/settings-admin.php b/apps/federatedfilesharing/settings-admin.php
index b2a305ebcdb..9dd21281fda 100644
--- a/apps/files_sharing/settings-admin.php
+++ b/apps/federatedfilesharing/settings-admin.php
@@ -20,12 +20,15 @@
*
*/
+use OCA\FederatedFileSharing\AppInfo\Application;
+
\OC_Util::checkAdminUser();
-\OCP\Util::addScript('files_sharing', 'settings-admin');
+$app = new Application('federatedfilesharing');
+$federatedShareProvider = $app->getFederatedShareProvider();
-$tmpl = new OCP\Template('files_sharing', 'settings-admin');
-$tmpl->assign('outgoingServer2serverShareEnabled', OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled());
-$tmpl->assign('incomingServer2serverShareEnabled', OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled());
+$tmpl = new OCP\Template('federatedfilesharing', 'settings-admin');
+$tmpl->assign('outgoingServer2serverShareEnabled', $federatedShareProvider->isOutgoingServer2serverShareEnabled());
+$tmpl->assign('incomingServer2serverShareEnabled', $federatedShareProvider->isIncomingServer2serverShareEnabled());
return $tmpl->fetchPage();
diff --git a/apps/files_sharing/settings-personal.php b/apps/federatedfilesharing/settings-personal.php
index 982a8b05c15..385d3971146 100644
--- a/apps/files_sharing/settings-personal.php
+++ b/apps/federatedfilesharing/settings-personal.php
@@ -21,9 +21,14 @@
*
*/
+use OCA\FederatedFileSharing\AppInfo\Application;
+
\OC_Util::checkLoggedIn();
-$l = \OC::$server->getL10N('files_sharing');
+$l = \OC::$server->getL10N('federatedfilesharing');
+
+$app = new Application('federatedfilesharing');
+$federatedShareProvider = $app->getFederatedShareProvider();
$isIE8 = false;
preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches);
@@ -35,8 +40,8 @@ $cloudID = \OC::$server->getUserSession()->getUser()->getCloudId();
$url = 'https://owncloud.org/federation#' . $cloudID;
$ownCloudLogoPath = \OC::$server->getURLGenerator()->imagePath('core', 'logo-icon.svg');
-$tmpl = new OCP\Template('files_sharing', 'settings-personal');
-$tmpl->assign('outgoingServer2serverShareEnabled', \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled());
+$tmpl = new OCP\Template('federatedfilesharing', 'settings-personal');
+$tmpl->assign('outgoingServer2serverShareEnabled', $federatedShareProvider->isOutgoingServer2serverShareEnabled());
$tmpl->assign('message_with_URL', $l->t('Share with me through my #ownCloud Federated Cloud ID, see %s', [$url]));
$tmpl->assign('message_without_URL', $l->t('Share with me through my #ownCloud Federated Cloud ID', [$cloudID]));
$tmpl->assign('owncloud_logo_path', $ownCloudLogoPath);
diff --git a/apps/files_sharing/templates/settings-admin.php b/apps/federatedfilesharing/templates/settings-admin.php
index 64b6b8e72a3..5d2eb04c170 100644
--- a/apps/files_sharing/templates/settings-admin.php
+++ b/apps/federatedfilesharing/templates/settings-admin.php
@@ -1,7 +1,9 @@
<?php
/** @var OC_L10N $l */
/** @var array $_ */
+script('federatedfilesharing', 'settings-admin');
?>
+
<div id="fileSharingSettings">
<h3><?php p($l->t('Federated Cloud Sharing'));?></h3>
<a target="_blank" rel="noreferrer" class="icon-info svg"
diff --git a/apps/files_sharing/templates/settings-personal.php b/apps/federatedfilesharing/templates/settings-personal.php
index ea9aae038a7..87b524af3e8 100644
--- a/apps/files_sharing/templates/settings-personal.php
+++ b/apps/federatedfilesharing/templates/settings-personal.php
@@ -1,11 +1,11 @@
<?php
/** @var OC_L10N $l */
/** @var array $_ */
-script('files_sharing', 'settings-personal');
-style('files_sharing', 'settings-personal');
+script('federatedfilesharing', 'settings-personal');
+style('federatedfilesharing', 'settings-personal');
if ($_['showShareIT']) {
- script('files_sharing', '3rdparty/gs-share/gs-share');
- style('files_sharing', '3rdparty/gs-share/style');
+ script('federatedfilesharing', '3rdparty/gs-share/gs-share');
+ style('federatedfilesharing', '3rdparty/gs-share/style');
}
?>
diff --git a/apps/federatedfilesharing/tests/federatedshareprovidertest.php b/apps/federatedfilesharing/tests/federatedshareprovidertest.php
index 92e9f10c3cd..1fbae90a46f 100644
--- a/apps/federatedfilesharing/tests/federatedshareprovidertest.php
+++ b/apps/federatedfilesharing/tests/federatedshareprovidertest.php
@@ -26,6 +26,7 @@ use OCA\FederatedFileSharing\FederatedShareProvider;
use OCA\FederatedFileSharing\Notifications;
use OCA\FederatedFileSharing\TokenHandler;
use OCP\Files\IRootFolder;
+use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IL10N;
use OCP\ILogger;
@@ -54,6 +55,8 @@ class FederatedShareProviderTest extends TestCase {
protected $logger;
/** @var IRootFolder | \PHPUnit_Framework_MockObject_MockObject */
protected $rootFolder;
+ /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
+ protected $config;
/** @var IManager */
protected $shareManager;
@@ -78,6 +81,7 @@ class FederatedShareProviderTest extends TestCase {
}));
$this->logger = $this->getMock('OCP\ILogger');
$this->rootFolder = $this->getMock('OCP\Files\IRootFolder');
+ $this->config = $this->getMock('OCP\IConfig');
$this->addressHandler = new AddressHandler(\OC::$server->getURLGenerator(), $this->l);
$this->provider = new FederatedShareProvider(
@@ -87,7 +91,8 @@ class FederatedShareProviderTest extends TestCase {
$this->tokenHandler,
$this->l,
$this->logger,
- $this->rootFolder
+ $this->rootFolder,
+ $this->config
);
$this->shareManager = \OC::$server->getShareManager();
@@ -510,4 +515,43 @@ class FederatedShareProviderTest extends TestCase {
$this->assertCount($rowDeleted ? 0 : 1, $data);
}
+
+ /**
+ * @dataProvider dataTestFederatedSharingSettings
+ *
+ * @param string $isEnabled
+ * @param bool $expected
+ */
+ public function testIsOutgoingServer2serverShareEnabled($isEnabled, $expected) {
+ $this->config->expects($this->once())->method('getAppValue')
+ ->with('files_sharing', 'outgoing_server2server_share_enabled', 'yes')
+ ->willReturn($isEnabled);
+
+ $this->assertSame($expected,
+ $this->provider->isOutgoingServer2serverShareEnabled()
+ );
+ }
+
+ /**
+ * @dataProvider dataTestFederatedSharingSettings
+ *
+ * @param string $isEnabled
+ * @param bool $expected
+ */
+ public function testIsIncomingServer2serverShareEnabled($isEnabled, $expected) {
+ $this->config->expects($this->once())->method('getAppValue')
+ ->with('files_sharing', 'incoming_server2server_share_enabled', 'yes')
+ ->willReturn($isEnabled);
+
+ $this->assertSame($expected,
+ $this->provider->isIncomingServer2serverShareEnabled()
+ );
+ }
+
+ public function dataTestFederatedSharingSettings() {
+ return [
+ ['yes', true],
+ ['no', false]
+ ];
+ }
}
diff --git a/apps/federation/l10n/bg_BG.js b/apps/federation/l10n/bg_BG.js
new file mode 100644
index 00000000000..402b89d086a
--- /dev/null
+++ b/apps/federation/l10n/bg_BG.js
@@ -0,0 +1,12 @@
+OC.L10N.register(
+ "federation",
+ {
+ "Server added to the list of trusted ownClouds" : "Сървърат добавен в листа със сигурни ownClouds",
+ "Server is already in the list of trusted servers." : "Сървъра вече е добавен в листа с сигурни сървъри",
+ "No ownCloud server found" : "Не е намерен ownCloud сървър",
+ "Federation" : "Федерация",
+ "Trusted ownCloud Servers" : "Сигурни ownCloud сървъри",
+ "+ Add ownCloud server" : "+ Добавяне ownCloud сървър",
+ "ownCloud Server" : "ownCloud сървър"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/federation/l10n/bg_BG.json b/apps/federation/l10n/bg_BG.json
new file mode 100644
index 00000000000..f0fed16602c
--- /dev/null
+++ b/apps/federation/l10n/bg_BG.json
@@ -0,0 +1,10 @@
+{ "translations": {
+ "Server added to the list of trusted ownClouds" : "Сървърат добавен в листа със сигурни ownClouds",
+ "Server is already in the list of trusted servers." : "Сървъра вече е добавен в листа с сигурни сървъри",
+ "No ownCloud server found" : "Не е намерен ownCloud сървър",
+ "Federation" : "Федерация",
+ "Trusted ownCloud Servers" : "Сигурни ownCloud сървъри",
+ "+ Add ownCloud server" : "+ Добавяне ownCloud сървър",
+ "ownCloud Server" : "ownCloud сървър"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/federation/l10n/oc.js b/apps/federation/l10n/oc.js
new file mode 100644
index 00000000000..d65cc9bdef8
--- /dev/null
+++ b/apps/federation/l10n/oc.js
@@ -0,0 +1,9 @@
+OC.L10N.register(
+ "federation",
+ {
+ "No ownCloud server found" : "Cap de servidor ownCloud pas trobat",
+ "Could not add server" : "Impossible d'apondre un servidor",
+ "Federation" : "Federacion",
+ "ownCloud Server" : "Servidor ownCloud"
+},
+"nplurals=2; plural=(n > 1);");
diff --git a/apps/federation/l10n/oc.json b/apps/federation/l10n/oc.json
new file mode 100644
index 00000000000..809a86fcaa8
--- /dev/null
+++ b/apps/federation/l10n/oc.json
@@ -0,0 +1,7 @@
+{ "translations": {
+ "No ownCloud server found" : "Cap de servidor ownCloud pas trobat",
+ "Could not add server" : "Impossible d'apondre un servidor",
+ "Federation" : "Federacion",
+ "ownCloud Server" : "Servidor ownCloud"
+},"pluralForm" :"nplurals=2; plural=(n > 1);"
+} \ No newline at end of file
diff --git a/apps/federation/l10n/th_TH.js b/apps/federation/l10n/th_TH.js
index 8aa63c8ca74..9779c11d5d2 100644
--- a/apps/federation/l10n/th_TH.js
+++ b/apps/federation/l10n/th_TH.js
@@ -6,6 +6,10 @@ OC.L10N.register(
"No ownCloud server found" : "ไม่พบเซิร์ฟเวอร์ ownCloud",
"Could not add server" : "ไม่สามารถเพิ่มเซิร์ฟเวอร์",
"Federation" : "สหพันธ์",
- "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "สหพันธ์ ownCloud ช่วยให้คุณสามารถเชื่อมต่อกับ ownCloud ที่น่าเชื่อถืออื่นๆ เพื่อแลกเปลี่ยนไดเรกทอรีของผู้ใช้ ตัวอย่างเช่น นี้จะถูกนำมาใช้กับผู้ใช้งานภายนอกโดยอัตโนมัติสำหรับการแชร์สหพันธ์"
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "สหพันธ์ ownCloud ช่วยให้คุณสามารถเชื่อมต่อกับ ownCloud ที่น่าเชื่อถืออื่นๆ เพื่อแลกเปลี่ยนไดเรกทอรีของผู้ใช้ ตัวอย่างเช่น นี้จะถูกนำมาใช้กับผู้ใช้งานภายนอกโดยอัตโนมัติสำหรับการแชร์สหพันธ์",
+ "Add server automatically once a federated share was created successfully" : "เพิ่มเซิร์ฟเวอร์โดยอัตโนมัติเมื่อแชร์กับสหพันธ์สร้างเสร็จเรียบร้อยแล้ว",
+ "Trusted ownCloud Servers" : "เซิร์ฟเวอร์ ownCloud ที่เชื่อถือได้",
+ "+ Add ownCloud server" : "+ เพิ่มเซิร์ฟเวอร์ ownCloud",
+ "ownCloud Server" : "เซิร์ฟเวอร์ ownCloud"
},
"nplurals=1; plural=0;");
diff --git a/apps/federation/l10n/th_TH.json b/apps/federation/l10n/th_TH.json
index 49c8bad4192..5bf4f833be7 100644
--- a/apps/federation/l10n/th_TH.json
+++ b/apps/federation/l10n/th_TH.json
@@ -4,6 +4,10 @@
"No ownCloud server found" : "ไม่พบเซิร์ฟเวอร์ ownCloud",
"Could not add server" : "ไม่สามารถเพิ่มเซิร์ฟเวอร์",
"Federation" : "สหพันธ์",
- "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "สหพันธ์ ownCloud ช่วยให้คุณสามารถเชื่อมต่อกับ ownCloud ที่น่าเชื่อถืออื่นๆ เพื่อแลกเปลี่ยนไดเรกทอรีของผู้ใช้ ตัวอย่างเช่น นี้จะถูกนำมาใช้กับผู้ใช้งานภายนอกโดยอัตโนมัติสำหรับการแชร์สหพันธ์"
+ "ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "สหพันธ์ ownCloud ช่วยให้คุณสามารถเชื่อมต่อกับ ownCloud ที่น่าเชื่อถืออื่นๆ เพื่อแลกเปลี่ยนไดเรกทอรีของผู้ใช้ ตัวอย่างเช่น นี้จะถูกนำมาใช้กับผู้ใช้งานภายนอกโดยอัตโนมัติสำหรับการแชร์สหพันธ์",
+ "Add server automatically once a federated share was created successfully" : "เพิ่มเซิร์ฟเวอร์โดยอัตโนมัติเมื่อแชร์กับสหพันธ์สร้างเสร็จเรียบร้อยแล้ว",
+ "Trusted ownCloud Servers" : "เซิร์ฟเวอร์ ownCloud ที่เชื่อถือได้",
+ "+ Add ownCloud server" : "+ เพิ่มเซิร์ฟเวอร์ ownCloud",
+ "ownCloud Server" : "เซิร์ฟเวอร์ ownCloud"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/appinfo/application.php b/apps/files/appinfo/application.php
index 593e0533c80..2d2decf6288 100644
--- a/apps/files/appinfo/application.php
+++ b/apps/files/appinfo/application.php
@@ -43,7 +43,8 @@ class Application extends App {
$server->getUserSession(),
$c->query('TagService'),
$server->getPreviewManager(),
- $server->getShareManager()
+ $server->getShareManager(),
+ $server->getConfig()
);
});
diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php
index 731c671b60a..2291b48e3c5 100644
--- a/apps/files/appinfo/routes.php
+++ b/apps/files/appinfo/routes.php
@@ -1,6 +1,7 @@
<?php
/**
* @author Bart Visscher <bartv@thisnet.nl>
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Roeland Jago Douma <rullzer@owncloud.com>
* @author Tobias Kaminsky <tobias@kaminsky.me>
@@ -48,6 +49,16 @@ $application->registerRoutes(
'verb' => 'GET',
'requirements' => array('tagName' => '.+'),
),
+ array(
+ 'name' => 'API#updateFileSorting',
+ 'url' => '/api/v1/sorting',
+ 'verb' => 'POST'
+ ),
+ array(
+ 'name' => 'API#showHiddenFiles',
+ 'url' => '/api/v1/showhidden',
+ 'verb' => 'POST'
+ ),
[
'name' => 'view#index',
'url' => '/',
diff --git a/apps/files/command/transferownership.php b/apps/files/command/transferownership.php
index 6bf2fae6bdf..1f46efdde0d 100644
--- a/apps/files/command/transferownership.php
+++ b/apps/files/command/transferownership.php
@@ -97,6 +97,12 @@ class TransferOwnership extends Command {
$output->writeln("<error>Unknown destination user $this->destinationUser</error>");
return;
}
+
+ // target user has to be ready
+ if (!\OC::$server->getEncryptionManager()->isReadyForUser($this->destinationUser)) {
+ $output->writeln("<error>The target user is not ready to accept files. The user has at least to be logged in once.</error>");
+ return;
+ }
$date = date('c');
$this->finalTarget = "$this->destinationUser/files/transferred from $this->sourceUser on $date";
diff --git a/apps/files/controller/apicontroller.php b/apps/files/controller/apicontroller.php
index ad286284386..072498c7b5f 100644
--- a/apps/files/controller/apicontroller.php
+++ b/apps/files/controller/apicontroller.php
@@ -1,6 +1,7 @@
<?php
/**
* @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <rullzer@owncloud.com>
@@ -29,13 +30,14 @@ namespace OCA\Files\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Controller;
+use OCP\IConfig;
use OCP\IRequest;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\DataDisplayResponse;
+use OCP\AppFramework\Http\Response;
use OCA\Files\Service\TagService;
use OCP\IPreview;
use OCP\Share\IManager;
-use OCP\Files\FileInfo;
use OCP\Files\Node;
use OCP\IUserSession;
@@ -53,6 +55,8 @@ class ApiController extends Controller {
private $previewManager;
/** IUserSession */
private $userSession;
+ /** IConfig */
+ private $config;
/**
* @param string $appName
@@ -65,12 +69,14 @@ class ApiController extends Controller {
IUserSession $userSession,
TagService $tagService,
IPreview $previewManager,
- IManager $shareManager) {
+ IManager $shareManager,
+ IConfig $config) {
parent::__construct($appName, $request);
$this->userSession = $userSession;
$this->tagService = $tagService;
$this->previewManager = $previewManager;
$this->shareManager = $shareManager;
+ $this->config = $config;
}
/**
@@ -196,4 +202,38 @@ class ApiController extends Controller {
return $shareTypes;
}
+ /**
+ * Change the default sort mode
+ *
+ * @NoAdminRequired
+ *
+ * @param string $mode
+ * @param string $direction
+ * @return Response
+ */
+ public function updateFileSorting($mode, $direction) {
+ $allowedMode = ['name', 'size', 'mtime'];
+ $allowedDirection = ['asc', 'desc'];
+ if (!in_array($mode, $allowedMode) || !in_array($direction, $allowedDirection)) {
+ $response = new Response();
+ $response->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
+ return $response;
+ }
+ $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting', $mode);
+ $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting_direction', $direction);
+ return new Response();
+ }
+
+ /**
+ * Toggle default for showing/hiding hidden files
+ *
+ * @NoAdminRequired
+ *
+ * @param bool $show
+ */
+ public function showHiddenFiles($show) {
+ $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', (int) $show);
+ return new Response();
+ }
+
}
diff --git a/apps/files/controller/viewcontroller.php b/apps/files/controller/viewcontroller.php
index 800cf008fa7..ded6fd555df 100644
--- a/apps/files/controller/viewcontroller.php
+++ b/apps/files/controller/viewcontroller.php
@@ -1,5 +1,6 @@
<?php
/**
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
@@ -27,11 +28,12 @@ use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IConfig;
use OCP\IL10N;
use OCP\INavigationManager;
use OCP\IRequest;
use OCP\IURLGenerator;
-use OCP\IConfig;
+use OCP\IUserSession;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
@@ -54,6 +56,8 @@ class ViewController extends Controller {
protected $config;
/** @var EventDispatcherInterface */
protected $eventDispatcher;
+ /** @var IUserSession */
+ protected $userSession;
/**
* @param string $appName
@@ -63,6 +67,7 @@ class ViewController extends Controller {
* @param IL10N $l10n
* @param IConfig $config
* @param EventDispatcherInterface $eventDispatcherInterface
+ * @param IUserSession $userSession
*/
public function __construct($appName,
IRequest $request,
@@ -70,7 +75,8 @@ class ViewController extends Controller {
INavigationManager $navigationManager,
IL10N $l10n,
IConfig $config,
- EventDispatcherInterface $eventDispatcherInterface) {
+ EventDispatcherInterface $eventDispatcherInterface,
+ IUserSession $userSession) {
parent::__construct($appName, $request);
$this->appName = $appName;
$this->request = $request;
@@ -79,6 +85,7 @@ class ViewController extends Controller {
$this->l10n = $l10n;
$this->config = $config;
$this->eventDispatcher = $eventDispatcherInterface;
+ $this->userSession = $userSession;
}
/**
@@ -130,7 +137,6 @@ class ViewController extends Controller {
\OCP\Util::addscript('files', 'app');
\OCP\Util::addscript('files', 'file-upload');
\OCP\Util::addscript('files', 'newfilemenu');
- \OCP\Util::addscript('files', 'jquery.iframe-transport');
\OCP\Util::addscript('files', 'jquery.fileupload');
\OCP\Util::addscript('files', 'jquery-visibility');
\OCP\Util::addscript('files', 'fileinfomodel');
@@ -213,6 +219,11 @@ class ViewController extends Controller {
$params['mailNotificationEnabled'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no');
$params['mailPublicNotificationEnabled'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no');
$params['allowShareWithLink'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes');
+ $user = $this->userSession->getUser()->getUID();
+ $params['defaultFileSorting'] = $this->config->getUserValue($user, 'files', 'file_sorting', 'name');
+ $params['defaultFileSortingDirection'] = $this->config->getUserValue($user, 'files', 'file_sorting_direction', 'asc');
+ $showHidden = (bool) $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', false);
+ $params['showHiddenFiles'] = $showHidden ? 1 : 0;
$params['appNavigation'] = $nav;
$params['appContents'] = $contentItems;
$this->navigationManager->setActiveEntry('files_index');
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index d20ab102ba5..373739071e9 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -2,6 +2,11 @@
This file is licensed under the Affero General Public License version 3 or later.
See the COPYING-README file. */
+/* SETTINGS */
+#files-setting-showhidden {
+ padding-bottom: 8px;
+}
+
/* FILE MENU */
.actions { padding:5px; height:32px; display: inline-block; float: left; }
.actions input, .actions button, .actions .button { margin:0; float:left; }
diff --git a/apps/files/js/app.js b/apps/files/js/app.js
index ff505d417f1..eac080a009d 100644
--- a/apps/files/js/app.js
+++ b/apps/files/js/app.js
@@ -11,7 +11,7 @@
*
*/
-/* global dragOptions, folderDropOptions */
+/* global dragOptions, folderDropOptions, OC */
(function() {
if (!OCA.Files) {
@@ -41,10 +41,22 @@
fileList: null,
/**
+ * Backbone model for storing files preferences
+ */
+ _filesConfig: null,
+
+ /**
* Initializes the files app
*/
initialize: function() {
this.navigation = new OCA.Files.Navigation($('#app-navigation'));
+ this.$showHiddenFiles = $('input#showhiddenfilesToggle');
+ var showHidden = $('#showHiddenFiles').val() === "1";
+ this.$showHiddenFiles.prop('checked', showHidden);
+
+ this._filesConfig = new OC.Backbone.Model({
+ showhidden: showHidden
+ });
var urlParams = OC.Util.History.parseUrlQuery();
var fileActions = new OCA.Files.FileActions();
@@ -72,7 +84,12 @@
fileActions: fileActions,
allowLegacyActions: true,
scrollTo: urlParams.scrollto,
- filesClient: OC.Files.getClient()
+ filesClient: OC.Files.getClient(),
+ sorting: {
+ mode: $('#defaultFileSorting').val(),
+ direction: $('#defaultFileSortingDirection').val()
+ },
+ config: this._filesConfig,
}
);
this.files.initialize();
@@ -86,6 +103,8 @@
this._setupEvents();
// trigger URL change event handlers
this._onPopState(urlParams);
+
+ this._debouncedPersistShowHiddenFilesState = _.debounce(this._persistShowHiddenFilesState, 1200);
},
/**
@@ -140,6 +159,14 @@
},
/**
+ *
+ * @returns {Backbone.Model}
+ */
+ getFilesConfig: function() {
+ return this._filesConfig;
+ },
+
+ /**
* Setup events based on URL changes
*/
_setupEvents: function() {
@@ -150,6 +177,30 @@
$('#app-content').delegate('>div', 'changeViewerMode', _.bind(this._onChangeViewerMode, this));
$('#app-navigation').on('itemChanged', _.bind(this._onNavigationChanged, this));
+ this.$showHiddenFiles.on('change', _.bind(this._onShowHiddenFilesChange, this));
+ },
+
+ /**
+ * Toggle showing hidden files according to the settings checkbox
+ *
+ * @returns {undefined}
+ */
+ _onShowHiddenFilesChange: function() {
+ var show = this.$showHiddenFiles.is(':checked');
+ this._filesConfig.set('showhidden', show);
+ this._debouncedPersistShowHiddenFilesState();
+ },
+
+ /**
+ * Persist show hidden preference on ther server
+ *
+ * @returns {undefined}
+ */
+ _persistShowHiddenFilesState: function() {
+ var show = this._filesConfig.get('showhidden');
+ $.post(OC.generateUrl('/apps/files/api/v1/showhidden'), {
+ show: show
+ });
},
/**
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index fca69064cde..b88a7031dba 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -504,7 +504,7 @@ OC.Upload = {
//fetch response from iframe
response = data.result[0].body.innerText;
}
- var result = $.parseJSON(response);
+ var result = JSON.parse(response);
delete data.jqXHR;
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 71af4a21b9b..16ca5e91ed2 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -145,6 +145,11 @@
_filter: '',
/**
+ * @type Backbone.Model
+ */
+ _filesConfig: undefined,
+
+ /**
* Sort attribute
* @type String
*/
@@ -198,6 +203,18 @@
return;
}
+ if (options.config) {
+ this._filesConfig = options.config;
+ } else if (!_.isUndefined(OCA.Files) && !_.isUndefined(OCA.Files.App)) {
+ this._filesConfig = OCA.Files.App.getFilesConfig();
+ }
+
+ if (!_.isUndefined(this._filesConfig)) {
+ this._filesConfig.on('change:showhidden', function() {
+ self.setFiles(self.files);
+ });
+ }
+
if (options.dragOptions) {
this._dragOptions = options.dragOptions;
}
@@ -239,7 +256,11 @@
this.fileSummary = this._createSummary();
- this.setSort('name', 'asc');
+ if (options.sorting) {
+ this.setSort(options.sorting.mode, options.sorting.direction, false, false);
+ } else {
+ this.setSort('name', 'asc', false, false);
+ }
var breadcrumbOptions = {
onClick: _.bind(this._onClickBreadCrumb, this),
@@ -390,6 +411,11 @@
model.toJSON(),
{updateSummary: true, silent: false, animate: true}
);
+
+ // restore selection state
+ var selected = !!self._selectedFiles[$tr.data('id')];
+ self._selectFileEl($tr, selected);
+
$tr.toggleClass('highlighted', highlightState);
});
model.on('busy', function(model, state) {
@@ -690,14 +716,14 @@
sort = $target.attr('data-sort');
if (sort) {
if (this._sort === sort) {
- this.setSort(sort, (this._sortDirection === 'desc')?'asc':'desc', true);
+ this.setSort(sort, (this._sortDirection === 'desc')?'asc':'desc', true, true);
}
else {
if ( sort === 'name' ) { //default sorting of name is opposite to size and mtime
- this.setSort(sort, 'asc', true);
+ this.setSort(sort, 'asc', true, true);
}
else {
- this.setSort(sort, 'desc', true);
+ this.setSort(sort, 'desc', true, true);
}
}
}
@@ -838,6 +864,10 @@
* @return array of DOM elements of the newly added files
*/
_nextPage: function(animate) {
+ // Save full files list while rendering
+ var allFiles = this.files;
+ this.files = this._filterHiddenFiles(this.files);
+
var index = this.$fileList.children().length,
count = this.pageSize(),
hidden,
@@ -884,6 +914,10 @@
}
}, 0);
}
+
+ // Restore full files list after rendering
+ this.files = allFiles;
+
return newTrs;
},
@@ -921,18 +955,25 @@
// clear "Select all" checkbox
this.$el.find('.select-all').prop('checked', false);
+ // Save full files list while rendering
+ var allFiles = this.files;
+ this.files = this._filterHiddenFiles(this.files);
+
this.isEmpty = this.files.length === 0;
this._nextPage();
this.updateEmptyContent();
- this.fileSummary.calculate(filesArray);
+ this.fileSummary.calculate(this.files);
this._selectedFiles = {};
this._selectionSummary.clear();
this.updateSelectionSummary();
$(window).scrollTop(0);
+ // Restore full files list after rendering
+ this.files = allFiles;
+
this.$fileList.trigger(jQuery.Event('updated'));
_.defer(function() {
self.$el.closest('#app-content').trigger(jQuery.Event('apprendered'));
@@ -940,6 +981,21 @@
},
/**
+ * Filter hidden files of the given filesArray (dot-files)
+ *
+ * @param filesArray files to be filtered
+ * @returns {array}
+ */
+ _filterHiddenFiles: function(files) {
+ if (_.isUndefined(this._filesConfig) || this._filesConfig.get('showhidden')) {
+ return files;
+ }
+ return _.filter(files, function(file) {
+ return file.name.indexOf('.') !== 0;
+ });
+ },
+
+ /**
* Returns the icon URL matching the given file info
*
* @param {OC.Files.FileInfo} fileInfo file info
@@ -1365,8 +1421,9 @@
* @param sort sort attribute name
* @param direction sort direction, one of "asc" or "desc"
* @param update true to update the list, false otherwise (default)
+ * @param persist true to save changes in the database (default)
*/
- setSort: function(sort, direction, update) {
+ setSort: function(sort, direction, update, persist) {
var comparator = FileList.Comparators[sort] || FileList.Comparators.name;
this._sort = sort;
this._sortDirection = (direction === 'desc')?'desc':'asc';
@@ -1397,6 +1454,13 @@
this.reload();
}
}
+
+ if (persist) {
+ $.post(OC.generateUrl('/apps/files/api/v1/sorting'), {
+ mode: sort,
+ direction: direction
+ });
+ }
},
/**
@@ -2532,7 +2596,7 @@
// fetch response from iframe
response = data.result[0].body.innerText;
}
- var result=$.parseJSON(response);
+ var result = JSON.parse(response);
if (typeof result[0] !== 'undefined' && result[0].status === 'success') {
var file = result[0];
@@ -2845,7 +2909,7 @@ $(document).ready(function() {
OCA.Files.FileList.lastAction();
}
});
- $(window).unload(function () {
+ $(window).on('unload', function () {
$(window).trigger('beforeunload');
});
diff --git a/apps/files/js/jquery.iframe-transport.js b/apps/files/js/jquery.iframe-transport.js
deleted file mode 100644
index 5c9df77976b..00000000000
--- a/apps/files/js/jquery.iframe-transport.js
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * jQuery Iframe Transport Plugin 1.7
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2011, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*jslint unparam: true, nomen: true */
-/*global define, window, document */
-
-(function (factory) {
- 'use strict';
- if (typeof define === 'function' && define.amd) {
- // Register as an anonymous AMD module:
- define(['jquery'], factory);
- } else {
- // Browser globals:
- factory(window.jQuery);
- }
-}(function ($) {
- 'use strict';
-
- // Helper variable to create unique names for the transport iframes:
- var counter = 0;
-
- // The iframe transport accepts three additional options:
- // options.fileInput: a jQuery collection of file input fields
- // options.paramName: the parameter name for the file form data,
- // overrides the name property of the file input field(s),
- // can be a string or an array of strings.
- // options.formData: an array of objects with name and value properties,
- // equivalent to the return data of .serializeArray(), e.g.:
- // [{name: 'a', value: 1}, {name: 'b', value: 2}]
- $.ajaxTransport('iframe', function (options) {
- if (options.async) {
- var form,
- iframe,
- addParamChar;
- return {
- send: function (_, completeCallback) {
- form = $('<form style="display:none;"></form>');
- form.attr('accept-charset', options.formAcceptCharset);
- addParamChar = /\?/.test(options.url) ? '&' : '?';
- // XDomainRequest only supports GET and POST:
- if (options.type === 'DELETE') {
- options.url = options.url + addParamChar + '_method=DELETE';
- options.type = 'POST';
- } else if (options.type === 'PUT') {
- options.url = options.url + addParamChar + '_method=PUT';
- options.type = 'POST';
- } else if (options.type === 'PATCH') {
- options.url = options.url + addParamChar + '_method=PATCH';
- options.type = 'POST';
- }
- // javascript:false as initial iframe src
- // prevents warning popups on HTTPS in IE6.
- // IE versions below IE8 cannot set the name property of
- // elements that have already been added to the DOM,
- // so we set the name along with the iframe HTML markup:
- counter += 1;
- iframe = $(
- '<iframe src="javascript:false;" name="iframe-transport-' +
- counter + '"></iframe>'
- ).bind('load', function () {
- var fileInputClones,
- paramNames = $.isArray(options.paramName) ?
- options.paramName : [options.paramName];
- iframe
- .unbind('load')
- .bind('load', function () {
- var response;
- // Wrap in a try/catch block to catch exceptions thrown
- // when trying to access cross-domain iframe contents:
- try {
- response = iframe.contents();
- // Google Chrome and Firefox do not throw an
- // exception when calling iframe.contents() on
- // cross-domain requests, so we unify the response:
- if (!response.length || !response[0].firstChild) {
- throw new Error();
- }
- } catch (e) {
- response = undefined;
- }
- // The complete callback returns the
- // iframe content document as response object:
- completeCallback(
- 200,
- 'success',
- {'iframe': response}
- );
- // Fix for IE endless progress bar activity bug
- // (happens on form submits to iframe targets):
- $('<iframe src="javascript:false;"></iframe>')
- .appendTo(form);
- window.setTimeout(function () {
- // Removing the form in a setTimeout call
- // allows Chrome's developer tools to display
- // the response result
- form.remove();
- }, 0);
- });
- form
- .prop('target', iframe.prop('name'))
- .prop('action', options.url)
- .prop('method', options.type);
- if (options.formData) {
- $.each(options.formData, function (index, field) {
- $('<input type="hidden"/>')
- .prop('name', field.name)
- .val(field.value)
- .appendTo(form);
- });
- }
- if (options.fileInput && options.fileInput.length &&
- options.type === 'POST') {
- fileInputClones = options.fileInput.clone();
- // Insert a clone for each file input field:
- options.fileInput.after(function (index) {
- return fileInputClones[index];
- });
- if (options.paramName) {
- options.fileInput.each(function (index) {
- $(this).prop(
- 'name',
- paramNames[index] || options.paramName
- );
- });
- }
- // Appending the file input fields to the hidden form
- // removes them from their original location:
- form
- .append(options.fileInput)
- .prop('enctype', 'multipart/form-data')
- // enctype must be set as encoding for IE:
- .prop('encoding', 'multipart/form-data');
- }
- form.submit();
- // Insert the file input fields at their original location
- // by replacing the clones with the originals:
- if (fileInputClones && fileInputClones.length) {
- options.fileInput.each(function (index, input) {
- var clone = $(fileInputClones[index]);
- $(input).prop('name', clone.prop('name'));
- clone.replaceWith(input);
- });
- }
- });
- form.append(iframe).appendTo(document.body);
- },
- abort: function () {
- if (iframe) {
- // javascript:false as iframe src aborts the request
- // and prevents warning popups on HTTPS in IE6.
- // concat is used to avoid the "Script URL" JSLint error:
- iframe
- .unbind('load')
- .prop('src', 'javascript'.concat(':false;'));
- }
- if (form) {
- form.remove();
- }
- }
- };
- }
- });
-
- // The iframe transport returns the iframe content document as response.
- // The following adds converters from iframe to text, json, html, xml
- // and script.
- // Please note that the Content-Type for JSON responses has to be text/plain
- // or text/html, if the browser doesn't include application/json in the
- // Accept header, else IE will show a download dialog.
- // The Content-Type for XML responses on the other hand has to be always
- // application/xml or text/xml, so IE properly parses the XML response.
- // See also
- // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
- $.ajaxSetup({
- converters: {
- 'iframe text': function (iframe) {
- return iframe && $(iframe[0].body).text();
- },
- 'iframe json': function (iframe) {
- return iframe && $.parseJSON($(iframe[0].body).text());
- },
- 'iframe html': function (iframe) {
- return iframe && $(iframe[0].body).html();
- },
- 'iframe xml': function (iframe) {
- var xmlDoc = iframe && iframe[0];
- return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
- $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
- $(xmlDoc.body).html());
- },
- 'iframe script': function (iframe) {
- return iframe && $.globalEval($(iframe[0].body).text());
- }
- }
- });
-
-})); \ No newline at end of file
diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js
index 453e2b8fc58..7301549e63a 100644
--- a/apps/files/l10n/cs_CZ.js
+++ b/apps/files/l10n/cs_CZ.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Při použití PHP-FPM může změna nastavení trvat až 5 minut od uložení.",
"Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.",
"Settings" : "Nastavení",
+ "Show hidden files" : "Zobrazit skryté soubory",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">přístup ke svým Souborům přes WebDAV</a>",
"Cancel upload" : "Zrušit odesílání",
diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json
index 6e6bcfbe23d..9423db1ca09 100644
--- a/apps/files/l10n/cs_CZ.json
+++ b/apps/files/l10n/cs_CZ.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Při použití PHP-FPM může změna nastavení trvat až 5 minut od uložení.",
"Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.",
"Settings" : "Nastavení",
+ "Show hidden files" : "Zobrazit skryté soubory",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">přístup ke svým Souborům přes WebDAV</a>",
"Cancel upload" : "Zrušit odesílání",
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index 40c9d78ba2a..1d3c8ed51e7 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.",
"Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Deine Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 4f471d3a09b..2b0ddc64950 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.",
"Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutze diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Deine Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
diff --git a/apps/files/l10n/de_AT.js b/apps/files/l10n/de_AT.js
index 783ff4aaa6b..9100dc4d820 100644
--- a/apps/files/l10n/de_AT.js
+++ b/apps/files/l10n/de_AT.js
@@ -4,9 +4,11 @@ OC.L10N.register(
"Unknown error" : "Unbekannter Fehler",
"Files" : "Dateien",
"Download" : "Herunterladen",
+ "Rename" : "Umbenennen",
"Delete" : "Löschen",
"Unshare" : "Teilung zurücknehmen",
"Details" : "Details",
+ "Name" : "Name",
"New folder" : "Neuer Ordner",
"Upload" : "Hochladen",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
diff --git a/apps/files/l10n/de_AT.json b/apps/files/l10n/de_AT.json
index 2d54751bdf6..cfbffca2b31 100644
--- a/apps/files/l10n/de_AT.json
+++ b/apps/files/l10n/de_AT.json
@@ -2,9 +2,11 @@
"Unknown error" : "Unbekannter Fehler",
"Files" : "Dateien",
"Download" : "Herunterladen",
+ "Rename" : "Umbenennen",
"Delete" : "Löschen",
"Unshare" : "Teilung zurücknehmen",
"Details" : "Details",
+ "Name" : "Name",
"New folder" : "Neuer Ordner",
"Upload" : "Hochladen",
"A new file or folder has been <strong>created</strong>" : "Eine neue Datei oder ein neuer Ordner wurde <strong>erstellt</strong>",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index d9543f39893..3c3c732c885 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Bei PHP-FPM kann es 5 Minuten dauern, bis Änderungen angewendet sind.",
"Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 1dc7f9989ad..f9ad749b41e 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Bei PHP-FPM kann es 5 Minuten dauern, bis Änderungen angewendet sind.",
"Missing permissions to edit from here." : "Fehlende Berechtigungen um von hier aus zu bearbeiten.",
"Settings" : "Einstellungen",
+ "Show hidden files" : "Versteckte Dateien anzeigen",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benutzen Sie diese Adresse, um <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">über WebDAV auf Ihre Dateien zuzugreifen</a>",
"Cancel upload" : "Upload abbrechen",
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index c9fd96ea507..a15c67400b7 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -106,6 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Missing permissions to edit from here.",
"Settings" : "Settings",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>",
"Cancel upload" : "Cancel upload",
"No files in here" : "No files in here",
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index 172f49cfc38..46a71fdf049 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -104,6 +104,7 @@
"Missing permissions to edit from here." : "Missing permissions to edit from here.",
"Settings" : "Settings",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>",
"Cancel upload" : "Cancel upload",
"No files in here" : "No files in here",
"Upload some content or sync with your devices!" : "Upload some content or sync with your devices!",
diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js
index 7294495787f..e5ad89cf0fc 100644
--- a/apps/files/l10n/fi_FI.js
+++ b/apps/files/l10n/fi_FI.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM:tä käyttäen muutoksien voimaantulossa saattaa kestää 5 minuuttia.",
"Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.",
"Settings" : "Asetukset",
+ "Show hidden files" : "Näytä piilotetut tiedostot",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">päästäksesi tiedostoihisi WebDAV-liittymän kautta</a>",
"Cancel upload" : "Peru lähetys",
diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json
index 429845bb4ac..6f75e570c00 100644
--- a/apps/files/l10n/fi_FI.json
+++ b/apps/files/l10n/fi_FI.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM:tä käyttäen muutoksien voimaantulossa saattaa kestää 5 minuuttia.",
"Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.",
"Settings" : "Asetukset",
+ "Show hidden files" : "Näytä piilotetut tiedostot",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">päästäksesi tiedostoihisi WebDAV-liittymän kautta</a>",
"Cancel upload" : "Peru lähetys",
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 12497c4dbe1..4edc931ca25 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Avec PHP-FPM il peut se passer jusqu'à 5 minutes pour que les changements soient appliqués.",
"Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.",
"Settings" : "Paramètres",
+ "Show hidden files" : "Afficher les fichiers cachés",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accéder à vos fichiers par WebDAV</a>",
"Cancel upload" : "Annuler l'envoi",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 679d170b2ad..f80275841ac 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Avec PHP-FPM il peut se passer jusqu'à 5 minutes pour que les changements soient appliqués.",
"Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.",
"Settings" : "Paramètres",
+ "Show hidden files" : "Afficher les fichiers cachés",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accéder à vos fichiers par WebDAV</a>",
"Cancel upload" : "Annuler l'envoi",
diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js
index 96f599c87c5..181bac52a09 100644
--- a/apps/files/l10n/hu_HU.js
+++ b/apps/files/l10n/hu_HU.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM-mel akár 5 percbe is telhet, míg ez a beállítás érvénybe lép.",
"Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.",
"Settings" : "Beállítások",
+ "Show hidden files" : "Rejtett fájlok megjelenítése",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Használja ezt a címet <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">a Fájlok eléréséhez WebDAV-on keresztül</a>.",
"Cancel upload" : "A feltöltés megszakítása",
diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json
index 442d883d234..35e4546923b 100644
--- a/apps/files/l10n/hu_HU.json
+++ b/apps/files/l10n/hu_HU.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM-mel akár 5 percbe is telhet, míg ez a beállítás érvénybe lép.",
"Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.",
"Settings" : "Beállítások",
+ "Show hidden files" : "Rejtett fájlok megjelenítése",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Használja ezt a címet <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">a Fájlok eléréséhez WebDAV-on keresztül</a>.",
"Cancel upload" : "A feltöltés megszakítása",
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index 8041a8c2d72..b05e602e4ae 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM potrebbe richiedere 5 minuti perché le modifiche siano applicate.",
"Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.",
"Settings" : "Impostazioni",
+ "Show hidden files" : "Mostra i file nascosti",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accedere ai tuoi file con WebDAV</a>",
"Cancel upload" : "Annulla caricamento",
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index 473433f853a..24e0cc02db0 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM potrebbe richiedere 5 minuti perché le modifiche siano applicate.",
"Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.",
"Settings" : "Impostazioni",
+ "Show hidden files" : "Mostra i file nascosti",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">accedere ai tuoi file con WebDAV</a>",
"Cancel upload" : "Annulla caricamento",
diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js
index b1b83d36c29..086ed3bc144 100644
--- a/apps/files/l10n/nb_NO.js
+++ b/apps/files/l10n/nb_NO.js
@@ -106,6 +106,7 @@ OC.L10N.register(
"Missing permissions to edit from here." : "Manglende rettigheter til å redigere herfra.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Bruk adressen <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">for å få tilgang til WebDAV</a>",
"Cancel upload" : "Avbryt opplasting",
"No files in here" : "Ingen filer her",
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json
index fc0958dce74..0f034867f51 100644
--- a/apps/files/l10n/nb_NO.json
+++ b/apps/files/l10n/nb_NO.json
@@ -104,6 +104,7 @@
"Missing permissions to edit from here." : "Manglende rettigheter til å redigere herfra.",
"Settings" : "Innstillinger",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Bruk adressen <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">for å få tilgang til WebDAV</a>",
"Cancel upload" : "Avbryt opplasting",
"No files in here" : "Ingen filer her",
"Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!",
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index 45f435806bc..1985179f72e 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -104,6 +104,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Met PHP-FPM kan het 5 minuten duren voordat wijzigingen zijn doorgevoerd.",
"Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.",
"Settings" : "Instellingen",
+ "Show hidden files" : "Tonen verborgen bestanden",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">om uw bestanden via WebDAV te benaderen</a>",
"Cancel upload" : "Upload afbreken",
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index 1c0990e3394..0e441ea88aa 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -102,6 +102,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Met PHP-FPM kan het 5 minuten duren voordat wijzigingen zijn doorgevoerd.",
"Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.",
"Settings" : "Instellingen",
+ "Show hidden files" : "Tonen verborgen bestanden",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">om uw bestanden via WebDAV te benaderen</a>",
"Cancel upload" : "Upload afbreken",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index fa05c516166..bf9b5208388 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.",
"Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.",
"Settings" : "Configurações",
+ "Show hidden files" : "Mostrar arquivos escondidos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">para acessar seus Arquivos via WebDAV</a>",
"Cancel upload" : "Cancelar envio",
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index eb2426495eb..873f1133869 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.",
"Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.",
"Settings" : "Configurações",
+ "Show hidden files" : "Mostrar arquivos escondidos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">para acessar seus Arquivos via WebDAV</a>",
"Cancel upload" : "Cancelar envio",
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index ae1f1a8d11d..ed4819046a2 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Com o PHP-FPM pode demorar 5 minutos até que as alterações sejam aplicadas.",
"Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.",
"Settings" : "Definições",
+ "Show hidden files" : "Mostrar ficheiros ocultos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">aceder aos seus ficheiros via WebDAV</a>",
"Cancel upload" : "Cancelar o envio",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 345840ffa39..c2104a25703 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Com o PHP-FPM pode demorar 5 minutos até que as alterações sejam aplicadas.",
"Missing permissions to edit from here." : "Faltam permissões para editar a partir daqui.",
"Settings" : "Definições",
+ "Show hidden files" : "Mostrar ficheiros ocultos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">aceder aos seus ficheiros via WebDAV</a>",
"Cancel upload" : "Cancelar o envio",
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index be0457c9b9a..b9f19666fa0 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Uveljavljanje sprememb prek PHP-FPM lahko traja tudi 5 minut.",
"Missing permissions to edit from here." : "Ni ustreznih dovoljenj za urejanje na tej ravni.",
"Settings" : "Nastavitve",
+ "Show hidden files" : "Pokaži skrite datoteke",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> za dostop do datotek prek sistema WebDAV</a>.",
"Cancel upload" : "Prekliči pošiljanje",
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index 4f2cf82b46b..ce674108901 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Uveljavljanje sprememb prek PHP-FPM lahko traja tudi 5 minut.",
"Missing permissions to edit from here." : "Ni ustreznih dovoljenj za urejanje na tej ravni.",
"Settings" : "Nastavitve",
+ "Show hidden files" : "Pokaži skrite datoteke",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> za dostop do datotek prek sistema WebDAV</a>.",
"Cancel upload" : "Prekliči pošiljanje",
diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js
index d1c07c62025..7ef830e631b 100644
--- a/apps/files/l10n/sq.js
+++ b/apps/files/l10n/sq.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Me PHP-FPM mund të duhen 5 minuta që ndryshimet të hyjnë në fuqi.",
"Missing permissions to edit from here." : "Mungojnë lejet për përpunim që nga këtu.",
"Settings" : "Rregullime",
+ "Show hidden files" : "Shfaq kartela të fshehura",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
"Cancel upload" : "Anuloje ngarkimin",
diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json
index 40e8a3bb4ac..9b14554309e 100644
--- a/apps/files/l10n/sq.json
+++ b/apps/files/l10n/sq.json
@@ -103,6 +103,7 @@
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Me PHP-FPM mund të duhen 5 minuta që ndryshimet të hyjnë në fuqi.",
"Missing permissions to edit from here." : "Mungojnë lejet për përpunim që nga këtu.",
"Settings" : "Rregullime",
+ "Show hidden files" : "Shfaq kartela të fshehura",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">të hyrë te Kartelat tuaja përmes WebDAV-it</a>",
"Cancel upload" : "Anuloje ngarkimin",
diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js
index ba1871f1682..25b1009dfd5 100644
--- a/apps/files/l10n/th_TH.js
+++ b/apps/files/l10n/th_TH.js
@@ -28,6 +28,7 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัพโหลด {filename} มันเป็นไดเรกทอรีหรือมี 0 ไบต์",
"Total file size {size1} exceeds upload limit {size2}" : "ขนาดไฟล์ {size1} ทั้งหมดเกินขีดจำกัด ของการอัพโหลด {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "พื้นที่ว่างไม่เพียงพอคุณจะอัพโหลด {size1} แต่มีพืนที่แค่ {size2}",
+ "Error uploading file \"{fileName}\": {message}" : "ข้อผิดพลาดขณะอัพโหลดไฟล์ \"{fileName}\": {message}",
"Could not get result from server." : "ไม่สามารถรับผลลัพธ์จากเซิร์ฟเวอร์",
"File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"Actions" : "การกระทำ",
diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json
index 73d88b544c9..c0ccef03542 100644
--- a/apps/files/l10n/th_TH.json
+++ b/apps/files/l10n/th_TH.json
@@ -26,6 +26,7 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัพโหลด {filename} มันเป็นไดเรกทอรีหรือมี 0 ไบต์",
"Total file size {size1} exceeds upload limit {size2}" : "ขนาดไฟล์ {size1} ทั้งหมดเกินขีดจำกัด ของการอัพโหลด {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "พื้นที่ว่างไม่เพียงพอคุณจะอัพโหลด {size1} แต่มีพืนที่แค่ {size2}",
+ "Error uploading file \"{fileName}\": {message}" : "ข้อผิดพลาดขณะอัพโหลดไฟล์ \"{fileName}\": {message}",
"Could not get result from server." : "ไม่สามารถรับผลลัพธ์จากเซิร์ฟเวอร์",
"File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก",
"Actions" : "การกระทำ",
diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php
index 39a5875f3d0..9c79f806713 100644
--- a/apps/files/templates/appnavigation.php
+++ b/apps/files/templates/appnavigation.php
@@ -16,9 +16,13 @@
</button>
</div>
<div id="app-settings-content">
- <label for="webdavurl"><?php p($l->t('WebDAV'));?></label>
- <input id="webdavurl" type="text" readonly="readonly" value="<?php p(\OCP\Util::linkToRemote('webdav')); ?>" />
- <em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank" rel="noreferrer">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em>
+ <div id="files-setting-showhidden">
+ <input class="checkbox" id="showhiddenfilesToggle" checked="checked" type="checkbox">
+ <label for="showhiddenfilesToggle"><?php p($l->t('Show hidden files')); ?></label>
+ </div>
+ <label for="webdavurl"><?php p($l->t('WebDAV'));?></label>
+ <input id="webdavurl" type="text" readonly="readonly" value="<?php p(\OCP\Util::linkToRemote('webdav')); ?>" />
+ <em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank" rel="noreferrer">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em>
</div>
</div>
</div>
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index e825c300d31..7281edd3aec 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -18,4 +18,7 @@
<input type="hidden" name="mailNotificationEnabled" id="mailNotificationEnabled" value="<?php p($_['mailNotificationEnabled']) ?>" />
<input type="hidden" name="mailPublicNotificationEnabled" id="mailPublicNotificationEnabled" value="<?php p($_['mailPublicNotificationEnabled']) ?>" />
<input type="hidden" name="allowShareWithLink" id="allowShareWithLink" value="<?php p($_['allowShareWithLink']) ?>" />
+<input type="hidden" name="defaultFileSorting" id="defaultFileSorting" value="<?php p($_['defaultFileSorting']) ?>" />
+<input type="hidden" name="defaultFileSortingDirection" id="defaultFileSortingDirection" value="<?php p($_['defaultFileSortingDirection']) ?>" />
+<input type="hidden" name="showHiddenFiles" id="showHiddenFiles" value="<?php p($_['showHiddenFiles']); ?>" />
<?php endif;
diff --git a/apps/files/tests/controller/ViewControllerTest.php b/apps/files/tests/controller/ViewControllerTest.php
index 657ab6cb338..420e635b4b9 100644
--- a/apps/files/tests/controller/ViewControllerTest.php
+++ b/apps/files/tests/controller/ViewControllerTest.php
@@ -1,5 +1,6 @@
<?php
/**
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Joas Schilling <nickvergessen@owncloud.com>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Vincent Petry <pvince81@owncloud.com>
@@ -33,6 +34,7 @@ use OCP\AppFramework\Http\RedirectResponse;
use OCP\INavigationManager;
use OCP\IL10N;
use OCP\IConfig;
+use OCP\IUserSession;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
@@ -55,6 +57,10 @@ class ViewControllerTest extends TestCase {
private $eventDispatcher;
/** @var ViewController */
private $viewController;
+ /** @var IUser */
+ private $user;
+ /** @var IUserSession */
+ private $userSession;
public function setUp() {
parent::setUp();
@@ -64,6 +70,11 @@ class ViewControllerTest extends TestCase {
$this->l10n = $this->getMock('\OCP\IL10N');
$this->config = $this->getMock('\OCP\IConfig');
$this->eventDispatcher = $this->getMock('\Symfony\Component\EventDispatcher\EventDispatcherInterface');
+ $this->userSession = $this->getMock('\OCP\IUserSession');
+ $this->user = $this->getMock('\OCP\IUser');
+ $this->userSession->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($this->user));
$this->viewController = $this->getMockBuilder('\OCA\Files\Controller\ViewController')
->setConstructorArgs([
'files',
@@ -72,7 +83,8 @@ class ViewControllerTest extends TestCase {
$this->navigationManager,
$this->l10n,
$this->config,
- $this->eventDispatcher
+ $this->eventDispatcher,
+ $this->userSession
])
->setMethods([
'getStorageInfo',
@@ -143,6 +155,13 @@ class ViewControllerTest extends TestCase {
'owner' => 'MyName',
'ownerDisplayName' => 'MyDisplayName',
]));
+ $this->config->expects($this->exactly(3))
+ ->method('getUserValue')
+ ->will($this->returnValueMap([
+ [$this->user->getUID(), 'files', 'file_sorting', 'name', 'name'],
+ [$this->user->getUID(), 'files', 'file_sorting_direction', 'asc', 'asc'],
+ [$this->user->getUID(), 'files', 'show_hidden', false, false],
+ ]));
$this->config
->expects($this->any())
@@ -224,6 +243,9 @@ class ViewControllerTest extends TestCase {
'owner' => 'MyName',
'ownerDisplayName' => 'MyDisplayName',
'isPublic' => false,
+ 'defaultFileSorting' => 'name',
+ 'defaultFileSortingDirection' => 'asc',
+ 'showHiddenFiles' => false,
'mailNotificationEnabled' => 'no',
'mailPublicNotificationEnabled' => 'no',
'allowShareWithLink' => 'yes',
diff --git a/apps/files/tests/controller/apicontrollertest.php b/apps/files/tests/controller/apicontrollertest.php
index a9b248a36fe..2eba7d62feb 100644
--- a/apps/files/tests/controller/apicontrollertest.php
+++ b/apps/files/tests/controller/apicontrollertest.php
@@ -1,5 +1,7 @@
<?php
+
/**
+ * @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Lukas Reschke <lukas@owncloud.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <rullzer@owncloud.com>
@@ -43,6 +45,8 @@ use OCP\Image;
class ApiControllerTest extends TestCase {
/** @var string */
private $appName = 'files';
+ /** @var \OCP\IUser */
+ private $user;
/** @var IRequest */
private $request;
/** @var TagService */
@@ -53,19 +57,21 @@ class ApiControllerTest extends TestCase {
private $apiController;
/** @var \OCP\Share\IManager */
private $shareManager;
+ /** @var \OCP\IConfig */
+ private $config;
public function setUp() {
$this->request = $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor()
->getMock();
- $user = $this->getMock('\OCP\IUser');
- $user->expects($this->any())
+ $this->user = $this->getMock('\OCP\IUser');
+ $this->user->expects($this->any())
->method('getUID')
->will($this->returnValue('user1'));
$userSession = $this->getMock('\OCP\IUserSession');
$userSession->expects($this->any())
->method('getUser')
- ->will($this->returnValue($user));
+ ->will($this->returnValue($this->user));
$this->tagService = $this->getMockBuilder('\OCA\Files\Service\TagService')
->disableOriginalConstructor()
->getMock();
@@ -75,6 +81,7 @@ class ApiControllerTest extends TestCase {
$this->preview = $this->getMockBuilder('\OCP\IPreview')
->disableOriginalConstructor()
->getMock();
+ $this->config = $this->getMock('\OCP\IConfig');
$this->apiController = new ApiController(
$this->appName,
@@ -82,7 +89,8 @@ class ApiControllerTest extends TestCase {
$userSession,
$this->tagService,
$this->preview,
- $this->shareManager
+ $this->shareManager,
+ $this->config
);
}
@@ -335,4 +343,57 @@ class ApiControllerTest extends TestCase {
$this->assertEquals(Http::STATUS_OK, $ret->getStatus());
}
+
+ public function testUpdateFileSorting() {
+ $mode = 'mtime';
+ $direction = 'desc';
+
+ $this->config->expects($this->at(0))
+ ->method('setUserValue')
+ ->with($this->user->getUID(), 'files', 'file_sorting', $mode);
+ $this->config->expects($this->at(1))
+ ->method('setUserValue')
+ ->with($this->user->getUID(), 'files', 'file_sorting_direction', $direction);
+
+ $expected = new HTTP\Response();
+ $actual = $this->apiController->updateFileSorting($mode, $direction);
+ $this->assertEquals($expected, $actual);
+ }
+
+ public function invalidSortingModeData() {
+ return [
+ ['color', 'asc'],
+ ['name', 'size'],
+ ['foo', 'bar']
+ ];
+ }
+
+ /**
+ * @dataProvider invalidSortingModeData
+ */
+ public function testUpdateInvalidFileSorting($mode, $direction) {
+ $this->config->expects($this->never())
+ ->method('setUserValue');
+
+ $expected = new Http\Response(null);
+ $expected->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY);
+
+ $result = $this->apiController->updateFileSorting($mode, $direction);
+
+ $this->assertEquals($expected, $result);
+ }
+
+ public function testShowHiddenFiles() {
+ $show = false;
+
+ $this->config->expects($this->once())
+ ->method('setUserValue')
+ ->with($this->user->getUID(), 'files', 'show_hidden', $show);
+
+ $expected = new Http\Response();
+ $actual = $this->apiController->showHiddenFiles($show);
+
+ $this->assertEquals($expected, $actual);
+ }
+
}
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index a83c8c4c0bc..cc3bcd74b46 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -2106,6 +2106,8 @@ describe('OCA.Files.FileList tests', function() {
it('Toggles the sort indicator when clicking on a column header', function() {
var ASC_CLASS = fileList.SORT_INDICATOR_ASC_CLASS;
var DESC_CLASS = fileList.SORT_INDICATOR_DESC_CLASS;
+ var request;
+ var sortingUrl = OC.generateUrl('/apps/files/api/v1/sorting');
fileList.$el.find('.column-size .columntitle').click();
// moves triangle to size column, check indicator on name is hidden
expect(
@@ -2118,6 +2120,10 @@ describe('OCA.Files.FileList tests', function() {
expect(
fileList.$el.find('.column-size .sort-indicator').hasClass(DESC_CLASS)
).toEqual(true);
+ // check if changes are persisted
+ expect(fakeServer.requests.length).toEqual(1);
+ request = fakeServer.requests[0];
+ expect(request.url).toEqual(sortingUrl);
// click again on size column, reverses direction
fileList.$el.find('.column-size .columntitle').click();
@@ -2127,6 +2133,10 @@ describe('OCA.Files.FileList tests', function() {
expect(
fileList.$el.find('.column-size .sort-indicator').hasClass(ASC_CLASS)
).toEqual(true);
+ // check if changes are persisted
+ expect(fakeServer.requests.length).toEqual(2);
+ request = fakeServer.requests[1];
+ expect(request.url).toEqual(sortingUrl);
// click again on size column, reverses direction
fileList.$el.find('.column-size .columntitle').click();
@@ -2136,6 +2146,9 @@ describe('OCA.Files.FileList tests', function() {
expect(
fileList.$el.find('.column-size .sort-indicator').hasClass(DESC_CLASS)
).toEqual(true);
+ expect(fakeServer.requests.length).toEqual(3);
+ request = fakeServer.requests[2];
+ expect(request.url).toEqual(sortingUrl);
// click on mtime column, moves indicator there
fileList.$el.find('.column-mtime .columntitle').click();
@@ -2148,6 +2161,9 @@ describe('OCA.Files.FileList tests', function() {
expect(
fileList.$el.find('.column-mtime .sort-indicator').hasClass(DESC_CLASS)
).toEqual(true);
+ expect(fakeServer.requests.length).toEqual(4);
+ request = fakeServer.requests[3];
+ expect(request.url).toEqual(sortingUrl);
});
it('Uses correct sort comparator when inserting files', function() {
testFiles.sort(OCA.Files.FileList.Comparators.size);
diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php
index 46a4ecf0793..18f8b2551fa 100644
--- a/apps/files_external/appinfo/app.php
+++ b/apps/files_external/appinfo/app.php
@@ -26,17 +26,7 @@
*
*/
-OC::$CLASSPATH['OC\Files\Storage\StreamWrapper'] = 'files_external/lib/streamwrapper.php';
-OC::$CLASSPATH['OC\Files\Storage\FTP'] = 'files_external/lib/ftp.php';
-OC::$CLASSPATH['OC\Files\Storage\OwnCloud'] = 'files_external/lib/owncloud.php';
-OC::$CLASSPATH['OC\Files\Storage\Google'] = 'files_external/lib/google.php';
-OC::$CLASSPATH['OC\Files\Storage\Swift'] = 'files_external/lib/swift.php';
-OC::$CLASSPATH['OC\Files\Storage\SMB'] = 'files_external/lib/smb.php';
-OC::$CLASSPATH['OC\Files\Storage\AmazonS3'] = 'files_external/lib/amazons3.php';
-OC::$CLASSPATH['OC\Files\Storage\Dropbox'] = 'files_external/lib/dropbox.php';
-OC::$CLASSPATH['OC\Files\Storage\SFTP'] = 'files_external/lib/sftp.php';
OC::$CLASSPATH['OC_Mount_Config'] = 'files_external/lib/config.php';
-OC::$CLASSPATH['OCA\Files\External\Api'] = 'files_external/lib/api.php';
require_once __DIR__ . '/../3rdparty/autoload.php';
diff --git a/apps/files_external/appinfo/routes.php b/apps/files_external/appinfo/routes.php
index 2d2e6ddf607..e2f55e652a8 100644
--- a/apps/files_external/appinfo/routes.php
+++ b/apps/files_external/appinfo/routes.php
@@ -61,6 +61,6 @@ $this->create('files_external_list_applicable', '/applicable')
\OCP\API::register('get',
'/apps/files_external/api/v1/mounts',
- array('\OCA\Files\External\Api', 'getUserMounts'),
+ array('\OCA\Files_External\Lib\Api', 'getUserMounts'),
'files_external');
diff --git a/apps/files_external/l10n/de_AT.js b/apps/files_external/l10n/de_AT.js
index 417e514c605..e151ec8ad1b 100644
--- a/apps/files_external/l10n/de_AT.js
+++ b/apps/files_external/l10n/de_AT.js
@@ -9,6 +9,7 @@ OC.L10N.register(
"Host" : "Host",
"Location" : "Ort",
"Share" : "Freigeben",
+ "Name" : "Name",
"Folder name" : "Ordner Name",
"Delete" : "Löschen"
},
diff --git a/apps/files_external/l10n/de_AT.json b/apps/files_external/l10n/de_AT.json
index 6367f7d3b09..53a670e106d 100644
--- a/apps/files_external/l10n/de_AT.json
+++ b/apps/files_external/l10n/de_AT.json
@@ -7,6 +7,7 @@
"Host" : "Host",
"Location" : "Ort",
"Share" : "Freigeben",
+ "Name" : "Name",
"Folder name" : "Ordner Name",
"Delete" : "Löschen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/oc.js b/apps/files_external/l10n/oc.js
index dccf32455ad..40c222e0cf3 100644
--- a/apps/files_external/l10n/oc.js
+++ b/apps/files_external/l10n/oc.js
@@ -17,6 +17,7 @@ OC.L10N.register(
"Unsatisfied backend parameters" : "Paramètres mancants pel servici",
"Unsatisfied authentication mechanism parameters" : "Paramètres mancants pel metòde d'autentificacion",
"Insufficient data: %s" : "Donadas insufisentas : %s",
+ "%s" : "%s",
"Personal" : "Personal",
"System" : "Sistèma",
"Grant access" : "Autorizar l'accès",
diff --git a/apps/files_external/l10n/oc.json b/apps/files_external/l10n/oc.json
index 28099bbae13..06992b89604 100644
--- a/apps/files_external/l10n/oc.json
+++ b/apps/files_external/l10n/oc.json
@@ -15,6 +15,7 @@
"Unsatisfied backend parameters" : "Paramètres mancants pel servici",
"Unsatisfied authentication mechanism parameters" : "Paramètres mancants pel metòde d'autentificacion",
"Insufficient data: %s" : "Donadas insufisentas : %s",
+ "%s" : "%s",
"Personal" : "Personal",
"System" : "Sistèma",
"Grant access" : "Autorizar l'accès",
diff --git a/apps/files_external/l10n/sl.js b/apps/files_external/l10n/sl.js
index 454f142f2f1..8ce2cd450f6 100644
--- a/apps/files_external/l10n/sl.js
+++ b/apps/files_external/l10n/sl.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"Storage with id \"%i\" not found" : "Shrambe z ID \"%i\" ni mogoče najti.",
"Invalid backend or authentication mechanism class" : "Neveljaven ozadnji program oziroma razred mehanizma overitve",
"Invalid mount point" : "Neveljavna priklopna točka",
+ "Objectstore forbidden" : "Shranjevanje predmeta je prepovedano",
"Invalid storage backend \"%s\"" : "Neveljaven ozadnji program shrambe \"%s\"",
"Not permitted to use backend \"%s\"" : "Uporaba ozadnjega programa \"%s\" ni dovoljena.",
"Not permitted to use authentication mechanism \"%s\"" : "Uporaba načina overitve \"%s\" ni dovoljena.",
@@ -30,6 +31,7 @@ OC.L10N.register(
"Admin defined" : "Skrbnik je določen",
"Saved" : "Shranjeno",
"Empty response from the server" : "S strežnika je prejet odziv brez vsebine.",
+ "Couldn't get the information from the ownCloud server: {code} {type}" : "Ni mogoče pridobiti podrobnosti s strežnika ownCloud:{koda} {vrsta}",
"Couldn't get the list of external mount points: {type}" : "Ni mogoče pridobiti seznama zunanjih priklopnih točk: {type}",
"There was an error with message: " : "Prišlo je do napake s sporočilom:",
"External mount error" : "Notranja napaka priklopa",
diff --git a/apps/files_external/l10n/sl.json b/apps/files_external/l10n/sl.json
index 05ec6314a71..753a401d536 100644
--- a/apps/files_external/l10n/sl.json
+++ b/apps/files_external/l10n/sl.json
@@ -8,6 +8,7 @@
"Storage with id \"%i\" not found" : "Shrambe z ID \"%i\" ni mogoče najti.",
"Invalid backend or authentication mechanism class" : "Neveljaven ozadnji program oziroma razred mehanizma overitve",
"Invalid mount point" : "Neveljavna priklopna točka",
+ "Objectstore forbidden" : "Shranjevanje predmeta je prepovedano",
"Invalid storage backend \"%s\"" : "Neveljaven ozadnji program shrambe \"%s\"",
"Not permitted to use backend \"%s\"" : "Uporaba ozadnjega programa \"%s\" ni dovoljena.",
"Not permitted to use authentication mechanism \"%s\"" : "Uporaba načina overitve \"%s\" ni dovoljena.",
@@ -28,6 +29,7 @@
"Admin defined" : "Skrbnik je določen",
"Saved" : "Shranjeno",
"Empty response from the server" : "S strežnika je prejet odziv brez vsebine.",
+ "Couldn't get the information from the ownCloud server: {code} {type}" : "Ni mogoče pridobiti podrobnosti s strežnika ownCloud:{koda} {vrsta}",
"Couldn't get the list of external mount points: {type}" : "Ni mogoče pridobiti seznama zunanjih priklopnih točk: {type}",
"There was an error with message: " : "Prišlo je do napake s sporočilom:",
"External mount error" : "Notranja napaka priklopa",
diff --git a/apps/files_external/l10n/th_TH.js b/apps/files_external/l10n/th_TH.js
index f3cb33e78d8..d2abf4eb427 100644
--- a/apps/files_external/l10n/th_TH.js
+++ b/apps/files_external/l10n/th_TH.js
@@ -37,10 +37,15 @@ OC.L10N.register(
"Couldn't get the list of external mount points: {type}" : "ไม่สามารถรับรายชื่อของจุดเชื่อมต่อภายนอก: {type}",
"There was an error with message: " : "มีข้อความแสดงข้อผิดพลาด",
"External mount error" : "การติดจากตั้งภายนอกเกิดข้อผิดพลาด",
+ "external-storage" : "ที่จัดเก็บข้อมูลภายนอก",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "ไม่สามารถรับรายชื่อไดรฟ์เครือข่ายของวินโดว์ส จุดที่ติดตั้ง: ไม่มีการตอบสนองจากเซิร์ฟเวอร์",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "การกำหนดค่าบางส่วนของจุดเชื่อมต่อภายนอกไม่ถูกเชื่อมต่อ กรุณาคลิกที่ตรงสีแดงสำหรับข้อมูลเพิ่มเติม",
+ "Please enter the credentials for the {mount} mount" : "กรุณากรอกข้อมูลประจำตัวสำหรับ {mount} ",
"Username" : "ชื่อผู้ใช้งาน",
"Password" : "รหัสผ่าน",
+ "Credentials saved" : "ข้อมูลประจำตัวได้ถูกบันทึก",
+ "Credentials saving failed" : "บันทึกข้อมูลประจำตัวล้มเหลว",
+ "Credentials required" : "จำเป็นต้องระบบข้อมูลประจำตัว",
"Save" : "บันทึก",
"Access key" : "คีย์การเข้าถึง",
"Secret key" : "คีย์ลับ",
@@ -70,7 +75,7 @@ OC.L10N.register(
"Enable Path Style" : "เปิดใช้งานสไตล์เส้นทาง",
"WebDAV" : "WebDAV",
"URL" : "URL",
- "Remote subfolder" : "โฟลเดอร์ย่อยระยะไกล",
+ "Remote subfolder" : "โฟลเดอร์ย่อยรีโมท",
"Secure https://" : "โหมดปลอดภัย https://",
"Dropbox" : "Dropbox",
"FTP" : "FTP",
diff --git a/apps/files_external/l10n/th_TH.json b/apps/files_external/l10n/th_TH.json
index 8b5d857449a..16035bfc6b5 100644
--- a/apps/files_external/l10n/th_TH.json
+++ b/apps/files_external/l10n/th_TH.json
@@ -35,10 +35,15 @@
"Couldn't get the list of external mount points: {type}" : "ไม่สามารถรับรายชื่อของจุดเชื่อมต่อภายนอก: {type}",
"There was an error with message: " : "มีข้อความแสดงข้อผิดพลาด",
"External mount error" : "การติดจากตั้งภายนอกเกิดข้อผิดพลาด",
+ "external-storage" : "ที่จัดเก็บข้อมูลภายนอก",
"Couldn't get the list of Windows network drive mount points: empty response from the server" : "ไม่สามารถรับรายชื่อไดรฟ์เครือข่ายของวินโดว์ส จุดที่ติดตั้ง: ไม่มีการตอบสนองจากเซิร์ฟเวอร์",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "การกำหนดค่าบางส่วนของจุดเชื่อมต่อภายนอกไม่ถูกเชื่อมต่อ กรุณาคลิกที่ตรงสีแดงสำหรับข้อมูลเพิ่มเติม",
+ "Please enter the credentials for the {mount} mount" : "กรุณากรอกข้อมูลประจำตัวสำหรับ {mount} ",
"Username" : "ชื่อผู้ใช้งาน",
"Password" : "รหัสผ่าน",
+ "Credentials saved" : "ข้อมูลประจำตัวได้ถูกบันทึก",
+ "Credentials saving failed" : "บันทึกข้อมูลประจำตัวล้มเหลว",
+ "Credentials required" : "จำเป็นต้องระบบข้อมูลประจำตัว",
"Save" : "บันทึก",
"Access key" : "คีย์การเข้าถึง",
"Secret key" : "คีย์ลับ",
@@ -68,7 +73,7 @@
"Enable Path Style" : "เปิดใช้งานสไตล์เส้นทาง",
"WebDAV" : "WebDAV",
"URL" : "URL",
- "Remote subfolder" : "โฟลเดอร์ย่อยระยะไกล",
+ "Remote subfolder" : "โฟลเดอร์ย่อยรีโมท",
"Secure https://" : "โหมดปลอดภัย https://",
"Dropbox" : "Dropbox",
"FTP" : "FTP",
diff --git a/apps/files_external/lib/api.php b/apps/files_external/lib/api.php
index 50a2f38c65b..589317dcf98 100644
--- a/apps/files_external/lib/api.php
+++ b/apps/files_external/lib/api.php
@@ -23,7 +23,7 @@
*
*/
-namespace OCA\Files\External;
+namespace OCA\Files_External\Lib;
class Api {
diff --git a/apps/files_external/lib/backend/amazons3.php b/apps/files_external/lib/backend/amazons3.php
index b2dedc10e4a..449b6c0379d 100644
--- a/apps/files_external/lib/backend/amazons3.php
+++ b/apps/files_external/lib/backend/amazons3.php
@@ -38,7 +38,7 @@ class AmazonS3 extends Backend {
$this
->setIdentifier('amazons3')
->addIdentifierAlias('\OC\Files\Storage\AmazonS3') // legacy compat
- ->setStorageClass('\OC\Files\Storage\AmazonS3')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\AmazonS3')
->setText($l->t('Amazon S3'))
->addParameters([
(new DefinitionParameter('bucket', $l->t('Bucket'))),
diff --git a/apps/files_external/lib/backend/dropbox.php b/apps/files_external/lib/backend/dropbox.php
index 7a414731192..f9156082515 100644
--- a/apps/files_external/lib/backend/dropbox.php
+++ b/apps/files_external/lib/backend/dropbox.php
@@ -38,7 +38,7 @@ class Dropbox extends Backend {
$this
->setIdentifier('dropbox')
->addIdentifierAlias('\OC\Files\Storage\Dropbox') // legacy compat
- ->setStorageClass('\OC\Files\Storage\Dropbox')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\Dropbox')
->setText($l->t('Dropbox'))
->addParameters([
// all parameters handled in OAuth1 mechanism
diff --git a/apps/files_external/lib/backend/ftp.php b/apps/files_external/lib/backend/ftp.php
index b2b83a27405..3960592d0bc 100644
--- a/apps/files_external/lib/backend/ftp.php
+++ b/apps/files_external/lib/backend/ftp.php
@@ -38,7 +38,7 @@ class FTP extends Backend {
$this
->setIdentifier('ftp')
->addIdentifierAlias('\OC\Files\Storage\FTP') // legacy compat
- ->setStorageClass('\OC\Files\Storage\FTP')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\FTP')
->setText($l->t('FTP'))
->addParameters([
(new DefinitionParameter('host', $l->t('Host'))),
diff --git a/apps/files_external/lib/backend/google.php b/apps/files_external/lib/backend/google.php
index 93a8cd2177d..b2b48a0e402 100644
--- a/apps/files_external/lib/backend/google.php
+++ b/apps/files_external/lib/backend/google.php
@@ -38,7 +38,7 @@ class Google extends Backend {
$this
->setIdentifier('googledrive')
->addIdentifierAlias('\OC\Files\Storage\Google') // legacy compat
- ->setStorageClass('\OC\Files\Storage\Google')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\Google')
->setText($l->t('Google Drive'))
->addParameters([
// all parameters handled in OAuth2 mechanism
diff --git a/apps/files_external/lib/backend/owncloud.php b/apps/files_external/lib/backend/owncloud.php
index e7da328c5f1..e92288b1354 100644
--- a/apps/files_external/lib/backend/owncloud.php
+++ b/apps/files_external/lib/backend/owncloud.php
@@ -35,7 +35,7 @@ class OwnCloud extends Backend {
$this
->setIdentifier('owncloud')
->addIdentifierAlias('\OC\Files\Storage\OwnCloud') // legacy compat
- ->setStorageClass('\OC\Files\Storage\OwnCloud')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\OwnCloud')
->setText($l->t('ownCloud'))
->addParameters([
(new DefinitionParameter('host', $l->t('URL'))),
diff --git a/apps/files_external/lib/backend/sftp.php b/apps/files_external/lib/backend/sftp.php
index 3e5ecb90131..fa33caeb576 100644
--- a/apps/files_external/lib/backend/sftp.php
+++ b/apps/files_external/lib/backend/sftp.php
@@ -35,7 +35,7 @@ class SFTP extends Backend {
$this
->setIdentifier('sftp')
->addIdentifierAlias('\OC\Files\Storage\SFTP') // legacy compat
- ->setStorageClass('\OC\Files\Storage\SFTP')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\SFTP')
->setText($l->t('SFTP'))
->addParameters([
(new DefinitionParameter('host', $l->t('Host'))),
diff --git a/apps/files_external/lib/backend/sftp_key.php b/apps/files_external/lib/backend/sftp_key.php
index 58dddedf784..838cf6c52b2 100644
--- a/apps/files_external/lib/backend/sftp_key.php
+++ b/apps/files_external/lib/backend/sftp_key.php
@@ -34,7 +34,7 @@ class SFTP_Key extends Backend {
public function __construct(IL10N $l, RSA $legacyAuth, SFTP $sftpBackend) {
$this
->setIdentifier('\OC\Files\Storage\SFTP_Key')
- ->setStorageClass('\OC\Files\Storage\SFTP')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\SFTP')
->setText($l->t('SFTP with secret key login'))
->addParameters([
(new DefinitionParameter('host', $l->t('Host'))),
diff --git a/apps/files_external/lib/backend/smb.php b/apps/files_external/lib/backend/smb.php
index 9b71636936a..7ea30dd11bd 100644
--- a/apps/files_external/lib/backend/smb.php
+++ b/apps/files_external/lib/backend/smb.php
@@ -40,7 +40,7 @@ class SMB extends Backend {
$this
->setIdentifier('smb')
->addIdentifierAlias('\OC\Files\Storage\SMB') // legacy compat
- ->setStorageClass('\OC\Files\Storage\SMB')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\SMB')
->setText($l->t('SMB / CIFS'))
->addParameters([
(new DefinitionParameter('host', $l->t('Host'))),
diff --git a/apps/files_external/lib/backend/smb_oc.php b/apps/files_external/lib/backend/smb_oc.php
index ba38754ce5a..c543a19bdd8 100644
--- a/apps/files_external/lib/backend/smb_oc.php
+++ b/apps/files_external/lib/backend/smb_oc.php
@@ -42,7 +42,7 @@ class SMB_OC extends Backend {
public function __construct(IL10N $l, SessionCredentials $legacyAuth, SMB $smbBackend) {
$this
->setIdentifier('\OC\Files\Storage\SMB_OC')
- ->setStorageClass('\OC\Files\Storage\SMB')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\SMB')
->setText($l->t('SMB / CIFS using OC login'))
->addParameters([
(new DefinitionParameter('host', $l->t('Host'))),
diff --git a/apps/files_external/lib/backend/swift.php b/apps/files_external/lib/backend/swift.php
index d6e4ac12f9a..58677575f52 100644
--- a/apps/files_external/lib/backend/swift.php
+++ b/apps/files_external/lib/backend/swift.php
@@ -38,7 +38,7 @@ class Swift extends Backend {
$this
->setIdentifier('swift')
->addIdentifierAlias('\OC\Files\Storage\Swift') // legacy compat
- ->setStorageClass('\OC\Files\Storage\Swift')
+ ->setStorageClass('\OCA\Files_External\Lib\Storage\Swift')
->setText($l->t('OpenStack Object Storage'))
->addParameters([
(new DefinitionParameter('service_name', $l->t('Service name')))
diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/storage/amazons3.php
index cb2082ee38b..42df1deffb0 100644
--- a/apps/files_external/lib/amazons3.php
+++ b/apps/files_external/lib/storage/amazons3.php
@@ -33,7 +33,7 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
set_include_path(get_include_path() . PATH_SEPARATOR .
\OC_App::getAppPath('files_external') . '/3rdparty/aws-sdk-php');
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/storage/dropbox.php
index 8381ccbae59..55ae7146572 100644
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/storage/dropbox.php
@@ -27,13 +27,13 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
use GuzzleHttp\Exception\RequestException;
use Icewind\Streams\IteratorDirectory;
use Icewind\Streams\RetryWrapper;
-require_once __DIR__ . '/../3rdparty/Dropbox/autoload.php';
+require_once __DIR__ . '/../../3rdparty/Dropbox/autoload.php';
class Dropbox extends \OC\Files\Storage\Common {
@@ -59,7 +59,7 @@ class Dropbox extends \OC\Files\Storage\Common {
// note: Dropbox_API connection is lazy
$this->dropbox = new \Dropbox_API($this->oauth, 'auto');
} else {
- throw new \Exception('Creating \OC\Files\Storage\Dropbox storage failed');
+ throw new \Exception('Creating Dropbox storage failed');
}
}
diff --git a/apps/files_external/lib/ftp.php b/apps/files_external/lib/storage/ftp.php
index 7249aeceb5d..051c1873009 100644
--- a/apps/files_external/lib/ftp.php
+++ b/apps/files_external/lib/storage/ftp.php
@@ -28,11 +28,11 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
use Icewind\Streams\RetryWrapper;
-class FTP extends \OC\Files\Storage\StreamWrapper{
+class FTP extends StreamWrapper{
private $password;
private $user;
private $host;
@@ -59,7 +59,7 @@ class FTP extends \OC\Files\Storage\StreamWrapper{
$this->root .= '/';
}
} else {
- throw new \Exception('Creating \OC\Files\Storage\FTP storage failed');
+ throw new \Exception('Creating FTP storage failed');
}
}
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/storage/google.php
index 62d264dfeef..8d1fe808130 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/storage/google.php
@@ -31,7 +31,7 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
use GuzzleHttp\Exception\RequestException;
use Icewind\Streams\IteratorDirectory;
@@ -79,7 +79,7 @@ class Google extends \OC\Files\Storage\Common {
$token = json_decode($params['token'], true);
$this->id = 'google::'.substr($params['client_id'], 0, 30).$token['created'];
} else {
- throw new \Exception('Creating \OC\Files\Storage\Google storage failed');
+ throw new \Exception('Creating Google storage failed');
}
}
diff --git a/apps/files_external/lib/owncloud.php b/apps/files_external/lib/storage/owncloud.php
index c4824e6bd14..22ecb4c806a 100644
--- a/apps/files_external/lib/owncloud.php
+++ b/apps/files_external/lib/storage/owncloud.php
@@ -21,7 +21,7 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
/**
* ownCloud backend for external storage based on DAV backend.
diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/storage/sftp.php
index a6984f3b4e0..2375f84dcda 100644
--- a/apps/files_external/lib/sftp.php
+++ b/apps/files_external/lib/storage/sftp.php
@@ -29,7 +29,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
use Icewind\Streams\IteratorDirectory;
use Icewind\Streams\RetryWrapper;
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/storage/smb.php
index 08c4b25a088..4249d13168c 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/storage/smb.php
@@ -28,7 +28,7 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
use Icewind\SMB\Exception\ConnectException;
use Icewind\SMB\Exception\Exception;
@@ -42,7 +42,7 @@ use OC\Cache\CappedMemoryCache;
use OC\Files\Filesystem;
use OCP\Files\StorageNotAvailableException;
-class SMB extends Common {
+class SMB extends \OC\Files\Storage\Common {
/**
* @var \Icewind\SMB\Server
*/
diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/storage/streamwrapper.php
index efb51f32ba4..0b4dff78c4f 100644
--- a/apps/files_external/lib/streamwrapper.php
+++ b/apps/files_external/lib/storage/streamwrapper.php
@@ -24,9 +24,9 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
-abstract class StreamWrapper extends Common {
+abstract class StreamWrapper extends \OC\Files\Storage\Common {
/**
* @param string $path
diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/storage/swift.php
index 9282fe28669..4578cd9a5c7 100644
--- a/apps/files_external/lib/swift.php
+++ b/apps/files_external/lib/storage/swift.php
@@ -32,7 +32,7 @@
*
*/
-namespace OC\Files\Storage;
+namespace OCA\Files_External\Lib\Storage;
use Guzzle\Http\Url;
use Guzzle\Http\Exception\ClientErrorResponseException;
diff --git a/apps/files_external/service/dbconfigservice.php b/apps/files_external/service/dbconfigservice.php
index a37c541f045..9f7061eb938 100644
--- a/apps/files_external/service/dbconfigservice.php
+++ b/apps/files_external/service/dbconfigservice.php
@@ -322,10 +322,19 @@ class DBConfigService {
private function getMountsFromQuery(IQueryBuilder $query) {
$result = $query->execute();
$mounts = $result->fetchAll();
+ $uniqueMounts = [];
+ foreach ($mounts as $mount) {
+ $id = $mount['mount_id'];
+ if (!isset($uniqueMounts[$id])) {
+ $uniqueMounts[$id] = $mount;
+ }
+ }
+ $uniqueMounts = array_values($uniqueMounts);
$mountIds = array_map(function ($mount) {
return $mount['mount_id'];
- }, $mounts);
+ }, $uniqueMounts);
+ $mountIds = array_values(array_unique($mountIds));
$applicable = $this->getApplicableForMounts($mountIds);
$config = $this->getConfigForMounts($mountIds);
@@ -338,7 +347,7 @@ class DBConfigService {
$mount['config'] = $config;
$mount['options'] = $options;
return $mount;
- }, $mounts, $applicable, $config, $options);
+ }, $uniqueMounts, $applicable, $config, $options);
}
/**
diff --git a/apps/files_external/tests/amazons3migration.php b/apps/files_external/tests/amazons3migration.php
index d4ea9e2c261..614d6ca33df 100644
--- a/apps/files_external/tests/amazons3migration.php
+++ b/apps/files_external/tests/amazons3migration.php
@@ -24,14 +24,16 @@
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests;
+
+use OCA\Files_External\Lib\Storage\AmazonS3;
/**
* Class AmazonS3Migration
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests
*/
class AmazonS3Migration extends \Test\TestCase {
@@ -77,7 +79,7 @@ class AmazonS3Migration extends \Test\TestCase {
$fileId = $oldCache->put('foobar', array('size' => 0, 'mtime' => time(), 'mimetype' => 'httpd/directory'));
try {
- $this->instance = new \OC\Files\Storage\AmazonS3($this->params);
+ $this->instance = new AmazonS3($this->params);
} catch (\Exception $e) {
//ignore
}
@@ -103,7 +105,7 @@ class AmazonS3Migration extends \Test\TestCase {
$fileId = $oldCache->put('/', array('size' => 0, 'mtime' => time(), 'mimetype' => 'httpd/directory'));
try {
- $this->instance = new \OC\Files\Storage\AmazonS3($this->params);
+ $this->instance = new AmazonS3($this->params);
} catch (\Exception $e) {
//ignore
}
diff --git a/apps/files_external/tests/controller/storagescontrollertest.php b/apps/files_external/tests/controller/storagescontrollertest.php
index 5854cb00fee..4c3c62d5d6f 100644
--- a/apps/files_external/tests/controller/storagescontrollertest.php
+++ b/apps/files_external/tests/controller/storagescontrollertest.php
@@ -51,7 +51,7 @@ abstract class StoragesControllerTest extends \Test\TestCase {
/**
* @return \OCA\Files_External\Lib\Backend\Backend
*/
- protected function getBackendMock($class = '\OCA\Files_External\Lib\Backend\SMB', $storageClass = '\OC\Files\Storage\SMB') {
+ protected function getBackendMock($class = '\OCA\Files_External\Lib\Backend\SMB', $storageClass = '\OCA\Files_External\Lib\Storage\SMB') {
$backend = $this->getMockBuilder('\OCA\Files_External\Lib\Backend\Backend')
->disableOriginalConstructor()
->getMock();
@@ -104,7 +104,7 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$response = $this->controller->create(
'mount',
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\OCA\Files_External\Lib\Auth\NullMechanism',
array(),
[],
@@ -146,7 +146,7 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$response = $this->controller->update(
1,
'mount',
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\OCA\Files_External\Lib\Auth\NullMechanism',
array(),
[],
@@ -188,7 +188,7 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$response = $this->controller->create(
$mountPoint,
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\OCA\Files_External\Lib\Auth\NullMechanism',
array(),
[],
@@ -202,7 +202,7 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$response = $this->controller->update(
1,
$mountPoint,
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\OCA\Files_External\Lib\Auth\NullMechanism',
array(),
[],
@@ -279,7 +279,7 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$response = $this->controller->update(
255,
'mount',
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\OCA\Files_External\Lib\Auth\NullMechanism',
array(),
[],
@@ -375,7 +375,7 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$response = $this->controller->create(
'mount',
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\OCA\Files_External\Lib\Auth\NullMechanism',
array(),
[],
diff --git a/apps/files_external/tests/controller/userstoragescontrollertest.php b/apps/files_external/tests/controller/userstoragescontrollertest.php
index a7e854471b5..804b752b6af 100644
--- a/apps/files_external/tests/controller/userstoragescontrollertest.php
+++ b/apps/files_external/tests/controller/userstoragescontrollertest.php
@@ -78,7 +78,7 @@ class UserStoragesControllerTest extends StoragesControllerTest {
$response = $this->controller->create(
'mount',
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\Auth\Mechanism',
array(),
[],
@@ -92,7 +92,7 @@ class UserStoragesControllerTest extends StoragesControllerTest {
$response = $this->controller->update(
1,
'mount',
- '\OC\Files\Storage\SMB',
+ '\OCA\Files_External\Lib\Storage\SMB',
'\Auth\Mechanism',
array(),
[],
diff --git a/apps/files_external/tests/owncloudfunctions.php b/apps/files_external/tests/owncloudfunctions.php
index 019f988275e..25aaa90d178 100644
--- a/apps/files_external/tests/owncloudfunctions.php
+++ b/apps/files_external/tests/owncloudfunctions.php
@@ -23,14 +23,14 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests;
/**
* Class OwnCloudFunctions
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests
*/
class OwnCloudFunctions extends \Test\TestCase {
@@ -109,7 +109,7 @@ class OwnCloudFunctions extends \Test\TestCase {
public function testConfig($config, $expectedUri) {
$config['user'] = 'someuser';
$config['password'] = 'somepassword';
- $instance = new \OC\Files\Storage\OwnCloud($config);
+ $instance = new \OCA\Files_External\Lib\Storage\OwnCloud($config);
$this->assertEquals($expectedUri, $instance->createBaseUri());
}
}
diff --git a/apps/files_external/tests/service/dbconfigservicetest.php b/apps/files_external/tests/service/dbconfigservicetest.php
index c6d1add36b6..b088a7078d1 100644
--- a/apps/files_external/tests/service/dbconfigservicetest.php
+++ b/apps/files_external/tests/service/dbconfigservicetest.php
@@ -271,4 +271,15 @@ class DBConfigServiceTest extends TestCase {
$mount = $this->dbConfig->getMountById($id2);
$this->assertEquals('bar', $mount['auth_backend']);
}
+
+ public function testGetMountsForDuplicateByGroup() {
+ $id1 = $this->addMount('/test', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN);
+
+ $this->dbConfig->addApplicable($id1, DBConfigService::APPLICABLE_TYPE_GROUP, 'group1');
+ $this->dbConfig->addApplicable($id1, DBConfigService::APPLICABLE_TYPE_GROUP, 'group2');
+
+ $mounts = $this->dbConfig->getAdminMountsForMultiple(DBConfigService::APPLICABLE_TYPE_GROUP, ['group1', 'group2']);
+ $this->assertCount(1, $mounts);
+ $this->assertEquals($id1, $mounts[0]['mount_id']);
+ }
}
diff --git a/apps/files_external/tests/service/storagesservicetest.php b/apps/files_external/tests/service/storagesservicetest.php
index 3fbe3b755e1..f93c0134814 100644
--- a/apps/files_external/tests/service/storagesservicetest.php
+++ b/apps/files_external/tests/service/storagesservicetest.php
@@ -121,9 +121,9 @@ abstract class StoragesServiceTest extends \Test\TestCase {
$this->backendService->method('getAuthMechanisms')
->will($this->returnValue($authMechanisms));
- $sftpBackend = $this->getBackendMock('\OCA\Files_External\Lib\Backend\SFTP', '\OC\Files\Storage\SFTP');
+ $sftpBackend = $this->getBackendMock('\OCA\Files_External\Lib\Backend\SFTP', '\OCA\Files_External\Lib\Storage\SFTP');
$backends = [
- 'identifier:\OCA\Files_External\Lib\Backend\SMB' => $this->getBackendMock('\OCA\Files_External\Lib\Backend\SMB', '\OC\Files\Storage\SMB'),
+ 'identifier:\OCA\Files_External\Lib\Backend\SMB' => $this->getBackendMock('\OCA\Files_External\Lib\Backend\SMB', '\OCA\Files_External\Lib\Storage\SMB'),
'identifier:\OCA\Files_External\Lib\Backend\SFTP' => $sftpBackend,
'identifier:sftp_alias' => $sftpBackend,
];
@@ -171,7 +171,7 @@ abstract class StoragesServiceTest extends \Test\TestCase {
}
}
- protected function getBackendMock($class = '\OCA\Files_External\Lib\Backend\SMB', $storageClass = '\OC\Files\Storage\SMB') {
+ protected function getBackendMock($class = '\OCA\Files_External\Lib\Backend\SMB', $storageClass = '\OCA\Files_External\Lib\Storage\SMB') {
$backend = $this->getMockBuilder('\OCA\Files_External\Lib\Backend\Backend')
->disableOriginalConstructor()
->getMock();
diff --git a/apps/files_external/tests/backends/amazons3.php b/apps/files_external/tests/storage/amazons3test.php
index 3b43f81a926..eb0e410764c 100644
--- a/apps/files_external/tests/backends/amazons3.php
+++ b/apps/files_external/tests/storage/amazons3test.php
@@ -24,16 +24,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\AmazonS3;
/**
- * Class AmazonS3
+ * Class AmazonS3Test
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class AmazonS3 extends Storage {
+class AmazonS3Test extends \Test\Files\Storage\Storage {
private $config;
@@ -44,7 +46,7 @@ class AmazonS3 extends Storage {
if ( ! is_array($this->config) or ! $this->config['run']) {
$this->markTestSkipped('AmazonS3 backend not configured');
}
- $this->instance = new \OC\Files\Storage\AmazonS3($this->config);
+ $this->instance = new AmazonS3($this->config);
}
protected function tearDown() {
diff --git a/apps/files_external/tests/backends/dropbox.php b/apps/files_external/tests/storage/dropboxtest.php
index 1bf8b4171fb..d466d4b1b44 100644
--- a/apps/files_external/tests/backends/dropbox.php
+++ b/apps/files_external/tests/storage/dropboxtest.php
@@ -24,16 +24,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\Dropbox;
/**
- * Class Dropbox
+ * Class DropboxTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class Dropbox extends Storage {
+class DropboxTest extends \Test\Files\Storage\Storage {
private $config;
protected function setUp() {
@@ -45,7 +47,7 @@ class Dropbox extends Storage {
$this->markTestSkipped('Dropbox backend not configured');
}
$this->config['dropbox']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
- $this->instance = new \OC\Files\Storage\Dropbox($this->config['dropbox']);
+ $this->instance = new Dropbox($this->config['dropbox']);
}
protected function tearDown() {
diff --git a/apps/files_external/tests/backends/ftp.php b/apps/files_external/tests/storage/ftptest.php
index 868a022d38f..9af9ccff012 100644
--- a/apps/files_external/tests/backends/ftp.php
+++ b/apps/files_external/tests/storage/ftptest.php
@@ -24,16 +24,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\FTP;
/**
- * Class FTP
+ * Class FTPTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class FTP extends Storage {
+class FTPTest extends \Test\Files\Storage\Storage {
private $config;
protected function setUp() {
@@ -45,7 +47,7 @@ class FTP extends Storage {
$this->markTestSkipped('FTP backend not configured');
}
$this->config['root'] .= '/' . $id; //make sure we have an new empty folder to work in
- $this->instance = new \OC\Files\Storage\FTP($this->config);
+ $this->instance = new FTP($this->config);
$this->instance->mkdir('/');
}
@@ -63,31 +65,31 @@ class FTP extends Storage {
'password' => 'ftp',
'root' => '/',
'secure' => false );
- $instance = new \OC\Files\Storage\FTP($config);
+ $instance = new FTP($config);
$this->assertEquals('ftp://ftp:ftp@localhost/', $instance->constructUrl(''));
$config['secure'] = true;
- $instance = new \OC\Files\Storage\FTP($config);
+ $instance = new FTP($config);
$this->assertEquals('ftps://ftp:ftp@localhost/', $instance->constructUrl(''));
$config['secure'] = 'false';
- $instance = new \OC\Files\Storage\FTP($config);
+ $instance = new FTP($config);
$this->assertEquals('ftp://ftp:ftp@localhost/', $instance->constructUrl(''));
$config['secure'] = 'true';
- $instance = new \OC\Files\Storage\FTP($config);
+ $instance = new FTP($config);
$this->assertEquals('ftps://ftp:ftp@localhost/', $instance->constructUrl(''));
$config['root'] = '';
- $instance = new \OC\Files\Storage\FTP($config);
+ $instance = new FTP($config);
$this->assertEquals('ftps://ftp:ftp@localhost/somefile.txt', $instance->constructUrl('somefile.txt'));
$config['root'] = '/abc';
- $instance = new \OC\Files\Storage\FTP($config);
+ $instance = new FTP($config);
$this->assertEquals('ftps://ftp:ftp@localhost/abc/somefile.txt', $instance->constructUrl('somefile.txt'));
$config['root'] = '/abc/';
- $instance = new \OC\Files\Storage\FTP($config);
+ $instance = new FTP($config);
$this->assertEquals('ftps://ftp:ftp@localhost/abc/somefile.txt', $instance->constructUrl('somefile.txt'));
}
}
diff --git a/apps/files_external/tests/backends/google.php b/apps/files_external/tests/storage/googletest.php
index 7622f796407..46aa4555b12 100644
--- a/apps/files_external/tests/backends/google.php
+++ b/apps/files_external/tests/storage/googletest.php
@@ -25,18 +25,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
-require_once 'files_external/lib/google.php';
+use \OCA\Files_External\Lib\Storage\Google;
/**
- * Class Google
+ * Class GoogleTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class Google extends Storage {
+class GoogleTest extends \Test\Files\Storage\Storage {
private $config;
@@ -49,7 +49,7 @@ class Google extends Storage {
) {
$this->markTestSkipped('Google Drive backend not configured');
}
- $this->instance = new \OC\Files\Storage\Google($this->config['google']);
+ $this->instance = new Google($this->config['google']);
}
protected function tearDown() {
diff --git a/apps/files_external/tests/backends/owncloud.php b/apps/files_external/tests/storage/owncloudtest.php
index a56e9b2a186..cbc25e46fa0 100644
--- a/apps/files_external/tests/backends/owncloud.php
+++ b/apps/files_external/tests/storage/owncloudtest.php
@@ -22,16 +22,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\OwnCloud;
/**
- * Class OwnCloud
+ * Class OwnCloudTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class OwnCloud extends Storage {
+class OwnCloudTest extends \Test\Files\Storage\Storage {
private $config;
@@ -44,7 +46,7 @@ class OwnCloud extends Storage {
$this->markTestSkipped('ownCloud backend not configured');
}
$this->config['owncloud']['root'] .= '/' . $id; //make sure we have an new empty folder to work in
- $this->instance = new \OC\Files\Storage\OwnCloud($this->config['owncloud']);
+ $this->instance = new OwnCloud($this->config['owncloud']);
$this->instance->mkdir('/');
}
diff --git a/apps/files_external/tests/backends/sftp_key.php b/apps/files_external/tests/storage/sftp_keytest.php
index 73c6a0b6432..b974f88555f 100644
--- a/apps/files_external/tests/backends/sftp_key.php
+++ b/apps/files_external/tests/storage/sftp_keytest.php
@@ -22,16 +22,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\SFTP_Key;
/**
- * Class SFTP_Key
+ * Class SFTP_KeyTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class SFTP_Key extends Storage {
+class SFTP_KeyTest extends \Test\Files\Storage\Storage {
private $config;
protected function setUp() {
@@ -44,7 +46,7 @@ class SFTP_Key extends Storage {
}
// Make sure we have an new empty folder to work in
$this->config['sftp_key']['root'] .= '/' . $id;
- $this->instance = new \OC\Files\Storage\SFTP_Key($this->config['sftp_key']);
+ $this->instance = new SFTP_Key($this->config['sftp_key']);
$this->instance->mkdir('/');
}
diff --git a/apps/files_external/tests/backends/sftp.php b/apps/files_external/tests/storage/sftptest.php
index 608982adbc4..329e93819fc 100644
--- a/apps/files_external/tests/backends/sftp.php
+++ b/apps/files_external/tests/storage/sftptest.php
@@ -24,18 +24,20 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\SFTP;
/**
- * Class SFTP
+ * Class SFTPTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class SFTP extends Storage {
+class SFTPTest extends \Test\Files\Storage\Storage {
/**
- * @var \OC\Files\Storage\SFTP instance
+ * @var SFTP instance
*/
protected $instance;
@@ -50,7 +52,7 @@ class SFTP extends Storage {
$this->markTestSkipped('SFTP backend not configured');
}
$this->config['root'] .= '/' . $id; //make sure we have an new empty folder to work in
- $this->instance = new \OC\Files\Storage\SFTP($this->config);
+ $this->instance = new SFTP($this->config);
$this->instance->mkdir('/');
}
@@ -66,7 +68,7 @@ class SFTP extends Storage {
* @dataProvider configProvider
*/
public function testStorageId($config, $expectedStorageId) {
- $instance = new \OC\Files\Storage\SFTP($config);
+ $instance = new SFTP($config);
$this->assertEquals($expectedStorageId, $instance->getId());
}
diff --git a/apps/files_external/tests/backends/smb.php b/apps/files_external/tests/storage/smbtest.php
index f9a377c271b..fc2795702c6 100644
--- a/apps/files_external/tests/backends/smb.php
+++ b/apps/files_external/tests/storage/smbtest.php
@@ -23,16 +23,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\SMB;
/**
- * Class SMB
+ * Class SMBTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class SMB extends Storage {
+class SMBTest extends \Test\Files\Storage\Storage {
protected function setUp() {
parent::setUp();
@@ -46,7 +48,7 @@ class SMB extends Storage {
$config['root'] .= '/';
}
$config['root'] .= $id; //make sure we have an new empty folder to work in
- $this->instance = new \OC\Files\Storage\SMB($config);
+ $this->instance = new SMB($config);
$this->instance->mkdir('/');
}
@@ -71,7 +73,7 @@ class SMB extends Storage {
}
public function testStorageId() {
- $this->instance = new \OC\Files\Storage\SMB([
+ $this->instance = new SMB([
'host' => 'testhost',
'user' => 'testuser',
'password' => 'somepass',
diff --git a/apps/files_external/tests/backends/swift.php b/apps/files_external/tests/storage/swifttest.php
index 9bdcd48ee68..1bcbb815067 100644
--- a/apps/files_external/tests/backends/swift.php
+++ b/apps/files_external/tests/storage/swifttest.php
@@ -24,16 +24,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OCA\Files_External\Lib\Storage\Swift;
/**
- * Class Swift
+ * Class SwiftTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class Swift extends Storage {
+class SwiftTest extends \Test\Files\Storage\Storage {
private $config;
@@ -44,7 +46,7 @@ class Swift extends Storage {
if (!is_array($this->config) or !$this->config['run']) {
$this->markTestSkipped('OpenStack Object Storage backend not configured');
}
- $this->instance = new \OC\Files\Storage\Swift($this->config);
+ $this->instance = new Swift($this->config);
}
protected function tearDown() {
diff --git a/apps/files_external/tests/backends/webdav.php b/apps/files_external/tests/storage/webdavtest.php
index e1a710c94b4..f8c5b19e04f 100644
--- a/apps/files_external/tests/backends/webdav.php
+++ b/apps/files_external/tests/storage/webdavtest.php
@@ -23,16 +23,18 @@
*
*/
-namespace Test\Files\Storage;
+namespace OCA\Files_External\Tests\Storage;
+
+use \OC\Files\Storage\DAV;
/**
- * Class DAV
+ * Class WebDAVTest
*
* @group DB
*
- * @package Test\Files\Storage
+ * @package OCA\Files_External\Tests\Storage
*/
-class DAV extends Storage {
+class WebDAVTest extends \Test\Files\Storage\Storage {
protected function setUp() {
parent::setUp();
@@ -46,7 +48,7 @@ class DAV extends Storage {
$this->waitDelay = $config['wait'];
}
$config['root'] .= '/' . $id; //make sure we have an new empty folder to work in
- $this->instance = new \OC\Files\Storage\DAV($config);
+ $this->instance = new DAV($config);
$this->instance->mkdir('/');
}
diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php
index 76f9d5d7668..78e648618be 100644
--- a/apps/files_sharing/ajax/external.php
+++ b/apps/files_sharing/ajax/external.php
@@ -31,8 +31,11 @@ OCP\JSON::checkAppEnabled('files_sharing');
$l = \OC::$server->getL10N('files_sharing');
+$federatedSharingApp = new \OCA\FederatedFileSharing\AppInfo\Application('federatedfilesharing');
+$federatedShareProvider = $federatedSharingApp->getFederatedShareProvider();
+
// check if server admin allows to mount public links from other servers
-if (OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled() === false) {
+if ($federatedShareProvider->isIncomingServer2serverShareEnabled() === false) {
\OCP\JSON::error(array('data' => array('message' => $l->t('Server to server sharing is not enabled on this server'))));
exit();
}
diff --git a/apps/files_sharing/ajax/shareinfo.php b/apps/files_sharing/ajax/shareinfo.php
index e531e84ebbc..d7f756b0039 100644
--- a/apps/files_sharing/ajax/shareinfo.php
+++ b/apps/files_sharing/ajax/shareinfo.php
@@ -29,7 +29,10 @@ if (!isset($_GET['t'])) {
exit;
}
-if (OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled() === false) {
+$federatedSharingApp = new \OCA\FederatedFileSharing\AppInfo\Application('federatedfilesharing');
+$federatedShareProvider = $federatedSharingApp->getFederatedShareProvider();
+
+if ($federatedShareProvider->isOutgoingServer2serverShareEnabled() === false) {
\OC_Response::setStatus(404); // 404 not found
exit;
}
@@ -62,29 +65,37 @@ if (!$isWritable) {
$rootInfo = \OC\Files\Filesystem::getFileInfo($path);
$rootView = new \OC\Files\View('');
+$shareManager = \OC::$server->getShareManager();
+$share = $shareManager->getShareByToken($token);
+$sharePermissions= (int)$share->getPermissions();
+
/**
* @param \OCP\Files\FileInfo $dir
* @param \OC\Files\View $view
* @return array
*/
-function getChildInfo($dir, $view) {
+function getChildInfo($dir, $view, $sharePermissions) {
$children = $view->getDirectoryContent($dir->getPath());
$result = array();
foreach ($children as $child) {
- $formated = \OCA\Files\Helper::formatFileInfo($child);
+ $formatted = \OCA\Files\Helper::formatFileInfo($child);
if ($child->getType() === 'dir') {
- $formated['children'] = getChildInfo($child, $view);
+ $formatted['children'] = getChildInfo($child, $view, $sharePermissions);
}
- $formated['mtime'] = $formated['mtime'] / 1000;
- $result[] = $formated;
+ $formatted['mtime'] = $formatted['mtime'] / 1000;
+ $formatted['permissions'] = $sharePermissions & (int)$formatted['permissions'];
+ $result[] = $formatted;
}
return $result;
}
$result = \OCA\Files\Helper::formatFileInfo($rootInfo);
$result['mtime'] = $result['mtime'] / 1000;
+$result['permissions'] = (int)$result['permissions'] & $sharePermissions;
+
+
if ($rootInfo->getType() === 'dir') {
- $result['children'] = getChildInfo($rootInfo, $rootView);
+ $result['children'] = getChildInfo($rootInfo, $rootView, $sharePermissions);
}
OCP\JSON::success(array('data' => $result));
diff --git a/apps/files_sharing/api/ocssharewrapper.php b/apps/files_sharing/api/ocssharewrapper.php
index a51ad1eb2c9..8ce9271a709 100644
--- a/apps/files_sharing/api/ocssharewrapper.php
+++ b/apps/files_sharing/api/ocssharewrapper.php
@@ -33,7 +33,9 @@ class OCSShareWrapper {
\OC::$server->getRequest(),
\OC::$server->getRootFolder(),
\OC::$server->getURLGenerator(),
- \OC::$server->getUserSession()->getUser());
+ \OC::$server->getUserSession()->getUser(),
+ \OC::$server->getL10N('files_sharing')
+ );
}
public function getAllShares() {
diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php
index 11b24d9148b..034ec5105e4 100644
--- a/apps/files_sharing/api/server2server.php
+++ b/apps/files_sharing/api/server2server.php
@@ -26,11 +26,25 @@
namespace OCA\Files_Sharing\API;
use OCA\FederatedFileSharing\DiscoveryManager;
+use OCA\FederatedFileSharing\FederatedShareProvider;
use OCA\Files_Sharing\Activity;
use OCP\Files\NotFoundException;
class Server2Server {
+ /** @var FederatedShareProvider */
+ private $federatedShareProvider;
+
+
+ /**
+ * Server2Server constructor.
+ *
+ * @param FederatedShareProvider $federatedShareProvider
+ */
+ public function __construct(FederatedShareProvider $federatedShareProvider) {
+ $this->federatedShareProvider = $federatedShareProvider;
+ }
+
/**
* create a new share
*
@@ -300,9 +314,9 @@ class Server2Server {
$result = \OCP\App::isEnabled('files_sharing');
if ($incoming) {
- $result = $result && \OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled();
+ $result = $result && $this->federatedShareProvider->isIncomingServer2serverShareEnabled();
} else {
- $result = $result && \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled();
+ $result = $result && $this->federatedShareProvider->isOutgoingServer2serverShareEnabled();
}
return $result;
diff --git a/apps/files_sharing/api/share20ocs.php b/apps/files_sharing/api/share20ocs.php
index 61d5044cf84..68098530017 100644
--- a/apps/files_sharing/api/share20ocs.php
+++ b/apps/files_sharing/api/share20ocs.php
@@ -22,6 +22,7 @@ namespace OCA\Files_Sharing\API;
use OCP\Files\NotFoundException;
use OCP\IGroupManager;
+use OCP\IL10N;
use OCP\IUserManager;
use OCP\IRequest;
use OCP\IURLGenerator;
@@ -54,6 +55,8 @@ class Share20OCS {
private $urlGenerator;
/** @var IUser */
private $currentUser;
+ /** @var IL10N */
+ private $l;
/**
* Share20OCS constructor.
@@ -73,7 +76,8 @@ class Share20OCS {
IRequest $request,
IRootFolder $rootFolder,
IURLGenerator $urlGenerator,
- IUser $currentUser
+ IUser $currentUser,
+ IL10N $l10n
) {
$this->shareManager = $shareManager;
$this->userManager = $userManager;
@@ -82,6 +86,7 @@ class Share20OCS {
$this->rootFolder = $rootFolder;
$this->urlGenerator = $urlGenerator;
$this->currentUser = $currentUser;
+ $this->l = $l10n;
}
/**
@@ -162,13 +167,13 @@ class Share20OCS {
*/
public function getShare($id) {
if (!$this->shareManager->shareApiEnabled()) {
- return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Share API is disabled'));
}
try {
$share = $this->getShareById($id);
} catch (ShareNotFound $e) {
- return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Wrong share ID, share doesn\'t exist'));
}
if ($this->canAccessShare($share)) {
@@ -180,7 +185,7 @@ class Share20OCS {
}
}
- return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Wrong share ID, share doesn\'t exist'));
}
/**
@@ -191,17 +196,17 @@ class Share20OCS {
*/
public function deleteShare($id) {
if (!$this->shareManager->shareApiEnabled()) {
- return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Share API is disabled'));
}
try {
$share = $this->getShareById($id);
} catch (ShareNotFound $e) {
- return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Wrong share ID, share doesn\'t exist'));
}
if (!$this->canAccessShare($share)) {
- return new \OC_OCS_Result(null, 404, 'could not delete share');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Could not delete share'));
}
$this->shareManager->deleteShare($share);
@@ -216,20 +221,20 @@ class Share20OCS {
$share = $this->shareManager->newShare();
if (!$this->shareManager->shareApiEnabled()) {
- return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Share API is disabled'));
}
// Verify path
$path = $this->request->getParam('path', null);
if ($path === null) {
- return new \OC_OCS_Result(null, 404, 'please specify a file or folder path');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Please specify a file or folder path'));
}
$userFolder = $this->rootFolder->getUserFolder($this->currentUser->getUID());
try {
$path = $userFolder->get($path);
} catch (\OCP\Files\NotFoundException $e) {
- return new \OC_OCS_Result(null, 404, 'wrong path, file/folder doesn\'t exist');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Wrong path, file/folder doesn\'t exist'));
}
$share->setNode($path);
@@ -270,25 +275,25 @@ class Share20OCS {
if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
// Valid user is required to share
if ($shareWith === null || !$this->userManager->userExists($shareWith)) {
- return new \OC_OCS_Result(null, 404, 'please specify a valid user');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Please specify a valid user'));
}
$share->setSharedWith($shareWith);
$share->setPermissions($permissions);
} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
if (!$this->shareManager->allowGroupSharing()) {
- return new \OC_OCS_Result(null, 404, 'group sharing is disabled by the administrator');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Group sharing is disabled by the administrator'));
}
// Valid group is required to share
if ($shareWith === null || !$this->groupManager->groupExists($shareWith)) {
- return new \OC_OCS_Result(null, 404, 'please specify a valid group');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Please specify a valid group'));
}
$share->setSharedWith($shareWith);
$share->setPermissions($permissions);
} else if ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
//Can we even share links?
if (!$this->shareManager->shareApiAllowLinks()) {
- return new \OC_OCS_Result(null, 404, 'public link sharing is disabled by the administrator');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Public link sharing is disabled by the administrator'));
}
/*
@@ -304,12 +309,12 @@ class Share20OCS {
if ($publicUpload === 'true') {
// Check if public upload is allowed
if (!$this->shareManager->shareApiLinkAllowPublicUpload()) {
- return new \OC_OCS_Result(null, 403, 'public upload disabled by the administrator');
+ return new \OC_OCS_Result(null, 403, $this->l->t('Public upload disabled by the administrator'));
}
// Public upload can only be set for folders
if ($path instanceof \OCP\Files\File) {
- return new \OC_OCS_Result(null, 404, 'public upload is only possible for public shared folders');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Public upload is only possible for publicly shared folders'));
}
$share->setPermissions(
@@ -336,19 +341,19 @@ class Share20OCS {
$expireDate = $this->parseDate($expireDate);
$share->setExpirationDate($expireDate);
} catch (\Exception $e) {
- return new \OC_OCS_Result(null, 404, 'Invalid Date. Format must be YYYY-MM-DD.');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Invalid date, date format must be YYYY-MM-DD'));
}
}
} else if ($shareType === \OCP\Share::SHARE_TYPE_REMOTE) {
if (!$this->shareManager->outgoingServer2ServerSharesAllowed()) {
- return new \OC_OCS_Result(null, 403, 'Sharing '.$path->getPath().' failed, because the backend does not allow shares from type '.$shareType);
+ return new \OC_OCS_Result(null, 403, $this->l->t('Sharing %s failed because the back end does not allow shares from type %s', [$path->getPath(), $shareType]));
}
$share->setSharedWith($shareWith);
$share->setPermissions($permissions);
} else {
- return new \OC_OCS_Result(null, 400, "unknown share type");
+ return new \OC_OCS_Result(null, 400, $this->l->t('Unknown share type'));
}
$share->setShareType($shareType);
@@ -397,7 +402,7 @@ class Share20OCS {
*/
private function getSharesInDir($folder) {
if (!($folder instanceof \OCP\Files\Folder)) {
- return new \OC_OCS_Result(null, 400, "not a directory");
+ return new \OC_OCS_Result(null, 400, $this->l->t('Not a directory'));
}
$nodes = $folder->getDirectoryListing();
@@ -450,7 +455,7 @@ class Share20OCS {
try {
$path = $userFolder->get($path);
} catch (\OCP\Files\NotFoundException $e) {
- return new \OC_OCS_Result(null, 404, 'wrong path, file/folder doesn\'t exist');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Wrong path, file/folder doesn\'t exist'));
}
}
@@ -498,17 +503,17 @@ class Share20OCS {
*/
public function updateShare($id) {
if (!$this->shareManager->shareApiEnabled()) {
- return new \OC_OCS_Result(null, 404, 'Share API is disabled');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Share API is disabled'));
}
try {
$share = $this->getShareById($id);
} catch (ShareNotFound $e) {
- return new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Wrong share ID, share doesn\'t exist'));
}
if (!$this->canAccessShare($share)) {
- return new \OC_OCS_Result(null, 404, 'wrong share Id, share doesn\'t exist.');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Wrong share ID, share doesn\'t exist'));
}
$permissions = $this->request->getParam('permissions', null);
@@ -538,16 +543,16 @@ class Share20OCS {
if ($newPermissions !== null &&
$newPermissions !== \OCP\Constants::PERMISSION_READ &&
$newPermissions !== (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE)) {
- return new \OC_OCS_Result(null, 400, 'can\'t change permission for public link share');
+ return new \OC_OCS_Result(null, 400, $this->l->t('Can\'t change permissions for public share links'));
}
if ($newPermissions === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE)) {
if (!$this->shareManager->shareApiLinkAllowPublicUpload()) {
- return new \OC_OCS_Result(null, 403, 'public upload disabled by the administrator');
+ return new \OC_OCS_Result(null, 403, $this->l->t('Public upload disabled by the administrator'));
}
if (!($share->getNode() instanceof \OCP\Files\Folder)) {
- return new \OC_OCS_Result(null, 400, "public upload is only possible for public shared folders");
+ return new \OC_OCS_Result(null, 400, $this->l->t('Public upload is only possible for publicly shared folders'));
}
}
@@ -575,7 +580,7 @@ class Share20OCS {
} else {
// For other shares only permissions is valid.
if ($permissions === null) {
- return new \OC_OCS_Result(null, 400, 'Wrong or no update parameter given');
+ return new \OC_OCS_Result(null, 400, $this->l->t('Wrong or no update parameter given'));
} else {
$permissions = (int)$permissions;
$share->setPermissions($permissions);
@@ -594,7 +599,7 @@ class Share20OCS {
}
if ($share->getPermissions() & ~$maxPermissions) {
- return new \OC_OCS_Result(null, 404, 'Cannot increase permissions');
+ return new \OC_OCS_Result(null, 404, $this->l->t('Cannot increase permissions'));
}
}
}
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index 29202c15b22..e0cbfd7f5ba 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -44,9 +44,6 @@ $l = \OC::$server->getL10N('files_sharing');
$application = new Application();
$application->registerMountProviders();
-\OCP\App::registerAdmin('files_sharing', 'settings-admin');
-\OCP\App::registerPersonal('files_sharing', 'settings-personal');
-
\OCA\Files_Sharing\Helper::registerHooks();
\OCP\Share::registerBackend('file', 'OC_Share_Backend_File');
diff --git a/apps/files_sharing/appinfo/application.php b/apps/files_sharing/appinfo/application.php
index 64c7517456d..b17e213e2e2 100644
--- a/apps/files_sharing/appinfo/application.php
+++ b/apps/files_sharing/appinfo/application.php
@@ -45,6 +45,7 @@ class Application extends App {
* Controllers
*/
$container->registerService('ShareController', function (SimpleContainer $c) use ($server) {
+ $federatedSharingApp = new \OCA\FederatedFileSharing\AppInfo\Application('federatedfilesharing');
return new ShareController(
$c->query('AppName'),
$c->query('Request'),
@@ -56,7 +57,8 @@ class Application extends App {
$server->getShareManager(),
$server->getSession(),
$server->getPreviewManager(),
- $server->getRootFolder()
+ $server->getRootFolder(),
+ $federatedSharingApp->getFederatedShareProvider()
);
});
$container->registerService('ExternalSharesController', function (SimpleContainer $c) {
@@ -111,7 +113,8 @@ class Application extends App {
/** @var \OCP\IServerContainer $server */
$server = $c->query('ServerContainer');
return new MountProvider(
- $server->getConfig()
+ $server->getConfig(),
+ $server->getShareManager()
);
});
diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js
index af198208de2..6f12b3d4456 100644
--- a/apps/files_sharing/js/app.js
+++ b/apps/files_sharing/js/app.js
@@ -33,7 +33,8 @@ OCA.Sharing.App = {
id: 'shares.self',
scrollContainer: $('#app-content'),
sharedWithUser: true,
- fileActions: this._createFileActions()
+ fileActions: this._createFileActions(),
+ config: OCA.Files.App.getFilesConfig()
}
);
@@ -55,7 +56,8 @@ OCA.Sharing.App = {
id: 'shares.others',
scrollContainer: $('#app-content'),
sharedWithUser: false,
- fileActions: this._createFileActions()
+ fileActions: this._createFileActions(),
+ config: OCA.Files.App.getFilesConfig()
}
);
@@ -77,7 +79,8 @@ OCA.Sharing.App = {
id: 'shares.link',
scrollContainer: $('#app-content'),
linksOnly: true,
- fileActions: this._createFileActions()
+ fileActions: this._createFileActions(),
+ config: OCA.Files.App.getFilesConfig()
}
);
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 5bfc8e1d4a2..07ec5f766a1 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -38,7 +38,7 @@
var tr = oldCreateRow.apply(this, arguments);
var sharePermissions = fileData.permissions;
if (fileData.mountType && fileData.mountType === "external-root"){
- // for external storages we cant use the permissions of the mountpoint
+ // for external storages we can't use the permissions of the mountpoint
// instead we show all permissions and only use the share permissions from the mountpoint to handle resharing
sharePermissions = sharePermissions | (OC.PERMISSION_ALL & ~OC.PERMISSION_SHARE);
}
diff --git a/apps/files_sharing/l10n/az.js b/apps/files_sharing/l10n/az.js
index 5cec471aa24..7bf3472dfef 100644
--- a/apps/files_sharing/l10n/az.js
+++ b/apps/files_sharing/l10n/az.js
@@ -55,10 +55,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Öz ownCloud-nuza əlavə edin",
"Download" : "Yüklə",
"Download %s" : "Endir %s",
- "Direct link" : "Birbaşa link",
- "Federated Cloud Sharing" : "Federal Cloud Paylaşım",
- "Open documentation" : "Sənədləri aç",
- "Allow users on this server to send shares to other servers" : "Bu serverdən digər serverlərə istifadəçilər tərəfindən paylaşımın göndərilməsinə izin vermək",
- "Allow users on this server to receive shares from other servers" : "Digər serverlərdən bu serverə istifadəçilər tərəfindən paylaşımın ötürülməsinə izin vermək"
+ "Direct link" : "Birbaşa link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/az.json b/apps/files_sharing/l10n/az.json
index bd74add7ca8..40e16a7cc0c 100644
--- a/apps/files_sharing/l10n/az.json
+++ b/apps/files_sharing/l10n/az.json
@@ -53,10 +53,6 @@
"Add to your ownCloud" : "Öz ownCloud-nuza əlavə edin",
"Download" : "Yüklə",
"Download %s" : "Endir %s",
- "Direct link" : "Birbaşa link",
- "Federated Cloud Sharing" : "Federal Cloud Paylaşım",
- "Open documentation" : "Sənədləri aç",
- "Allow users on this server to send shares to other servers" : "Bu serverdən digər serverlərə istifadəçilər tərəfindən paylaşımın göndərilməsinə izin vermək",
- "Allow users on this server to receive shares from other servers" : "Digər serverlərdən bu serverə istifadəçilər tərəfindən paylaşımın ötürülməsinə izin vermək"
+ "Direct link" : "Birbaşa link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/bg_BG.js b/apps/files_sharing/l10n/bg_BG.js
index 540f7d0f14a..01f9e6b989c 100644
--- a/apps/files_sharing/l10n/bg_BG.js
+++ b/apps/files_sharing/l10n/bg_BG.js
@@ -51,8 +51,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Добави към своя ownCloud",
"Download" : "Изтегли",
"Download %s" : "Изтегли %s",
- "Direct link" : "Директна връзка",
- "Allow users on this server to send shares to other servers" : "Позволи на потребители от този сървър да споделят папки с други сървъри",
- "Allow users on this server to receive shares from other servers" : "Позволи на потребители на този сървър да получават споделени папки от други сървъри"
+ "Direct link" : "Директна връзка"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/bg_BG.json b/apps/files_sharing/l10n/bg_BG.json
index 18dddd90cbc..6cca34b23e1 100644
--- a/apps/files_sharing/l10n/bg_BG.json
+++ b/apps/files_sharing/l10n/bg_BG.json
@@ -49,8 +49,6 @@
"Add to your ownCloud" : "Добави към своя ownCloud",
"Download" : "Изтегли",
"Download %s" : "Изтегли %s",
- "Direct link" : "Директна връзка",
- "Allow users on this server to send shares to other servers" : "Позволи на потребители от този сървър да споделят папки с други сървъри",
- "Allow users on this server to receive shares from other servers" : "Позволи на потребители на този сървър да получават споделени папки от други сървъри"
+ "Direct link" : "Директна връзка"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ca.js b/apps/files_sharing/l10n/ca.js
index 31255f628bb..cb13956f91b 100644
--- a/apps/files_sharing/l10n/ca.js
+++ b/apps/files_sharing/l10n/ca.js
@@ -38,7 +38,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Afegiu a ownCloud",
"Download" : "Baixa",
"Download %s" : "Baixa %s",
- "Direct link" : "Enllaç directe",
- "Open documentation" : "Obre la documentació"
+ "Direct link" : "Enllaç directe"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/ca.json b/apps/files_sharing/l10n/ca.json
index e244021d55f..fa80c60befb 100644
--- a/apps/files_sharing/l10n/ca.json
+++ b/apps/files_sharing/l10n/ca.json
@@ -36,7 +36,6 @@
"Add to your ownCloud" : "Afegiu a ownCloud",
"Download" : "Baixa",
"Download %s" : "Baixa %s",
- "Direct link" : "Enllaç directe",
- "Open documentation" : "Obre la documentació"
+ "Direct link" : "Enllaç directe"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js
index 3394608fd6f..2f82224e276 100644
--- a/apps/files_sharing/l10n/cs_CZ.js
+++ b/apps/files_sharing/l10n/cs_CZ.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Obdržel(a) jsi \"/%2$s\" jako vzdálené sdílení od %1$s",
"Accept" : "Přijmout",
"Decline" : "Zamítnout",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID",
"This share is password-protected" : "Toto sdílení je chráněno heslem",
"The password is wrong. Try again." : "Heslo není správné. Zkuste to znovu.",
"Password" : "Heslo",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Přidat do svého ownCloudu",
"Download" : "Stáhnout",
"Download %s" : "Stáhnout %s",
- "Direct link" : "Přímý odkaz",
- "Federated Cloud Sharing" : "Propojené cloudové sdílení",
- "Open documentation" : "Otevřít dokumentaci",
- "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
- "Allow users on this server to receive shares from other servers" : "Povolit uživatelům z tohoto serveru přijímat sdílení z jiných serverů",
- "Federated Cloud" : "Sdružený cloud",
- "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
- "Share it:" : "Sdílet:",
- "Add to your website" : "Přidat na svou webovou stránku",
- "Share with me via ownCloud" : "Sdíleno se mnou přes ownCloud",
- "HTML Code:" : "HTML kód:"
+ "Direct link" : "Přímý odkaz"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json
index d193eb69373..060a7af4154 100644
--- a/apps/files_sharing/l10n/cs_CZ.json
+++ b/apps/files_sharing/l10n/cs_CZ.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Obdržel(a) jsi \"/%2$s\" jako vzdálené sdílení od %1$s",
"Accept" : "Přijmout",
"Decline" : "Zamítnout",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID, více na %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Sdílej se mnou pomocí mého #ownCloud sdruženého cloud ID",
"This share is password-protected" : "Toto sdílení je chráněno heslem",
"The password is wrong. Try again." : "Heslo není správné. Zkuste to znovu.",
"Password" : "Heslo",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Přidat do svého ownCloudu",
"Download" : "Stáhnout",
"Download %s" : "Stáhnout %s",
- "Direct link" : "Přímý odkaz",
- "Federated Cloud Sharing" : "Propojené cloudové sdílení",
- "Open documentation" : "Otevřít dokumentaci",
- "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery",
- "Allow users on this server to receive shares from other servers" : "Povolit uživatelům z tohoto serveru přijímat sdílení z jiných serverů",
- "Federated Cloud" : "Sdružený cloud",
- "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:",
- "Share it:" : "Sdílet:",
- "Add to your website" : "Přidat na svou webovou stránku",
- "Share with me via ownCloud" : "Sdíleno se mnou přes ownCloud",
- "HTML Code:" : "HTML kód:"
+ "Direct link" : "Přímý odkaz"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/da.js b/apps/files_sharing/l10n/da.js
index b981022986a..8ecd981af45 100644
--- a/apps/files_sharing/l10n/da.js
+++ b/apps/files_sharing/l10n/da.js
@@ -56,8 +56,6 @@ OC.L10N.register(
"Shares" : "Delt",
"Accept" : "Acceptér",
"Decline" : "Afvis",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med mig gennem min #ownCloud Federated Cloud ID, se %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Del med mig gennem min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Delingen er beskyttet af kodeord",
"The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.",
"Password" : "Kodeord",
@@ -73,16 +71,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Tilføj til din ownCload",
"Download" : "Hent",
"Download %s" : "Hent %s",
- "Direct link" : "Direkte link",
- "Federated Cloud Sharing" : "Sammensluttet Cloud deling",
- "Open documentation" : "Åben dokumentation",
- "Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere",
- "Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Din Federated Cloud ID:",
- "Share it:" : "Del:",
- "Add to your website" : "Tilføj til dit websted",
- "Share with me via ownCloud" : "Del med mig gennem ownCloud",
- "HTML Code:" : "HTMLkode:"
+ "Direct link" : "Direkte link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/da.json b/apps/files_sharing/l10n/da.json
index 38f98ca22b8..d68cdfb0452 100644
--- a/apps/files_sharing/l10n/da.json
+++ b/apps/files_sharing/l10n/da.json
@@ -54,8 +54,6 @@
"Shares" : "Delt",
"Accept" : "Acceptér",
"Decline" : "Afvis",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med mig gennem min #ownCloud Federated Cloud ID, se %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Del med mig gennem min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Delingen er beskyttet af kodeord",
"The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.",
"Password" : "Kodeord",
@@ -71,16 +69,6 @@
"Add to your ownCloud" : "Tilføj til din ownCload",
"Download" : "Hent",
"Download %s" : "Hent %s",
- "Direct link" : "Direkte link",
- "Federated Cloud Sharing" : "Sammensluttet Cloud deling",
- "Open documentation" : "Åben dokumentation",
- "Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere",
- "Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Din Federated Cloud ID:",
- "Share it:" : "Del:",
- "Add to your website" : "Tilføj til dit websted",
- "Share with me via ownCloud" : "Del med mig gennem ownCloud",
- "HTML Code:" : "HTMLkode:"
+ "Direct link" : "Direkte link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js
index 6526012e24a..cb14c5e010f 100644
--- a/apps/files_sharing/l10n/de.js
+++ b/apps/files_sharing/l10n/de.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Du empfängst \"/%2$s\" als Remotefreigabe von %1$s",
"Accept" : "Ok",
"Decline" : "Abgelehnt",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID",
"This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." : "Bitte überprüfe Dein Passwort und versuche es erneut.",
"Password" : "Passwort",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Zu Deiner ownCloud hinzufügen",
"Download" : "Herunterladen",
"Download %s" : "Download %s",
- "Direct link" : "Direkter Link",
- "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
- "Open documentation" : "Dokumentation öffnen",
- "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
- "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:",
- "Share it:" : "Zum Teilen:",
- "Add to your website" : "Zu deiner Webseite hinzufügen",
- "Share with me via ownCloud" : "Teile mit mir über ownCloud",
- "HTML Code:" : "HTML-Code:"
+ "Direct link" : "Direkter Link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json
index f9d6118769c..4306e96c20a 100644
--- a/apps/files_sharing/l10n/de.json
+++ b/apps/files_sharing/l10n/de.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Du empfängst \"/%2$s\" als Remotefreigabe von %1$s",
"Accept" : "Ok",
"Decline" : "Abgelehnt",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Teile mit mir über meine #ownCloud Federated-Cloud-ID",
"This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." : "Bitte überprüfe Dein Passwort und versuche es erneut.",
"Password" : "Passwort",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Zu Deiner ownCloud hinzufügen",
"Download" : "Herunterladen",
"Download %s" : "Download %s",
- "Direct link" : "Direkter Link",
- "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
- "Open documentation" : "Dokumentation öffnen",
- "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
- "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:",
- "Share it:" : "Zum Teilen:",
- "Add to your website" : "Zu deiner Webseite hinzufügen",
- "Share with me via ownCloud" : "Teile mit mir über ownCloud",
- "HTML Code:" : "HTML-Code:"
+ "Direct link" : "Direkter Link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/de_AT.js b/apps/files_sharing/l10n/de_AT.js
index fdbbbee12f0..4f3c622fcce 100644
--- a/apps/files_sharing/l10n/de_AT.js
+++ b/apps/files_sharing/l10n/de_AT.js
@@ -9,6 +9,7 @@ OC.L10N.register(
"%2$s shared %1$s with you" : "%2$s hat %1$s mit dir geteilt",
"Shares" : "teilt",
"Password" : "Passwort",
+ "Name" : "Name",
"Download" : "Herunterladen"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/de_AT.json b/apps/files_sharing/l10n/de_AT.json
index 5cda52d6358..c6e2724f33d 100644
--- a/apps/files_sharing/l10n/de_AT.json
+++ b/apps/files_sharing/l10n/de_AT.json
@@ -7,6 +7,7 @@
"%2$s shared %1$s with you" : "%2$s hat %1$s mit dir geteilt",
"Shares" : "teilt",
"Password" : "Passwort",
+ "Name" : "Name",
"Download" : "Herunterladen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js
index aaa93baf2f0..269c0bb208e 100644
--- a/apps/files_sharing/l10n/de_DE.js
+++ b/apps/files_sharing/l10n/de_DE.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Sie haben \"/%2$s\" als Remotefreigabe von %1$s erhalten",
"Accept" : "Akzeptieren",
"Decline" : "Ablehnen",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID",
"This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
"Password" : "Passwort",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Zu Ihrer ownCloud hinzufügen",
"Download" : "Herunterladen",
"Download %s" : "Download %s",
- "Direct link" : "Direkte Verlinkung",
- "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
- "Open documentation" : "Dokumentation öffnen",
- "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
- "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
- "Share it:" : "Zum Teilen:",
- "Add to your website" : "Zu Ihrer Website hinzufügen",
- "Share with me via ownCloud" : "Teilen Sie mit mir über ownCloud",
- "HTML Code:" : "HTML-Code:"
+ "Direct link" : "Direkte Verlinkung"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json
index 24bb6c43cdb..f2952f3db60 100644
--- a/apps/files_sharing/l10n/de_DE.json
+++ b/apps/files_sharing/l10n/de_DE.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Sie haben \"/%2$s\" als Remotefreigabe von %1$s erhalten",
"Accept" : "Akzeptieren",
"Decline" : "Ablehnen",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID, siehe %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Teilen Sie mit mir über meine #ownCloud Federated-Cloud-ID",
"This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
"Password" : "Passwort",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Zu Ihrer ownCloud hinzufügen",
"Download" : "Herunterladen",
"Download %s" : "Download %s",
- "Direct link" : "Direkte Verlinkung",
- "Federated Cloud Sharing" : "Federated-Cloud-Sharing",
- "Open documentation" : "Dokumentation öffnen",
- "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben",
- "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:",
- "Share it:" : "Zum Teilen:",
- "Add to your website" : "Zu Ihrer Website hinzufügen",
- "Share with me via ownCloud" : "Teilen Sie mit mir über ownCloud",
- "HTML Code:" : "HTML-Code:"
+ "Direct link" : "Direkte Verlinkung"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/el.js b/apps/files_sharing/l10n/el.js
index fe3a62c4357..1959036f6fc 100644
--- a/apps/files_sharing/l10n/el.js
+++ b/apps/files_sharing/l10n/el.js
@@ -54,8 +54,6 @@ OC.L10N.register(
"Shares" : "Κοινόχρηστοι φάκελοι",
"Accept" : "Αποδοχή",
"Decline" : "Απόρριψη",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου",
"This share is password-protected" : "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό",
"The password is wrong. Try again." : "Εσφαλμένος κωδικός πρόσβασης. Προσπαθήστε ξανά.",
"Password" : "Κωδικός πρόσβασης",
@@ -71,16 +69,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Προσθήκη στο ownCloud σου",
"Download" : "Λήψη",
"Download %s" : "Λήψη %s",
- "Direct link" : "Άμεσος σύνδεσμος",
- "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ",
- "Open documentation" : "Ανοιχτή τεκμηρίωση.",
- "Allow users on this server to send shares to other servers" : "Να επιτρέπεται σε χρήστες αυτού του διακομιστή να στέλνουν διαμοιρασμένους φακέλους σε άλλους διακομιστές",
- "Allow users on this server to receive shares from other servers" : "Να επιτρέπεται στους χρίστες του διακομιστή να λαμβάνουν διαμοιρασμένα αρχεία από άλλους διακομιστές",
- "Federated Cloud" : "Federated σύννεφο",
- "Your Federated Cloud ID:" : "Το ID σας στο Federated Cloud:",
- "Share it:" : "Μοιραστείτε το:",
- "Add to your website" : "Προσθήκη στην ιστοσελίδα σας",
- "Share with me via ownCloud" : "Διαμοιρασμός με εμένα μέσω του ",
- "HTML Code:" : "Κώδικας HTML:"
+ "Direct link" : "Άμεσος σύνδεσμος"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/el.json b/apps/files_sharing/l10n/el.json
index 3283aa0a029..c241c7613a1 100644
--- a/apps/files_sharing/l10n/el.json
+++ b/apps/files_sharing/l10n/el.json
@@ -52,8 +52,6 @@
"Shares" : "Κοινόχρηστοι φάκελοι",
"Accept" : "Αποδοχή",
"Decline" : "Απόρριψη",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου, δείτε %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Διαμοιρασμός με εμένα μέσω του #ownCloud Federated Cloud ID μου",
"This share is password-protected" : "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό",
"The password is wrong. Try again." : "Εσφαλμένος κωδικός πρόσβασης. Προσπαθήστε ξανά.",
"Password" : "Κωδικός πρόσβασης",
@@ -69,16 +67,6 @@
"Add to your ownCloud" : "Προσθήκη στο ownCloud σου",
"Download" : "Λήψη",
"Download %s" : "Λήψη %s",
- "Direct link" : "Άμεσος σύνδεσμος",
- "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ",
- "Open documentation" : "Ανοιχτή τεκμηρίωση.",
- "Allow users on this server to send shares to other servers" : "Να επιτρέπεται σε χρήστες αυτού του διακομιστή να στέλνουν διαμοιρασμένους φακέλους σε άλλους διακομιστές",
- "Allow users on this server to receive shares from other servers" : "Να επιτρέπεται στους χρίστες του διακομιστή να λαμβάνουν διαμοιρασμένα αρχεία από άλλους διακομιστές",
- "Federated Cloud" : "Federated σύννεφο",
- "Your Federated Cloud ID:" : "Το ID σας στο Federated Cloud:",
- "Share it:" : "Μοιραστείτε το:",
- "Add to your website" : "Προσθήκη στην ιστοσελίδα σας",
- "Share with me via ownCloud" : "Διαμοιρασμός με εμένα μέσω του ",
- "HTML Code:" : "Κώδικας HTML:"
+ "Direct link" : "Άμεσος σύνδεσμος"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/en_GB.js b/apps/files_sharing/l10n/en_GB.js
index 545934771bd..f8ba89b2fa0 100644
--- a/apps/files_sharing/l10n/en_GB.js
+++ b/apps/files_sharing/l10n/en_GB.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "You received \"/%2$s\" as a remote share from %1$s",
"Accept" : "Accept",
"Decline" : "Decline",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Share with me through my #ownCloud Federated Cloud ID, see %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Share with me through my #ownCloud Federated Cloud ID",
"This share is password-protected" : "This share is password-protected",
"The password is wrong. Try again." : "The password is wrong. Try again.",
"Password" : "Password",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Add to your ownCloud",
"Download" : "Download",
"Download %s" : "Download %s",
- "Direct link" : "Direct link",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Open documentation",
- "Allow users on this server to send shares to other servers" : "Allow users on this server to send shares to other servers",
- "Allow users on this server to receive shares from other servers" : "Allow users on this server to receive shares from other servers",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Your Federated Cloud ID:",
- "Share it:" : "Share it:",
- "Add to your website" : "Add to your website",
- "Share with me via ownCloud" : "Share with me via ownCloud",
- "HTML Code:" : "HTML Code:"
+ "Direct link" : "Direct link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/en_GB.json b/apps/files_sharing/l10n/en_GB.json
index a478bb9301a..9ab2cabe562 100644
--- a/apps/files_sharing/l10n/en_GB.json
+++ b/apps/files_sharing/l10n/en_GB.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "You received \"/%2$s\" as a remote share from %1$s",
"Accept" : "Accept",
"Decline" : "Decline",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Share with me through my #ownCloud Federated Cloud ID, see %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Share with me through my #ownCloud Federated Cloud ID",
"This share is password-protected" : "This share is password-protected",
"The password is wrong. Try again." : "The password is wrong. Try again.",
"Password" : "Password",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Add to your ownCloud",
"Download" : "Download",
"Download %s" : "Download %s",
- "Direct link" : "Direct link",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Open documentation",
- "Allow users on this server to send shares to other servers" : "Allow users on this server to send shares to other servers",
- "Allow users on this server to receive shares from other servers" : "Allow users on this server to receive shares from other servers",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Your Federated Cloud ID:",
- "Share it:" : "Share it:",
- "Add to your website" : "Add to your website",
- "Share with me via ownCloud" : "Share with me via ownCloud",
- "HTML Code:" : "HTML Code:"
+ "Direct link" : "Direct link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/eo.js b/apps/files_sharing/l10n/eo.js
index bce9d7298b0..1656264fd57 100644
--- a/apps/files_sharing/l10n/eo.js
+++ b/apps/files_sharing/l10n/eo.js
@@ -66,8 +66,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Vi ricevis “/%2$s” kiel fora kunhavigo de %1$s",
"Accept" : "Akcepti",
"Decline" : "Malakcepti",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Kunhavigi kun mi per mia identigilo de #ownCloud-federnuba identigilo; vidu %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Kunhavigi kun mi per mia #ownCloud-federnuba identigilo",
"This share is password-protected" : "Ĉi tiu kunhavigo estas protektata per pasvorto",
"The password is wrong. Try again." : "La pasvorto malĝustas. Provu denove.",
"Password" : "Pasvorto",
@@ -83,14 +81,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Aldoni al via ownCloud",
"Download" : "Elŝuti",
"Download %s" : "Elŝuti %s",
- "Direct link" : "Direkta ligilo",
- "Federated Cloud Sharing" : "Federnuba kunhavado",
- "Open documentation" : "Malfermi la dokumentaron",
- "Federated Cloud" : "Federa nubo",
- "Your Federated Cloud ID:" : "Via federnuba identigilo:",
- "Share it:" : "Kunhavigi ĝin:",
- "Add to your website" : "Aldoni al via TTT-ejo",
- "Share with me via ownCloud" : "Kunhavigi kun mi per ownCloud",
- "HTML Code:" : "HTML-kodo:"
+ "Direct link" : "Direkta ligilo"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/eo.json b/apps/files_sharing/l10n/eo.json
index 63655bcea55..fb8793e6efc 100644
--- a/apps/files_sharing/l10n/eo.json
+++ b/apps/files_sharing/l10n/eo.json
@@ -64,8 +64,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Vi ricevis “/%2$s” kiel fora kunhavigo de %1$s",
"Accept" : "Akcepti",
"Decline" : "Malakcepti",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Kunhavigi kun mi per mia identigilo de #ownCloud-federnuba identigilo; vidu %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Kunhavigi kun mi per mia #ownCloud-federnuba identigilo",
"This share is password-protected" : "Ĉi tiu kunhavigo estas protektata per pasvorto",
"The password is wrong. Try again." : "La pasvorto malĝustas. Provu denove.",
"Password" : "Pasvorto",
@@ -81,14 +79,6 @@
"Add to your ownCloud" : "Aldoni al via ownCloud",
"Download" : "Elŝuti",
"Download %s" : "Elŝuti %s",
- "Direct link" : "Direkta ligilo",
- "Federated Cloud Sharing" : "Federnuba kunhavado",
- "Open documentation" : "Malfermi la dokumentaron",
- "Federated Cloud" : "Federa nubo",
- "Your Federated Cloud ID:" : "Via federnuba identigilo:",
- "Share it:" : "Kunhavigi ĝin:",
- "Add to your website" : "Aldoni al via TTT-ejo",
- "Share with me via ownCloud" : "Kunhavigi kun mi per ownCloud",
- "HTML Code:" : "HTML-kodo:"
+ "Direct link" : "Direkta ligilo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js
index 2dc3a69c2d0..70bc8e7e61c 100644
--- a/apps/files_sharing/l10n/es.js
+++ b/apps/files_sharing/l10n/es.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Acaba de recibir el siguiente enlace demoto \"/%2$s\" de %1$s",
"Accept" : "Aceptar",
"Decline" : "Denegar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud",
"This share is password-protected" : "Este elemento compartido está protegido por contraseña",
"The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" : "Contraseña",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Agregue su propio ownCloud",
"Download" : "Descargar",
"Download %s" : "Descargar %s",
- "Direct link" : "Enlace directo",
- "Federated Cloud Sharing" : "Compartido en Cloud Federado",
- "Open documentation" : "Documentación abierta",
- "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores",
- "Federated Cloud" : "Nube Federada",
- "Your Federated Cloud ID:" : "Su ID Nube Federada:",
- "Share it:" : "Compartir:",
- "Add to your website" : "Añadir a su sitio web",
- "Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Enlace directo"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json
index 40a16c5f25d..79e4713298a 100644
--- a/apps/files_sharing/l10n/es.json
+++ b/apps/files_sharing/l10n/es.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Acaba de recibir el siguiente enlace demoto \"/%2$s\" de %1$s",
"Accept" : "Aceptar",
"Decline" : "Denegar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud, ver %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID Nube Federada #ownCloud",
"This share is password-protected" : "Este elemento compartido está protegido por contraseña",
"The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" : "Contraseña",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Agregue su propio ownCloud",
"Download" : "Descargar",
"Download %s" : "Descargar %s",
- "Direct link" : "Enlace directo",
- "Federated Cloud Sharing" : "Compartido en Cloud Federado",
- "Open documentation" : "Documentación abierta",
- "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores",
- "Federated Cloud" : "Nube Federada",
- "Your Federated Cloud ID:" : "Su ID Nube Federada:",
- "Share it:" : "Compartir:",
- "Add to your website" : "Añadir a su sitio web",
- "Share with me via ownCloud" : "Compartirlo conmigo vía OwnCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Enlace directo"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/et_EE.js b/apps/files_sharing/l10n/et_EE.js
index 8e74001649b..8033c8706c2 100644
--- a/apps/files_sharing/l10n/et_EE.js
+++ b/apps/files_sharing/l10n/et_EE.js
@@ -54,13 +54,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Lisa oma ownCloudi",
"Download" : "Lae alla",
"Download %s" : "Laadi alla %s",
- "Direct link" : "Otsene link",
- "Open documentation" : "Ava dokumentatsioon",
- "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse",
- "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest",
- "Share it:" : "Jaga seda:",
- "Add to your website" : "Lisa oma veebisaidile",
- "Share with me via ownCloud" : "Jaga minuga läbi ownCloudiga",
- "HTML Code:" : "HTML kood:"
+ "Direct link" : "Otsene link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/et_EE.json b/apps/files_sharing/l10n/et_EE.json
index 08643648796..fc46f9dc0b8 100644
--- a/apps/files_sharing/l10n/et_EE.json
+++ b/apps/files_sharing/l10n/et_EE.json
@@ -52,13 +52,6 @@
"Add to your ownCloud" : "Lisa oma ownCloudi",
"Download" : "Lae alla",
"Download %s" : "Laadi alla %s",
- "Direct link" : "Otsene link",
- "Open documentation" : "Ava dokumentatsioon",
- "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse",
- "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest",
- "Share it:" : "Jaga seda:",
- "Add to your website" : "Lisa oma veebisaidile",
- "Share with me via ownCloud" : "Jaga minuga läbi ownCloudiga",
- "HTML Code:" : "HTML kood:"
+ "Direct link" : "Otsene link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/eu.js b/apps/files_sharing/l10n/eu.js
index e7e5220d3f3..ba5b3d1f709 100644
--- a/apps/files_sharing/l10n/eu.js
+++ b/apps/files_sharing/l10n/eu.js
@@ -49,9 +49,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Gehitu zure ownCloud-era",
"Download" : "Deskargatu",
"Download %s" : "Deskargatu %s",
- "Direct link" : "Lotura zuzena",
- "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea",
- "Allow users on this server to send shares to other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzariekin partekatzera",
- "Allow users on this server to receive shares from other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzarietatik partekatutakoak jasotzen"
+ "Direct link" : "Lotura zuzena"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/eu.json b/apps/files_sharing/l10n/eu.json
index 72e3b036323..9c2e2324f07 100644
--- a/apps/files_sharing/l10n/eu.json
+++ b/apps/files_sharing/l10n/eu.json
@@ -47,9 +47,6 @@
"Add to your ownCloud" : "Gehitu zure ownCloud-era",
"Download" : "Deskargatu",
"Download %s" : "Deskargatu %s",
- "Direct link" : "Lotura zuzena",
- "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea",
- "Allow users on this server to send shares to other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzariekin partekatzera",
- "Allow users on this server to receive shares from other servers" : "Baimendu zerbitzari honetako erabiltzaileak beste zerbitzarietatik partekatutakoak jasotzen"
+ "Direct link" : "Lotura zuzena"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/fa.js b/apps/files_sharing/l10n/fa.js
index b6cb143a3dd..45b0343d6df 100644
--- a/apps/files_sharing/l10n/fa.js
+++ b/apps/files_sharing/l10n/fa.js
@@ -44,8 +44,6 @@ OC.L10N.register(
"Add to your ownCloud" : "افزودن به ownCloud شما",
"Download" : "دانلود",
"Download %s" : "دانلود %s",
- "Direct link" : "پیوند مستقیم",
- "Open documentation" : "بازکردن مستند",
- "HTML Code:" : "کد HTML :"
+ "Direct link" : "پیوند مستقیم"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/fa.json b/apps/files_sharing/l10n/fa.json
index e3d73a7a633..ca60b238ba7 100644
--- a/apps/files_sharing/l10n/fa.json
+++ b/apps/files_sharing/l10n/fa.json
@@ -42,8 +42,6 @@
"Add to your ownCloud" : "افزودن به ownCloud شما",
"Download" : "دانلود",
"Download %s" : "دانلود %s",
- "Direct link" : "پیوند مستقیم",
- "Open documentation" : "بازکردن مستند",
- "HTML Code:" : "کد HTML :"
+ "Direct link" : "پیوند مستقیم"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/fi_FI.js b/apps/files_sharing/l10n/fi_FI.js
index 68b41feb46c..04d8a74e974 100644
--- a/apps/files_sharing/l10n/fi_FI.js
+++ b/apps/files_sharing/l10n/fi_FI.js
@@ -62,8 +62,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Vastaanotit kohteen \"/%2$s\" etäjakona käyttäjältä %1$s",
"Accept" : "Hyväksy",
"Decline" : "Kieltäydy",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta, katso %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta",
"This share is password-protected" : "Tämä jako on suojattu salasanalla",
"The password is wrong. Try again." : "Väärä salasana. Yritä uudelleen.",
"Password" : "Salasana",
@@ -79,16 +77,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Lisää ownCloudiisi",
"Download" : "Lataa",
"Download %s" : "Lataa %s",
- "Direct link" : "Suora linkki",
- "Federated Cloud Sharing" : "Federoitu pilvijakaminen",
- "Open documentation" : "Avaa dokumentaatio",
- "Allow users on this server to send shares to other servers" : "Salli tämän palvelimen käyttäjien lähettää jakoja muille palvelimille",
- "Allow users on this server to receive shares from other servers" : "Salli tämän palvelimen käyttäjien vastaanottaa jakoja muilta palvelimilta",
- "Federated Cloud" : "Federoitu pilvi",
- "Your Federated Cloud ID:" : "Federoidun pilvesi tunniste:",
- "Share it:" : "Jaa se:",
- "Add to your website" : "Lisää verkkosivuillesi",
- "Share with me via ownCloud" : "Jaa kanssani ownCloudin kautta",
- "HTML Code:" : "HTML-koodi:"
+ "Direct link" : "Suora linkki"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/fi_FI.json b/apps/files_sharing/l10n/fi_FI.json
index e1834ab3c0e..c2ded25771b 100644
--- a/apps/files_sharing/l10n/fi_FI.json
+++ b/apps/files_sharing/l10n/fi_FI.json
@@ -60,8 +60,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Vastaanotit kohteen \"/%2$s\" etäjakona käyttäjältä %1$s",
"Accept" : "Hyväksy",
"Decline" : "Kieltäydy",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta, katso %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Jaa kanssani käyttäen #ownCloud ja federoitua pilvitunnistetta",
"This share is password-protected" : "Tämä jako on suojattu salasanalla",
"The password is wrong. Try again." : "Väärä salasana. Yritä uudelleen.",
"Password" : "Salasana",
@@ -77,16 +75,6 @@
"Add to your ownCloud" : "Lisää ownCloudiisi",
"Download" : "Lataa",
"Download %s" : "Lataa %s",
- "Direct link" : "Suora linkki",
- "Federated Cloud Sharing" : "Federoitu pilvijakaminen",
- "Open documentation" : "Avaa dokumentaatio",
- "Allow users on this server to send shares to other servers" : "Salli tämän palvelimen käyttäjien lähettää jakoja muille palvelimille",
- "Allow users on this server to receive shares from other servers" : "Salli tämän palvelimen käyttäjien vastaanottaa jakoja muilta palvelimilta",
- "Federated Cloud" : "Federoitu pilvi",
- "Your Federated Cloud ID:" : "Federoidun pilvesi tunniste:",
- "Share it:" : "Jaa se:",
- "Add to your website" : "Lisää verkkosivuillesi",
- "Share with me via ownCloud" : "Jaa kanssani ownCloudin kautta",
- "HTML Code:" : "HTML-koodi:"
+ "Direct link" : "Suora linkki"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index e99dffcdcac..72275072598 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "L'utilisateur %1$s a partagé la ressource distante %2$s avec vous",
"Accept" : "Accepter",
"Decline" : "Refuser",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud",
"This share is password-protected" : "Ce partage est protégé par un mot de passe",
"The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.",
"Password" : "Mot de passe",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Ajouter à votre ownCloud",
"Download" : "Télécharger",
"Download %s" : "Télécharger %s",
- "Direct link" : "Lien direct",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Voir la documentation",
- "Allow users on this server to send shares to other servers" : "Autoriser les utilisateurs de ce serveur à envoyer des partages vers d'autres serveurs",
- "Allow users on this server to receive shares from other servers" : "Autoriser les utilisateurs de ce serveur à recevoir des partages d'autres serveurs",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :",
- "Share it:" : "Partager :",
- "Add to your website" : "Ajouter à votre site web",
- "Share with me via ownCloud" : "Partagez avec moi via ownCloud",
- "HTML Code:" : "Code HTML :"
+ "Direct link" : "Lien direct"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index c0c7b85bf96..03c39ca719f 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "L'utilisateur %1$s a partagé la ressource distante %2$s avec vous",
"Accept" : "Accepter",
"Decline" : "Refuser",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud",
"This share is password-protected" : "Ce partage est protégé par un mot de passe",
"The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.",
"Password" : "Mot de passe",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Ajouter à votre ownCloud",
"Download" : "Télécharger",
"Download %s" : "Télécharger %s",
- "Direct link" : "Lien direct",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Voir la documentation",
- "Allow users on this server to send shares to other servers" : "Autoriser les utilisateurs de ce serveur à envoyer des partages vers d'autres serveurs",
- "Allow users on this server to receive shares from other servers" : "Autoriser les utilisateurs de ce serveur à recevoir des partages d'autres serveurs",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :",
- "Share it:" : "Partager :",
- "Add to your website" : "Ajouter à votre site web",
- "Share with me via ownCloud" : "Partagez avec moi via ownCloud",
- "HTML Code:" : "Code HTML :"
+ "Direct link" : "Lien direct"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/gl.js b/apps/files_sharing/l10n/gl.js
index 7d4028f0bad..2430b2555f6 100644
--- a/apps/files_sharing/l10n/gl.js
+++ b/apps/files_sharing/l10n/gl.js
@@ -42,8 +42,6 @@ OC.L10N.register(
"%2$s shared %1$s with you" : "%2$s compartiu %1$s con vostede",
"Shares" : "Comparticións",
"Accept" : "Aceptar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
"This share is password-protected" : "Esta compartición está protexida con contrasinal",
"The password is wrong. Try again." : "O contrasinal é incorrecto. Ténteo de novo.",
"Password" : "Contrasinal",
@@ -59,15 +57,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Engadir ao seu ownCloud",
"Download" : "Descargar",
"Download %s" : "Descargar %s",
- "Direct link" : "Ligazón directa",
- "Federated Cloud Sharing" : "Nube federada compartida",
- "Open documentation" : "Abrir a documentación",
- "Allow users on this server to send shares to other servers" : "Permitir aos usuarios deste servidor enviar comparticións a outros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir aos usuarios deste servidor recibir comparticións de outros servidores",
- "Federated Cloud" : "Nube federada",
- "Your Federated Cloud ID:" : "ID da súa nube federada:",
- "Share it:" : "Compártao:",
- "Share with me via ownCloud" : "Comparte comigo a través do ownCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Ligazón directa"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/gl.json b/apps/files_sharing/l10n/gl.json
index a6aa34d14cb..fc8b8b8f6f7 100644
--- a/apps/files_sharing/l10n/gl.json
+++ b/apps/files_sharing/l10n/gl.json
@@ -40,8 +40,6 @@
"%2$s shared %1$s with you" : "%2$s compartiu %1$s con vostede",
"Shares" : "Comparticións",
"Accept" : "Aceptar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Comparte comigo a través do meu ID da nube federada do #ownCloud , vexa %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Comparte comigo a través do meu ID da nube federada do #ownCloud",
"This share is password-protected" : "Esta compartición está protexida con contrasinal",
"The password is wrong. Try again." : "O contrasinal é incorrecto. Ténteo de novo.",
"Password" : "Contrasinal",
@@ -57,15 +55,6 @@
"Add to your ownCloud" : "Engadir ao seu ownCloud",
"Download" : "Descargar",
"Download %s" : "Descargar %s",
- "Direct link" : "Ligazón directa",
- "Federated Cloud Sharing" : "Nube federada compartida",
- "Open documentation" : "Abrir a documentación",
- "Allow users on this server to send shares to other servers" : "Permitir aos usuarios deste servidor enviar comparticións a outros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir aos usuarios deste servidor recibir comparticións de outros servidores",
- "Federated Cloud" : "Nube federada",
- "Your Federated Cloud ID:" : "ID da súa nube federada:",
- "Share it:" : "Compártao:",
- "Share with me via ownCloud" : "Comparte comigo a través do ownCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Ligazón directa"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/he.js b/apps/files_sharing/l10n/he.js
index b0be1d34c97..2b4d4966254 100644
--- a/apps/files_sharing/l10n/he.js
+++ b/apps/files_sharing/l10n/he.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "קבלת \"/%2$s\" כשיתוף חיצוני מאת %1$s",
"Accept" : "אישור",
"Decline" : "סירוב",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי, ניתן לראות %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי",
"This share is password-protected" : "שיתוף זה מוגן סיסמא",
"The password is wrong. Try again." : "הסיסמא שגויה. יש לנסות שנית.",
"Password" : "סיסמא",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "הוספה ל- ownCloud שלך",
"Download" : "הורדה",
"Download %s" : "הורדה %s",
- "Direct link" : "קישור ישיר",
- "Federated Cloud Sharing" : "ענן שיתוף מאוגד",
- "Open documentation" : "תיעוד פתוח",
- "Allow users on this server to send shares to other servers" : "מאפשר למשתמשים בשרת זה לשלוח שיתופים לשרתים אחרים",
- "Allow users on this server to receive shares from other servers" : "מאפשר למשתמשים בשרת זה לקבל שיתופים משרתים אחרים",
- "Federated Cloud" : "ענן מאוגד",
- "Your Federated Cloud ID:" : "מספר זיהוי הענן המאוגד שלך:",
- "Share it:" : "שיתוף שלו:",
- "Add to your website" : "הוספה לאתר האינטרנט שלך",
- "Share with me via ownCloud" : "שיתוף איתי באמצעות ownCloud",
- "HTML Code:" : "קוד HTML:"
+ "Direct link" : "קישור ישיר"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/he.json b/apps/files_sharing/l10n/he.json
index de1cfff07b5..411bebd4d01 100644
--- a/apps/files_sharing/l10n/he.json
+++ b/apps/files_sharing/l10n/he.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "קבלת \"/%2$s\" כשיתוף חיצוני מאת %1$s",
"Accept" : "אישור",
"Decline" : "סירוב",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי, ניתן לראות %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "שיתוף איתי באמצעות מספר זהות שרת ה- #ownCloud המאוגד שלי",
"This share is password-protected" : "שיתוף זה מוגן סיסמא",
"The password is wrong. Try again." : "הסיסמא שגויה. יש לנסות שנית.",
"Password" : "סיסמא",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "הוספה ל- ownCloud שלך",
"Download" : "הורדה",
"Download %s" : "הורדה %s",
- "Direct link" : "קישור ישיר",
- "Federated Cloud Sharing" : "ענן שיתוף מאוגד",
- "Open documentation" : "תיעוד פתוח",
- "Allow users on this server to send shares to other servers" : "מאפשר למשתמשים בשרת זה לשלוח שיתופים לשרתים אחרים",
- "Allow users on this server to receive shares from other servers" : "מאפשר למשתמשים בשרת זה לקבל שיתופים משרתים אחרים",
- "Federated Cloud" : "ענן מאוגד",
- "Your Federated Cloud ID:" : "מספר זיהוי הענן המאוגד שלך:",
- "Share it:" : "שיתוף שלו:",
- "Add to your website" : "הוספה לאתר האינטרנט שלך",
- "Share with me via ownCloud" : "שיתוף איתי באמצעות ownCloud",
- "HTML Code:" : "קוד HTML:"
+ "Direct link" : "קישור ישיר"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/hu_HU.js b/apps/files_sharing/l10n/hu_HU.js
index d76fa12435e..7febea97b6e 100644
--- a/apps/files_sharing/l10n/hu_HU.js
+++ b/apps/files_sharing/l10n/hu_HU.js
@@ -55,8 +55,6 @@ OC.L10N.register(
"Shares" : "Megosztások",
"Accept" : "Elfogadás",
"Decline" : "Elutasítás",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
@@ -72,16 +70,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Adjuk hozzá a saját ownCloudunkhoz",
"Download" : "Letöltés",
"Download %s" : "%s letöltése",
- "Direct link" : "Közvetlen link",
- "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
- "Open documentation" : "Dokumentáció megnyitása",
- "Allow users on this server to send shares to other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy fájlokat osszanak meg más szerverekkel.",
- "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől",
- "Federated Cloud" : "Egyesített felhő",
- "Your Federated Cloud ID:" : "Egyesített felhő azonosító:",
- "Share it:" : "Ossza meg:",
- "Add to your website" : "Adja hozzá saját weboldalához",
- "Share with me via ownCloud" : "Ossza meg velem ownCloud-on keresztül",
- "HTML Code:" : "HTML kód:"
+ "Direct link" : "Közvetlen link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/hu_HU.json b/apps/files_sharing/l10n/hu_HU.json
index 242961a1960..9fb55800e75 100644
--- a/apps/files_sharing/l10n/hu_HU.json
+++ b/apps/files_sharing/l10n/hu_HU.json
@@ -53,8 +53,6 @@
"Shares" : "Megosztások",
"Accept" : "Elfogadás",
"Decline" : "Elutasítás",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével, lásd %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Ossza meg velem az #ownCloud Egyesített Felhő Azonosító segítségével ",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
@@ -70,16 +68,6 @@
"Add to your ownCloud" : "Adjuk hozzá a saját ownCloudunkhoz",
"Download" : "Letöltés",
"Download %s" : "%s letöltése",
- "Direct link" : "Közvetlen link",
- "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
- "Open documentation" : "Dokumentáció megnyitása",
- "Allow users on this server to send shares to other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy fájlokat osszanak meg más szerverekkel.",
- "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől",
- "Federated Cloud" : "Egyesített felhő",
- "Your Federated Cloud ID:" : "Egyesített felhő azonosító:",
- "Share it:" : "Ossza meg:",
- "Add to your website" : "Adja hozzá saját weboldalához",
- "Share with me via ownCloud" : "Ossza meg velem ownCloud-on keresztül",
- "HTML Code:" : "HTML kód:"
+ "Direct link" : "Közvetlen link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/id.js b/apps/files_sharing/l10n/id.js
index 837c0cfa843..5c182bd1a8a 100644
--- a/apps/files_sharing/l10n/id.js
+++ b/apps/files_sharing/l10n/id.js
@@ -54,8 +54,6 @@ OC.L10N.register(
"Shares" : "Dibagikan",
"Accept" : "Terima",
"Decline" : "Tolak",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya",
"This share is password-protected" : "Berbagi ini dilindungi sandi",
"The password is wrong. Try again." : "Sandi salah. Coba lagi",
"Password" : "Sandi",
@@ -71,16 +69,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Tambahkan ke ownCloud Anda",
"Download" : "Unduh",
"Download %s" : "Unduh %s",
- "Direct link" : "Tautan langsung",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Buka dokumentasi",
- "Allow users on this server to send shares to other servers" : "Izinkan para pengguna di server ini untuk mengirimkan berbagi ke server lainnya.",
- "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Federated Cloud ID Anda:",
- "Share it:" : "Bagikan:",
- "Add to your website" : "Tambahkan pada situs web Anda",
- "Share with me via ownCloud" : "Dibagikan pada saya via ownCloud",
- "HTML Code:" : "Kode HTML:"
+ "Direct link" : "Tautan langsung"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/id.json b/apps/files_sharing/l10n/id.json
index 40789ec9355..739719b460e 100644
--- a/apps/files_sharing/l10n/id.json
+++ b/apps/files_sharing/l10n/id.json
@@ -52,8 +52,6 @@
"Shares" : "Dibagikan",
"Accept" : "Terima",
"Decline" : "Tolak",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya",
"This share is password-protected" : "Berbagi ini dilindungi sandi",
"The password is wrong. Try again." : "Sandi salah. Coba lagi",
"Password" : "Sandi",
@@ -69,16 +67,6 @@
"Add to your ownCloud" : "Tambahkan ke ownCloud Anda",
"Download" : "Unduh",
"Download %s" : "Unduh %s",
- "Direct link" : "Tautan langsung",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Buka dokumentasi",
- "Allow users on this server to send shares to other servers" : "Izinkan para pengguna di server ini untuk mengirimkan berbagi ke server lainnya.",
- "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Federated Cloud ID Anda:",
- "Share it:" : "Bagikan:",
- "Add to your website" : "Tambahkan pada situs web Anda",
- "Share with me via ownCloud" : "Dibagikan pada saya via ownCloud",
- "HTML Code:" : "Kode HTML:"
+ "Direct link" : "Tautan langsung"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/is.js b/apps/files_sharing/l10n/is.js
index 1b5e7e23be1..b4bf1168ef1 100644
--- a/apps/files_sharing/l10n/is.js
+++ b/apps/files_sharing/l10n/is.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Þú tókst við \"/%2$s\" sem fjartengdri sameign frá %1$s",
"Accept" : "Samþykkja",
"Decline" : "Hafna",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID, sjá %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID",
"This share is password-protected" : "Þessi sameign er varin með lykilorði",
"The password is wrong. Try again." : "Lykilorðið er rangt. Reyndu aftur.",
"Password" : "Lykilorð",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Bæta í þitt eigið ownCloud",
"Download" : "Niðurhal",
"Download %s" : "Sækja %s",
- "Direct link" : "Beinn tengill",
- "Federated Cloud Sharing" : "Deiling með skýjasambandi",
- "Open documentation" : "Opna hjálparskjöl",
- "Allow users on this server to send shares to other servers" : "Leyfa notendum á þessum þjóni að senda sameignir til annarra þjóna",
- "Allow users on this server to receive shares from other servers" : "Leyfa notendum á þessum þjóni að taka á móti sameignum frá öðrum þjónum",
- "Federated Cloud" : "Skýjasamband (federated)",
- "Your Federated Cloud ID:" : "Skýjasambandsauðkennið þitt (Federated Cloud ID):",
- "Share it:" : "Deila því:",
- "Add to your website" : "Bæta við vefsvæðið þitt",
- "Share with me via ownCloud" : "Deila með mér í gegnum ownCloud",
- "HTML Code:" : "HTML-kóði:"
+ "Direct link" : "Beinn tengill"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/files_sharing/l10n/is.json b/apps/files_sharing/l10n/is.json
index c80c91d55dc..e2b10c4de87 100644
--- a/apps/files_sharing/l10n/is.json
+++ b/apps/files_sharing/l10n/is.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Þú tókst við \"/%2$s\" sem fjartengdri sameign frá %1$s",
"Accept" : "Samþykkja",
"Decline" : "Hafna",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID, sjá %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #ownCloud Federated Cloud ID",
"This share is password-protected" : "Þessi sameign er varin með lykilorði",
"The password is wrong. Try again." : "Lykilorðið er rangt. Reyndu aftur.",
"Password" : "Lykilorð",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Bæta í þitt eigið ownCloud",
"Download" : "Niðurhal",
"Download %s" : "Sækja %s",
- "Direct link" : "Beinn tengill",
- "Federated Cloud Sharing" : "Deiling með skýjasambandi",
- "Open documentation" : "Opna hjálparskjöl",
- "Allow users on this server to send shares to other servers" : "Leyfa notendum á þessum þjóni að senda sameignir til annarra þjóna",
- "Allow users on this server to receive shares from other servers" : "Leyfa notendum á þessum þjóni að taka á móti sameignum frá öðrum þjónum",
- "Federated Cloud" : "Skýjasamband (federated)",
- "Your Federated Cloud ID:" : "Skýjasambandsauðkennið þitt (Federated Cloud ID):",
- "Share it:" : "Deila því:",
- "Add to your website" : "Bæta við vefsvæðið þitt",
- "Share with me via ownCloud" : "Deila með mér í gegnum ownCloud",
- "HTML Code:" : "HTML-kóði:"
+ "Direct link" : "Beinn tengill"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js
index 93adc336604..6355c5c2c64 100644
--- a/apps/files_sharing/l10n/it.js
+++ b/apps/files_sharing/l10n/it.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Hai ricevuto \"/%2$s\" come condivisione remota da %1$s",
"Accept" : "Accetta",
"Decline" : "Rifiuta",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud, vedi %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud",
"This share is password-protected" : "Questa condivisione è protetta da password",
"The password is wrong. Try again." : "La password è errata. Prova ancora.",
"Password" : "Password",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Aggiungi al tuo ownCloud",
"Download" : "Scarica",
"Download %s" : "Scarica %s",
- "Direct link" : "Collegamento diretto",
- "Federated Cloud Sharing" : "Condivisione cloud federata",
- "Open documentation" : "Apri la documentazione",
- "Allow users on this server to send shares to other servers" : "Consenti agli utenti su questo server di inviare condivisioni ad altri server",
- "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server",
- "Federated Cloud" : "Cloud federata",
- "Your Federated Cloud ID:" : "Il tuo ID di cloud federata:",
- "Share it:" : "Condividilo:",
- "Add to your website" : "Aggiungilo al tuo sito web",
- "Share with me via ownCloud" : "Condividi con me tramite ownCloud",
- "HTML Code:" : "Codice HTML:"
+ "Direct link" : "Collegamento diretto"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json
index d95f35be0a9..44c1f8f784a 100644
--- a/apps/files_sharing/l10n/it.json
+++ b/apps/files_sharing/l10n/it.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Hai ricevuto \"/%2$s\" come condivisione remota da %1$s",
"Accept" : "Accetta",
"Decline" : "Rifiuta",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud, vedi %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Condividi con me attraverso il mio ID di cloud federata #ownCloud",
"This share is password-protected" : "Questa condivisione è protetta da password",
"The password is wrong. Try again." : "La password è errata. Prova ancora.",
"Password" : "Password",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Aggiungi al tuo ownCloud",
"Download" : "Scarica",
"Download %s" : "Scarica %s",
- "Direct link" : "Collegamento diretto",
- "Federated Cloud Sharing" : "Condivisione cloud federata",
- "Open documentation" : "Apri la documentazione",
- "Allow users on this server to send shares to other servers" : "Consenti agli utenti su questo server di inviare condivisioni ad altri server",
- "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server",
- "Federated Cloud" : "Cloud federata",
- "Your Federated Cloud ID:" : "Il tuo ID di cloud federata:",
- "Share it:" : "Condividilo:",
- "Add to your website" : "Aggiungilo al tuo sito web",
- "Share with me via ownCloud" : "Condividi con me tramite ownCloud",
- "HTML Code:" : "Codice HTML:"
+ "Direct link" : "Collegamento diretto"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js
index 3af2b548dfe..a643bf7f445 100644
--- a/apps/files_sharing/l10n/ja.js
+++ b/apps/files_sharing/l10n/ja.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s からリモート共有として \"/%2$s\" を受け取りました。",
"Accept" : "承諾",
"Decline" : "拒否《はてなキーワード》",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
- "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
"This share is password-protected" : "この共有はパスワードで保護されています",
"The password is wrong. Try again." : "パスワードが間違っています。再試行してください。",
"Password" : "パスワード",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "ownCloud に追加",
"Download" : "ダウンロード",
"Download %s" : "%s をダウンロード",
- "Direct link" : "リンク",
- "Federated Cloud Sharing" : "統合されたクラウド共有",
- "Open documentation" : "ドキュメントを開く",
- "Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する",
- "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する",
- "Federated Cloud" : "クラウド連携",
- "Your Federated Cloud ID:" : "あなたのクラウド連携ID:",
- "Share it:" : "以下で共有:",
- "Add to your website" : "ウェブサイトに追加",
- "Share with me via ownCloud" : "OwnCloud経由で共有",
- "HTML Code:" : "HTMLコード:"
+ "Direct link" : "リンク"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json
index 5d36081daf3..a7adc456d9f 100644
--- a/apps/files_sharing/l10n/ja.json
+++ b/apps/files_sharing/l10n/ja.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s からリモート共有として \"/%2$s\" を受け取りました。",
"Accept" : "承諾",
"Decline" : "拒否《はてなキーワード》",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
- "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
"This share is password-protected" : "この共有はパスワードで保護されています",
"The password is wrong. Try again." : "パスワードが間違っています。再試行してください。",
"Password" : "パスワード",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "ownCloud に追加",
"Download" : "ダウンロード",
"Download %s" : "%s をダウンロード",
- "Direct link" : "リンク",
- "Federated Cloud Sharing" : "統合されたクラウド共有",
- "Open documentation" : "ドキュメントを開く",
- "Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する",
- "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する",
- "Federated Cloud" : "クラウド連携",
- "Your Federated Cloud ID:" : "あなたのクラウド連携ID:",
- "Share it:" : "以下で共有:",
- "Add to your website" : "ウェブサイトに追加",
- "Share with me via ownCloud" : "OwnCloud経由で共有",
- "HTML Code:" : "HTMLコード:"
+ "Direct link" : "リンク"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ko.js b/apps/files_sharing/l10n/ko.js
index ff2a630c569..a9c6b58011e 100644
--- a/apps/files_sharing/l10n/ko.js
+++ b/apps/files_sharing/l10n/ko.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s에서 원격 공유로 \"/%2$s\"을(를) 받음",
"Accept" : "수락",
"Decline" : "거절",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨",
"This share is password-protected" : "이 공유는 암호로 보호되어 있습니다",
"The password is wrong. Try again." : "암호가 잘못되었습니다. 다시 입력해 주십시오.",
"Password" : "암호",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "내 ownCloud에 추가하기",
"Download" : "다운로드",
"Download %s" : "%s 다운로드",
- "Direct link" : "직접 링크",
- "Federated Cloud Sharing" : "클라우드 연합 공유",
- "Open documentation" : "문서 열기",
- "Allow users on this server to send shares to other servers" : "이 서버의 사용자가 다른 서버와 공유할 수 있도록 허용",
- "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용",
- "Federated Cloud" : "연합 클라우드",
- "Your Federated Cloud ID:" : "내 연합 클라우드 ID:",
- "Share it:" : "공유하기:",
- "Add to your website" : "내 웹 사이트에 추가",
- "Share with me via ownCloud" : "ownCloud로 나와 공유하기",
- "HTML Code:" : "HTML 코드:"
+ "Direct link" : "직접 링크"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/ko.json b/apps/files_sharing/l10n/ko.json
index 727265c259f..326ea68b1b3 100644
--- a/apps/files_sharing/l10n/ko.json
+++ b/apps/files_sharing/l10n/ko.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s에서 원격 공유로 \"/%2$s\"을(를) 받음",
"Accept" : "수락",
"Decline" : "거절",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "내 #ownCloud 연합 클라우드 ID를 통해서 공유됨",
"This share is password-protected" : "이 공유는 암호로 보호되어 있습니다",
"The password is wrong. Try again." : "암호가 잘못되었습니다. 다시 입력해 주십시오.",
"Password" : "암호",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "내 ownCloud에 추가하기",
"Download" : "다운로드",
"Download %s" : "%s 다운로드",
- "Direct link" : "직접 링크",
- "Federated Cloud Sharing" : "클라우드 연합 공유",
- "Open documentation" : "문서 열기",
- "Allow users on this server to send shares to other servers" : "이 서버의 사용자가 다른 서버와 공유할 수 있도록 허용",
- "Allow users on this server to receive shares from other servers" : "이 서버의 사용자가 다른 서버에서 공유한 파일을 받을 수 있도록 허용",
- "Federated Cloud" : "연합 클라우드",
- "Your Federated Cloud ID:" : "내 연합 클라우드 ID:",
- "Share it:" : "공유하기:",
- "Add to your website" : "내 웹 사이트에 추가",
- "Share with me via ownCloud" : "ownCloud로 나와 공유하기",
- "HTML Code:" : "HTML 코드:"
+ "Direct link" : "직접 링크"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/lb.js b/apps/files_sharing/l10n/lb.js
index deaddb26139..fcbfd04c64f 100644
--- a/apps/files_sharing/l10n/lb.js
+++ b/apps/files_sharing/l10n/lb.js
@@ -10,7 +10,6 @@ OC.L10N.register(
"No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
"Name" : "Numm",
"Download" : "Download",
- "Direct link" : "Direkte Link",
- "Open documentation" : "Dokumentatioun opmaachen"
+ "Direct link" : "Direkte Link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/lb.json b/apps/files_sharing/l10n/lb.json
index 43de4dbb667..5a466e560c6 100644
--- a/apps/files_sharing/l10n/lb.json
+++ b/apps/files_sharing/l10n/lb.json
@@ -8,7 +8,6 @@
"No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt",
"Name" : "Numm",
"Download" : "Download",
- "Direct link" : "Direkte Link",
- "Open documentation" : "Dokumentatioun opmaachen"
+ "Direct link" : "Direkte Link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/lt_LT.js b/apps/files_sharing/l10n/lt_LT.js
index 8aa1be493b9..3e46d74f16d 100644
--- a/apps/files_sharing/l10n/lt_LT.js
+++ b/apps/files_sharing/l10n/lt_LT.js
@@ -55,8 +55,6 @@ OC.L10N.register(
"Shares" : "Dalijimaisi",
"Accept" : "Priimti",
"Decline" : "Atmesti",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Pasidalink su manimi per #ownCloud padebesius, plačiau %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Pasidalink su manimi per #ownCloud padebesius",
"This share is password-protected" : "Turinys apsaugotas slaptažodžiu",
"The password is wrong. Try again." : "Netinka slaptažodis: Bandykite dar kartą.",
"Password" : "Slaptažodis",
@@ -72,16 +70,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Pridėti prie tavo ownCloud",
"Download" : "Atsisiųsti",
"Download %s" : "Atsiųsti %s",
- "Direct link" : "Tiesioginė nuoroda",
- "Federated Cloud Sharing" : "Viešas dalijimasis padebesiu",
- "Open documentation" : "Atidaryti dokumentą",
- "Allow users on this server to send shares to other servers" : "Leisti vartotojams šiame serveryje dalintis su kitais serveriais",
- "Allow users on this server to receive shares from other servers" : "Leisti vartotojams šiame serveryje priimti dalijimusis iš kitų serverių",
- "Federated Cloud" : "Viešas debesis",
- "Your Federated Cloud ID:" : "Tavo debesies ID:",
- "Share it:" : "Pasidalink:",
- "Add to your website" : "Pridėti tavo puslapį",
- "Share with me via ownCloud" : "Pasidalink su manimi per ownCloud",
- "HTML Code:" : "HTML kodas:"
+ "Direct link" : "Tiesioginė nuoroda"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_sharing/l10n/lt_LT.json b/apps/files_sharing/l10n/lt_LT.json
index ef139068832..03cfb47634b 100644
--- a/apps/files_sharing/l10n/lt_LT.json
+++ b/apps/files_sharing/l10n/lt_LT.json
@@ -53,8 +53,6 @@
"Shares" : "Dalijimaisi",
"Accept" : "Priimti",
"Decline" : "Atmesti",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Pasidalink su manimi per #ownCloud padebesius, plačiau %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Pasidalink su manimi per #ownCloud padebesius",
"This share is password-protected" : "Turinys apsaugotas slaptažodžiu",
"The password is wrong. Try again." : "Netinka slaptažodis: Bandykite dar kartą.",
"Password" : "Slaptažodis",
@@ -70,16 +68,6 @@
"Add to your ownCloud" : "Pridėti prie tavo ownCloud",
"Download" : "Atsisiųsti",
"Download %s" : "Atsiųsti %s",
- "Direct link" : "Tiesioginė nuoroda",
- "Federated Cloud Sharing" : "Viešas dalijimasis padebesiu",
- "Open documentation" : "Atidaryti dokumentą",
- "Allow users on this server to send shares to other servers" : "Leisti vartotojams šiame serveryje dalintis su kitais serveriais",
- "Allow users on this server to receive shares from other servers" : "Leisti vartotojams šiame serveryje priimti dalijimusis iš kitų serverių",
- "Federated Cloud" : "Viešas debesis",
- "Your Federated Cloud ID:" : "Tavo debesies ID:",
- "Share it:" : "Pasidalink:",
- "Add to your website" : "Pridėti tavo puslapį",
- "Share with me via ownCloud" : "Pasidalink su manimi per ownCloud",
- "HTML Code:" : "HTML kodas:"
+ "Direct link" : "Tiesioginė nuoroda"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/lv.js b/apps/files_sharing/l10n/lv.js
index a27ea0de207..abc9d4ce301 100644
--- a/apps/files_sharing/l10n/lv.js
+++ b/apps/files_sharing/l10n/lv.js
@@ -54,10 +54,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Pievienot savam ownCloud",
"Download" : "Lejupielādēt",
"Download %s" : "Lejupielādēt %s",
- "Direct link" : "Tiešā saite",
- "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
- "Open documentation" : "Atvērt dokumentāciju",
- "Allow users on this server to send shares to other servers" : "Atļaut šī servera lietotājiem sūtīt koplietotnes uz citiem serveriem",
- "Allow users on this server to receive shares from other servers" : "Atļaut šī servera lietotājiem saņem koplietotnes no citiem serveriem"
+ "Direct link" : "Tiešā saite"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
diff --git a/apps/files_sharing/l10n/lv.json b/apps/files_sharing/l10n/lv.json
index 45868381304..5ea0c87b814 100644
--- a/apps/files_sharing/l10n/lv.json
+++ b/apps/files_sharing/l10n/lv.json
@@ -52,10 +52,6 @@
"Add to your ownCloud" : "Pievienot savam ownCloud",
"Download" : "Lejupielādēt",
"Download %s" : "Lejupielādēt %s",
- "Direct link" : "Tiešā saite",
- "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana",
- "Open documentation" : "Atvērt dokumentāciju",
- "Allow users on this server to send shares to other servers" : "Atļaut šī servera lietotājiem sūtīt koplietotnes uz citiem serveriem",
- "Allow users on this server to receive shares from other servers" : "Atļaut šī servera lietotājiem saņem koplietotnes no citiem serveriem"
+ "Direct link" : "Tiešā saite"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/mk.js b/apps/files_sharing/l10n/mk.js
index e628c96125b..cbae94a41ae 100644
--- a/apps/files_sharing/l10n/mk.js
+++ b/apps/files_sharing/l10n/mk.js
@@ -50,14 +50,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Додади во вашиот ownCloud",
"Download" : "Преземи",
"Download %s" : "Преземи %s",
- "Direct link" : "Директна врска",
- "Federated Cloud Sharing" : "Федерирано клауд споделување",
- "Open documentation" : "Отвори ја документацијата",
- "Federated Cloud" : "Федериран клауд",
- "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:",
- "Share it:" : "Сподели го:",
- "Add to your website" : "Додади на твојот веб сајт",
- "Share with me via ownCloud" : "Сподели со мене преку ownCloud",
- "HTML Code:" : "HTML код:"
+ "Direct link" : "Директна врска"
},
"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/apps/files_sharing/l10n/mk.json b/apps/files_sharing/l10n/mk.json
index 33358b782b7..3a0a353dc4c 100644
--- a/apps/files_sharing/l10n/mk.json
+++ b/apps/files_sharing/l10n/mk.json
@@ -48,14 +48,6 @@
"Add to your ownCloud" : "Додади во вашиот ownCloud",
"Download" : "Преземи",
"Download %s" : "Преземи %s",
- "Direct link" : "Директна врска",
- "Federated Cloud Sharing" : "Федерирано клауд споделување",
- "Open documentation" : "Отвори ја документацијата",
- "Federated Cloud" : "Федериран клауд",
- "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:",
- "Share it:" : "Сподели го:",
- "Add to your website" : "Додади на твојот веб сајт",
- "Share with me via ownCloud" : "Сподели со мене преку ownCloud",
- "HTML Code:" : "HTML код:"
+ "Direct link" : "Директна врска"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/nb_NO.js b/apps/files_sharing/l10n/nb_NO.js
index 29cf14fb4a5..402677e1028 100644
--- a/apps/files_sharing/l10n/nb_NO.js
+++ b/apps/files_sharing/l10n/nb_NO.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Du mottok \"/%2$s\" som en ekstern deling fra %1$s",
"Accept" : "Aksepter",
"Decline" : "Avslå",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky",
"This share is password-protected" : "Denne delingen er passordbeskyttet",
"The password is wrong. Try again." : "Passordet er feil. Prøv på nytt.",
"Password" : "Passord",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Legg til i din ownCloud",
"Download" : "Last ned",
"Download %s" : "Last ned %s",
- "Direct link" : "Direkte lenke",
- "Federated Cloud Sharing" : "Sammenknyttet sky-deling",
- "Open documentation" : "Åpne dokumentasjonen",
- "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne serveren sender delinger til andre servere",
- "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne serveren mottar delinger fra andre servere",
- "Federated Cloud" : "Sammenknyttet sky",
- "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:",
- "Share it:" : "Del den:",
- "Add to your website" : "Legg på websiden din",
- "Share with me via ownCloud" : "Del med meg via ownCloud",
- "HTML Code:" : "HTML-kode:"
+ "Direct link" : "Direkte lenke"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/nb_NO.json b/apps/files_sharing/l10n/nb_NO.json
index b52aa14c6b4..f6234318255 100644
--- a/apps/files_sharing/l10n/nb_NO.json
+++ b/apps/files_sharing/l10n/nb_NO.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Du mottok \"/%2$s\" som en ekstern deling fra %1$s",
"Accept" : "Aksepter",
"Decline" : "Avslå",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky",
"This share is password-protected" : "Denne delingen er passordbeskyttet",
"The password is wrong. Try again." : "Passordet er feil. Prøv på nytt.",
"Password" : "Passord",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Legg til i din ownCloud",
"Download" : "Last ned",
"Download %s" : "Last ned %s",
- "Direct link" : "Direkte lenke",
- "Federated Cloud Sharing" : "Sammenknyttet sky-deling",
- "Open documentation" : "Åpne dokumentasjonen",
- "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne serveren sender delinger til andre servere",
- "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne serveren mottar delinger fra andre servere",
- "Federated Cloud" : "Sammenknyttet sky",
- "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:",
- "Share it:" : "Del den:",
- "Add to your website" : "Legg på websiden din",
- "Share with me via ownCloud" : "Del med meg via ownCloud",
- "HTML Code:" : "HTML-kode:"
+ "Direct link" : "Direkte lenke"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js
index 99979f08d39..0f36714bb13 100644
--- a/apps/files_sharing/l10n/nl.js
+++ b/apps/files_sharing/l10n/nl.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "U ontving \"/%2$s\" als een externe share van %1$s",
"Accept" : "Accepteren",
"Decline" : "Afwijzen",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deel met mij via mijn #ownCloud federated Cloud ID, zie %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Deel met mij via mijn #ownCloud federated Cloud ID",
"This share is password-protected" : "Deze share is met een wachtwoord beveiligd",
"The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" : "Wachtwoord",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Toevoegen aan uw ownCloud",
"Download" : "Downloaden",
"Download %s" : "Download %s",
- "Direct link" : "Directe link",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Open documentatie",
- "Allow users on this server to send shares to other servers" : "Toestaan dat gebruikers op deze server shares sturen naar andere servers",
- "Allow users on this server to receive shares from other servers" : "Toestaan dat gebruikers op deze server shares ontvangen van andere servers",
- "Federated Cloud" : "Gefedereerde Cloud",
- "Your Federated Cloud ID:" : "Uw Federated Cloud ID:",
- "Share it:" : "Deel het:",
- "Add to your website" : "Toevoegen aan uw website",
- "Share with me via ownCloud" : "Deel met mij via ownCloud",
- "HTML Code:" : "HTML Code:"
+ "Direct link" : "Directe link"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json
index 1d66dd578fe..b09ac101e2e 100644
--- a/apps/files_sharing/l10n/nl.json
+++ b/apps/files_sharing/l10n/nl.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "U ontving \"/%2$s\" als een externe share van %1$s",
"Accept" : "Accepteren",
"Decline" : "Afwijzen",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Deel met mij via mijn #ownCloud federated Cloud ID, zie %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Deel met mij via mijn #ownCloud federated Cloud ID",
"This share is password-protected" : "Deze share is met een wachtwoord beveiligd",
"The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" : "Wachtwoord",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Toevoegen aan uw ownCloud",
"Download" : "Downloaden",
"Download %s" : "Download %s",
- "Direct link" : "Directe link",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Open documentatie",
- "Allow users on this server to send shares to other servers" : "Toestaan dat gebruikers op deze server shares sturen naar andere servers",
- "Allow users on this server to receive shares from other servers" : "Toestaan dat gebruikers op deze server shares ontvangen van andere servers",
- "Federated Cloud" : "Gefedereerde Cloud",
- "Your Federated Cloud ID:" : "Uw Federated Cloud ID:",
- "Share it:" : "Deel het:",
- "Add to your website" : "Toevoegen aan uw website",
- "Share with me via ownCloud" : "Deel met mij via ownCloud",
- "HTML Code:" : "HTML Code:"
+ "Direct link" : "Directe link"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/oc.js b/apps/files_sharing/l10n/oc.js
index 350d35b2de0..f5a9096df32 100644
--- a/apps/files_sharing/l10n/oc.js
+++ b/apps/files_sharing/l10n/oc.js
@@ -54,8 +54,6 @@ OC.L10N.register(
"Shares" : "Partiments",
"Accept" : "Acceptar",
"Decline" : "Refusar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
"This share is password-protected" : "Aqueste partiment es protegit per un senhal",
"The password is wrong. Try again." : "Lo senhal es incorrècte. Ensajatz tornamai.",
"Password" : "Senhal",
@@ -71,16 +69,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Apondre a vòstre ownCloud",
"Download" : "Telecargar",
"Download %s" : "Telecargar %s",
- "Direct link" : "Ligam dirècte",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Veire la documentacion",
- "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors",
- "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :",
- "Share it:" : "Partejar :",
- "Add to your website" : "Apondre a vòstre site web",
- "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud",
- "HTML Code:" : "Còde HTML :"
+ "Direct link" : "Ligam dirècte"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_sharing/l10n/oc.json b/apps/files_sharing/l10n/oc.json
index 90254deca48..658219ca2b0 100644
--- a/apps/files_sharing/l10n/oc.json
+++ b/apps/files_sharing/l10n/oc.json
@@ -52,8 +52,6 @@
"Shares" : "Partiments",
"Accept" : "Acceptar",
"Decline" : "Refusar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Partejatz amb ieu gràcias a mon identificant Federated Cloud #owncloud",
"This share is password-protected" : "Aqueste partiment es protegit per un senhal",
"The password is wrong. Try again." : "Lo senhal es incorrècte. Ensajatz tornamai.",
"Password" : "Senhal",
@@ -69,16 +67,6 @@
"Add to your ownCloud" : "Apondre a vòstre ownCloud",
"Download" : "Telecargar",
"Download %s" : "Telecargar %s",
- "Direct link" : "Ligam dirècte",
- "Federated Cloud Sharing" : "Federated Cloud Sharing",
- "Open documentation" : "Veire la documentacion",
- "Allow users on this server to send shares to other servers" : "Autorizar los utilizaires d'aqueste servidor a mandar de partiments cap a d'autres servidors",
- "Allow users on this server to receive shares from other servers" : "Autorizar los utilizaires d'aqueste servidor a recebre de partiments d'autres servidors",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Vòstre identificant Federated Cloud :",
- "Share it:" : "Partejar :",
- "Add to your website" : "Apondre a vòstre site web",
- "Share with me via ownCloud" : "Partejatz amb ieu via ownCloud",
- "HTML Code:" : "Còde HTML :"
+ "Direct link" : "Ligam dirècte"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/pl.js b/apps/files_sharing/l10n/pl.js
index f96a684b704..d8e7a105618 100644
--- a/apps/files_sharing/l10n/pl.js
+++ b/apps/files_sharing/l10n/pl.js
@@ -47,8 +47,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Dodaj do twojego ownCloud",
"Download" : "Pobierz",
"Download %s" : "Pobierz %s",
- "Direct link" : "Bezpośredni link",
- "Open documentation" : "Otwórz dokumentację",
- "Add to your website" : "Dodaj do swojej strony"
+ "Direct link" : "Bezpośredni link"
},
"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_sharing/l10n/pl.json b/apps/files_sharing/l10n/pl.json
index 917d1a4cfaa..2026437ff75 100644
--- a/apps/files_sharing/l10n/pl.json
+++ b/apps/files_sharing/l10n/pl.json
@@ -45,8 +45,6 @@
"Add to your ownCloud" : "Dodaj do twojego ownCloud",
"Download" : "Pobierz",
"Download %s" : "Pobierz %s",
- "Direct link" : "Bezpośredni link",
- "Open documentation" : "Otwórz dokumentację",
- "Add to your website" : "Dodaj do swojej strony"
+ "Direct link" : "Bezpośredni link"
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js
index b41f5492a0e..ae7d8ba5ae0 100644
--- a/apps/files_sharing/l10n/pt_BR.js
+++ b/apps/files_sharing/l10n/pt_BR.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Você recebeu \"/%2$s\" como um compartilhamento remoto de %1$s",
"Accept" : "Aceitar",
"Decline" : "Rejeitar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada, veja %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada",
"This share is password-protected" : "Este compartilhamento esta protegido por senha",
"The password is wrong. Try again." : "Senha incorreta. Tente novamente.",
"Password" : "Senha",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Adiconar ao seu ownCloud",
"Download" : "Baixar",
"Download %s" : "Baixar %s",
- "Direct link" : "Link direto",
- "Federated Cloud Sharing" : "Compartilhamento de Nuvem Associada",
- "Open documentation" : "Abrir documentação",
- "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir que os usuários nesse servidor recebam compartilhamentos de outros servidores",
- "Federated Cloud" : "Nuvem Associada",
- "Your Federated Cloud ID:" : "Sua ID na Nuvem Associada:",
- "Share it:" : "Compartilhe:",
- "Add to your website" : "Adicione ao seu website",
- "Share with me via ownCloud" : "Compartilhe comigo via ownCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Link direto"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json
index be38812857e..c55f4204b7c 100644
--- a/apps/files_sharing/l10n/pt_BR.json
+++ b/apps/files_sharing/l10n/pt_BR.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Você recebeu \"/%2$s\" como um compartilhamento remoto de %1$s",
"Accept" : "Aceitar",
"Decline" : "Rejeitar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada, veja %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Compartilhe comigo através do meu #ownCloud Nuvem ID Associada",
"This share is password-protected" : "Este compartilhamento esta protegido por senha",
"The password is wrong. Try again." : "Senha incorreta. Tente novamente.",
"Password" : "Senha",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Adiconar ao seu ownCloud",
"Download" : "Baixar",
"Download %s" : "Baixar %s",
- "Direct link" : "Link direto",
- "Federated Cloud Sharing" : "Compartilhamento de Nuvem Associada",
- "Open documentation" : "Abrir documentação",
- "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir que os usuários nesse servidor recebam compartilhamentos de outros servidores",
- "Federated Cloud" : "Nuvem Associada",
- "Your Federated Cloud ID:" : "Sua ID na Nuvem Associada:",
- "Share it:" : "Compartilhe:",
- "Add to your website" : "Adicione ao seu website",
- "Share with me via ownCloud" : "Compartilhe comigo via ownCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Link direto"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/pt_PT.js b/apps/files_sharing/l10n/pt_PT.js
index e9cf412bc53..41c20a6ff4f 100644
--- a/apps/files_sharing/l10n/pt_PT.js
+++ b/apps/files_sharing/l10n/pt_PT.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Recebeu \"/%2$s\" como uma partilha remota de %1$s",
"Accept" : "Aceitar",
"Decline" : "Recusar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud, veja %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud",
"This share is password-protected" : "Esta partilha está protegida por senha",
"The password is wrong. Try again." : "A senha está errada. Por favor, tente de novo.",
"Password" : "Senha",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Adicionar à sua ownCloud",
"Download" : "Transferir",
"Download %s" : "Transferir %s",
- "Direct link" : "Hiperligação direta",
- "Federated Cloud Sharing" : "Partilha de Nuvem Federada",
- "Open documentation" : "Abrir documentação",
- "Allow users on this server to send shares to other servers" : "Permitir utilizadores neste servidor para enviar as partilhas para outros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir utilizadores neste servidor para receber as partilhas de outros servidores",
- "Federated Cloud" : "Nuvem Federada",
- "Your Federated Cloud ID:" : "A Sua Id. da Nuvem Federada",
- "Share it:" : "Partilhe:",
- "Add to your website" : "Adicione ao seu sítio da Web",
- "Share with me via ownCloud" : "Partilhe comigo via ownCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Hiperligação direta"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/pt_PT.json b/apps/files_sharing/l10n/pt_PT.json
index f311ef6bb33..5ff546a1397 100644
--- a/apps/files_sharing/l10n/pt_PT.json
+++ b/apps/files_sharing/l10n/pt_PT.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Recebeu \"/%2$s\" como uma partilha remota de %1$s",
"Accept" : "Aceitar",
"Decline" : "Recusar",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud, veja %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #ownCloud",
"This share is password-protected" : "Esta partilha está protegida por senha",
"The password is wrong. Try again." : "A senha está errada. Por favor, tente de novo.",
"Password" : "Senha",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Adicionar à sua ownCloud",
"Download" : "Transferir",
"Download %s" : "Transferir %s",
- "Direct link" : "Hiperligação direta",
- "Federated Cloud Sharing" : "Partilha de Nuvem Federada",
- "Open documentation" : "Abrir documentação",
- "Allow users on this server to send shares to other servers" : "Permitir utilizadores neste servidor para enviar as partilhas para outros servidores",
- "Allow users on this server to receive shares from other servers" : "Permitir utilizadores neste servidor para receber as partilhas de outros servidores",
- "Federated Cloud" : "Nuvem Federada",
- "Your Federated Cloud ID:" : "A Sua Id. da Nuvem Federada",
- "Share it:" : "Partilhe:",
- "Add to your website" : "Adicione ao seu sítio da Web",
- "Share with me via ownCloud" : "Partilhe comigo via ownCloud",
- "HTML Code:" : "Código HTML:"
+ "Direct link" : "Hiperligação direta"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js
index 8c9de804011..ab9dccd5ad5 100644
--- a/apps/files_sharing/l10n/ru.js
+++ b/apps/files_sharing/l10n/ru.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Вы получили доступ к \"/%2$s\" от пользователя %1$s",
"Accept" : "Принять",
"Decline" : "Отклонить",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ",
"This share is password-protected" : "Общий ресурс защищен паролем",
"The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.",
"Password" : "Пароль",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Добавить в свой ownCloud",
"Download" : "Скачать",
"Download %s" : "Скачать %s",
- "Direct link" : "Прямая ссылка",
- "Federated Cloud Sharing" : "Объединение облачных хранилищ",
- "Open documentation" : "Открыть документацию",
- "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов",
- "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов",
- "Federated Cloud" : "Объединение облачных хранилищ",
- "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:",
- "Share it:" : "Поделись этим:",
- "Add to your website" : "Добавить к себе на сайт",
- "Share with me via ownCloud" : "Поделитесь мной через ownCloud",
- "HTML Code:" : "HTML код:"
+ "Direct link" : "Прямая ссылка"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json
index 5dc7af37190..0e2464a98b2 100644
--- a/apps/files_sharing/l10n/ru.json
+++ b/apps/files_sharing/l10n/ru.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Вы получили доступ к \"/%2$s\" от пользователя %1$s",
"Accept" : "Принять",
"Decline" : "Отклонить",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ, смотрите %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Поделитесь со мной через мой #ownCloud ID в объединении облачных хранилищ",
"This share is password-protected" : "Общий ресурс защищен паролем",
"The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.",
"Password" : "Пароль",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Добавить в свой ownCloud",
"Download" : "Скачать",
"Download %s" : "Скачать %s",
- "Direct link" : "Прямая ссылка",
- "Federated Cloud Sharing" : "Объединение облачных хранилищ",
- "Open documentation" : "Открыть документацию",
- "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов",
- "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов",
- "Federated Cloud" : "Объединение облачных хранилищ",
- "Your Federated Cloud ID:" : "Ваш ID в объединении облачных хранилищ:",
- "Share it:" : "Поделись этим:",
- "Add to your website" : "Добавить к себе на сайт",
- "Share with me via ownCloud" : "Поделитесь мной через ownCloud",
- "HTML Code:" : "HTML код:"
+ "Direct link" : "Прямая ссылка"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sk_SK.js b/apps/files_sharing/l10n/sk_SK.js
index dfd287e067d..2dab005e2c2 100644
--- a/apps/files_sharing/l10n/sk_SK.js
+++ b/apps/files_sharing/l10n/sk_SK.js
@@ -54,8 +54,6 @@ OC.L10N.register(
"Shares" : "Zdieľanie",
"Accept" : "Schváliť",
"Decline" : "Odmietnuť",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID",
"This share is password-protected" : "Toto zdieľanie je chránené heslom",
"The password is wrong. Try again." : "Heslo je chybné. Skúste to znova.",
"Password" : "Heslo",
@@ -71,16 +69,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Pridať do svojho ownCloudu",
"Download" : "Sťahovanie",
"Download %s" : "Stiahnuť %s",
- "Direct link" : "Priama linka",
- "Federated Cloud Sharing" : "Združené cloudové zdieľanie",
- "Open documentation" : "Otvoriť dokumentáciu",
- "Allow users on this server to send shares to other servers" : "Povoliť používateľom z tohoto servera posielať zdieľania na iné servery",
- "Allow users on this server to receive shares from other servers" : "Povoliť používateľom z tohoto servera prijímať zdieľania z iných serverov",
- "Federated Cloud" : "Združený Cloud",
- "Your Federated Cloud ID:" : "Vaše združené Cloud ID",
- "Share it:" : "Zdieľať:",
- "Add to your website" : "Pridať na svoju webstránku",
- "Share with me via ownCloud" : "Zdieľané so mnou cez ownCloud",
- "HTML Code:" : "HTML kód:"
+ "Direct link" : "Priama linka"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files_sharing/l10n/sk_SK.json b/apps/files_sharing/l10n/sk_SK.json
index 5d23d16c976..70e97f90c38 100644
--- a/apps/files_sharing/l10n/sk_SK.json
+++ b/apps/files_sharing/l10n/sk_SK.json
@@ -52,8 +52,6 @@
"Shares" : "Zdieľanie",
"Accept" : "Schváliť",
"Decline" : "Odmietnuť",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID, viac n %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Zdieľajte so mnou pomocou môjho #ownCloud Federated Cloud ID",
"This share is password-protected" : "Toto zdieľanie je chránené heslom",
"The password is wrong. Try again." : "Heslo je chybné. Skúste to znova.",
"Password" : "Heslo",
@@ -69,16 +67,6 @@
"Add to your ownCloud" : "Pridať do svojho ownCloudu",
"Download" : "Sťahovanie",
"Download %s" : "Stiahnuť %s",
- "Direct link" : "Priama linka",
- "Federated Cloud Sharing" : "Združené cloudové zdieľanie",
- "Open documentation" : "Otvoriť dokumentáciu",
- "Allow users on this server to send shares to other servers" : "Povoliť používateľom z tohoto servera posielať zdieľania na iné servery",
- "Allow users on this server to receive shares from other servers" : "Povoliť používateľom z tohoto servera prijímať zdieľania z iných serverov",
- "Federated Cloud" : "Združený Cloud",
- "Your Federated Cloud ID:" : "Vaše združené Cloud ID",
- "Share it:" : "Zdieľať:",
- "Add to your website" : "Pridať na svoju webstránku",
- "Share with me via ownCloud" : "Zdieľané so mnou cez ownCloud",
- "HTML Code:" : "HTML kód:"
+ "Direct link" : "Priama linka"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sl.js b/apps/files_sharing/l10n/sl.js
index 5c7e5bc3974..1a55c4bebe5 100644
--- a/apps/files_sharing/l10n/sl.js
+++ b/apps/files_sharing/l10n/sl.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "Za datoteko ali mapo je odobrena <strong>souporaba</strong>.",
"A file or folder was shared from <strong>another server</strong>" : "Souporaba datoteke ali mape <strong>z drugega strežnika</strong> je odobrena.",
"A public shared file or folder was <strong>downloaded</strong>" : "Mapa ali datoteka v souporabi je bila <strong>prejeta</strong>.",
+ "You received a new remote share %2$s from %1$s" : "Prejeli ste oddaljeno mapo za souporabo %2$s od %1$s",
"You received a new remote share from %s" : "Prejeli ste mapo za oddaljeno souporabo z %s",
"%1$s accepted remote share %2$s" : "Uporabnik %1$s je prejel oddaljeno souporabo %2$s",
"%1$s declined remote share %2$s" : "Uporabnik %1$s je zavrnil souporabo %2$s",
@@ -38,16 +39,20 @@ OC.L10N.register(
"Public shared folder %1$s was downloaded" : "Mapa v souporabi %1$s je bila prejeta",
"Public shared file %1$s was downloaded" : "Datoteka v souporabi %1$s je bila prejeta",
"You shared %1$s with %2$s" : "Omogočili ste souporabo %1$s z uporabnikom %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s je omogočil souporabo %1$s z %3$s",
+ "You removed the share of %2$s for %1$s" : "Odstranili ste mapo za souporabo %2$s za %1$s",
"You shared %1$s with group %2$s" : "Omogočili ste souporabo %1$s s skupino %2$s",
"You shared %1$s via link" : "Omogočili ste souporabo %1$s preko povezave",
"%2$s shared %1$s with you" : "Uporabnik %2$s je omogočil souporabo %1$s",
"Downloaded via public link" : "Prejeto preko javne povezave",
+ "Shared with %2$s" : "Omogočena souporaba z %2$s",
+ "Shared via public link" : "Omogočena javna povezava za souporabo",
+ "Removed public link" : "Javno povezava je odstranjena",
"Public link expired" : "Javna povezava je potekla",
+ "Shared by %2$s" : "Omogočena souporaba iz strani %2$s",
"Shares" : "Souporaba",
"Accept" : "Sprejmi",
"Decline" : "Zavrni",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka, več na %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka",
"This share is password-protected" : "To mesto je zaščiteno z geslom.",
"The password is wrong. Try again." : "Geslo je napačno. Poskusite znova.",
"Password" : "Geslo",
@@ -63,14 +68,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Dodaj v svoj oblak ownCloud",
"Download" : "Prejmi",
"Download %s" : "Prejmi %s",
- "Direct link" : "Neposredna povezava",
- "Federated Cloud Sharing" : "Souporaba zveznega oblaka",
- "Open documentation" : "Odpri dokumentacijo",
- "Allow users on this server to send shares to other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo na druge strežnike.",
- "Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map za souporabo z drugih strežnikov.",
- "Federated Cloud" : "Zvezni oblak",
- "Your Federated Cloud ID:" : "Vaš ID zveznega oblaka:",
- "Add to your website" : "Dodaj na spletišče",
- "HTML Code:" : "Koda HTML:"
+ "Direct link" : "Neposredna povezava"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
diff --git a/apps/files_sharing/l10n/sl.json b/apps/files_sharing/l10n/sl.json
index 05d65c56ccb..29feacf2c24 100644
--- a/apps/files_sharing/l10n/sl.json
+++ b/apps/files_sharing/l10n/sl.json
@@ -29,6 +29,7 @@
"A file or folder has been <strong>shared</strong>" : "Za datoteko ali mapo je odobrena <strong>souporaba</strong>.",
"A file or folder was shared from <strong>another server</strong>" : "Souporaba datoteke ali mape <strong>z drugega strežnika</strong> je odobrena.",
"A public shared file or folder was <strong>downloaded</strong>" : "Mapa ali datoteka v souporabi je bila <strong>prejeta</strong>.",
+ "You received a new remote share %2$s from %1$s" : "Prejeli ste oddaljeno mapo za souporabo %2$s od %1$s",
"You received a new remote share from %s" : "Prejeli ste mapo za oddaljeno souporabo z %s",
"%1$s accepted remote share %2$s" : "Uporabnik %1$s je prejel oddaljeno souporabo %2$s",
"%1$s declined remote share %2$s" : "Uporabnik %1$s je zavrnil souporabo %2$s",
@@ -36,16 +37,20 @@
"Public shared folder %1$s was downloaded" : "Mapa v souporabi %1$s je bila prejeta",
"Public shared file %1$s was downloaded" : "Datoteka v souporabi %1$s je bila prejeta",
"You shared %1$s with %2$s" : "Omogočili ste souporabo %1$s z uporabnikom %2$s",
+ "%2$s shared %1$s with %3$s" : "%2$s je omogočil souporabo %1$s z %3$s",
+ "You removed the share of %2$s for %1$s" : "Odstranili ste mapo za souporabo %2$s za %1$s",
"You shared %1$s with group %2$s" : "Omogočili ste souporabo %1$s s skupino %2$s",
"You shared %1$s via link" : "Omogočili ste souporabo %1$s preko povezave",
"%2$s shared %1$s with you" : "Uporabnik %2$s je omogočil souporabo %1$s",
"Downloaded via public link" : "Prejeto preko javne povezave",
+ "Shared with %2$s" : "Omogočena souporaba z %2$s",
+ "Shared via public link" : "Omogočena javna povezava za souporabo",
+ "Removed public link" : "Javno povezava je odstranjena",
"Public link expired" : "Javna povezava je potekla",
+ "Shared by %2$s" : "Omogočena souporaba iz strani %2$s",
"Shares" : "Souporaba",
"Accept" : "Sprejmi",
"Decline" : "Zavrni",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka, več na %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Omogoči souporabo prek #ownCloud ID zveznega oblaka",
"This share is password-protected" : "To mesto je zaščiteno z geslom.",
"The password is wrong. Try again." : "Geslo je napačno. Poskusite znova.",
"Password" : "Geslo",
@@ -61,14 +66,6 @@
"Add to your ownCloud" : "Dodaj v svoj oblak ownCloud",
"Download" : "Prejmi",
"Download %s" : "Prejmi %s",
- "Direct link" : "Neposredna povezava",
- "Federated Cloud Sharing" : "Souporaba zveznega oblaka",
- "Open documentation" : "Odpri dokumentacijo",
- "Allow users on this server to send shares to other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo na druge strežnike.",
- "Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map za souporabo z drugih strežnikov.",
- "Federated Cloud" : "Zvezni oblak",
- "Your Federated Cloud ID:" : "Vaš ID zveznega oblaka:",
- "Add to your website" : "Dodaj na spletišče",
- "HTML Code:" : "Koda HTML:"
+ "Direct link" : "Neposredna povezava"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sq.js b/apps/files_sharing/l10n/sq.js
index 8ffc9dba389..2e019ab3ace 100644
--- a/apps/files_sharing/l10n/sq.js
+++ b/apps/files_sharing/l10n/sq.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Ju erdhi \"/%2$s\" si ndarje e largët prej %1$s",
"Accept" : "Pranoje",
"Decline" : "Hidhe poshtë",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud, shihni %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud",
"This share is password-protected" : "Kjo pjesë është e mbrojtur me fjalëkalim",
"The password is wrong. Try again." : "Fjalëkalimi është i gabuar. Riprovoni.",
"Password" : "Fjalëkalim",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Shtojeni te ownCloud-i juaj",
"Download" : "Shkarko",
"Download %s" : "Shkarko %s",
- "Direct link" : "Lidhje e drejtpërdrejtë",
- "Federated Cloud Sharing" : "Ndarje e Federuar Në Re",
- "Open documentation" : "Hap dokumentimin",
- "Allow users on this server to send shares to other servers" : "Lejoju përdoruesve në këtë shërbyes të dërgojnë ndarje në shërbyes të tjerë",
- "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë",
- "Federated Cloud" : "Re e Federuar",
- "Your Federated Cloud ID:" : "ID-ja juaj për Re të Federuar:",
- "Share it:" : "Ndajeni:",
- "Add to your website" : "Shtojeni te sajti juaj",
- "Share with me via ownCloud" : "Ndani me mua përmes ownCloud-it",
- "HTML Code:" : "Kod HTML:"
+ "Direct link" : "Lidhje e drejtpërdrejtë"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/sq.json b/apps/files_sharing/l10n/sq.json
index 70b2a3ff20d..f853e3420cb 100644
--- a/apps/files_sharing/l10n/sq.json
+++ b/apps/files_sharing/l10n/sq.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Ju erdhi \"/%2$s\" si ndarje e largët prej %1$s",
"Accept" : "Pranoje",
"Decline" : "Hidhe poshtë",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud, shihni %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Ndani me mua përmes ID-së time për #ownCloud Federated Cloud",
"This share is password-protected" : "Kjo pjesë është e mbrojtur me fjalëkalim",
"The password is wrong. Try again." : "Fjalëkalimi është i gabuar. Riprovoni.",
"Password" : "Fjalëkalim",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Shtojeni te ownCloud-i juaj",
"Download" : "Shkarko",
"Download %s" : "Shkarko %s",
- "Direct link" : "Lidhje e drejtpërdrejtë",
- "Federated Cloud Sharing" : "Ndarje e Federuar Në Re",
- "Open documentation" : "Hap dokumentimin",
- "Allow users on this server to send shares to other servers" : "Lejoju përdoruesve në këtë shërbyes të dërgojnë ndarje në shërbyes të tjerë",
- "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë",
- "Federated Cloud" : "Re e Federuar",
- "Your Federated Cloud ID:" : "ID-ja juaj për Re të Federuar:",
- "Share it:" : "Ndajeni:",
- "Add to your website" : "Shtojeni te sajti juaj",
- "Share with me via ownCloud" : "Ndani me mua përmes ownCloud-it",
- "HTML Code:" : "Kod HTML:"
+ "Direct link" : "Lidhje e drejtpërdrejtë"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sr.js b/apps/files_sharing/l10n/sr.js
index 1c532341231..494b4937cc2 100644
--- a/apps/files_sharing/l10n/sr.js
+++ b/apps/files_sharing/l10n/sr.js
@@ -58,13 +58,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Додај у свој облак",
"Download" : "Преузми",
"Download %s" : "Преузми %s",
- "Direct link" : "Директна веза",
- "Federated Cloud Sharing" : "Здружено дељење у облаку",
- "Open documentation" : "Отвори документацију",
- "Allow users on this server to send shares to other servers" : "Дозвољава корисницима овог сервера да шаљу дељења на друге сервере",
- "Allow users on this server to receive shares from other servers" : "Дозвољава корисницима овог сервера да примају дељења са других сервера",
- "Federated Cloud" : "Здружени облак",
- "Your Federated Cloud ID:" : "ИД вашег здруженог облака:",
- "HTML Code:" : "ХТМЛ кôд:"
+ "Direct link" : "Директна веза"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_sharing/l10n/sr.json b/apps/files_sharing/l10n/sr.json
index 7e993ae039e..a254e2dcce6 100644
--- a/apps/files_sharing/l10n/sr.json
+++ b/apps/files_sharing/l10n/sr.json
@@ -56,13 +56,6 @@
"Add to your ownCloud" : "Додај у свој облак",
"Download" : "Преузми",
"Download %s" : "Преузми %s",
- "Direct link" : "Директна веза",
- "Federated Cloud Sharing" : "Здружено дељење у облаку",
- "Open documentation" : "Отвори документацију",
- "Allow users on this server to send shares to other servers" : "Дозвољава корисницима овог сервера да шаљу дељења на друге сервере",
- "Allow users on this server to receive shares from other servers" : "Дозвољава корисницима овог сервера да примају дељења са других сервера",
- "Federated Cloud" : "Здружени облак",
- "Your Federated Cloud ID:" : "ИД вашег здруженог облака:",
- "HTML Code:" : "ХТМЛ кôд:"
+ "Direct link" : "Директна веза"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sr@latin.js b/apps/files_sharing/l10n/sr@latin.js
index d9ea5a22416..e044946e117 100644
--- a/apps/files_sharing/l10n/sr@latin.js
+++ b/apps/files_sharing/l10n/sr@latin.js
@@ -51,8 +51,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Dodaj na svoj ownCloud",
"Download" : "Preuzmi",
"Download %s" : "Preuzmi %s",
- "Direct link" : "Direktna prečica",
- "Allow users on this server to send shares to other servers" : "Dozvoli korisnicima na ovom serveru da šalju deljene resurse na druge servere",
- "Allow users on this server to receive shares from other servers" : "Dozvoli korisnicima na ovom serveru da primaju deljene resurse sa drugih servera"
+ "Direct link" : "Direktna prečica"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_sharing/l10n/sr@latin.json b/apps/files_sharing/l10n/sr@latin.json
index 8cba518384e..f4942a0dfa9 100644
--- a/apps/files_sharing/l10n/sr@latin.json
+++ b/apps/files_sharing/l10n/sr@latin.json
@@ -49,8 +49,6 @@
"Add to your ownCloud" : "Dodaj na svoj ownCloud",
"Download" : "Preuzmi",
"Download %s" : "Preuzmi %s",
- "Direct link" : "Direktna prečica",
- "Allow users on this server to send shares to other servers" : "Dozvoli korisnicima na ovom serveru da šalju deljene resurse na druge servere",
- "Allow users on this server to receive shares from other servers" : "Dozvoli korisnicima na ovom serveru da primaju deljene resurse sa drugih servera"
+ "Direct link" : "Direktna prečica"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/sv.js b/apps/files_sharing/l10n/sv.js
index 2381031c192..165b5a20deb 100644
--- a/apps/files_sharing/l10n/sv.js
+++ b/apps/files_sharing/l10n/sv.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "Du mottog \"/%2$s\" som fjärrdelning från %1$s",
"Accept" : "Acceptera",
"Decline" : "Neka",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dela med mig genom min #owncloud Federated Cloud ID, se %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Dela med mig genom min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." : "Lösenordet är fel. Försök igen.",
"Password" : "Lösenord",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Lägg till i din ownCloud",
"Download" : "Ladda ner",
"Download %s" : "Ladda ner %s",
- "Direct link" : "Direkt länk",
- "Federated Cloud Sharing" : "Federate Cloud delning",
- "Open documentation" : "Öppna dokumentation",
- "Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar",
- "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Ditt Federated Cloud ID",
- "Share it:" : "Dela detta:",
- "Add to your website" : "Lägg till på din hemsida",
- "Share with me via ownCloud" : "Dela med mig via Owncloud",
- "HTML Code:" : "HTML Kod:"
+ "Direct link" : "Direkt länk"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/sv.json b/apps/files_sharing/l10n/sv.json
index f86e9491149..748caa6b57f 100644
--- a/apps/files_sharing/l10n/sv.json
+++ b/apps/files_sharing/l10n/sv.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "Du mottog \"/%2$s\" som fjärrdelning från %1$s",
"Accept" : "Acceptera",
"Decline" : "Neka",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dela med mig genom min #owncloud Federated Cloud ID, se %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "Dela med mig genom min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." : "Lösenordet är fel. Försök igen.",
"Password" : "Lösenord",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "Lägg till i din ownCloud",
"Download" : "Ladda ner",
"Download %s" : "Ladda ner %s",
- "Direct link" : "Direkt länk",
- "Federated Cloud Sharing" : "Federate Cloud delning",
- "Open documentation" : "Öppna dokumentation",
- "Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar",
- "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
- "Federated Cloud" : "Federated Cloud",
- "Your Federated Cloud ID:" : "Ditt Federated Cloud ID",
- "Share it:" : "Dela detta:",
- "Add to your website" : "Lägg till på din hemsida",
- "Share with me via ownCloud" : "Dela med mig via Owncloud",
- "HTML Code:" : "HTML Kod:"
+ "Direct link" : "Direkt länk"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/th_TH.js b/apps/files_sharing/l10n/th_TH.js
index 9303fd5cdd3..a03951d4cef 100644
--- a/apps/files_sharing/l10n/th_TH.js
+++ b/apps/files_sharing/l10n/th_TH.js
@@ -5,9 +5,9 @@ OC.L10N.register(
"The mountpoint name contains invalid characters." : "ชื่อจุดเชื่อมต่อมีตัวอักษรที่ไม่ถูกต้อง",
"Not allowed to create a federated share with the same user server" : "ไม่อนุญาตให้สร้างแชร์ในเครือกับเซิร์ฟเวอร์ที่มีผู้ใช้เดียวกัน",
"Invalid or untrusted SSL certificate" : "ใบรับรอง SSL ไม่ถูกต้องหรือไม่น่าเชื่อถือ",
- "Could not authenticate to remote share, password might be wrong" : "ไม่สามารถรับรองความถูกต้องจากการแชร์ระยะไกลรหัสผ่านอาจจะผิด",
+ "Could not authenticate to remote share, password might be wrong" : "ไม่สามารถรับรองความถูกต้องจากรีโมทแชร์ บางทีรหัสผ่านอาจจะผิด",
"Storage not valid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
- "Couldn't add remote share" : "ไม่สามารถเพิ่มแชร์ระยะไกล",
+ "Couldn't add remote share" : "ไม่สามารถเพิ่มรีโมทแชร์",
"Shared with you" : "แชร์กับคุณ",
"Shared with others" : "แชร์กับผู้อื่น",
"Shared by link" : "แชร์โดยลิงค์",
@@ -18,11 +18,11 @@ OC.L10N.register(
"Files and folders you share will show up here" : "ไฟล์และโฟลเดอร์ที่คุณแชร์จะปรากฏขึ้นที่นี่",
"No shared links" : "ไม่มีลิงค์ที่แชร์",
"Files and folders you share by link will show up here" : "ไฟล์และโฟลเดอร์ที่คุณแชร์โดยลิงค์จะปรากฏขึ้นที่นี่",
- "Do you want to add the remote share {name} from {owner}@{remote}?" : "คุณต้องการที่จะเพิ่มการแชร์ระยะไกล {name} จาก {owner}@{remote}?",
- "Remote share" : "แชร์ระยะไกล",
- "Remote share password" : "รหัสผ่านการแชร์ระยะไกล",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "คุณต้องการที่จะเพิ่มรีโมทแชร์ {name} จาก {owner}@{remote}?",
+ "Remote share" : "รีโมทแชร์",
+ "Remote share password" : "รหัสผ่านรีโมทแชร์",
"Cancel" : "ยกเลิก",
- "Add remote share" : "เพิ่มการแชร์ระยะไกล",
+ "Add remote share" : "เพิ่มรีโมทแชร์",
"You can upload into this folder" : "คุณสามารถอัพโหลดลงในโฟลเดอร์นี้",
"No ownCloud installation (7 or higher) found at {remote}" : "ไม่มีการติดตั้ง ownCloud (7 หรือสูงกว่า) พบได้ที่ {remote}",
"Invalid ownCloud url" : "URL ownCloud ไม่ถูกต้อง",
@@ -31,33 +31,49 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "ไฟล์หรือโฟลเดอร์ได้ถูก <strong>แชร์</strong>",
"A file or folder was shared from <strong>another server</strong>" : "ไฟล์หรือโฟลเดอร์จะถูกแชร์จาก <strong>เซิร์ฟเวอร์อื่นๆ</ strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "แชร์ไฟล์หรือโฟลเดอร์สาธารณะถูก <strong>ดาวน์โหลด</strong>",
- "You received a new remote share %2$s from %1$s" : "คุณได้รับการแชร์ระยะไกลใหม่ %2$s จาก %1$s",
- "You received a new remote share from %s" : "คุณได้รับการแชร์ระยะไกลใหม่จาก %s",
- "%1$s accepted remote share %2$s" : "%1$s ยอมรับการแชร์ %2$s จากระยะไกล",
- "%1$s declined remote share %2$s" : "%1$s ปฏิเสธการแชร์ %2$s จากระยะไกล",
+ "You received a new remote share %2$s from %1$s" : "คุณได้รับ %2$s รีโมทแชร์ใหม่จาก %1$s",
+ "You received a new remote share from %s" : "คุณได้รับรีโมทแชร์ใหม่จาก %s",
+ "%1$s accepted remote share %2$s" : "%1$s ยอมรับรีโมทแชร์จาก %2$s",
+ "%1$s declined remote share %2$s" : "%1$s ปฏิเสธรีโมทแชร์จาก %2$s",
"%1$s unshared %2$s from you" : "%1$s ไม่ได้แชร์ %2$s จากคุณ",
"Public shared folder %1$s was downloaded" : "โฟลเดอร์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด",
"Public shared file %1$s was downloaded" : "ไฟล์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด",
"You shared %1$s with %2$s" : "คุณแชร์ %1$s กับ %2$s",
"%2$s shared %1$s with %3$s" : "%2$s ได้แชร์ %1$s กับ %3$s",
+ "You removed the share of %2$s for %1$s" : "คุณได้ลบแชร์ %2$s สำหรับ %1$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s ได้ลบแชร์ของ %3$s สำหรับ %1$s",
"You shared %1$s with group %2$s" : "คุณแชร์ %1$s กับกลุ่ม %2$s",
"%2$s shared %1$s with group %3$s" : "%2$s ได้แชร์ %1$s กับกลุ่ม %3$s",
+ "You removed the share of group %2$s for %1$s" : "คุณได้ลบแชร์ของกลุ่ม %2$s สำหรับ %1$s",
+ "%2$s removed the share of group %3$s for %1$s" : "%2$s ได้ลบแชร์ของกลุ่ม %3$s สำหรับ %1$s",
"%2$s shared %1$s via link" : "%2$s ได้แชร์ %1$s ผ่านลิงค์",
"You shared %1$s via link" : "คุณแชร์ %1$s ผ่านลิงค์",
+ "You removed the public link for %1$s" : "คุณได้ลบลิงค์สาธารณะสำหรับ %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s ได้ลบลิงค์สาธารณะสำหรับ %1$s",
+ "Your public link for %1$s expired" : "ลิงก์สาธารณะของคุณสำหรับ %1$s หมดอายุ",
+ "The public link of %2$s for %1$s expired" : "ลิงค์สาธารณะของ %2$s สำหรับ %1$s หมดอายุ",
"%2$s shared %1$s with you" : "%2$s ถูกแชร์ %1$s กับคุณ",
+ "%2$s removed the share for %1$s" : "%2$s ได้ลบแชร์สำหรับ %1$s",
"Downloaded via public link" : "ดาวน์โหลดผ่านลิงค์สาธารณะ",
"Shared with %2$s" : "แชร์กับ %2$s",
"Shared with %3$s by %2$s" : "แชร์กับ %3$s โดย %2$s",
+ "Removed share for %2$s" : "แชร์สำหรับ %2$s ถูกลบแล้ว",
+ "%2$s removed share for %3$s" : "%2$s ได้ลบแชร์สำหรับ %3$s",
"Shared with group %2$s" : "แชร์กับกลุ่ม %2$s",
"Shared with group %3$s by %2$s" : "แชร์กับกลุ่ม %3$s โดย %2$s",
+ "Removed share of group %2$s" : "แชร์ของกลุ่ม %2$s ถูกลบแล้ว",
+ "%2$s removed share of group %3$s" : "%2$s ได้ลบแชร์ของกลุ่ม %3$s",
"Shared via link by %2$s" : "แชร์ผ่านลิงค์โดย %2$s",
"Shared via public link" : "แชร์ผ่านลิงค์สาธารณะ",
+ "Removed public link" : "ลิงค์สาธารณะถูกลบแล้ว",
+ "%2$s removed public link" : "%2$s ได้ลบลิงค์สาธารณะแล้ว",
+ "Public link expired" : "ลิงค์สาธารณะหมดอายุแล้ว",
+ "Public link of %2$s expired" : "ลิงค์สาธารณะของ %2$s หมดอายุแล้ว",
"Shared by %2$s" : "แชร์โดย %2$s",
"Shares" : "แชร์",
+ "You received \"/%2$s\" as a remote share from %1$s" : "คุณได้รับ \"/%2$s\" ที่เป็นรีโมทแชร์จาก %1$s",
"Accept" : "ยอมรับ",
"Decline" : "ลดลง",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ สามารถดูได้ที่ %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ",
"This share is password-protected" : "นี้แชร์การป้องกันด้วยรหัสผ่าน",
"The password is wrong. Try again." : "รหัสผ่านที่ไม่ถูกต้อง กรุณาลองอีกครั้ง",
"Password" : "รหัสผ่าน",
@@ -73,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "เพิ่มลงใน ownCloud ของคุณ",
"Download" : "ดาวน์โหลด",
"Download %s" : "ดาวน์โหลด %s",
- "Direct link" : "ลิงค์โดยตรง",
- "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
- "Open documentation" : "เปิดเอกสาร",
- "Allow users on this server to send shares to other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ส่งแชร์ไปยังเซิร์ฟเวอร์อื่นๆ",
- "Allow users on this server to receive shares from other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ได้รับการแชร์จากเซิร์ฟเวอร์อื่นๆ",
- "Federated Cloud" : "สหพันธ์คลาวด์",
- "Your Federated Cloud ID:" : "ไอดีคลาวด์ของคุณ:",
- "Share it:" : "แชร์มัน:",
- "Add to your website" : "เพิ่มไปยังเว็บไซต์",
- "Share with me via ownCloud" : "แชร์ร่วมกับฉันผ่าน ownCloud",
- "HTML Code:" : "โค้ด HTML:"
+ "Direct link" : "ลิงค์โดยตรง"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/th_TH.json b/apps/files_sharing/l10n/th_TH.json
index 9e4343bdee5..182331ffc1a 100644
--- a/apps/files_sharing/l10n/th_TH.json
+++ b/apps/files_sharing/l10n/th_TH.json
@@ -3,9 +3,9 @@
"The mountpoint name contains invalid characters." : "ชื่อจุดเชื่อมต่อมีตัวอักษรที่ไม่ถูกต้อง",
"Not allowed to create a federated share with the same user server" : "ไม่อนุญาตให้สร้างแชร์ในเครือกับเซิร์ฟเวอร์ที่มีผู้ใช้เดียวกัน",
"Invalid or untrusted SSL certificate" : "ใบรับรอง SSL ไม่ถูกต้องหรือไม่น่าเชื่อถือ",
- "Could not authenticate to remote share, password might be wrong" : "ไม่สามารถรับรองความถูกต้องจากการแชร์ระยะไกลรหัสผ่านอาจจะผิด",
+ "Could not authenticate to remote share, password might be wrong" : "ไม่สามารถรับรองความถูกต้องจากรีโมทแชร์ บางทีรหัสผ่านอาจจะผิด",
"Storage not valid" : "การจัดเก็บข้อมูลไม่ถูกต้อง",
- "Couldn't add remote share" : "ไม่สามารถเพิ่มแชร์ระยะไกล",
+ "Couldn't add remote share" : "ไม่สามารถเพิ่มรีโมทแชร์",
"Shared with you" : "แชร์กับคุณ",
"Shared with others" : "แชร์กับผู้อื่น",
"Shared by link" : "แชร์โดยลิงค์",
@@ -16,11 +16,11 @@
"Files and folders you share will show up here" : "ไฟล์และโฟลเดอร์ที่คุณแชร์จะปรากฏขึ้นที่นี่",
"No shared links" : "ไม่มีลิงค์ที่แชร์",
"Files and folders you share by link will show up here" : "ไฟล์และโฟลเดอร์ที่คุณแชร์โดยลิงค์จะปรากฏขึ้นที่นี่",
- "Do you want to add the remote share {name} from {owner}@{remote}?" : "คุณต้องการที่จะเพิ่มการแชร์ระยะไกล {name} จาก {owner}@{remote}?",
- "Remote share" : "แชร์ระยะไกล",
- "Remote share password" : "รหัสผ่านการแชร์ระยะไกล",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "คุณต้องการที่จะเพิ่มรีโมทแชร์ {name} จาก {owner}@{remote}?",
+ "Remote share" : "รีโมทแชร์",
+ "Remote share password" : "รหัสผ่านรีโมทแชร์",
"Cancel" : "ยกเลิก",
- "Add remote share" : "เพิ่มการแชร์ระยะไกล",
+ "Add remote share" : "เพิ่มรีโมทแชร์",
"You can upload into this folder" : "คุณสามารถอัพโหลดลงในโฟลเดอร์นี้",
"No ownCloud installation (7 or higher) found at {remote}" : "ไม่มีการติดตั้ง ownCloud (7 หรือสูงกว่า) พบได้ที่ {remote}",
"Invalid ownCloud url" : "URL ownCloud ไม่ถูกต้อง",
@@ -29,33 +29,49 @@
"A file or folder has been <strong>shared</strong>" : "ไฟล์หรือโฟลเดอร์ได้ถูก <strong>แชร์</strong>",
"A file or folder was shared from <strong>another server</strong>" : "ไฟล์หรือโฟลเดอร์จะถูกแชร์จาก <strong>เซิร์ฟเวอร์อื่นๆ</ strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "แชร์ไฟล์หรือโฟลเดอร์สาธารณะถูก <strong>ดาวน์โหลด</strong>",
- "You received a new remote share %2$s from %1$s" : "คุณได้รับการแชร์ระยะไกลใหม่ %2$s จาก %1$s",
- "You received a new remote share from %s" : "คุณได้รับการแชร์ระยะไกลใหม่จาก %s",
- "%1$s accepted remote share %2$s" : "%1$s ยอมรับการแชร์ %2$s จากระยะไกล",
- "%1$s declined remote share %2$s" : "%1$s ปฏิเสธการแชร์ %2$s จากระยะไกล",
+ "You received a new remote share %2$s from %1$s" : "คุณได้รับ %2$s รีโมทแชร์ใหม่จาก %1$s",
+ "You received a new remote share from %s" : "คุณได้รับรีโมทแชร์ใหม่จาก %s",
+ "%1$s accepted remote share %2$s" : "%1$s ยอมรับรีโมทแชร์จาก %2$s",
+ "%1$s declined remote share %2$s" : "%1$s ปฏิเสธรีโมทแชร์จาก %2$s",
"%1$s unshared %2$s from you" : "%1$s ไม่ได้แชร์ %2$s จากคุณ",
"Public shared folder %1$s was downloaded" : "โฟลเดอร์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด",
"Public shared file %1$s was downloaded" : "ไฟล์สาธารณะ %1$s ที่แชร์ถูกดาวน์โหลด",
"You shared %1$s with %2$s" : "คุณแชร์ %1$s กับ %2$s",
"%2$s shared %1$s with %3$s" : "%2$s ได้แชร์ %1$s กับ %3$s",
+ "You removed the share of %2$s for %1$s" : "คุณได้ลบแชร์ %2$s สำหรับ %1$s",
+ "%2$s removed the share of %3$s for %1$s" : "%2$s ได้ลบแชร์ของ %3$s สำหรับ %1$s",
"You shared %1$s with group %2$s" : "คุณแชร์ %1$s กับกลุ่ม %2$s",
"%2$s shared %1$s with group %3$s" : "%2$s ได้แชร์ %1$s กับกลุ่ม %3$s",
+ "You removed the share of group %2$s for %1$s" : "คุณได้ลบแชร์ของกลุ่ม %2$s สำหรับ %1$s",
+ "%2$s removed the share of group %3$s for %1$s" : "%2$s ได้ลบแชร์ของกลุ่ม %3$s สำหรับ %1$s",
"%2$s shared %1$s via link" : "%2$s ได้แชร์ %1$s ผ่านลิงค์",
"You shared %1$s via link" : "คุณแชร์ %1$s ผ่านลิงค์",
+ "You removed the public link for %1$s" : "คุณได้ลบลิงค์สาธารณะสำหรับ %1$s",
+ "%2$s removed the public link for %1$s" : "%2$s ได้ลบลิงค์สาธารณะสำหรับ %1$s",
+ "Your public link for %1$s expired" : "ลิงก์สาธารณะของคุณสำหรับ %1$s หมดอายุ",
+ "The public link of %2$s for %1$s expired" : "ลิงค์สาธารณะของ %2$s สำหรับ %1$s หมดอายุ",
"%2$s shared %1$s with you" : "%2$s ถูกแชร์ %1$s กับคุณ",
+ "%2$s removed the share for %1$s" : "%2$s ได้ลบแชร์สำหรับ %1$s",
"Downloaded via public link" : "ดาวน์โหลดผ่านลิงค์สาธารณะ",
"Shared with %2$s" : "แชร์กับ %2$s",
"Shared with %3$s by %2$s" : "แชร์กับ %3$s โดย %2$s",
+ "Removed share for %2$s" : "แชร์สำหรับ %2$s ถูกลบแล้ว",
+ "%2$s removed share for %3$s" : "%2$s ได้ลบแชร์สำหรับ %3$s",
"Shared with group %2$s" : "แชร์กับกลุ่ม %2$s",
"Shared with group %3$s by %2$s" : "แชร์กับกลุ่ม %3$s โดย %2$s",
+ "Removed share of group %2$s" : "แชร์ของกลุ่ม %2$s ถูกลบแล้ว",
+ "%2$s removed share of group %3$s" : "%2$s ได้ลบแชร์ของกลุ่ม %3$s",
"Shared via link by %2$s" : "แชร์ผ่านลิงค์โดย %2$s",
"Shared via public link" : "แชร์ผ่านลิงค์สาธารณะ",
+ "Removed public link" : "ลิงค์สาธารณะถูกลบแล้ว",
+ "%2$s removed public link" : "%2$s ได้ลบลิงค์สาธารณะแล้ว",
+ "Public link expired" : "ลิงค์สาธารณะหมดอายุแล้ว",
+ "Public link of %2$s expired" : "ลิงค์สาธารณะของ %2$s หมดอายุแล้ว",
"Shared by %2$s" : "แชร์โดย %2$s",
"Shares" : "แชร์",
+ "You received \"/%2$s\" as a remote share from %1$s" : "คุณได้รับ \"/%2$s\" ที่เป็นรีโมทแชร์จาก %1$s",
"Accept" : "ยอมรับ",
"Decline" : "ลดลง",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ สามารถดูได้ที่ %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "แชร์ร่วมกับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์ในเครือ",
"This share is password-protected" : "นี้แชร์การป้องกันด้วยรหัสผ่าน",
"The password is wrong. Try again." : "รหัสผ่านที่ไม่ถูกต้อง กรุณาลองอีกครั้ง",
"Password" : "รหัสผ่าน",
@@ -71,16 +87,6 @@
"Add to your ownCloud" : "เพิ่มลงใน ownCloud ของคุณ",
"Download" : "ดาวน์โหลด",
"Download %s" : "ดาวน์โหลด %s",
- "Direct link" : "ลิงค์โดยตรง",
- "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
- "Open documentation" : "เปิดเอกสาร",
- "Allow users on this server to send shares to other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ส่งแชร์ไปยังเซิร์ฟเวอร์อื่นๆ",
- "Allow users on this server to receive shares from other servers" : "อนุญาตให้ผู้ใช้บนเซิร์ฟเวอร์นี้ได้รับการแชร์จากเซิร์ฟเวอร์อื่นๆ",
- "Federated Cloud" : "สหพันธ์คลาวด์",
- "Your Federated Cloud ID:" : "ไอดีคลาวด์ของคุณ:",
- "Share it:" : "แชร์มัน:",
- "Add to your website" : "เพิ่มไปยังเว็บไซต์",
- "Share with me via ownCloud" : "แชร์ร่วมกับฉันผ่าน ownCloud",
- "HTML Code:" : "โค้ด HTML:"
+ "Direct link" : "ลิงค์โดยตรง"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/tr.js b/apps/files_sharing/l10n/tr.js
index c08d9baa0d5..a836a20e88d 100644
--- a/apps/files_sharing/l10n/tr.js
+++ b/apps/files_sharing/l10n/tr.js
@@ -74,8 +74,6 @@ OC.L10N.register(
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s kişisinden \"/%2$s\" uzak paylaşımını aldınız",
"Accept" : "Kabul et",
"Decline" : "Reddet",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaş, bkz %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaş",
"This share is password-protected" : "Bu paylaşım parola korumalı",
"The password is wrong. Try again." : "Parola hatalı. Yeniden deneyin.",
"Password" : "Parola",
@@ -91,16 +89,6 @@ OC.L10N.register(
"Add to your ownCloud" : "ownCloud'ınıza Ekleyin",
"Download" : "İndir",
"Download %s" : "İndir: %s",
- "Direct link" : "Doğrudan bağlantı",
- "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
- "Open documentation" : "Belgelendirmeyi aç",
- "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver",
- "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver",
- "Federated Cloud" : "Birleşmiş Bulut",
- "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:",
- "Share it:" : "Paylaşın:",
- "Add to your website" : "Web sitenize ekleyin",
- "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşın",
- "HTML Code:" : "HTML Kodu:"
+ "Direct link" : "Doğrudan bağlantı"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/files_sharing/l10n/tr.json b/apps/files_sharing/l10n/tr.json
index b107ec25589..901098f1f54 100644
--- a/apps/files_sharing/l10n/tr.json
+++ b/apps/files_sharing/l10n/tr.json
@@ -72,8 +72,6 @@
"You received \"/%2$s\" as a remote share from %1$s" : "%1$s kişisinden \"/%2$s\" uzak paylaşımını aldınız",
"Accept" : "Kabul et",
"Decline" : "Reddet",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud Birleşik Bulut kimliğim ile paylaş, bkz %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud Birleşmiş Bulut kimliğim ile paylaş",
"This share is password-protected" : "Bu paylaşım parola korumalı",
"The password is wrong. Try again." : "Parola hatalı. Yeniden deneyin.",
"Password" : "Parola",
@@ -89,16 +87,6 @@
"Add to your ownCloud" : "ownCloud'ınıza Ekleyin",
"Download" : "İndir",
"Download %s" : "İndir: %s",
- "Direct link" : "Doğrudan bağlantı",
- "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı",
- "Open documentation" : "Belgelendirmeyi aç",
- "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver",
- "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver",
- "Federated Cloud" : "Birleşmiş Bulut",
- "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:",
- "Share it:" : "Paylaşın:",
- "Add to your website" : "Web sitenize ekleyin",
- "Share with me via ownCloud" : "Benimle ownCloud aracılığıyla paylaşın",
- "HTML Code:" : "HTML Kodu:"
+ "Direct link" : "Doğrudan bağlantı"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js
index b122664beca..fcd56b8afc2 100644
--- a/apps/files_sharing/l10n/uk.js
+++ b/apps/files_sharing/l10n/uk.js
@@ -55,12 +55,6 @@ OC.L10N.register(
"Add to your ownCloud" : "Додати до вашого ownCloud",
"Download" : "Завантажити",
"Download %s" : "Завантажити %s",
- "Direct link" : "Пряме посилання",
- "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
- "Open documentation" : "Відкрити документацію",
- "Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах",
- "Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів",
- "Share it:" : "Поділитися цим:",
- "HTML Code:" : "HTML код:"
+ "Direct link" : "Пряме посилання"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json
index 363a02ed7ed..3aebedad135 100644
--- a/apps/files_sharing/l10n/uk.json
+++ b/apps/files_sharing/l10n/uk.json
@@ -53,12 +53,6 @@
"Add to your ownCloud" : "Додати до вашого ownCloud",
"Download" : "Завантажити",
"Download %s" : "Завантажити %s",
- "Direct link" : "Пряме посилання",
- "Federated Cloud Sharing" : "Об’єднання хмарних сховищ",
- "Open documentation" : "Відкрити документацію",
- "Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах",
- "Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів",
- "Share it:" : "Поділитися цим:",
- "HTML Code:" : "HTML код:"
+ "Direct link" : "Пряме посилання"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/zh_CN.js b/apps/files_sharing/l10n/zh_CN.js
index 8270a39e6d7..a9f676fad98 100644
--- a/apps/files_sharing/l10n/zh_CN.js
+++ b/apps/files_sharing/l10n/zh_CN.js
@@ -62,16 +62,6 @@ OC.L10N.register(
"Add to your ownCloud" : "添加到您的 ownCloud",
"Download" : "下载",
"Download %s" : "下载 %s",
- "Direct link" : "直接链接",
- "Federated Cloud Sharing" : "联合云共享",
- "Open documentation" : "打开文档",
- "Allow users on this server to send shares to other servers" : "允许用户分享文件给其他服务器上的用户",
- "Allow users on this server to receive shares from other servers" : "允许用户从其他服务器接收分享",
- "Federated Cloud" : "联合云",
- "Your Federated Cloud ID:" : "你的联合云ID:",
- "Share it:" : "分享它:",
- "Add to your website" : "添加到您的网站",
- "Share with me via ownCloud" : "通过联合云与我共享",
- "HTML Code:" : "HTML 代码:"
+ "Direct link" : "直接链接"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/zh_CN.json b/apps/files_sharing/l10n/zh_CN.json
index c59c4684c39..bffaa9b6b5b 100644
--- a/apps/files_sharing/l10n/zh_CN.json
+++ b/apps/files_sharing/l10n/zh_CN.json
@@ -60,16 +60,6 @@
"Add to your ownCloud" : "添加到您的 ownCloud",
"Download" : "下载",
"Download %s" : "下载 %s",
- "Direct link" : "直接链接",
- "Federated Cloud Sharing" : "联合云共享",
- "Open documentation" : "打开文档",
- "Allow users on this server to send shares to other servers" : "允许用户分享文件给其他服务器上的用户",
- "Allow users on this server to receive shares from other servers" : "允许用户从其他服务器接收分享",
- "Federated Cloud" : "联合云",
- "Your Federated Cloud ID:" : "你的联合云ID:",
- "Share it:" : "分享它:",
- "Add to your website" : "添加到您的网站",
- "Share with me via ownCloud" : "通过联合云与我共享",
- "HTML Code:" : "HTML 代码:"
+ "Direct link" : "直接链接"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/zh_TW.js b/apps/files_sharing/l10n/zh_TW.js
index a3de7a5ef4a..43e9c23a38b 100644
--- a/apps/files_sharing/l10n/zh_TW.js
+++ b/apps/files_sharing/l10n/zh_TW.js
@@ -55,8 +55,6 @@ OC.L10N.register(
"Shares" : "分享",
"Accept" : "接受",
"Decline" : "拒絕",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享,請看 %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享",
"This share is password-protected" : "這個分享有密碼保護",
"The password is wrong. Try again." : "請檢查您的密碼並再試一次",
"Password" : "密碼",
@@ -72,16 +70,6 @@ OC.L10N.register(
"Add to your ownCloud" : "加入到你的 ownCloud",
"Download" : "下載",
"Download %s" : "下載 %s",
- "Direct link" : "直接連結",
- "Federated Cloud Sharing" : "聯盟式雲端分享",
- "Open documentation" : "開啟文件",
- "Allow users on this server to send shares to other servers" : "允許這台伺服器上的使用者發送分享給其他伺服器",
- "Allow users on this server to receive shares from other servers" : "允許這台伺服器上的使用者發送接收來自其他伺服器的分享",
- "Federated Cloud" : "聯盟式雲端",
- "Your Federated Cloud ID:" : "您的雲端聯盟 ID:",
- "Share it:" : "分享它:",
- "Add to your website" : "新增至您的網站",
- "Share with me via ownCloud" : "透過 ownCloud 與我分享",
- "HTML Code:" : "HTML Code:"
+ "Direct link" : "直接連結"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/zh_TW.json b/apps/files_sharing/l10n/zh_TW.json
index 7a237c1c58a..7ca97b77f8a 100644
--- a/apps/files_sharing/l10n/zh_TW.json
+++ b/apps/files_sharing/l10n/zh_TW.json
@@ -53,8 +53,6 @@
"Shares" : "分享",
"Accept" : "接受",
"Decline" : "拒絕",
- "Share with me through my #ownCloud Federated Cloud ID, see %s" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享,請看 %s",
- "Share with me through my #ownCloud Federated Cloud ID" : "可透過我的 #ownCloud 聯盟雲端 ID,與我分享",
"This share is password-protected" : "這個分享有密碼保護",
"The password is wrong. Try again." : "請檢查您的密碼並再試一次",
"Password" : "密碼",
@@ -70,16 +68,6 @@
"Add to your ownCloud" : "加入到你的 ownCloud",
"Download" : "下載",
"Download %s" : "下載 %s",
- "Direct link" : "直接連結",
- "Federated Cloud Sharing" : "聯盟式雲端分享",
- "Open documentation" : "開啟文件",
- "Allow users on this server to send shares to other servers" : "允許這台伺服器上的使用者發送分享給其他伺服器",
- "Allow users on this server to receive shares from other servers" : "允許這台伺服器上的使用者發送接收來自其他伺服器的分享",
- "Federated Cloud" : "聯盟式雲端",
- "Your Federated Cloud ID:" : "您的雲端聯盟 ID:",
- "Share it:" : "分享它:",
- "Add to your website" : "新增至您的網站",
- "Share with me via ownCloud" : "透過 ownCloud 與我分享",
- "HTML Code:" : "HTML Code:"
+ "Direct link" : "直接連結"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php
index ea024b6016a..72294f6b26f 100644
--- a/apps/files_sharing/lib/controllers/sharecontroller.php
+++ b/apps/files_sharing/lib/controllers/sharecontroller.php
@@ -33,6 +33,7 @@ namespace OCA\Files_Sharing\Controllers;
use OC;
use OC_Files;
use OC_Util;
+use OCA\FederatedFileSharing\FederatedShareProvider;
use OCP;
use OCP\Template;
use OCP\Share;
@@ -79,6 +80,8 @@ class ShareController extends Controller {
protected $previewManager;
/** @var IRootFolder */
protected $rootFolder;
+ /** @var FederatedShareProvider */
+ protected $federatedShareProvider;
/**
* @param string $appName
@@ -92,6 +95,7 @@ class ShareController extends Controller {
* @param ISession $session
* @param IPreview $previewManager
* @param IRootFolder $rootFolder
+ * @param FederatedShareProvider $federatedShareProvider
*/
public function __construct($appName,
IRequest $request,
@@ -103,7 +107,8 @@ class ShareController extends Controller {
\OCP\Share\IManager $shareManager,
ISession $session,
IPreview $previewManager,
- IRootFolder $rootFolder) {
+ IRootFolder $rootFolder,
+ FederatedShareProvider $federatedShareProvider) {
parent::__construct($appName, $request);
$this->config = $config;
@@ -115,6 +120,7 @@ class ShareController extends Controller {
$this->session = $session;
$this->previewManager = $previewManager;
$this->rootFolder = $rootFolder;
+ $this->federatedShareProvider = $federatedShareProvider;
}
/**
@@ -300,7 +306,7 @@ class ShareController extends Controller {
$shareTmpl['previewSupported'] = $this->previewManager->isMimeSupported($share->getNode()->getMimetype());
$shareTmpl['dirToken'] = $token;
$shareTmpl['sharingToken'] = $token;
- $shareTmpl['server2serversharing'] = Helper::isOutgoingServer2serverShareEnabled();
+ $shareTmpl['server2serversharing'] = $this->federatedShareProvider->isOutgoingServer2serverShareEnabled();
$shareTmpl['protected'] = $share->getPassword() !== null ? 'true' : 'false';
$shareTmpl['dir'] = '';
$shareTmpl['nonHumanFileSize'] = $share->getNode()->getSize();
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 71d6788cb52..7dc9f66f114 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -384,7 +384,7 @@ class Manager {
}
/**
- * return a list of shares wich are accepted by the user
+ * return a list of shares which are accepted by the user
*
* @return array list of accepted server-to-server shares
*/
diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
index 8fe7af66044..4382dcab0c3 100644
--- a/apps/files_sharing/lib/external/storage.php
+++ b/apps/files_sharing/lib/external/storage.php
@@ -319,5 +319,21 @@ class Storage extends DAV implements ISharedStorage {
}
return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_SHARE);
}
+
+ public function getPermissions($path) {
+ $response = $this->propfind($path);
+ if (isset($response['{http://open-collaboration-services.org/ns}share-permissions'])) {
+ $permissions = $response['{http://open-collaboration-services.org/ns}share-permissions'];
+ } else {
+ // use default permission if remote server doesn't provide the share permissions
+ if ($this->is_dir($path)) {
+ $permissions = \OCP\Constants::PERMISSION_ALL;
+ } else {
+ $permissions = \OCP\Constants::PERMISSION_ALL & ~\OCP\Constants::PERMISSION_CREATE;
+ }
+ }
+
+ return $permissions;
+ }
}
diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php
index e857974ae74..c09694e9888 100644
--- a/apps/files_sharing/lib/helper.php
+++ b/apps/files_sharing/lib/helper.php
@@ -280,26 +280,6 @@ class Helper {
}
/**
- * allow users from other ownCloud instances to mount public links share by this instance
- * @return bool
- */
- public static function isOutgoingServer2serverShareEnabled() {
- $appConfig = \OC::$server->getAppConfig();
- $result = $appConfig->getValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes');
- return ($result === 'yes') ? true : false;
- }
-
- /**
- * allow user to mount public links from onther ownClouds
- * @return bool
- */
- public static function isIncomingServer2serverShareEnabled() {
- $appConfig = \OC::$server->getAppConfig();
- $result = $appConfig->getValue('files_sharing', 'incoming_server2server_share_enabled', 'yes');
- return ($result === 'yes') ? true : false;
- }
-
- /**
* get default share folder
*
* @return string
diff --git a/apps/files_sharing/lib/mountprovider.php b/apps/files_sharing/lib/mountprovider.php
index 4a60e44bb26..8e133951293 100644
--- a/apps/files_sharing/lib/mountprovider.php
+++ b/apps/files_sharing/lib/mountprovider.php
@@ -22,12 +22,11 @@
namespace OCA\Files_Sharing;
-use OC\Files\Filesystem;
-use OC\User\NoUserException;
use OCP\Files\Config\IMountProvider;
use OCP\Files\Storage\IStorageFactory;
use OCP\IConfig;
use OCP\IUser;
+use OCP\Share\IManager;
class MountProvider implements IMountProvider {
/**
@@ -36,10 +35,17 @@ class MountProvider implements IMountProvider {
protected $config;
/**
+ * @var IManager
+ */
+ protected $shareManager;
+
+ /**
* @param \OCP\IConfig $config
+ * @param IManager $shareManager
*/
- public function __construct(IConfig $config) {
+ public function __construct(IConfig $config, IManager $shareManager) {
$this->config = $config;
+ $this->shareManager = $shareManager;
}
@@ -51,23 +57,27 @@ class MountProvider implements IMountProvider {
* @return \OCP\Files\Mount\IMountPoint[]
*/
public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) {
- $shares = \OCP\Share::getItemsSharedWithUser('file', $user->getUID());
- $shares = array_filter($shares, function ($share) {
- return $share['permissions'] > 0;
+ $shares = $this->shareManager->getSharedWith($user->getUID(), \OCP\Share::SHARE_TYPE_USER, null, -1);
+ $shares = array_merge($shares, $this->shareManager->getSharedWith($user->getUID(), \OCP\Share::SHARE_TYPE_GROUP, null, -1));
+ $shares = array_filter($shares, function (\OCP\Share\IShare $share) {
+ return $share->getPermissions() > 0;
});
- $shares = array_map(function ($share) use ($user, $storageFactory) {
- return new SharedMount(
+ $mounts = [];
+ foreach ($shares as $share) {
+
+ $mounts[] = new SharedMount(
'\OC\Files\Storage\Shared',
- '/' . $user->getUID() . '/' . $share['file_target'],
- array(
- 'share' => $share,
- 'user' => $user->getUID()
- ),
+ $mounts,
+ [
+ 'user' => $user->getUID(),
+ 'newShare' => $share,
+ ],
$storageFactory
);
- }, $shares);
+ }
+
// array_filter removes the null values from the array
- return array_filter($shares);
+ return array_filter($mounts);
}
}
diff --git a/apps/files_sharing/lib/scanner.php b/apps/files_sharing/lib/scanner.php
index 8b32d014a08..2e951423aa2 100644
--- a/apps/files_sharing/lib/scanner.php
+++ b/apps/files_sharing/lib/scanner.php
@@ -42,8 +42,10 @@ class SharedScanner extends Scanner {
*/
public function getData($path) {
$data = parent::getData($path);
- $sourcePath = $this->storage->getSourcePath($path);
- list($sourceStorage, $internalPath) = \OC\Files\Filesystem::resolvePath($sourcePath);
+ if ($data === null) {
+ return null;
+ }
+ list($sourceStorage, $internalPath) = $this->storage->resolvePath($path);
$data['permissions'] = $sourceStorage->getPermissions($internalPath);
return $data;
}
diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php
index 113675508fb..38605def73a 100644
--- a/apps/files_sharing/lib/share/file.php
+++ b/apps/files_sharing/lib/share/file.php
@@ -1,4 +1,6 @@
<?php
+use OCA\FederatedFileSharing\FederatedShareProvider;
+
/**
* @author Andreas Fischer <bantu@owncloud.com>
* @author Bart Visscher <bartv@thisnet.nl>
@@ -40,6 +42,18 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
private $path;
+ /** @var FederatedShareProvider */
+ private $federatedShareProvider;
+
+ public function __construct(FederatedShareProvider $federatedShareProvider = null) {
+ if ($federatedShareProvider) {
+ $this->federatedShareProvider = $federatedShareProvider;
+ } else {
+ $federatedSharingApp = new \OCA\FederatedFileSharing\AppInfo\Application('federatedfilesharing');
+ $this->federatedShareProvider = $federatedSharingApp->getFederatedShareProvider();
+ }
+ }
+
public function isValidSource($itemSource, $uidOwner) {
try {
$path = \OC\Files\Filesystem::getPath($itemSource);
@@ -173,7 +187,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
*/
public function isShareTypeAllowed($shareType) {
if ($shareType === \OCP\Share::SHARE_TYPE_REMOTE) {
- return \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled();
+ return $this->federatedShareProvider->isOutgoingServer2serverShareEnabled();
}
return true;
diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php
index 1e554cc5948..4aed80b12b2 100644
--- a/apps/files_sharing/lib/sharedmount.php
+++ b/apps/files_sharing/lib/sharedmount.php
@@ -25,6 +25,7 @@
namespace OCA\Files_Sharing;
+use OC\Files\Filesystem;
use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount;
use OC\Files\View;
@@ -48,46 +49,49 @@ class SharedMount extends MountPoint implements MoveableMount {
*/
private $user;
+ /** @var \OCP\Share\IShare */
+ private $share;
+
/**
* @param string $storage
- * @param string $mountpoint
+ * @param SharedMount[] $mountpoints
* @param array|null $arguments
* @param \OCP\Files\Storage\IStorageFactory $loader
*/
- public function __construct($storage, $mountpoint, $arguments = null, $loader = null) {
+ public function __construct($storage, array $mountpoints, $arguments = null, $loader = null) {
$this->user = $arguments['user'];
$this->recipientView = new View('/' . $this->user . '/files');
- $newMountPoint = $this->verifyMountPoint($arguments['share']);
+ $this->share = $arguments['newShare'];
+ $newMountPoint = $this->verifyMountPoint($this->share, $mountpoints);
$absMountPoint = '/' . $this->user . '/files' . $newMountPoint;
- $arguments['ownerView'] = new View('/' . $arguments['share']['uid_owner'] . '/files');
+ $arguments['ownerView'] = new View('/' . $this->share->getShareOwner() . '/files');
parent::__construct($storage, $absMountPoint, $arguments, $loader);
}
/**
* check if the parent folder exists otherwise move the mount point up
*
- * @param array $share
+ * @param \OCP\Share\IShare $share
+ * @param SharedMount[] $mountpoints
* @return string
*/
- private function verifyMountPoint(&$share) {
+ private function verifyMountPoint(\OCP\Share\IShare $share, array $mountpoints) {
- $mountPoint = basename($share['file_target']);
- $parent = dirname($share['file_target']);
+ $mountPoint = basename($share->getTarget());
+ $parent = dirname($share->getTarget());
if (!$this->recipientView->is_dir($parent)) {
$parent = Helper::getShareFolder();
}
- $newMountPoint = \OCA\Files_Sharing\Helper::generateUniqueTarget(
+ $newMountPoint = $this->generateUniqueTarget(
\OC\Files\Filesystem::normalizePath($parent . '/' . $mountPoint),
- [],
- $this->recipientView
+ $this->recipientView,
+ $mountpoints
);
- if ($newMountPoint !== $share['file_target']) {
+ if ($newMountPoint !== $share->getTarget()) {
$this->updateFileTarget($newMountPoint, $share);
- $share['file_target'] = $newMountPoint;
- $share['unique_name'] = true;
}
return $newMountPoint;
@@ -97,32 +101,44 @@ class SharedMount extends MountPoint implements MoveableMount {
* update fileTarget in the database if the mount point changed
*
* @param string $newPath
- * @param array $share reference to the share which should be modified
+ * @param \OCP\Share\IShare $share
* @return bool
*/
private function updateFileTarget($newPath, &$share) {
- // if the user renames a mount point from a group share we need to create a new db entry
- // for the unique name
- if ($share['share_type'] === \OCP\Share::SHARE_TYPE_GROUP && empty($share['unique_name'])) {
- $query = \OCP\DB::prepare('INSERT INTO `*PREFIX*share` (`item_type`, `item_source`, `item_target`,'
- .' `share_type`, `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`,'
- .' `file_target`, `token`, `parent`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)');
- $arguments = array($share['item_type'], $share['item_source'], $share['item_target'],
- 2, $this->user, $share['uid_owner'], $share['permissions'], $share['stime'], $share['file_source'],
- $newPath, $share['token'], $share['id']);
- } else {
- // rename mount point
- $query = \OCP\DB::prepare(
- 'Update `*PREFIX*share`
- SET `file_target` = ?
- WHERE `id` = ?'
- );
- $arguments = array($newPath, $share['id']);
- }
+ $share->setTarget($newPath);
+ \OC::$server->getShareManager()->moveShare($share, $this->user);
+ }
+
+
+ /**
+ * @param string $path
+ * @param View $view
+ * @param SharedMount[] $mountpoints
+ * @return mixed
+ */
+ private function generateUniqueTarget($path, $view, array $mountpoints) {
+ $pathinfo = pathinfo($path);
+ $ext = (isset($pathinfo['extension'])) ? '.'.$pathinfo['extension'] : '';
+ $name = $pathinfo['filename'];
+ $dir = $pathinfo['dirname'];
+
+ // Helper function to find existing mount points
+ $mountpointExists = function($path) use ($mountpoints) {
+ foreach ($mountpoints as $mountpoint) {
+ if ($mountpoint->getShare()->getTarget() === $path) {
+ return true;
+ }
+ }
+ return false;
+ };
- $result = $query->execute($arguments);
+ $i = 2;
+ while ($view->file_exists($path) || $mountpointExists($path)) {
+ $path = Filesystem::normalizePath($dir . '/' . $name . ' ('.$i.')' . $ext);
+ $i++;
+ }
- return $result === 1 ? true : false;
+ return $path;
}
/**
@@ -164,20 +180,11 @@ class SharedMount extends MountPoint implements MoveableMount {
$result = true;
- if (!empty($share['grouped'])) {
- foreach ($share['grouped'] as $s) {
- $result = $this->updateFileTarget($relTargetPath, $s) && $result;
- }
- } else {
- $result = $this->updateFileTarget($relTargetPath, $share) && $result;
- }
-
- if ($result) {
+ try {
+ $this->updateFileTarget($relTargetPath, $share);
$this->setMountPoint($target);
- $this->storage->setUniqueName();
$this->storage->setMountPoint($relTargetPath);
-
- } else {
+ } catch (\Exception $e) {
\OCP\Util::writeLog('file sharing',
'Could not rename mount point for shared folder "' . $this->getMountPoint() . '" to "' . $target . '"',
\OCP\Util::ERROR);
@@ -202,11 +209,18 @@ class SharedMount extends MountPoint implements MoveableMount {
}
/**
- * @return array
+ * @return \OCP\Share\IShare
*/
public function getShare() {
- /** @var $storage \OC\Files\Storage\Shared */
- $storage = $this->getStorage();
- return $storage->getShare();
+ return $this->share;
+ }
+
+ /**
+ * Get the file id of the root of the storage
+ *
+ * @return int
+ */
+ public function getStorageRootId() {
+ return $this->share->getNodeId();
}
}
diff --git a/apps/files_sharing/lib/sharedpropagator.php b/apps/files_sharing/lib/sharedpropagator.php
index 29735934499..f17cfc3a75b 100644
--- a/apps/files_sharing/lib/sharedpropagator.php
+++ b/apps/files_sharing/lib/sharedpropagator.php
@@ -33,12 +33,10 @@ class SharedPropagator extends Propagator {
* @param string $internalPath
* @param int $time
* @param int $sizeDifference
- * @return \array[] all propagated entries
*/
public function propagateChange($internalPath, $time, $sizeDifference = 0) {
- $source = $this->storage->getSourcePath($internalPath);
/** @var \OC\Files\Storage\Storage $storage */
- list($storage, $sourceInternalPath) = \OC\Files\Filesystem::resolvePath($source);
+ list($storage, $sourceInternalPath) = $this->storage->resolvePath($internalPath);
return $storage->getPropagator()->propagateChange($sourceInternalPath, $time, $sizeDifference);
}
}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index 8f4888d20e2..1a040364f11 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -41,21 +41,18 @@ use OCP\Lock\ILockingProvider;
/**
* Convert target path to source path and pass the function call to the correct storage provider
*/
-class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
+class Shared extends \OC\Files\Storage\Wrapper\Jail implements ISharedStorage {
private $share; // the shared resource
- private $files = array();
+
+ /** @var \OCP\Share\IShare */
+ private $newShare;
/**
* @var \OC\Files\View
*/
private $ownerView;
- /**
- * @var string
- */
- private $user;
-
private $initialized = false;
/**
@@ -68,16 +65,28 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
*/
private $sourceStorage;
+ /** @var string */
+ private $user;
+
/**
* @var \OCP\ILogger
*/
private $logger;
public function __construct($arguments) {
- $this->share = $arguments['share'];
$this->ownerView = $arguments['ownerView'];
- $this->user = $arguments['user'];
$this->logger = \OC::$server->getLogger();
+ $this->newShare = $arguments['newShare'];
+ $this->user = $arguments['user'];
+
+ Filesystem::initMountPoints($this->newShare->getShareOwner());
+ $sourcePath = $this->ownerView->getPath($this->newShare->getNodeId());
+ list($storage, $internalPath) = $this->ownerView->resolvePath($sourcePath);
+
+ parent::__construct([
+ 'storage' => $storage,
+ 'root' => $internalPath,
+ ]);
}
private function init() {
@@ -86,8 +95,8 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
}
$this->initialized = true;
try {
- Filesystem::initMountPoints($this->share['uid_owner']);
- $sourcePath = $this->ownerView->getPath($this->share['file_source']);
+ Filesystem::initMountPoints($this->newShare->getShareOwner());
+ $sourcePath = $this->ownerView->getPath($this->newShare->getNodeId());
list($this->sourceStorage, $sourceInternalPath) = $this->ownerView->resolvePath($sourcePath);
$this->sourceRootInfo = $this->sourceStorage->getCache()->get($sourceInternalPath);
} catch (\Exception $e) {
@@ -115,59 +124,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
* @return int
*/
public function getSourceId() {
- return (int)$this->share['file_source'];
- }
-
- /**
- * Get the source file path, permissions, and owner for a shared file
- *
- * @param string $target Shared target file path
- * @return array Returns array with the keys path, permissions, and owner or false if not found
- */
- public function getFile($target) {
- $this->init();
- if (!isset($this->files[$target])) {
- // Check for partial files
- if (pathinfo($target, PATHINFO_EXTENSION) === 'part') {
- $source = \OC_Share_Backend_File::getSource(substr($target, 0, -5), $this->getShare());
- if ($source) {
- $source['path'] .= '.part';
- // All partial files have delete permission
- $source['permissions'] |= \OCP\Constants::PERMISSION_DELETE;
- }
- } else {
- $source = \OC_Share_Backend_File::getSource($target, $this->getShare());
- }
- $this->files[$target] = $source;
- }
- return $this->files[$target];
- }
-
- /**
- * Get the source file path for a shared file
- *
- * @param string $target Shared target file path
- * @return string|false source file path or false if not found
- */
- public function getSourcePath($target) {
- if (!$this->isValid()){
- return false;
- }
- $source = $this->getFile($target);
- if ($source) {
- if (!isset($source['fullPath'])) {
- \OC\Files\Filesystem::initMountPoints($source['fileOwner']);
- $mount = \OC\Files\Filesystem::getMountByNumericId($source['storage']);
- if (is_array($mount) && !empty($mount)) {
- $this->files[$target]['fullPath'] = $mount[key($mount)]->getMountPoint() . $source['path'];
- } else {
- $this->files[$target]['fullPath'] = false;
- \OCP\Util::writeLog('files_sharing', "Unable to get mount for shared storage '" . $source['storage'] . "' user '" . $source['fileOwner'] . "'", \OCP\Util::ERROR);
- }
- }
- return $this->files[$target]['fullPath'];
- }
- return false;
+ return $this->newShare->getNodeId();
}
/**
@@ -180,7 +137,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
if (!$this->isValid()) {
return 0;
}
- $permissions = $this->share['permissions'];
+ $permissions = $this->newShare->getPermissions();
// part files and the mount point always have delete permissions
if ($target === '' || pathinfo($target, PATHINFO_EXTENSION) === 'part') {
$permissions |= \OCP\Constants::PERMISSION_DELETE;
@@ -193,84 +150,6 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
return $permissions;
}
- public function mkdir($path) {
- if ($path == '' || $path == '/' || !$this->isCreatable(dirname($path))) {
- return false;
- } else if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->mkdir($internalPath);
- }
- return false;
- }
-
- /**
- * Delete the directory if DELETE permission is granted
- *
- * @param string $path
- * @return boolean
- */
- public function rmdir($path) {
-
- // never delete a share mount point
- if (empty($path)) {
- return false;
- }
-
- if (($source = $this->getSourcePath($path)) && $this->isDeletable($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->rmdir($internalPath);
- }
- return false;
- }
-
- public function opendir($path) {
- $source = $this->getSourcePath($path);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->opendir($internalPath);
- }
-
- public function is_dir($path) {
- $source = $this->getSourcePath($path);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->is_dir($internalPath);
- }
-
- public function is_file($path) {
- if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->is_file($internalPath);
- }
- return false;
- }
-
- public function stat($path) {
- if ($path == '' || $path == '/') {
- $stat['size'] = $this->filesize($path);
- $stat['mtime'] = $this->filemtime($path);
- return $stat;
- } else if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->stat($internalPath);
- }
- return false;
- }
-
- public function filetype($path) {
- if ($path == '' || $path == '/') {
- return 'dir';
- } else if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->filetype($internalPath);
- }
- return false;
- }
-
- public function filesize($path) {
- $source = $this->getSourcePath($path);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->filesize($internalPath);
- }
-
public function isCreatable($path) {
return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_CREATE);
}
@@ -301,127 +180,6 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_SHARE);
}
- public function file_exists($path) {
- if ($path == '' || $path == '/') {
- return true;
- } else if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->file_exists($internalPath);
- }
- return false;
- }
-
- public function filemtime($path) {
- $source = $this->getSourcePath($path);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->filemtime($internalPath);
- }
-
- public function file_get_contents($path) {
- $source = $this->getSourcePath($path);
- if ($source) {
- $info = array(
- 'target' => $this->getMountPoint() . $path,
- 'source' => $source,
- );
- \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_get_contents', $info);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->file_get_contents($internalPath);
- }
- }
-
- public function file_put_contents($path, $data) {
- if ($source = $this->getSourcePath($path)) {
- // Check if permission is granted
- if (($this->file_exists($path) && !$this->isUpdatable($path))
- || ($this->is_dir($path) && !$this->isCreatable($path))
- ) {
- return false;
- }
- $info = array(
- 'target' => $this->getMountPoint() . '/' . $path,
- 'source' => $source,
- );
- \OCP\Util::emitHook('\OC\Files\Storage\Shared', 'file_put_contents', $info);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- $result = $storage->file_put_contents($internalPath, $data);
- return $result;
- }
- return false;
- }
-
- /**
- * Delete the file if DELETE permission is granted
- *
- * @param string $path
- * @return boolean
- */
- public function unlink($path) {
-
- // never delete a share mount point
- if (empty($path)) {
- return false;
- }
- if ($source = $this->getSourcePath($path)) {
- if ($this->isDeletable($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->unlink($internalPath);
- }
- }
- return false;
- }
-
- public function rename($path1, $path2) {
- $this->init();
- // we need the paths relative to data/user/files
- $relPath1 = $this->getMountPoint() . '/' . $path1;
- $relPath2 = $this->getMountPoint() . '/' . $path2;
- $pathinfo = pathinfo($relPath1);
-
- $isPartFile = (isset($pathinfo['extension']) && $pathinfo['extension'] === 'part');
- $targetExists = $this->file_exists($path2);
- $sameFolder = (dirname($relPath1) === dirname($relPath2));
- if ($targetExists || ($sameFolder && !$isPartFile)) {
- // note that renaming a share mount point is always allowed
- if (!$this->isUpdatable('')) {
- return false;
- }
- } else {
- if (!$this->isCreatable('')) {
- return false;
- }
- }
-
-
- /**
- * @var \OC\Files\Storage\Storage $sourceStorage
- */
- list($sourceStorage, $sourceInternalPath) = $this->resolvePath($path1);
- /**
- * @var \OC\Files\Storage\Storage $targetStorage
- */
- list($targetStorage, $targetInternalPath) = $this->resolvePath($path2);
-
- return $targetStorage->moveFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
- }
-
- public function copy($path1, $path2) {
- // Copy the file if CREATE permission is granted
- if ($this->isCreatable(dirname($path2))) {
- /**
- * @var \OC\Files\Storage\Storage $sourceStorage
- */
- list($sourceStorage, $sourceInternalPath) = $this->resolvePath($path1);
- /**
- * @var \OC\Files\Storage\Storage $targetStorage
- */
- list($targetStorage, $targetInternalPath) = $this->resolvePath($path2);
-
- return $targetStorage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
- }
- return false;
- }
-
public function fopen($path, $mode) {
if ($source = $this->getSourcePath($path)) {
switch ($mode) {
@@ -465,43 +223,34 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
'mode' => $mode,
);
\OCP\Util::emitHook('\OC\Files\Storage\Shared', 'fopen', $info);
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->fopen($internalPath, $mode);
+ return parent::fopen($path, $mode);
}
return false;
}
- public function getMimeType($path) {
- if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->getMimeType($internalPath);
- }
- return false;
- }
-
- public function free_space($path) {
- $source = $this->getSourcePath($path);
- if ($source) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->free_space($internalPath);
- }
- return \OCP\Files\FileInfo::SPACE_UNKNOWN;
- }
+ /**
+ * see http://php.net/manual/en/function.rename.php
+ *
+ * @param string $path1
+ * @param string $path2
+ * @return bool
+ */
+ public function rename($path1, $path2) {
+ $isPartFile = pathinfo($path1, PATHINFO_EXTENSION) === 'part';
+ $targetExists = $this->file_exists($path2);
+ $sameFodler = dirname($path1) === dirname($path2);
- public function getLocalFile($path) {
- if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->getLocalFile($internalPath);
+ if ($targetExists || ($sameFodler && !$isPartFile)) {
+ if (!$this->isUpdatable('')) {
+ return false;
+ }
+ } else {
+ if (!$this->isCreatable('')) {
+ return false;
+ }
}
- return false;
- }
- public function touch($path, $mtime = null) {
- if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->touch($internalPath, $mtime);
- }
- return false;
+ return parent::rename($path1, $path2);
}
/**
@@ -510,33 +259,21 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
* @return string
*/
public function getMountPoint() {
- return $this->share['file_target'];
- }
-
- public function setMountPoint($path) {
- $this->share['file_target'] = $path;
- }
-
- public function getShareType() {
- return $this->share['share_type'];
+ return $this->newShare->getTarget();
}
/**
- * does the group share already has a user specific unique name
- *
- * @return bool
+ * @param string $path
*/
- public function uniqueNameSet() {
- return (isset($this->share['unique_name']) && $this->share['unique_name']);
+ public function setMountPoint($path) {
+ $this->newShare->setTarget($path);
}
/**
- * the share now uses a unique name of this user
- *
- * @brief the share now uses a unique name of this user
+ * @return int
*/
- public function setUniqueName() {
- $this->share['unique_name'] = true;
+ public function getShareType() {
+ return $this->newShare->getShareType();
}
/**
@@ -545,7 +282,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
* @return integer unique share ID
*/
public function getShareId() {
- return $this->share['id'];
+ return $this->newShare->getId();
}
/**
@@ -554,14 +291,14 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
* @return string
*/
public function getSharedFrom() {
- return $this->share['uid_owner'];
+ return $this->newShare->getShareOwner();
}
/**
- * @return array
+ * @return \OCP\Share\IShare
*/
public function getShare() {
- return $this->share;
+ return $this->newShare;
}
/**
@@ -570,11 +307,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
* @return string
*/
public function getItemType() {
- return $this->share['item_type'];
- }
-
- public function hasUpdated($path, $time) {
- return $this->filemtime($path) > $time;
+ return $this->newShare->getNodeType();
}
public function getCache($path = '', $storage = null) {
@@ -599,26 +332,11 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
if (!$storage) {
$storage = $this;
}
- return new \OCA\Files_Sharing\SharedPropagator($storage);
+ return new \OCA\Files_Sharing\SharedPropagator($storage, \OC::$server->getDatabaseConnection());
}
public function getOwner($path) {
- if ($path == '') {
- $path = $this->getMountPoint();
- }
- $source = $this->getFile($path);
- if ($source) {
- return $source['fileOwner'];
- }
- return false;
- }
-
- public function getETag($path) {
- if ($source = $this->getSourcePath($path)) {
- list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
- return $storage->getETag($internalPath);
- }
- return null;
+ return $this->newShare->getShareOwner();
}
/**
@@ -627,50 +345,8 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
* @return bool
*/
public function unshareStorage() {
- $result = true;
- if (!empty($this->share['grouped'])) {
- foreach ($this->share['grouped'] as $share) {
- $result = $result && \OCP\Share::unshareFromSelf($share['item_type'], $share['file_target']);
- }
- }
- $result = $result && \OCP\Share::unshareFromSelf($this->getItemType(), $this->getMountPoint());
-
- return $result;
- }
-
- /**
- * Resolve the path for the source of the share
- *
- * @param string $path
- * @return array
- */
- public function resolvePath($path) {
- $source = $this->getSourcePath($path);
- return \OC\Files\Filesystem::resolvePath($source);
- }
-
- /**
- * @param \OCP\Files\Storage $sourceStorage
- * @param string $sourceInternalPath
- * @param string $targetInternalPath
- * @return bool
- */
- public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
- /** @var \OCP\Files\Storage $targetStorage */
- list($targetStorage, $targetInternalPath) = $this->resolvePath($targetInternalPath);
- return $targetStorage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
- }
-
- /**
- * @param \OCP\Files\Storage $sourceStorage
- * @param string $sourceInternalPath
- * @param string $targetInternalPath
- * @return bool
- */
- public function moveFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
- /** @var \OCP\Files\Storage $targetStorage */
- list($targetStorage, $targetInternalPath) = $this->resolvePath($targetInternalPath);
- return $targetStorage->moveFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath);
+ \OC::$server->getShareManager()->deleteFromSelf($this->newShare, $this->user);
+ return true;
}
/**
@@ -685,7 +361,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
$targetStorage->acquireLock($targetInternalPath, $type, $provider);
// lock the parent folders of the owner when locking the share as recipient
if ($path === '') {
- $sourcePath = $this->ownerView->getPath($this->share['file_source']);
+ $sourcePath = $this->ownerView->getPath($this->newShare->getNodeId());
$this->ownerView->lockFile(dirname($sourcePath), ILockingProvider::LOCK_SHARED, true);
}
}
@@ -701,7 +377,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
$targetStorage->releaseLock($targetInternalPath, $type, $provider);
// unlock the parent folders of the owner when unlocking the share as recipient
if ($path === '') {
- $sourcePath = $this->ownerView->getPath($this->share['file_source']);
+ $sourcePath = $this->ownerView->getPath($this->newShare->getNodeId());
$this->ownerView->unlockFile(dirname($sourcePath), ILockingProvider::LOCK_SHARED, true);
}
}
@@ -735,14 +411,8 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
// shares do not participate in availability logic
}
- public function isLocal() {
- $this->init();
- $ownerPath = $this->ownerView->getPath($this->share['item_source']);
- list($targetStorage) = $this->ownerView->resolvePath($ownerPath);
- return $targetStorage->isLocal();
- }
-
public function getSourceStorage() {
return $this->sourceStorage;
}
+
}
diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php
index 10da2462807..0e6433b1122 100644
--- a/apps/files_sharing/lib/updater.php
+++ b/apps/files_sharing/lib/updater.php
@@ -81,8 +81,10 @@ class Shared_Updater {
$src = $userFolder->get($path);
- $type = $src instanceof \OCP\Files\File ? 'file' : 'folder';
- $shares = \OCP\Share::getItemShared($type, $src->getId());
+ $shareManager = \OC::$server->getShareManager();
+
+ $shares = $shareManager->getSharesBy($userFolder->getOwner()->getUID(), \OCP\Share::SHARE_TYPE_USER, $src, false, -1);
+ $shares = array_merge($shares, $shareManager->getSharesBy($userFolder->getOwner()->getUID(), \OCP\Share::SHARE_TYPE_GROUP, $src, false, -1));
// If the path we move is not a share we don't care
if (empty($shares)) {
@@ -96,14 +98,13 @@ class Shared_Updater {
return;
}
- $parenShare = $dstMount->getShare();
+ $newOwner = $dstMount->getShare()->getShareOwner();
+ //Ownership is moved over
foreach ($shares as $share) {
- $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder();
- $qb->update('share')
- ->set('parent', $qb->createNamedParameter($parenShare['id']))
- ->where($qb->expr()->eq('id', $qb->createNamedParameter($share['id'])))
- ->execute();
+ /** @var \OCP\Share\IShare $share */
+ $share->setShareOwner($newOwner);
+ $shareManager->updateShare($share);
}
}
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index ae00b01dca2..cb7fe1103b5 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -8,7 +8,6 @@ OCP\Util::addStyle('files_sharing', 'mobile');
OCP\Util::addScript('files_sharing', 'public');
OCP\Util::addScript('files', 'fileactions');
OCP\Util::addScript('files', 'fileactionsmenu');
-OCP\Util::addScript('files', 'jquery.iframe-transport');
OCP\Util::addScript('files', 'jquery.fileupload');
// JS required for folders
diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php
index 08f8b6f243d..3ded1bfc5d4 100644
--- a/apps/files_sharing/tests/api.php
+++ b/apps/files_sharing/tests/api.php
@@ -40,9 +40,6 @@ class Test_Files_Sharing_Api extends TestCase {
private static $tempStorage;
- /** @var \OCP\Share\IManager */
- private $shareManager;
-
/** @var \OCP\Files\Folder */
private $userFolder;
@@ -66,7 +63,6 @@ class Test_Files_Sharing_Api extends TestCase {
$this->view->file_put_contents($this->folder.$this->filename, $this->data);
$this->view->file_put_contents($this->folder . $this->subfolder . $this->filename, $this->data);
- $this->shareManager = \OC::$server->getShareManager();
$this->userFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
}
@@ -105,6 +101,12 @@ class Test_Files_Sharing_Api extends TestCase {
private function createOCS($request, $userId) {
$currentUser = \OC::$server->getUserManager()->get($userId);
+ $l = $this->getMock('\OCP\IL10N');
+ $l->method('t')
+ ->will($this->returnCallback(function($text, $parameters = []) {
+ return vsprintf($text, $parameters);
+ }));
+
return new \OCA\Files_Sharing\API\Share20OCS(
$this->shareManager,
\OC::$server->getGroupManager(),
@@ -112,7 +114,8 @@ class Test_Files_Sharing_Api extends TestCase {
$request,
\OC::$server->getRootFolder(),
\OC::$server->getURLGenerator(),
- $currentUser
+ $currentUser,
+ $l
);
}
@@ -669,7 +672,7 @@ class Test_Files_Sharing_Api extends TestCase {
$this->assertFalse($result->succeeded());
$this->assertEquals(400, $result->getStatusCode());
- $this->assertEquals('not a directory', $result->getMeta()['message']);
+ $this->assertEquals('Not a directory', $result->getMeta()['message']);
$this->shareManager->deleteShare($share1);
}
@@ -939,7 +942,7 @@ class Test_Files_Sharing_Api extends TestCase {
$this->assertEquals(404, $result->getStatusCode());
$meta = $result->getMeta();
- $this->assertEquals('wrong share ID, share doesn\'t exist.', $meta['message']);
+ $this->assertEquals('Wrong share ID, share doesn\'t exist', $meta['message']);
}
/**
@@ -1195,10 +1198,13 @@ class Test_Files_Sharing_Api extends TestCase {
$fileInfo = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
-
- $this->assertTrue($result);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
// user2 shares a file from the folder as link
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
@@ -1215,14 +1221,20 @@ class Test_Files_Sharing_Api extends TestCase {
$this->assertTrue($fileInfo2 instanceof \OC\Files\FileInfo);
+ $pass = true;
try {
- $result2 = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER3, 31);
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ 'localDir',
+ self::TEST_FILES_SHARING_API_USER2,
+ self::TEST_FILES_SHARING_API_USER3,
+ \OCP\Constants::PERMISSION_ALL
+ );
} catch (\Exception $e) {
- $result2 = false;
+ $pass = false;
}
- $this->assertFalse($result2);
+ $this->assertFalse($pass);
//cleanup
@@ -1232,8 +1244,7 @@ class Test_Files_Sharing_Api extends TestCase {
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+ $this->shareManager->deleteShare($share);
}
/**
@@ -1264,10 +1275,13 @@ class Test_Files_Sharing_Api extends TestCase {
$fileInfo = $this->view->getFileInfo($this->folder);
// user 1 shares the mount point folder with user2
- $result = \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
-
- $this->assertTrue($result);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
// user2: check that mount point name appears correctly
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
@@ -1279,8 +1293,7 @@ class Test_Files_Sharing_Api extends TestCase {
\Test_Files_Sharing_Api::loginHelper(\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+ $this->shareManager->deleteShare($share);
\OC_Hook::clear('OC_Filesystem', 'post_initMountPoints', '\Test_Files_Sharing_Api', 'initTestMountPointsHook');
}
@@ -1398,7 +1411,7 @@ class Test_Files_Sharing_Api extends TestCase {
if ($valid === false) {
$this->assertFalse($result->succeeded());
$this->assertEquals(404, $result->getStatusCode());
- $this->assertEquals('Invalid Date. Format must be YYYY-MM-DD.', $result->getMeta()['message']);
+ $this->assertEquals('Invalid date, date format must be YYYY-MM-DD', $result->getMeta()['message']);
return;
}
diff --git a/apps/files_sharing/tests/api/share20ocstest.php b/apps/files_sharing/tests/api/share20ocstest.php
index 9a30b8720ed..56c350aa99a 100644
--- a/apps/files_sharing/tests/api/share20ocstest.php
+++ b/apps/files_sharing/tests/api/share20ocstest.php
@@ -20,6 +20,7 @@
*/
namespace OCA\Files_Sharing\Tests\API;
+use OCP\IL10N;
use OCA\Files_Sharing\API\Share20OCS;
use OCP\Files\NotFoundException;
use OCP\IGroupManager;
@@ -61,6 +62,9 @@ class Share20OCSTest extends \Test\TestCase {
/** @var Share20OCS */
private $ocs;
+ /** @var IL10N */
+ private $l;
+
protected function setUp() {
$this->shareManager = $this->getMockBuilder('OCP\Share\IManager')
->disableOriginalConstructor()
@@ -77,14 +81,21 @@ class Share20OCSTest extends \Test\TestCase {
$this->currentUser = $this->getMock('OCP\IUser');
$this->currentUser->method('getUID')->willReturn('currentUser');
+ $this->l = $this->getMock('\OCP\IL10N');
+ $this->l->method('t')
+ ->will($this->returnCallback(function($text, $parameters = []) {
+ return vsprintf($text, $parameters);
+ }));
+
$this->ocs = new Share20OCS(
- $this->shareManager,
- $this->groupManager,
- $this->userManager,
- $this->request,
- $this->rootFolder,
- $this->urlGenerator,
- $this->currentUser
+ $this->shareManager,
+ $this->groupManager,
+ $this->userManager,
+ $this->request,
+ $this->rootFolder,
+ $this->urlGenerator,
+ $this->currentUser,
+ $this->l
);
}
@@ -97,7 +108,8 @@ class Share20OCSTest extends \Test\TestCase {
$this->request,
$this->rootFolder,
$this->urlGenerator,
- $this->currentUser
+ $this->currentUser,
+ $this->l,
])->setMethods(['formatShare'])
->getMock();
}
@@ -120,7 +132,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('outgoingServer2ServerSharesAllowed')->willReturn(true);
- $expected = new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ $expected = new \OC_OCS_Result(null, 404, 'Wrong share ID, share doesn\'t exist');
$this->assertEquals($expected, $this->ocs->deleteShare(42));
}
@@ -361,7 +373,8 @@ class Share20OCSTest extends \Test\TestCase {
$this->request,
$this->rootFolder,
$this->urlGenerator,
- $this->currentUser
+ $this->currentUser,
+ $this->l,
])->setMethods(['canAccessShare'])
->getMock();
@@ -426,7 +439,7 @@ class Share20OCSTest extends \Test\TestCase {
->with('ocinternal:42')
->willReturn($share);
- $expected = new \OC_OCS_Result(null, 404, 'wrong share ID, share doesn\'t exist.');
+ $expected = new \OC_OCS_Result(null, 404, 'Wrong share ID, share doesn\'t exist');
$this->assertEquals($expected->getMeta(), $this->ocs->getShare(42)->getMeta());
}
@@ -478,7 +491,7 @@ class Share20OCSTest extends \Test\TestCase {
}
public function testCreateShareNoPath() {
- $expected = new \OC_OCS_Result(null, 404, 'please specify a file or folder path');
+ $expected = new \OC_OCS_Result(null, 404, 'Please specify a file or folder path');
$result = $this->ocs->createShare();
@@ -504,7 +517,7 @@ class Share20OCSTest extends \Test\TestCase {
->with('invalid-path')
->will($this->throwException(new \OCP\Files\NotFoundException()));
- $expected = new \OC_OCS_Result(null, 404, 'wrong path, file/folder doesn\'t exist');
+ $expected = new \OC_OCS_Result(null, 404, 'Wrong path, file/folder doesn\'t exist');
$result = $this->ocs->createShare();
@@ -572,7 +585,7 @@ class Share20OCSTest extends \Test\TestCase {
->with('valid-path')
->willReturn($path);
- $expected = new \OC_OCS_Result(null, 404, 'please specify a valid user');
+ $expected = new \OC_OCS_Result(null, 404, 'Please specify a valid user');
$result = $this->ocs->createShare();
@@ -610,7 +623,7 @@ class Share20OCSTest extends \Test\TestCase {
->with('valid-path')
->willReturn($path);
- $expected = new \OC_OCS_Result(null, 404, 'please specify a valid user');
+ $expected = new \OC_OCS_Result(null, 404, 'Please specify a valid user');
$result = $this->ocs->createShare();
@@ -631,7 +644,8 @@ class Share20OCSTest extends \Test\TestCase {
$this->request,
$this->rootFolder,
$this->urlGenerator,
- $this->currentUser
+ $this->currentUser,
+ $this->l,
])->setMethods(['formatShare'])
->getMock();
@@ -711,7 +725,7 @@ class Share20OCSTest extends \Test\TestCase {
->with('valid-path')
->willReturn($path);
- $expected = new \OC_OCS_Result(null, 404, 'please specify a valid user');
+ $expected = new \OC_OCS_Result(null, 404, 'Please specify a valid user');
$result = $this->ocs->createShare();
@@ -732,7 +746,8 @@ class Share20OCSTest extends \Test\TestCase {
$this->request,
$this->rootFolder,
$this->urlGenerator,
- $this->currentUser
+ $this->currentUser,
+ $this->l,
])->setMethods(['formatShare'])
->getMock();
@@ -819,7 +834,7 @@ class Share20OCSTest extends \Test\TestCase {
$share->method('setNode')->with($path);
- $expected = new \OC_OCS_Result(null, 404, 'group sharing is disabled by the administrator');
+ $expected = new \OC_OCS_Result(null, 404, 'Group sharing is disabled by the administrator');
$result = $this->ocs->createShare();
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -845,7 +860,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('newShare')->willReturn(\OC::$server->getShareManager()->newShare());
- $expected = new \OC_OCS_Result(null, 404, 'public link sharing is disabled by the administrator');
+ $expected = new \OC_OCS_Result(null, 404, 'Public link sharing is disabled by the administrator');
$result = $this->ocs->createShare();
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -873,7 +888,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('newShare')->willReturn(\OC::$server->getShareManager()->newShare());
$this->shareManager->method('shareApiAllowLinks')->willReturn(true);
- $expected = new \OC_OCS_Result(null, 403, 'public upload disabled by the administrator');
+ $expected = new \OC_OCS_Result(null, 403, 'Public upload disabled by the administrator');
$result = $this->ocs->createShare();
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -902,7 +917,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('shareApiAllowLinks')->willReturn(true);
$this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true);
- $expected = new \OC_OCS_Result(null, 404, 'public upload is only possible for public shared folders');
+ $expected = new \OC_OCS_Result(null, 404, 'Public upload is only possible for publicly shared folders');
$result = $this->ocs->createShare();
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -1070,7 +1085,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('shareApiAllowLinks')->willReturn(true);
$this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true);
- $expected = new \OC_OCS_Result(null, 404, 'Invalid Date. Format must be YYYY-MM-DD.');
+ $expected = new \OC_OCS_Result(null, 404, 'Invalid date, date format must be YYYY-MM-DD');
$result = $ocs->createShare();
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -1093,7 +1108,8 @@ class Share20OCSTest extends \Test\TestCase {
$this->request,
$this->rootFolder,
$this->urlGenerator,
- $this->currentUser
+ $this->currentUser,
+ $this->l,
])->setMethods(['formatShare'])
->getMock();
@@ -1142,7 +1158,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
- $expected = new \OC_OCS_Result(null, 404, 'wrong share Id, share doesn\'t exist.');
+ $expected = new \OC_OCS_Result(null, 404, 'Wrong share ID, share doesn\'t exist');
$result = $this->ocs->updateShare(42);
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -1306,7 +1322,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
$this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(false);
- $expected = new \OC_OCS_Result(null, 403, 'public upload disabled by the administrator');
+ $expected = new \OC_OCS_Result(null, 403, 'Public upload disabled by the administrator');
$result = $ocs->updateShare(42);
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -1335,7 +1351,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
$this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true);
- $expected = new \OC_OCS_Result(null, 400, 'public upload is only possible for public shared folders');
+ $expected = new \OC_OCS_Result(null, 400, 'Public upload is only possible for publicly shared folders');
$result = $ocs->updateShare(42);
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -1523,7 +1539,7 @@ class Share20OCSTest extends \Test\TestCase {
$this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
$this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true);
- $expected = new \OC_OCS_Result(null, 400, 'can\'t change permission for public link share');
+ $expected = new \OC_OCS_Result(null, 400, 'Can\'t change permissions for public share links');
$result = $ocs->updateShare(42);
$this->assertEquals($expected->getMeta(), $result->getMeta());
@@ -1899,7 +1915,8 @@ class Share20OCSTest extends \Test\TestCase {
$this->request,
$this->rootFolder,
$this->urlGenerator,
- $this->currentUser
+ $this->currentUser,
+ $this->l
);
}
diff --git a/apps/files_sharing/tests/cache.php b/apps/files_sharing/tests/cache.php
index c137ba0728d..dd727c1c6f2 100644
--- a/apps/files_sharing/tests/cache.php
+++ b/apps/files_sharing/tests/cache.php
@@ -26,27 +26,6 @@
*/
use OCA\Files_sharing\Tests\TestCase;
-/**
- * ownCloud
- *
- * @author Vincent Petry, Bjoern Schiessle
- * @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- * 2014 Bjoern Schiessle <schiessle@owncloud.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or 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 AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
/**
* Class Test_Files_Sharing_Cache
@@ -72,9 +51,14 @@ class Test_Files_Sharing_Cache extends TestCase {
/** @var \OC\Files\Storage\Storage */
protected $sharedStorage;
+ /** @var \OCP\Share\IManager */
+ protected $shareManager;
+
protected function setUp() {
parent::setUp();
+ $this->shareManager = \OC::$server->getShareManager();
+
\OC_User::setDisplayName(self::TEST_FILES_SHARING_API_USER1, 'User One');
\OC_User::setDisplayName(self::TEST_FILES_SHARING_API_USER2, 'User Two');
@@ -101,13 +85,25 @@ class Test_Files_Sharing_Cache extends TestCase {
$this->ownerStorage->getScanner()->scan('');
// share "shareddir" with user2
- $fileinfo = $this->view->getFileInfo('container/shareddir');
- \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
-
- $fileinfo = $this->view->getFileInfo('container/shared single file.txt');
- \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
+ $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
+
+ $node = $rootFolder->get('container/shareddir');
+ $share = $this->shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $this->shareManager->createShare($share);
+
+ $node = $rootFolder->get('container/shared single file.txt');
+ $share = $this->shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL & ~(\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_DELETE));
+ $this->shareManager->createShare($share);
// login as user2
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -125,13 +121,10 @@ class Test_Files_Sharing_Cache extends TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $fileinfo = $this->view->getFileInfo('container/shareddir');
- \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
-
- $fileinfo = $this->view->getFileInfo('container/shared single file.txt');
- \OCP\Share::unshare('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
+ $shares = $this->shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, \OCP\Share::SHARE_TYPE_USER);
+ foreach ($shares as $share) {
+ $this->shareManager->deleteShare($share);
+ }
$this->view->deleteAll('container');
@@ -193,7 +186,7 @@ class Test_Files_Sharing_Cache extends TestCase {
array('name' => 'shareddir', 'path' => ''),
)
),
- array('%nonexistant%',
+ array('%nonexistent%',
array(
)
),
@@ -392,9 +385,15 @@ class Test_Files_Sharing_Cache extends TestCase {
function testGetFolderContentsWhenSubSubdirShared() {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $fileinfo = $this->view->getFileInfo('container/shareddir/subdir');
- \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER3, 31);
+ $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
+ $node = $rootFolder->get('container/shareddir/subdir');
+ $share = $this->shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER3)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $share = $this->shareManager->createShare($share);
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
@@ -430,8 +429,7 @@ class Test_Files_Sharing_Cache extends TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER3);
+ $this->shareManager->deleteShare($share);
}
/**
@@ -470,7 +468,17 @@ class Test_Files_Sharing_Cache extends TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
\OC\Files\Filesystem::file_put_contents('test.txt', 'foo');
$info = \OC\Files\Filesystem::getFileInfo('test.txt');
- \OCP\Share::shareItem('file', $info->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL);
+
+ $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
+ $node = $rootFolder->get('test.txt');
+ $share = $this->shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE);
+ $this->shareManager->createShare($share);
+
\OC_Util::tearDownFS();
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -491,7 +499,16 @@ class Test_Files_Sharing_Cache extends TestCase {
\OC\Files\Filesystem::touch('foo/bar/test.txt');
$folderInfo = \OC\Files\Filesystem::getFileInfo('foo');
$fileInfo = \OC\Files\Filesystem::getFileInfo('foo/bar/test.txt');
- \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL);
+
+ $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
+ $node = $rootFolder->get('foo');
+ $share = $this->shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $this->shareManager->createShare($share);
\OC_Util::tearDownFS();
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
diff --git a/apps/files_sharing/tests/controller/sharecontroller.php b/apps/files_sharing/tests/controller/sharecontroller.php
index db8c7fe553c..df3973099fb 100644
--- a/apps/files_sharing/tests/controller/sharecontroller.php
+++ b/apps/files_sharing/tests/controller/sharecontroller.php
@@ -29,6 +29,7 @@
namespace OCA\Files_Sharing\Controllers;
use OC\Files\Filesystem;
+use OCA\FederatedFileSharing\FederatedShareProvider;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\RedirectResponse;
@@ -66,6 +67,8 @@ class ShareControllerTest extends \Test\TestCase {
private $shareManager;
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject */
private $userManager;
+ /** @var FederatedShareProvider | \PHPUnit_Framework_MockObject_MockObject */
+ private $federatedShareProvider;
protected function setUp() {
$this->appName = 'files_sharing';
@@ -76,6 +79,12 @@ class ShareControllerTest extends \Test\TestCase {
$this->previewManager = $this->getMock('\OCP\IPreview');
$this->config = $this->getMock('\OCP\IConfig');
$this->userManager = $this->getMock('\OCP\IUserManager');
+ $this->federatedShareProvider = $this->getMockBuilder('OCA\FederatedFileSharing\FederatedShareProvider')
+ ->disableOriginalConstructor()->getMock();
+ $this->federatedShareProvider->expects($this->any())
+ ->method('isOutgoingServer2serverShareEnabled')->willReturn(true);
+ $this->federatedShareProvider->expects($this->any())
+ ->method('isIncomingServer2serverShareEnabled')->willReturn(true);
$this->shareController = new \OCA\Files_Sharing\Controllers\ShareController(
$this->appName,
@@ -88,7 +97,8 @@ class ShareControllerTest extends \Test\TestCase {
$this->shareManager,
$this->session,
$this->previewManager,
- $this->getMock('\OCP\Files\IRootFolder')
+ $this->getMock('\OCP\Files\IRootFolder'),
+ $this->federatedShareProvider
);
diff --git a/apps/files_sharing/tests/encryptedsizepropagation.php b/apps/files_sharing/tests/encryptedsizepropagation.php
new file mode 100644
index 00000000000..e341606abe4
--- /dev/null
+++ b/apps/files_sharing/tests/encryptedsizepropagation.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_sharing\Tests;
+
+use OC\Files\View;
+use Test\Traits\EncryptionTrait;
+
+/**
+ * @group DB
+ */
+class EncryptedSizePropagation extends SizePropagation {
+ use EncryptionTrait;
+
+ protected function setupUser($name, $password = '') {
+ $this->createUser($name, $password);
+ $tmpFolder = \OC::$server->getTempManager()->getTemporaryFolder();
+ $this->registerMount($name, '\OC\Files\Storage\Local', '/' . $name, ['datadir' => $tmpFolder]);
+ $this->setupForUser($name, $password);
+ $this->loginWithEncryption($name);
+ return new View('/' . $name . '/files');
+ }
+}
diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php
index 55972dd9221..2f3604e63cd 100644
--- a/apps/files_sharing/tests/etagpropagation.php
+++ b/apps/files_sharing/tests/etagpropagation.php
@@ -50,13 +50,15 @@ class EtagPropagation extends PropagationTestCase {
$this->fileIds[self::TEST_FILES_SHARING_API_USER3] = [];
$this->fileIds[self::TEST_FILES_SHARING_API_USER4] = [];
+ $rootFolder = \OC::$server->getRootFolder();
+ $shareManager = \OC::$server->getShareManager();
+
$this->rootView = new View('');
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
$view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
$view1->mkdir('/sub1/sub2/folder/inside');
$view1->mkdir('/directReshare');
$view1->mkdir('/sub1/sub2/folder/other');
- $view1->mkdir('/sub1/sub2/folder/other');
$view1->file_put_contents('/foo.txt', 'foobar');
$view1->file_put_contents('/sub1/sub2/folder/file.txt', 'foobar');
$view1->file_put_contents('/sub1/sub2/folder/inside/file.txt', 'foobar');
@@ -64,30 +66,90 @@ class EtagPropagation extends PropagationTestCase {
$this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
$fileInfo = $view1->getFileInfo('/foo.txt');
$this->assertInstanceOf('\OC\Files\FileInfo', $fileInfo);
- \OCP\Share::shareItem('file', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
- \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
- \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER3, 31);
+
+ $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
+ ->get('/foo.txt');
+ $share = $shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE);
+ $shareManager->createShare($share);
+ $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
+ ->get('/sub1/sub2/folder');
+ $share = $shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $shareManager->createShare($share);
+ $share = $shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER3)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $shareManager->createShare($share);
+
$folderInfo = $view1->getFileInfo('/directReshare');
$this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
- \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
+
+ $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1)
+ ->get('/directReshare');
+ $share = $shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $shareManager->createShare($share);
+
$this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER1]['sub1'] = $view1->getFileInfo('sub1')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER1]['sub1/sub2'] = $view1->getFileInfo('sub1/sub2')->getId();
+ /*
+ * User 2
+ */
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
$view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
$view2->mkdir('/sub1/sub2');
$view2->rename('/folder', '/sub1/sub2/folder');
$insideInfo = $view2->getFileInfo('/sub1/sub2/folder/inside');
$this->assertInstanceOf('\OC\Files\FileInfo', $insideInfo);
- \OCP\Share::shareItem('folder', $insideInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER4, 31);
+
+ $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER2)
+ ->get('/sub1/sub2/folder/inside');
+ $share = $shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER4)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $shareManager->createShare($share);
+
$folderInfo = $view2->getFileInfo('/directReshare');
$this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
- \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER4, 31);
+
+ $node = $rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER2)
+ ->get('/directReshare');
+ $share = $shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER4)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $shareManager->createShare($share);
+
$this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER2]['sub1'] = $view2->getFileInfo('sub1')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER2]['sub1/sub2'] = $view2->getFileInfo('sub1/sub2')->getId();
+ /*
+ * User 3
+ */
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER3);
$view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
$view3->mkdir('/sub1/sub2');
@@ -96,6 +158,9 @@ class EtagPropagation extends PropagationTestCase {
$this->fileIds[self::TEST_FILES_SHARING_API_USER3]['sub1'] = $view3->getFileInfo('sub1')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER3]['sub1/sub2'] = $view3->getFileInfo('sub1/sub2')->getId();
+ /*
+ * User 4
+ */
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER4);
$view4 = new View('/' . self::TEST_FILES_SHARING_API_USER4 . '/files');
$view4->mkdir('/sub1/sub2');
@@ -108,6 +173,7 @@ class EtagPropagation extends PropagationTestCase {
$this->loginAsUser($user);
foreach ($ids as $id) {
$path = $this->rootView->getPath($id);
+ $ls = $this->rootView->getDirectoryContent($path);
$this->fileEtags[$id] = $this->rootView->getFileInfo($path)->getEtag();
}
}
@@ -202,19 +268,40 @@ class EtagPropagation extends PropagationTestCase {
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
$folderInfo = $this->rootView->getFileInfo('/' . self::TEST_FILES_SHARING_API_USER1 . '/files/sub1/sub2/folder');
$this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
- $folderId = $folderInfo->getId();
- $this->assertTrue(
- \OCP\Share::unshare(
- 'folder',
- $folderId,
- \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2
- )
- );
+
+ $node = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1)->get('/sub1/sub2/folder');
+ $shareManager = \OC::$server->getShareManager();
+ $shares = $shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, \OCP\Share::SHARE_TYPE_USER, $node, true);
+
+ foreach ($shares as $share) {
+ if ($share->getSharedWith() === self::TEST_FILES_SHARING_API_USER2) {
+ $shareManager->deleteShare($share);
+ }
+ }
+
$this->assertEtagsForFoldersChanged([
// direct recipient affected
self::TEST_FILES_SHARING_API_USER2,
- // reshare recipient affected
+ ]);
+
+ $this->assertAllUnchanged();
+ }
+
+ public function testOwnerUnsharesFlatReshares() {
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+ $folderInfo = $this->rootView->getFileInfo('/' . self::TEST_FILES_SHARING_API_USER1 . '/files/sub1/sub2/folder/inside');
+ $this->assertInstanceOf('\OC\Files\FileInfo', $folderInfo);
+
+ $node = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1)->get('/sub1/sub2/folder/inside');
+ $shareManager = \OC::$server->getShareManager();
+ $shares = $shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, \OCP\Share::SHARE_TYPE_USER, $node, true);
+
+ foreach ($shares as $share) {
+ $shareManager->deleteShare($share);
+ }
+
+ $this->assertEtagsForFoldersChanged([
+ // direct recipient affected
self::TEST_FILES_SHARING_API_USER4,
]);
@@ -223,14 +310,13 @@ class EtagPropagation extends PropagationTestCase {
public function testRecipientUnsharesFromSelf() {
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
+ $ls = $this->rootView->getDirectoryContent('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/sub1/sub2/');
$this->assertTrue(
$this->rootView->unlink('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/sub1/sub2/folder')
);
$this->assertEtagsForFoldersChanged([
// direct recipient affected
self::TEST_FILES_SHARING_API_USER2,
- // reshare recipient affected
- self::TEST_FILES_SHARING_API_USER4,
]);
$this->assertAllUnchanged();
@@ -240,8 +326,11 @@ class EtagPropagation extends PropagationTestCase {
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
Filesystem::file_put_contents('/sub1/sub2/folder/asd.txt', 'bar');
$this->assertEtagsNotChanged([self::TEST_FILES_SHARING_API_USER4]);
- $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2,
- self::TEST_FILES_SHARING_API_USER3]);
+ $this->assertEtagsForFoldersChanged([
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ self::TEST_FILES_SHARING_API_USER3
+ ]);
$this->assertAllUnchanged();
}
@@ -350,14 +439,21 @@ class EtagPropagation extends PropagationTestCase {
}
public function testEtagChangeOnPermissionsChange() {
- $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
+ $userFolder = $this->rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
+ $node = $userFolder->get('/sub1/sub2/folder');
- $view = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
- $folderInfo = $view->getFileInfo('/sub1/sub2/folder');
+ $shares = $this->shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, \OCP\Share::SHARE_TYPE_USER, $node);
+ /** @var \OCP\Share\IShare[] $shares */
+ $shares = array_filter($shares, function(\OCP\Share\IShare $share) {
+ return $share->getSharedWith() === self::TEST_FILES_SHARING_API_USER2;
+ });
+ $this->assertCount(1, $shares);
- \OCP\Share::setPermissions('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 17);
+ $share = $shares[0];
+ $share->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE);
+ $this->shareManager->updateShare($share);
- $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]);
+ $this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2]);
$this->assertAllUnchanged();
}
diff --git a/apps/files_sharing/tests/groupetagpropagation.php b/apps/files_sharing/tests/groupetagpropagation.php
index 9f6b1e2f720..aaa81135279 100644
--- a/apps/files_sharing/tests/groupetagpropagation.php
+++ b/apps/files_sharing/tests/groupetagpropagation.php
@@ -46,18 +46,36 @@ class GroupEtagPropagation extends PropagationTestCase {
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
$view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
$view1->mkdir('/test/sub');
- $folderInfo = $view1->getFileInfo('/test');
- \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group1', 31);
+
+ $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ '/test',
+ self::TEST_FILES_SHARING_API_USER1,
+ 'group1',
+ \OCP\Constants::PERMISSION_ALL
+ );
$this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test'] = $view1->getFileInfo('test')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test/sub'] = $view1->getFileInfo('test/sub')->getId();
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
$view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
- $folderInfo = $view2->getFileInfo('/test');
- $subFolderInfo = $view2->getFileInfo('/test/sub');
- \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group2', 31);
- \OCP\Share::shareItem('folder', $subFolderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group3', 31);
+
+ $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ '/test',
+ self::TEST_FILES_SHARING_API_USER2,
+ 'group2',
+ \OCP\Constants::PERMISSION_ALL
+ );
+ $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ '/test/sub',
+ self::TEST_FILES_SHARING_API_USER2,
+ 'group3',
+ \OCP\Constants::PERMISSION_ALL
+ );
+
$this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test'] = $view2->getFileInfo('test')->getId();
$this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test/sub'] = $view2->getFileInfo('test/sub')->getId();
diff --git a/apps/files_sharing/tests/locking.php b/apps/files_sharing/tests/locking.php
index ef8b2bb1cd4..932afe006f9 100644
--- a/apps/files_sharing/tests/locking.php
+++ b/apps/files_sharing/tests/locking.php
@@ -59,7 +59,13 @@ class Locking extends TestCase {
Filesystem::file_put_contents('/foo/bar.txt', 'asd');
$fileId = Filesystem::getFileInfo('/foo/bar.txt')->getId();
- \OCP\Share::shareItem('file', $fileId, \OCP\Share::SHARE_TYPE_USER, $this->recipientUid, 31);
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ '/foo/bar.txt',
+ $this->ownerUid,
+ $this->recipientUid,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
$this->loginAsUser($this->recipientUid);
$this->assertTrue(Filesystem::file_exists('bar.txt'));
diff --git a/apps/files_sharing/tests/permissions.php b/apps/files_sharing/tests/permissions.php
index 43a57266851..c1568ceab0a 100644
--- a/apps/files_sharing/tests/permissions.php
+++ b/apps/files_sharing/tests/permissions.php
@@ -33,39 +33,25 @@ use OC\Files\View;
*/
class Test_Files_Sharing_Permissions extends OCA\Files_sharing\Tests\TestCase {
- /**
- * @var Storage
- */
+ /** @var Storage */
private $sharedStorageRestrictedShare;
- /**
- * @var Storage
- */
+ /** @var Storage */
private $sharedCacheRestrictedShare;
- /**
- * @var View
- */
+ /** @var View */
private $secondView;
- /**
- * @var Storage
- */
+ /** @var Storage */
private $ownerStorage;
- /**
- * @var Storage
- */
+ /** @var Storage */
private $sharedStorage;
- /**
- * @var Cache
- */
+ /** @var Cache */
private $sharedCache;
- /**
- * @var Cache
- */
+ /** @var Cache */
private $ownerCache;
protected function setUp() {
@@ -88,12 +74,25 @@ class Test_Files_Sharing_Permissions extends OCA\Files_sharing\Tests\TestCase {
$this->ownerStorage->getScanner()->scan('');
// share "shareddir" with user2
- $fileinfo = $this->view->getFileInfo('container/shareddir');
- \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
- $fileinfo2 = $this->view->getFileInfo('container/shareddirrestricted');
- \OCP\Share::shareItem('folder', $fileinfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 7);
+ $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1);
+
+ $node = $rootFolder->get('container/shareddir');
+ $share = $this->shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $this->shareManager->createShare($share);
+
+ $node = $rootFolder->get('container/shareddirrestricted');
+ $share = $this->shareManager->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
+ ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
+ ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE);
+ $this->shareManager->createShare($share);
// login as user2
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -113,12 +112,10 @@ class Test_Files_Sharing_Permissions extends OCA\Files_sharing\Tests\TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $fileinfo = $this->view->getFileInfo('container/shareddir');
- \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
- $fileinfo2 = $this->view->getFileInfo('container/shareddirrestricted');
- \OCP\Share::unshare('folder', $fileinfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
+ $shares = $this->shareManager->getSharesBy(self::TEST_FILES_SHARING_API_USER1, \OCP\Share::SHARE_TYPE_USER);
+ foreach ($shares as $share) {
+ $this->shareManager->deleteShare($share);
+ }
$this->view->deleteAll('container');
diff --git a/apps/files_sharing/tests/server2server.php b/apps/files_sharing/tests/server2server.php
index 7714f274c6d..1d047916ca9 100644
--- a/apps/files_sharing/tests/server2server.php
+++ b/apps/files_sharing/tests/server2server.php
@@ -44,6 +44,9 @@ class Test_Files_Sharing_S2S_OCS_API extends TestCase {
*/
private $s2s;
+ /** @var \OCA\FederatedFileSharing\FederatedShareProvider | PHPUnit_Framework_MockObject_MockObject */
+ private $federatedShareProvider;
+
protected function setUp() {
parent::setUp();
@@ -57,10 +60,16 @@ class Test_Files_Sharing_S2S_OCS_API extends TestCase {
->setConstructorArgs([$config, $clientService])
->getMock();
$httpHelperMock->expects($this->any())->method('post')->with($this->anything())->will($this->returnValue(true));
+ $this->federatedShareProvider = $this->getMockBuilder('OCA\FederatedFileSharing\FederatedShareProvider')
+ ->disableOriginalConstructor()->getMock();
+ $this->federatedShareProvider->expects($this->any())
+ ->method('isOutgoingServer2serverShareEnabled')->willReturn(true);
+ $this->federatedShareProvider->expects($this->any())
+ ->method('isIncomingServer2serverShareEnabled')->willReturn(true);
$this->registerHttpHelper($httpHelperMock);
- $this->s2s = new \OCA\Files_Sharing\API\Server2Server();
+ $this->s2s = new \OCA\Files_Sharing\API\Server2Server($this->federatedShareProvider);
$this->connection = \OC::$server->getDatabaseConnection();
}
diff --git a/apps/files_sharing/tests/share.php b/apps/files_sharing/tests/share.php
index aad698bcdba..7707cca190f 100644
--- a/apps/files_sharing/tests/share.php
+++ b/apps/files_sharing/tests/share.php
@@ -75,17 +75,21 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup');
- $fileinfo = $this->view->getFileInfo($this->filename);
-
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, 31);
-
- $this->assertTrue($result);
-
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
- 'testGroup', 31);
+ $share1 = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
- $this->assertTrue($result);
+ $share2 = $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ 'testGroup',
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
@@ -102,123 +106,9 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
// for user3 nothing should change
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
- }
-
- /**
- * if a file was shared as group share and as individual share they should be grouped
- */
- public function testGroupingOfShares() {
-
- $fileinfo = $this->view->getFileInfo($this->filename);
-
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
- \Test_Files_Sharing::TEST_FILES_SHARING_API_GROUP1, \OCP\Constants::PERMISSION_READ);
-
- $this->assertTrue($result);
-
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_UPDATE);
-
- $this->assertTrue($result);
-
- self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
-
- $result = \OCP\Share::getItemSharedWith('file', null);
-
- $this->assertTrue(is_array($result));
-
- // test should return exactly one shares created from testCreateShare()
- $this->assertSame(1, count($result));
-
- $share = reset($result);
- $this->assertSame(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, $share['permissions']);
-
- \OC\Files\Filesystem::rename($this->filename, $this->filename . '-renamed');
-
- $result = \OCP\Share::getItemSharedWith('file', null);
-
- $this->assertTrue(is_array($result));
-
- // test should return exactly one shares created from testCreateShare()
- $this->assertSame(1, count($result));
-
- $share = reset($result);
- $this->assertSame(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, $share['permissions']);
- $this->assertSame($this->filename . '-renamed', $share['file_target']);
-
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
-
- // unshare user share
- $result = \OCP\Share::unshare('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
-
- self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
-
- $result = \OCP\Share::getItemSharedWith('file', null);
-
- $this->assertTrue(is_array($result));
-
- // test should return the remaining group share
- $this->assertSame(1, count($result));
-
- $share = reset($result);
- // only the group share permissions should be available now
- $this->assertSame(\OCP\Constants::PERMISSION_READ, $share['permissions']);
- $this->assertSame($this->filename . '-renamed', $share['file_target']);
-
- }
-
- /**
- * user1 share file to a group and to a user2 in the same group. Then user2
- * unshares the file from self. Afterwards user1 should no longer see the
- * single user share to user2. If he re-shares the file to user2 the same target
- * then the group share should be used to group the item
- */
- public function testShareAndUnshareFromSelf() {
- $fileinfo = $this->view->getFileInfo($this->filename);
-
- // share the file to group1 (user2 is a member of this group) and explicitely to user2
- \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_FILES_SHARING_API_GROUP1, \OCP\Constants::PERMISSION_ALL);
- \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL);
-
- // user1 should have to shared files
- $shares = \OCP\Share::getItemsShared('file');
- $this->assertSame(2, count($shares));
-
- // user2 should have two files "welcome.txt" and the shared file,
- // both the group share and the single share of the same file should be
- // grouped to one file
- \Test_Files_Sharing::loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $dirContent = \OC\Files\Filesystem::getDirectoryContent('/');
- $this->assertSame(2, count($dirContent));
- $this->verifyDirContent($dirContent, array('welcome.txt', ltrim($this->filename, '/')));
-
- // now user2 deletes the share (= unshare from self)
- \OC\Files\Filesystem::unlink($this->filename);
-
- // only welcome.txt should exists
- $dirContent = \OC\Files\Filesystem::getDirectoryContent('/');
- $this->assertSame(1, count($dirContent));
- $this->verifyDirContent($dirContent, array('welcome.txt'));
-
- // login as user1...
- \Test_Files_Sharing::loginHelper(self::TEST_FILES_SHARING_API_USER1);
-
- // ... now user1 should have only one shared file, the group share
- $shares = \OCP\Share::getItemsShared('file');
- $this->assertSame(1, count($shares));
-
- // user1 shares a gain the file directly to user2
- \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL);
-
- // user2 should see again welcome.txt and the shared file
- \Test_Files_Sharing::loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $dirContent = \OC\Files\Filesystem::getDirectoryContent('/');
- $this->assertSame(2, count($dirContent));
- $this->verifyDirContent($dirContent, array('welcome.txt', ltrim($this->filename, '/')));
-
+ $this->shareManager->deleteShare($share1);
+ $this->shareManager->deleteShare($share2);
}
/**
@@ -238,15 +128,23 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
$fileinfo = $this->view->getFileInfo($this->filename);
$folderinfo = $this->view->getFileInfo($this->folder);
- $fileShare = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
- $this->assertTrue($fileShare);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
\OCA\Files_Sharing\Helper::setShareFolder('/Shared/subfolder');
- $folderShare = \OCP\Share::shareItem('folder', $folderinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
- $this->assertTrue($folderShare);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -261,56 +159,59 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
$this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
\OC\Files\Filesystem::file_put_contents('test.txt', 'test');
- $fileInfo = \OC\Files\Filesystem::getFileInfo('test.txt');
-
- $this->assertTrue(
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_FILES_SHARING_API_GROUP1, 23)
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ 'test.txt',
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_GROUP1,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
);
$this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $items = \OCP\Share::getItemsSharedWith('file');
- $this->assertSame('/test.txt' ,$items[0]['file_target']);
- $this->assertSame(23, $items[0]['permissions']);
+ $shares = $this->shareManager->getSharedWith(self::TEST_FILES_SHARING_API_USER2, \OCP\Share::SHARE_TYPE_GROUP);
+ $share = $shares[0];
+ $this->assertSame('/test.txt' ,$share->getTarget());
+ $this->assertSame(19, $share->getPermissions());
\OC\Files\Filesystem::rename('test.txt', 'new test.txt');
- $items = \OCP\Share::getItemsSharedWith('file');
- $this->assertSame('/new test.txt' ,$items[0]['file_target']);
- $this->assertSame(23, $items[0]['permissions']);
+ $shares = $this->shareManager->getSharedWith(self::TEST_FILES_SHARING_API_USER2, \OCP\Share::SHARE_TYPE_GROUP);
+ $share = $shares[0];
+ $this->assertSame('/new test.txt' ,$share->getTarget());
+ $this->assertSame(19, $share->getPermissions());
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::setPermissions('file', $items[0]['item_source'], $items[0]['share_type'], $items[0]['share_with'], 3);
+ $share->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE);
+ $this->shareManager->updateShare($share);
$this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $items = \OCP\Share::getItemsSharedWith('file');
+ $shares = $this->shareManager->getSharedWith(self::TEST_FILES_SHARING_API_USER2, \OCP\Share::SHARE_TYPE_GROUP);
+ $share = $shares[0];
- $this->assertSame('/new test.txt' ,$items[0]['file_target']);
- $this->assertSame(3, $items[0]['permissions']);
+ $this->assertSame('/new test.txt' ,$share->getTarget());
+ $this->assertSame(3, $share->getPermissions());
}
/**
* shared files should never have delete permissions
* @dataProvider dataProviderTestFileSharePermissions
*/
- public function testFileSharePermissions($permission, $expectedPermissions) {
-
- $fileinfo = $this->view->getFileInfo($this->filename);
-
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, $permission);
-
- $this->assertTrue($result);
-
- $result = \OCP\Share::getItemShared('file', null);
-
- $this->assertTrue(is_array($result));
-
- // test should return exactly one shares created from testCreateShare()
- $this->assertSame(1, count($result), 'more then one share found');
+ public function testFileSharePermissions($permission, $expectedvalid) {
+
+ $pass = true;
+ try {
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ $permission
+ );
+ } catch (\Exception $e) {
+ $pass = false;
+ }
- $share = reset($result);
- $this->assertSame($expectedPermissions, $share['permissions']);
+ $this->assertEquals($expectedvalid, $pass);
}
public function dataProviderTestFileSharePermissions() {
@@ -321,22 +222,23 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
$permission6 = \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE;
return array(
- array($permission1, \OCP\Constants::PERMISSION_ALL & ~\OCP\Constants::PERMISSION_DELETE),
- array($permission3, $permission3),
- array($permission4, $permission4),
- array($permission5, $permission3),
- array($permission6, $permission4),
+ array($permission1, false),
+ array($permission3, true),
+ array($permission4, true),
+ array($permission5, false),
+ array($permission6, false),
);
}
public function testFileOwner() {
- $fileinfo = $this->view->getFileInfo($this->filename);
-
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- \Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL);
-
- $this->assertTrue($result);
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ
+ );
$this->loginHelper(\Test_Files_Sharing::TEST_FILES_SHARING_API_USER2);
@@ -344,135 +246,4 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase {
$this->assertSame(\Test_Files_Sharing::TEST_FILES_SHARING_API_USER1, $info->getOwner()->getUID());
}
-
- /**
- * @dataProvider dataProviderGetUsersSharingFile
- *
- * @param string $groupName name of group to share with
- * @param bool $includeOwner whether to include the owner in the result
- * @param bool $includePaths whether to include paths in the result
- * @param array $expectedResult expected result of the API call
- */
- public function testGetUsersSharingFile($groupName, $includeOwner, $includePaths, $expectedResult) {
-
- $fileinfo = $this->view->getFileInfo($this->folder);
-
- $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
- $groupName, \OCP\Constants::PERMISSION_READ);
- $this->assertTrue($result);
-
- // public share
- $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_LINK,
- null, \OCP\Constants::PERMISSION_READ);
- $this->assertNotNull($result); // returns the token!
-
- // owner renames after sharing
- $this->view->rename($this->folder, $this->folder . '_owner_renamed');
-
- self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
-
- $user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
- $user2View->rename($this->folder, $this->folder . '_renamed');
-
- $ownerPath = $this->folder . '_owner_renamed';
- $owner = self::TEST_FILES_SHARING_API_USER1;
-
- $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner, $includeOwner, $includePaths);
-
- // sort users to make sure it matches
- if ($includePaths) {
- ksort($result);
- } else {
- sort($result['users']);
- }
-
- $this->assertEquals(
- $expectedResult,
- $result
- );
- }
-
- public function dataProviderGetUsersSharingFile() {
- // note: "group" contains user1 (the owner), user2 and user3
- // and self::TEST_FILES_SHARING_API_GROUP1 contains only user2
- return [
- // share with group that contains owner
- [
- 'group',
- false,
- false,
- [
- 'users' =>
- [
- // because user1 was in group
- self::TEST_FILES_SHARING_API_USER1,
- self::TEST_FILES_SHARING_API_USER2,
- self::TEST_FILES_SHARING_API_USER3,
- ],
- 'public' => true,
- 'remote' => false,
- ],
- ],
- // share with group that does not contain owner
- [
- self::TEST_FILES_SHARING_API_GROUP1,
- false,
- false,
- [
- 'users' =>
- [
- self::TEST_FILES_SHARING_API_USER2,
- ],
- 'public' => true,
- 'remote' => false,
- ],
- ],
- // share with group that does not contain owner, include owner
- [
- self::TEST_FILES_SHARING_API_GROUP1,
- true,
- false,
- [
- 'users' =>
- [
- self::TEST_FILES_SHARING_API_USER1,
- self::TEST_FILES_SHARING_API_USER2,
- ],
- 'public' => true,
- 'remote' => false,
- ],
- ],
- // include paths, with owner
- [
- 'group',
- true,
- true,
- [
- self::TEST_FILES_SHARING_API_USER1 => self::TEST_FOLDER_NAME . '_owner_renamed',
- self::TEST_FILES_SHARING_API_USER2 => self::TEST_FOLDER_NAME . '_renamed',
- self::TEST_FILES_SHARING_API_USER3 => self::TEST_FOLDER_NAME,
- ],
- ],
- // include paths, group without owner
- [
- self::TEST_FILES_SHARING_API_GROUP1,
- false,
- true,
- [
- self::TEST_FILES_SHARING_API_USER2 => self::TEST_FOLDER_NAME. '_renamed',
- ],
- ],
- // include paths, include owner, group without owner
- [
- self::TEST_FILES_SHARING_API_GROUP1,
- true,
- true,
- [
- self::TEST_FILES_SHARING_API_USER1 => self::TEST_FOLDER_NAME . '_owner_renamed',
- self::TEST_FILES_SHARING_API_USER2 => self::TEST_FOLDER_NAME . '_renamed',
- ],
- ],
- ];
- }
-
}
diff --git a/apps/files_sharing/tests/sharedmount.php b/apps/files_sharing/tests/sharedmount.php
index e01deeb60f4..48040ab8dc9 100644
--- a/apps/files_sharing/tests/sharedmount.php
+++ b/apps/files_sharing/tests/sharedmount.php
@@ -49,8 +49,12 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
protected function tearDown() {
if ($this->view) {
- $this->view->unlink($this->folder);
- $this->view->unlink($this->filename);
+ if ($this->view->file_exists($this->folder)) {
+ $this->view->unlink($this->folder);
+ }
+ if ($this->view->file_exists($this->filename)) {
+ $this->view->unlink($this->filename);
+ }
}
parent::tearDown();
@@ -59,59 +63,46 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
/**
* test if the mount point moves up if the parent folder no longer exists
*/
- function testShareMountLoseParentFolder() {
+ public function testShareMountLoseParentFolder() {
// share to user
- $fileinfo = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
-
- $statement = "UPDATE `*PREFIX*share` SET `file_target` = ? where `share_with` = ?";
- $query = \OCP\DB::prepare($statement);
- $arguments = array('/foo/bar' . $this->folder, self::TEST_FILES_SHARING_API_USER2);
- $query->execute($arguments);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL);
- $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
- $result = $query->execute();
+ $share->setTarget('/foo/bar' . $this->folder);
+ $this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2);
- $shares = $result->fetchAll();
-
- $this->assertSame(1, count($shares));
-
- $share = reset($shares);
- $this->assertSame('/foo/bar' . $this->folder, $share['file_target']);
+ $share = $this->shareManager->getShareById($share->getFullId());
+ $this->assertSame('/foo/bar' . $this->folder, $share->getTarget());
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
-
// share should have moved up
- $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
- $result = $query->execute();
-
- $shares = $result->fetchAll();
-
- $this->assertSame(1, count($shares));
-
- $share = reset($shares);
- $this->assertSame($this->folder, $share['file_target']);
+ $share = $this->shareManager->getShareById($share->getFullId());
+ $this->assertSame($this->folder, $share->getTarget());
//cleanup
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2);
+ $this->shareManager->deleteShare($share);
$this->view->unlink($this->folder);
}
/**
* @medium
*/
- function testDeleteParentOfMountPoint() {
-
+ public function testDeleteParentOfMountPoint() {
// share to user
- $fileinfo = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
-
- $this->assertTrue($result);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -143,10 +134,14 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
$this->view->unlink($this->folder);
}
- function testMoveSharedFile() {
- $fileinfo = $this->view->getFileInfo($this->filename);
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
+ public function testMoveSharedFile() {
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -166,22 +161,27 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->filename));
//cleanup
- \OCP\Share::unshare('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2);
+ $this->shareManager->deleteShare($share);
}
/**
* share file with a group if a user renames the file the filename should not change
* for the other users
*/
- function testMoveGroupShare () {
+ public function testMoveGroupShare () {
\OC_Group::createGroup('testGroup');
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER1, 'testGroup');
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup');
$fileinfo = $this->view->getFileInfo($this->filename);
- $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
- "testGroup", 31);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ 'testGroup',
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -202,7 +202,7 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
//cleanup
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::unshare('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, 'testGroup');
+ $this->shareManager->deleteShare($share);
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER1, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup');
@@ -214,7 +214,7 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
* @param string $expectedResult
* @param bool $exception if a exception is expected
*/
- function testStripUserFilesPath($path, $expectedResult, $exception) {
+ public function testStripUserFilesPath($path, $expectedResult, $exception) {
$testClass = new DummyTestClassSharedMount(null, null);
try {
$result = $testClass->stripUserFilesPathDummy($path);
@@ -228,7 +228,7 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
}
}
- function dataProviderTestStripUserFilesPath() {
+ public function dataProviderTestStripUserFilesPath() {
return array(
array('/user/files/foo.txt', '/foo.txt', false),
array('/user/files/folder/foo.txt', '/folder/foo.txt', false),
@@ -239,7 +239,7 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
);
}
- function dataPermissionMovedGroupShare() {
+ public function dataPermissionMovedGroupShare() {
$data = [];
$powerset = function($permissions) {
@@ -256,7 +256,6 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
//Generate file permissions
$permissions = [
\OCP\Constants::PERMISSION_UPDATE,
- \OCP\Constants::PERMISSION_CREATE,
\OCP\Constants::PERMISSION_SHARE,
];
@@ -321,54 +320,45 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
\OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup');
// Share item with group
- $fileinfo = $this->view->getFileInfo($path);
- $this->assertTrue(
- \OCP\Share::shareItem($type, $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, "testGroup", $beforePerm)
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ $path,
+ self::TEST_FILES_SHARING_API_USER1,
+ 'testGroup',
+ $beforePerm
);
// Login as user 2 and verify the item exists
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertTrue(\OC\Files\Filesystem::file_exists($path));
- $result = \OCP\Share::getItemSharedWithBySource($type, $fileinfo['fileid']);
- $this->assertNotEmpty($result);
- $this->assertEquals($beforePerm, $result['permissions']);
+ $result = $this->shareManager->getShareById($share->getFullId(), self::TEST_FILES_SHARING_API_USER2);
+ $this->assertEquals($beforePerm, $result->getPermissions());
// Now move the item forcing a new entry in the share table
\OC\Files\Filesystem::rename($path, "newPath");
$this->assertTrue(\OC\Files\Filesystem::file_exists('newPath'));
$this->assertFalse(\OC\Files\Filesystem::file_exists($path));
- // Login as user 1 again and change permissions
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $this->assertTrue(
- \OCP\Share::setPermissions($type, $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, "testGroup", $afterPerm)
- );
+ // change permissions
+ $share->setPermissions($afterPerm);
+ $this->shareManager->updateShare($share);
// Login as user 3 and verify that the permissions are changed
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
- $result = \OCP\Share::getItemSharedWithBySource($type, $fileinfo['fileid']);
+ $result = $this->shareManager->getShareById($share->getFullId(), self::TEST_FILES_SHARING_API_USER3);
$this->assertNotEmpty($result);
- $this->assertEquals($afterPerm, $result['permissions']);
- $groupShareId = $result['id'];
+ $this->assertEquals($afterPerm, $result->getPermissions());
// Login as user 2 and verify that the permissions are changed
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $result = \OCP\Share::getItemSharedWithBySource($type, $fileinfo['fileid']);
+ $result = $this->shareManager->getShareById($share->getFullId(), self::TEST_FILES_SHARING_API_USER2);
$this->assertNotEmpty($result);
- $this->assertEquals($afterPerm, $result['permissions']);
- $this->assertNotEquals($groupShareId, $result['id']);
-
- // Also verify in the DB
- $statement = "SELECT `permissions` FROM `*PREFIX*share` WHERE `id`=?";
- $query = \OCP\DB::prepare($statement);
- $result = $query->execute([$result['id']]);
- $shares = $result->fetchAll();
- $this->assertCount(1, $shares);
- $this->assertEquals($afterPerm, $shares[0]['permissions']);
+ $this->assertEquals($afterPerm, $result->getPermissions());
+ $this->assertEquals('/newPath', $result->getTarget());
//cleanup
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::unshare($type, $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, 'testGroup');
+ $this->shareManager->deleteShare($share);
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER1, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup');
@@ -388,66 +378,44 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase {
// Share item with group
$fileinfo = $this->view->getFileInfo($this->folder);
- $this->assertTrue(
- \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, "testGroup", \OCP\Constants::PERMISSION_READ)
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ 'testGroup',
+ \OCP\Constants::PERMISSION_READ
);
// Login as user 2 and verify the item exists
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertTrue(\OC\Files\Filesystem::file_exists($this->folder));
- $result = \OCP\Share::getItemSharedWithBySource('folder', $fileinfo['fileid']);
+ $result = $this->shareManager->getShareById($share->getFullId(), self::TEST_FILES_SHARING_API_USER2);
$this->assertNotEmpty($result);
- $this->assertEquals(\OCP\Constants::PERMISSION_READ, $result['permissions']);
+ $this->assertEquals(\OCP\Constants::PERMISSION_READ, $result->getPermissions());
// Delete the share
$this->assertTrue(\OC\Files\Filesystem::rmdir($this->folder));
$this->assertFalse(\OC\Files\Filesystem::file_exists($this->folder));
// Verify we do not get a share
- $result = \OCP\Share::getItemSharedWithBySource('folder', $fileinfo['fileid']);
- $this->assertEmpty($result);
-
- // Verify that the permission is correct in the DB
- $qb = $connection->getQueryBuilder();
- $qb->select('*')
- ->from('share')
- ->where($qb->expr()->eq('file_source', $qb->createParameter('fileSource')))
- ->andWhere($qb->expr()->eq('share_type', $qb->createParameter('shareType')))
- ->setParameter(':fileSource', $fileinfo['fileid'])
- ->setParameter(':shareType', 2);
- $res = $qb->execute()->fetchAll();
-
- $this->assertCount(1, $res);
- $this->assertEquals(0, $res[0]['permissions']);
+ $result = $this->shareManager->getShareById($share->getFullId(), self::TEST_FILES_SHARING_API_USER2);
+ $this->assertEquals(0, $result->getPermissions());
// Login as user 1 again and change permissions
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $this->assertTrue(
- \OCP\Share::setPermissions('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, "testGroup", \OCP\Constants::PERMISSION_ALL)
- );
+ $share->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $share = $this->shareManager->updateShare($share);
// Login as user 2 and verify
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertFalse(\OC\Files\Filesystem::file_exists($this->folder));
- $result = \OCP\Share::getItemSharedWithBySource('folder', $fileinfo['fileid']);
- $this->assertEmpty($result);
+ $result = $this->shareManager->getShareById($share->getFullId(), self::TEST_FILES_SHARING_API_USER2);
+ $this->assertEquals(0, $result->getPermissions());
- $connection = \OC::$server->getDatabaseConnection();
- $qb = $connection->getQueryBuilder();
- $qb->select('*')
- ->from('share')
- ->where($qb->expr()->eq('file_source', $qb->createParameter('fileSource')))
- ->andWhere($qb->expr()->eq('share_type', $qb->createParameter('shareType')))
- ->setParameter(':fileSource', $fileinfo['fileid'])
- ->setParameter(':shareType', 2);
- $res = $qb->execute()->fetchAll();
-
- $this->assertCount(1, $res);
- $this->assertEquals(0, $res[0]['permissions']);
+ $this->shareManager->deleteShare($share);
//cleanup
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER1, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER2, 'testGroup');
\OC_Group::removeFromGroup(self::TEST_FILES_SHARING_API_USER3, 'testGroup');
diff --git a/apps/files_sharing/tests/sharedstorage.php b/apps/files_sharing/tests/sharedstorage.php
index 63f4334103f..19edc44f9b4 100644
--- a/apps/files_sharing/tests/sharedstorage.php
+++ b/apps/files_sharing/tests/sharedstorage.php
@@ -50,8 +50,12 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
protected function tearDown() {
if ($this->view) {
- $this->view->unlink($this->folder);
- $this->view->unlink($this->filename);
+ if ($this->view->file_exists($this->folder)) {
+ $this->view->unlink($this->folder);
+ }
+ if ($this->view->file_exists($this->filename)) {
+ $this->view->unlink($this->filename);
+ }
}
\OC\Files\Filesystem::getLoader()->removeStorageWrapper('oc_trashbin');
@@ -64,14 +68,16 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
*
* @medium
*/
- function testParentOfMountPointIsGone() {
+ public function testParentOfMountPointIsGone() {
// share to user
- $fileinfo = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
-
- $this->assertTrue($result);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -107,14 +113,17 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
/**
* @medium
*/
- function testRenamePartFile() {
+ public function testRenamePartFile() {
// share to user
- $fileinfo = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
- $this->assertTrue($result);
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -139,26 +148,30 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
$this->assertTrue($this->view->file_exists($this->folder . '/foo.txt'));
//cleanup
- \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
+ $this->shareManager->deleteShare($share);
}
public function testFilesize() {
-
- $fileinfoFolder = $this->view->getFileInfo($this->folder);
- $fileinfoFile = $this->view->getFileInfo($this->filename);
-
$folderSize = $this->view->filesize($this->folder);
$file1Size = $this->view->filesize($this->folder . $this->filename);
$file2Size = $this->view->filesize($this->filename);
- $result = \OCP\Share::shareItem('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
- $this->assertTrue($result);
+ $share1 = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
+
+ $share2 = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
- $result = \OCP\Share::shareItem('file', $fileinfoFile['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
- $this->assertTrue($result);
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -168,21 +181,19 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
$this->assertSame($file2Size, \OC\Files\Filesystem::filesize($this->filename));
//cleanup
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $result = \OCP\Share::unshare('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
- $result = \OCP\Share::unshare('file', $fileinfoFile['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
+ $this->shareManager->deleteShare($share1);
+ $this->shareManager->deleteShare($share2);
}
- function testGetPermissions() {
- $fileinfoFolder = $this->view->getFileInfo($this->folder);
+ public function testGetPermissions() {
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ
+ );
- $result = \OCP\Share::shareItem('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 1);
- $this->assertTrue($result);
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -201,18 +212,19 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
//cleanup
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $result = \OCP\Share::unshare('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
+ $this->shareManager->deleteShare($share);
}
public function testFopenWithReadOnlyPermission() {
$this->view->file_put_contents($this->folder . '/existing.txt', 'foo');
- $fileinfoFolder = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_READ);
- $this->assertTrue($result);
+
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -232,18 +244,20 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
$this->assertFalse($user2View->unlink($this->folder . '/existing.txt'));
//cleanup
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $result = \OCP\Share::unshare('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
+ $this->shareManager->deleteShare($share);
}
public function testFopenWithCreateOnlyPermission() {
$this->view->file_put_contents($this->folder . '/existing.txt', 'foo');
$fileinfoFolder = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE);
- $this->assertTrue($result);
+
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -284,11 +298,14 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
public function testFopenWithUpdateOnlyPermission() {
$this->view->file_put_contents($this->folder . '/existing.txt', 'foo');
- $fileinfoFolder = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE);
- $this->assertTrue($result);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -322,18 +339,19 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
$this->assertFalse($user2View->unlink($this->folder . '/existing-renamed.txt'));
//cleanup
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $result = \OCP\Share::unshare('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
+ $this->shareManager->deleteShare($share);
}
public function testFopenWithDeleteOnlyPermission() {
$this->view->file_put_contents($this->folder . '/existing.txt', 'foo');
- $fileinfoFolder = $this->view->getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE);
- $this->assertTrue($result);
+
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$user2View = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -353,23 +371,28 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
$this->assertTrue($user2View->unlink($this->folder . '/existing.txt'));
//cleanup
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $result = \OCP\Share::unshare('folder', $fileinfoFolder['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
+ $this->shareManager->deleteShare($share);
}
- function testMountSharesOtherUser() {
- $folderInfo = $this->view->getFileInfo($this->folder);
- $fileInfo = $this->view->getFileInfo($this->filename);
+ public function testMountSharesOtherUser() {
$rootView = new \OC\Files\View('');
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
// share 2 different files with 2 different users
- \OCP\Share::shareItem('folder', $folderInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER3, 31);
+ $share1 = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
+ $share2 = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->filename,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER3,
+ \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$this->assertTrue($rootView->file_exists('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/' . $this->folder));
@@ -387,15 +410,21 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
//cleanup
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
$this->view->unlink($this->folder);
+
+ $this->shareManager->deleteShare($share1);
+ $this->shareManager->deleteShare($share2);
}
public function testCopyFromStorage() {
- $folderInfo = $this->view->getFileInfo($this->folder);
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- // share 2 different files with 2 different users
- \OCP\Share::shareItem('folder', $folderInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -416,15 +445,19 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
$this->view->unlink($this->folder);
+ $this->shareManager->deleteShare($share);
}
public function testMoveFromStorage() {
- $folderInfo = $this->view->getFileInfo($this->folder);
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- // share 2 different files with 2 different users
- \OCP\Share::shareItem('folder', $folderInfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -445,31 +478,40 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
$this->view->unlink($this->folder);
+ $this->shareManager->deleteShare($share);
}
public function testNameConflict() {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
$view1 = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
$view1->mkdir('foo');
- $folderInfo1 = $view1->getFileInfo('foo');
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
$view3 = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files');
$view3->mkdir('foo');
- $folderInfo2 = $view3->getFileInfo('foo');
// share a folder with the same name from two different users to the same user
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::shareItem('folder', $folderInfo1['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
- self::TEST_FILES_SHARING_API_GROUP1, 31);
+ $share1 = $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ 'foo',
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_GROUP1,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
self::loginHelper(self::TEST_FILES_SHARING_API_USER3);
- \OCP\Share::shareItem('folder', $folderInfo2['fileid'], \OCP\Share::SHARE_TYPE_GROUP,
- self::TEST_FILES_SHARING_API_GROUP1, 31);
+ $share2 = $this->share(
+ \OCP\Share::SHARE_TYPE_GROUP,
+ 'foo',
+ self::TEST_FILES_SHARING_API_USER3,
+ self::TEST_FILES_SHARING_API_GROUP1,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
$view2 = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -482,7 +524,9 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase {
/** @var \OC\Files\Storage\Shared $storage */
$storage = $mount->getStorage();
- $source = $storage->getFile('');
- $this->assertEquals(self::TEST_FILES_SHARING_API_USER1, $source['uid_owner']);
+ $this->assertEquals(self::TEST_FILES_SHARING_API_USER1, $storage->getOwner(''));
+
+ $this->shareManager->deleteShare($share1);
+ $this->shareManager->deleteShare($share2);
}
}
diff --git a/apps/files_sharing/tests/sizepropagation.php b/apps/files_sharing/tests/sizepropagation.php
index 7b7884f3f96..c0f5696c16d 100644
--- a/apps/files_sharing/tests/sizepropagation.php
+++ b/apps/files_sharing/tests/sizepropagation.php
@@ -24,6 +24,8 @@
namespace OCA\Files_sharing\Tests;
use OC\Files\View;
+use Test\Traits\MountProviderTrait;
+use Test\Traits\UserTrait;
/**
* Class SizePropagation
@@ -33,57 +35,72 @@ use OC\Files\View;
* @package OCA\Files_sharing\Tests
*/
class SizePropagation extends TestCase {
+ use UserTrait;
+ use MountProviderTrait;
+
+ protected function setupUser($name, $password = '') {
+ $this->createUser($name, $password);
+ $tmpFolder = \OC::$server->getTempManager()->getTemporaryFolder();
+ $this->registerMount($name, '\OC\Files\Storage\Local', '/' . $name, ['datadir' => $tmpFolder]);
+ $this->loginAsUser($name);
+ return new View('/' . $name . '/files');
+ }
public function testSizePropagationWhenOwnerChangesFile() {
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $recipientView = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
+ $recipientView = $this->setupUser(self::TEST_FILES_SHARING_API_USER1);
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $ownerView = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
+ $ownerView = $this->setupUser(self::TEST_FILES_SHARING_API_USER2);
$ownerView->mkdir('/sharedfolder/subfolder');
$ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'bar');
- $sharedFolderInfo = $ownerView->getFileInfo('/sharedfolder', false);
- $this->assertInstanceOf('\OC\Files\FileInfo', $sharedFolderInfo);
- \OCP\Share::shareItem('folder', $sharedFolderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER1, 31);
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ '/sharedfolder',
+ self::TEST_FILES_SHARING_API_USER2,
+ self::TEST_FILES_SHARING_API_USER1,
+ \OCP\Constants::PERMISSION_ALL
+ );
$ownerRootInfo = $ownerView->getFileInfo('', false);
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
$this->assertTrue($recipientView->file_exists('/sharedfolder/subfolder/foo.txt'));
$recipientRootInfo = $recipientView->getFileInfo('', false);
// when file changed as owner
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
$ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'foobar');
// size of recipient's root stays the same
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
$newRecipientRootInfo = $recipientView->getFileInfo('', false);
$this->assertEquals($recipientRootInfo->getSize(), $newRecipientRootInfo->getSize());
// size of owner's root increases
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
$newOwnerRootInfo = $ownerView->getFileInfo('', false);
$this->assertEquals($ownerRootInfo->getSize() + 3, $newOwnerRootInfo->getSize());
}
public function testSizePropagationWhenRecipientChangesFile() {
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $recipientView = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
+ $recipientView = $this->setupUser(self::TEST_FILES_SHARING_API_USER1);
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
- $ownerView = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
+ $ownerView = $this->setupUser(self::TEST_FILES_SHARING_API_USER2);
$ownerView->mkdir('/sharedfolder/subfolder');
$ownerView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'bar');
- $sharedFolderInfo = $ownerView->getFileInfo('/sharedfolder', false);
- $this->assertInstanceOf('\OC\Files\FileInfo', $sharedFolderInfo);
- \OCP\Share::shareItem('folder', $sharedFolderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER1, 31);
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ '/sharedfolder',
+ self::TEST_FILES_SHARING_API_USER2,
+ self::TEST_FILES_SHARING_API_USER1,
+ \OCP\Constants::PERMISSION_ALL
+ );
$ownerRootInfo = $ownerView->getFileInfo('', false);
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
$this->assertTrue($recipientView->file_exists('/sharedfolder/subfolder/foo.txt'));
$recipientRootInfo = $recipientView->getFileInfo('', false);
+ $recipientRootInfoWithMounts = $recipientView->getFileInfo('', true);
// when file changed as recipient
$recipientView->file_put_contents('/sharedfolder/subfolder/foo.txt', 'foobar');
@@ -92,8 +109,12 @@ class SizePropagation extends TestCase {
$newRecipientRootInfo = $recipientView->getFileInfo('', false);
$this->assertEquals($recipientRootInfo->getSize(), $newRecipientRootInfo->getSize());
+ // but the size including mountpoints increases
+ $newRecipientRootInfo = $recipientView->getFileInfo('', true);
+ $this->assertEquals($recipientRootInfoWithMounts->getSize() +3, $newRecipientRootInfo->getSize());
+
// size of owner's root increases
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
+ $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2);
$newOwnerRootInfo = $ownerView->getFileInfo('', false);
$this->assertEquals($ownerRootInfo->getSize() + 3, $newOwnerRootInfo->getSize());
}
diff --git a/apps/files_sharing/tests/testcase.php b/apps/files_sharing/tests/testcase.php
index ce0a8beeec8..0950c2a62f5 100644
--- a/apps/files_sharing/tests/testcase.php
+++ b/apps/files_sharing/tests/testcase.php
@@ -59,6 +59,11 @@ abstract class TestCase extends \Test\TestCase {
public $folder;
public $subfolder;
+ /** @var \OCP\Share\IManager */
+ protected $shareManager;
+ /** @var \OCP\Files\IRootFolder */
+ protected $rootFolder;
+
public static function setUpBeforeClass() {
parent::setUpBeforeClass();
@@ -82,7 +87,7 @@ abstract class TestCase extends \Test\TestCase {
$backend->createUser(self::TEST_FILES_SHARING_API_USER4, self::TEST_FILES_SHARING_API_USER4);
// create group
- $groupBackend = new \OC_Group_Dummy();
+ $groupBackend = new \Test\Util\Group\Dummy();
$groupBackend->createGroup(self::TEST_FILES_SHARING_API_GROUP1);
$groupBackend->createGroup('group');
$groupBackend->createGroup('group1');
@@ -96,7 +101,6 @@ abstract class TestCase extends \Test\TestCase {
$groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER4, 'group3');
$groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_GROUP1);
\OC_Group::useBackend($groupBackend);
-
}
protected function setUp() {
@@ -107,6 +111,9 @@ abstract class TestCase extends \Test\TestCase {
$this->data = 'foobar';
$this->view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
+
+ $this->shareManager = \OC::$server->getShareManager();
+ $this->rootFolder = \OC::$server->getRootFolder();
}
protected function tearDown() {
@@ -201,4 +208,26 @@ abstract class TestCase extends \Test\TestCase {
}
+ /**
+ * @param int $type The share type
+ * @param string $path The path to share relative to $initiators root
+ * @param string $initiator
+ * @param string $recipient
+ * @param int $permissions
+ * @return \OCP\Share\IShare
+ */
+ protected function share($type, $path, $initiator, $recipient, $permissions) {
+ $userFolder = $this->rootFolder->getUserFolder($initiator);
+ $node = $userFolder->get($path);
+
+ $share = $this->shareManager->newShare();
+ $share->setShareType($type)
+ ->setSharedWith($recipient)
+ ->setSharedBy($initiator)
+ ->setNode($node)
+ ->setPermissions($permissions);
+ $share = $this->shareManager->createShare($share);
+
+ return $share;
+ }
}
diff --git a/apps/files_sharing/tests/unsharechildren.php b/apps/files_sharing/tests/unsharechildren.php
index 1968007be4e..6104dc98080 100644
--- a/apps/files_sharing/tests/unsharechildren.php
+++ b/apps/files_sharing/tests/unsharechildren.php
@@ -78,14 +78,19 @@ class UnshareChildren extends TestCase {
$fileInfo2 = \OC\Files\Filesystem::getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileInfo2->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
- $this->assertTrue($result);
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
// one folder should be shared with the user
- $sharedFolders = \OCP\Share::getItemsSharedWith('folder');
- $this->assertSame(1, count($sharedFolders));
+ $shares = $this->shareManager->getSharedWith(self::TEST_FILES_SHARING_API_USER2, \OCP\Share::SHARE_TYPE_USER);
+ $this->assertCount(1, $shares);
// move shared folder to 'localDir'
\OC\Files\Filesystem::mkdir('localDir');
@@ -97,8 +102,8 @@ class UnshareChildren extends TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
// after the parent directory was deleted the share should be unshared
- $sharedFolders = \OCP\Share::getItemsSharedWith('folder');
- $this->assertTrue(empty($sharedFolders));
+ $shares = $this->shareManager->getSharedWith(self::TEST_FILES_SHARING_API_USER2, \OCP\Share::SHARE_TYPE_USER);
+ $this->assertEmpty($shares);
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
diff --git a/apps/files_sharing/tests/updater.php b/apps/files_sharing/tests/updater.php
index 67c1642cdd0..53e7fc47665 100644
--- a/apps/files_sharing/tests/updater.php
+++ b/apps/files_sharing/tests/updater.php
@@ -75,7 +75,13 @@ class Test_Files_Sharing_Updater extends OCA\Files_Sharing\Tests\TestCase {
$fileinfo = \OC\Files\Filesystem::getFileInfo($this->folder);
$this->assertTrue($fileinfo instanceof \OC\Files\FileInfo);
- \OCP\Share::shareItem('folder', $fileinfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
+ $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
$this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
$view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files');
@@ -152,9 +158,14 @@ class Test_Files_Sharing_Updater extends OCA\Files_Sharing\Tests\TestCase {
$etagBeforeShareDir = $beforeShareDir->getEtag();
$this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $fileinfo = \OC\Files\Filesystem::getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
- $this->assertTrue($result);
+
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
$this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -173,8 +184,7 @@ class Test_Files_Sharing_Updater extends OCA\Files_Sharing\Tests\TestCase {
// cleanup
$this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $result = \OCP\Share::unshare('folder', $fileinfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
+ $this->shareManager->deleteShare($share);
$config->setSystemValue('share_folder', $oldShareFolder);
}
@@ -185,8 +195,14 @@ class Test_Files_Sharing_Updater extends OCA\Files_Sharing\Tests\TestCase {
function testRename() {
$fileinfo = \OC\Files\Filesystem::getFileInfo($this->folder);
- $result = \OCP\Share::shareItem('folder', $fileinfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 31);
- $this->assertTrue($result);
+
+ $share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ $this->folder,
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
$this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -210,9 +226,7 @@ class Test_Files_Sharing_Updater extends OCA\Files_Sharing\Tests\TestCase {
$this->assertTrue(\OC\Files\Filesystem::file_exists('/newTarget/oldTarget/subfolder/' . $this->folder));
// cleanup
- $this->loginHelper(self::TEST_FILES_SHARING_API_USER1);
- $result = \OCP\Share::unshare('folder', $fileinfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2);
- $this->assertTrue($result);
+ $this->shareManager->deleteShare($share);
}
}
diff --git a/apps/files_sharing/tests/watcher.php b/apps/files_sharing/tests/watcher.php
index 247fb59f351..19e1bc0b615 100644
--- a/apps/files_sharing/tests/watcher.php
+++ b/apps/files_sharing/tests/watcher.php
@@ -32,33 +32,27 @@
*/
class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase {
- /**
- * @var \OC\Files\Storage\Storage
- */
+ /** @var \OC\Files\Storage\Storage */
private $ownerStorage;
- /**
- * @var \OC\Files\Cache\Cache
- */
+ /** @var \OC\Files\Cache\Cache */
private $ownerCache;
- /**
- * @var \OC\Files\Storage\Storage
- */
+ /** @var \OC\Files\Storage\Storage */
private $sharedStorage;
- /**
- * @var \OC\Files\Cache\Cache
- */
+ /** @var \OC\Files\Cache\Cache */
private $sharedCache;
+ /** @var \OCP\Share\IShare */
+ private $_share;
+
protected function setUp() {
parent::setUp();
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
// prepare user1's dir structure
- $textData = "dummy file data\n";
$this->view->mkdir('container');
$this->view->mkdir('container/shareddir');
$this->view->mkdir('container/shareddir/subdir');
@@ -68,9 +62,13 @@ class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase {
$this->ownerStorage->getScanner()->scan('');
// share "shareddir" with user2
- $fileinfo = $this->view->getFileInfo('container/shareddir');
- \OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2, 31);
+ $this->_share = $this->share(
+ \OCP\Share::SHARE_TYPE_USER,
+ 'container/shareddir',
+ self::TEST_FILES_SHARING_API_USER1,
+ self::TEST_FILES_SHARING_API_USER2,
+ \OCP\Constants::PERMISSION_ALL
+ );
// login as user2
self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
@@ -89,9 +87,7 @@ class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase {
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
if ($this->view) {
- $fileinfo = $this->view->getFileInfo('container/shareddir');
- \OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- self::TEST_FILES_SHARING_API_USER2);
+ $this->shareManager->deleteShare($this->_share);
$this->view->deleteAll('container');
diff --git a/apps/files_trashbin/js/app.js b/apps/files_trashbin/js/app.js
index 771ea90bc16..fd3d5db32ff 100644
--- a/apps/files_trashbin/js/app.js
+++ b/apps/files_trashbin/js/app.js
@@ -29,7 +29,8 @@ OCA.Trashbin.App = {
scrollContainer: $('#app-content'),
fileActions: this._createFileActions(),
detailsViewEnabled: false,
- scrollTo: urlParams.scrollto
+ scrollTo: urlParams.scrollto,
+ config: OCA.Files.App.getFilesConfig()
}
);
},
diff --git a/apps/files_trashbin/l10n/de_AT.js b/apps/files_trashbin/l10n/de_AT.js
index 5d1a6cec445..8212e5210a9 100644
--- a/apps/files_trashbin/l10n/de_AT.js
+++ b/apps/files_trashbin/l10n/de_AT.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_trashbin",
{
"Delete" : "Löschen",
- "Error" : "Fehler"
+ "Error" : "Fehler",
+ "Name" : "Name"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/de_AT.json b/apps/files_trashbin/l10n/de_AT.json
index 5452cc8972a..d15a7c583ac 100644
--- a/apps/files_trashbin/l10n/de_AT.json
+++ b/apps/files_trashbin/l10n/de_AT.json
@@ -1,5 +1,6 @@
{ "translations": {
"Delete" : "Löschen",
- "Error" : "Fehler"
+ "Error" : "Fehler",
+ "Name" : "Name"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/lib/backgroundjob/expiretrash.php b/apps/files_trashbin/lib/backgroundjob/expiretrash.php
index 4ee0658840b..8a4e2d41fec 100644
--- a/apps/files_trashbin/lib/backgroundjob/expiretrash.php
+++ b/apps/files_trashbin/lib/backgroundjob/expiretrash.php
@@ -23,6 +23,7 @@
namespace OCA\Files_Trashbin\BackgroundJob;
use OCP\IConfig;
+use OCP\IUser;
use OCP\IUserManager;
use OCA\Files_Trashbin\AppInfo\Application;
use OCA\Files_Trashbin\Expiration;
@@ -31,40 +32,28 @@ use OCA\Files_Trashbin\Trashbin;
class ExpireTrash extends \OC\BackgroundJob\TimedJob {
- const ITEMS_PER_SESSION = 1000;
-
/**
* @var Expiration
*/
private $expiration;
-
- /**
- * @var IConfig
- */
- private $config;
/**
* @var IUserManager
*/
private $userManager;
-
- const USERS_PER_SESSION = 1000;
/**
- * @param IConfig|null $config
* @param IUserManager|null $userManager
* @param Expiration|null $expiration
*/
- public function __construct(IConfig $config = null,
- IUserManager $userManager = null,
+ public function __construct(IUserManager $userManager = null,
Expiration $expiration = null) {
// Run once per 30 minutes
$this->setInterval(60 * 30);
- if (is_null($expiration) || is_null($userManager) || is_null($config)) {
+ if (is_null($expiration) || is_null($userManager)) {
$this->fixDIForJobs();
} else {
- $this->config = $config;
$this->userManager = $userManager;
$this->expiration = $expiration;
}
@@ -72,7 +61,6 @@ class ExpireTrash extends \OC\BackgroundJob\TimedJob {
protected function fixDIForJobs() {
$application = new Application();
- $this->config = \OC::$server->getConfig();
$this->userManager = \OC::$server->getUserManager();
$this->expiration = $application->getContainer()->query('Expiration');
}
@@ -86,26 +74,15 @@ class ExpireTrash extends \OC\BackgroundJob\TimedJob {
if (!$maxAge) {
return;
}
-
- $offset = $this->config->getAppValue('files_trashbin', 'cronjob_user_offset', 0);
- $users = $this->userManager->search('', self::USERS_PER_SESSION, $offset);
- if (!count($users)) {
- // No users found, reset offset and retry
- $offset = 0;
- $users = $this->userManager->search('', self::USERS_PER_SESSION);
- }
-
- $offset += self::USERS_PER_SESSION;
- $this->config->setAppValue('files_trashbin', 'cronjob_user_offset', $offset);
-
- foreach ($users as $user) {
+
+ $this->userManager->callForAllUsers(function(IUser $user) {
$uid = $user->getUID();
if (!$this->setupFS($uid)) {
- continue;
+ return;
}
$dirContent = Helper::getTrashFiles('/', $uid, 'mtime');
Trashbin::deleteExpiredFiles($dirContent, $uid);
- }
+ });
\OC_Util::tearDownFS();
}
@@ -115,20 +92,16 @@ class ExpireTrash extends \OC\BackgroundJob\TimedJob {
* @param string $user
* @return boolean
*/
- private function setupFS($user){
- if (!$this->userManager->userExists($user)) {
- return false;
- }
+ protected function setupFS($user) {
+ \OC_Util::tearDownFS();
+ \OC_Util::setupFS($user);
- //Check if this user has a trashbin directory
+ // Check if this user has a trashbin directory
$view = new \OC\Files\View('/' . $user);
- if (!$view->is_dir('/files_trashbin/files')){
+ if (!$view->is_dir('/files_trashbin/files')) {
return false;
}
- \OC_Util::tearDownFS();
- \OC_Util::setupFS($user);
-
return true;
}
}
diff --git a/apps/files_trashbin/tests/backgroundjob/expiretrash.php b/apps/files_trashbin/tests/backgroundjob/expiretrash.php
index 79fc91884fc..c98a555c929 100644
--- a/apps/files_trashbin/tests/backgroundjob/expiretrash.php
+++ b/apps/files_trashbin/tests/backgroundjob/expiretrash.php
@@ -26,7 +26,6 @@ use \OCA\Files_Trashbin\BackgroundJob\ExpireTrash;
class ExpireTrash_Test extends \Test\TestCase {
public function testConstructAndRun() {
$backgroundJob = new ExpireTrash(
- $this->getMock('OCP\IConfig'),
$this->getMock('OCP\IUserManager'),
$this->getMockBuilder('OCA\Files_Trashbin\Expiration')->disableOriginalConstructor()->getMock()
);
diff --git a/apps/files_trashbin/tests/storage.php b/apps/files_trashbin/tests/storage.php
index afc07ff36c8..5c631770da3 100644
--- a/apps/files_trashbin/tests/storage.php
+++ b/apps/files_trashbin/tests/storage.php
@@ -261,9 +261,14 @@ class Storage extends \Test\TestCase {
$recipientUser = $this->getUniqueId('recipient_');
\OC::$server->getUserManager()->createUser($recipientUser, $recipientUser);
- $fileinfo = $this->userView->getFileInfo('share');
- $this->assertTrue(\OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- $recipientUser, 31));
+ $node = \OC::$server->getUserFolder($this->user)->get('share');
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedBy($this->user)
+ ->setSharedWith($recipientUser)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ \OC::$server->getShareManager()->createShare($share);
$this->loginAsUser($recipientUser);
@@ -309,9 +314,14 @@ class Storage extends \Test\TestCase {
$recipientUser = $this->getUniqueId('recipient_');
\OC::$server->getUserManager()->createUser($recipientUser, $recipientUser);
- $fileinfo = $this->userView->getFileInfo('share');
- $this->assertTrue(\OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
- $recipientUser, 31));
+ $node = \OC::$server->getUserFolder($this->user)->get('share');
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedBy($this->user)
+ ->setSharedWith($recipientUser)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ \OC::$server->getShareManager()->createShare($share);
$this->loginAsUser($recipientUser);
diff --git a/apps/files_trashbin/tests/trashbin.php b/apps/files_trashbin/tests/trashbin.php
index 8d616b6e8e2..7087da37266 100644
--- a/apps/files_trashbin/tests/trashbin.php
+++ b/apps/files_trashbin/tests/trashbin.php
@@ -211,9 +211,14 @@ class Test_Trashbin extends \Test\TestCase {
\OC\Files\Filesystem::file_put_contents($folder . 'user1-4.txt', 'file4');
//share user1-4.txt with user2
- $fileInfo = \OC\Files\Filesystem::getFileInfo($folder);
- $result = \OCP\Share::shareItem('folder', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_TRASHBIN_USER2, 31);
- $this->assertTrue($result);
+ $node = \OC::$server->getUserFolder(self::TEST_TRASHBIN_USER1)->get($folder);
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setNode($node)
+ ->setSharedBy(self::TEST_TRASHBIN_USER1)
+ ->setSharedWith(self::TEST_TRASHBIN_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ \OC::$server->getShareManager()->createShare($share);
// delete them so that they end up in the trash bin
\OC\Files\Filesystem::unlink($folder . 'user1-1.txt');
diff --git a/apps/files_versions/l10n/th_TH.js b/apps/files_versions/l10n/th_TH.js
index 97d0539ca55..9b00b1d6800 100644
--- a/apps/files_versions/l10n/th_TH.js
+++ b/apps/files_versions/l10n/th_TH.js
@@ -5,7 +5,7 @@ OC.L10N.register(
"Versions" : "รุ่น",
"Failed to revert {file} to revision {timestamp}." : "{file} ล้มเหลวที่จะย้อนกลับ มีการแก้ไขเมื่อ {timestamp}",
"Restore" : "คืนค่า",
- "No other versions available" : "ไม่มีรุ่นอื่นๆ",
+ "No other versions available" : "ยังไม่มีรุ่นที่ใหม่กว่า",
"More versions..." : "รุ่นอื่นๆ ..."
},
"nplurals=1; plural=0;");
diff --git a/apps/files_versions/l10n/th_TH.json b/apps/files_versions/l10n/th_TH.json
index a67fa3e17e0..d35dd9d4943 100644
--- a/apps/files_versions/l10n/th_TH.json
+++ b/apps/files_versions/l10n/th_TH.json
@@ -3,7 +3,7 @@
"Versions" : "รุ่น",
"Failed to revert {file} to revision {timestamp}." : "{file} ล้มเหลวที่จะย้อนกลับ มีการแก้ไขเมื่อ {timestamp}",
"Restore" : "คืนค่า",
- "No other versions available" : "ไม่มีรุ่นอื่นๆ",
+ "No other versions available" : "ยังไม่มีรุ่นที่ใหม่กว่า",
"More versions..." : "รุ่นอื่นๆ ..."
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_versions/lib/backgroundjob/expireversions.php b/apps/files_versions/lib/backgroundjob/expireversions.php
index 5d8eef4e351..8e14e65b9a7 100644
--- a/apps/files_versions/lib/backgroundjob/expireversions.php
+++ b/apps/files_versions/lib/backgroundjob/expireversions.php
@@ -21,6 +21,7 @@
namespace OCA\Files_Versions\BackgroundJob;
+use OCP\IUser;
use OCP\IUserManager;
use OCA\Files_Versions\AppInfo\Application;
use OCA\Files_Versions\Storage;
@@ -64,20 +65,13 @@ class ExpireVersions extends \OC\BackgroundJob\TimedJob {
return;
}
- $users = $this->userManager->search('');
- $isFSready = false;
- foreach ($users as $user) {
+ $this->userManager->callForAllUsers(function(IUser $user) {
$uid = $user->getUID();
- if (!$isFSready) {
- if (!$this->setupFS($uid)) {
- continue;
- }
- $isFSready = true;
+ if (!$this->setupFS($uid)) {
+ return;
}
Storage::expireOlderThanMaxForUser($uid);
- }
-
- \OC_Util::tearDownFS();
+ });
}
/**
@@ -85,14 +79,16 @@ class ExpireVersions extends \OC\BackgroundJob\TimedJob {
* @param string $user
* @return boolean
*/
- private function setupFS($user){
- if (!$this->userManager->userExists($user)) {
- return false;
- }
-
+ protected function setupFS($user) {
\OC_Util::tearDownFS();
\OC_Util::setupFS($user);
+ // Check if this user has a versions directory
+ $view = new \OC\Files\View('/' . $user);
+ if (!$view->is_dir('/files_versions')) {
+ return false;
+ }
+
return true;
}
}
diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php
index a213ea75238..3c23f2f730a 100644
--- a/apps/files_versions/lib/storage.php
+++ b/apps/files_versions/lib/storage.php
@@ -45,6 +45,7 @@ use OC\Files\Filesystem;
use OC\Files\View;
use OCA\Files_Versions\AppInfo\Application;
use OCA\Files_Versions\Command\Expire;
+use OCP\Files\NotFoundException;
use OCP\Lock\ILockingProvider;
use OCP\User;
diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php
index f6658e092bd..b8e68cfadf7 100644
--- a/apps/files_versions/tests/versions.php
+++ b/apps/files_versions/tests/versions.php
@@ -224,7 +224,7 @@ class Test_Files_Versioning extends \Test\TestCase {
),
11 // size of all deleted files (every file has the size 1)
),
- // third set of versions, with some gaps inbetween
+ // third set of versions, with some gaps between
array(
array(
// first slice (10sec) keep one version every 2 seconds
@@ -297,8 +297,6 @@ class Test_Files_Versioning extends \Test\TestCase {
\OC\Files\Filesystem::mkdir('folder1/folder2');
\OC\Files\Filesystem::file_put_contents("folder1/test.txt", "test file");
- $fileInfo = \OC\Files\Filesystem::getFileInfo('folder1');
-
$t1 = time();
// second version is two weeks older, this way we make sure that no
// version will be expired
@@ -314,7 +312,14 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->rootView->file_put_contents($v1, 'version1');
$this->rootView->file_put_contents($v2, 'version2');
- \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_VERSIONS_USER2, \OCP\Constants::PERMISSION_ALL);
+ $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1');
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedBy(self::TEST_VERSIONS_USER)
+ ->setSharedWith(self::TEST_VERSIONS_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $share = \OC::$server->getShareManager()->createShare($share);
self::loginHelper(self::TEST_VERSIONS_USER2);
@@ -332,6 +337,8 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->assertTrue($this->rootView->file_exists($v1Renamed));
$this->assertTrue($this->rootView->file_exists($v2Renamed));
+
+ \OC::$server->getShareManager()->deleteShare($share);
}
public function testMoveFolder() {
@@ -373,13 +380,14 @@ class Test_Files_Versioning extends \Test\TestCase {
\OC\Files\Filesystem::mkdir('folder1');
$fileInfo = \OC\Files\Filesystem::getFileInfo('folder1');
- \OCP\Share::shareItem(
- 'folder',
- $fileInfo['fileid'],
- \OCP\Share::SHARE_TYPE_USER,
- self::TEST_VERSIONS_USER2,
- \OCP\Constants::PERMISSION_ALL
- );
+ $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1');
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedBy(self::TEST_VERSIONS_USER)
+ ->setSharedWith(self::TEST_VERSIONS_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $share = \OC::$server->getShareManager()->createShare($share);
self::loginHelper(self::TEST_VERSIONS_USER2);
$versionsFolder2 = '/' . self::TEST_VERSIONS_USER2 . '/files_versions';
@@ -413,20 +421,22 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->assertTrue($this->rootView->file_exists($v1Renamed));
$this->assertTrue($this->rootView->file_exists($v2Renamed));
+
+ \OC::$server->getShareManager()->deleteShare($share);
}
public function testMoveFolderIntoSharedFolderAsRecipient() {
\OC\Files\Filesystem::mkdir('folder1');
- $fileInfo = \OC\Files\Filesystem::getFileInfo('folder1');
- \OCP\Share::shareItem(
- 'folder',
- $fileInfo['fileid'],
- \OCP\Share::SHARE_TYPE_USER,
- self::TEST_VERSIONS_USER2,
- \OCP\Constants::PERMISSION_ALL
- );
+ $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1');
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedBy(self::TEST_VERSIONS_USER)
+ ->setSharedWith(self::TEST_VERSIONS_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $share = \OC::$server->getShareManager()->createShare($share);
self::loginHelper(self::TEST_VERSIONS_USER2);
$versionsFolder2 = '/' . self::TEST_VERSIONS_USER2 . '/files_versions';
@@ -462,14 +472,14 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->assertTrue($this->rootView->file_exists($v1Renamed));
$this->assertTrue($this->rootView->file_exists($v2Renamed));
+
+ \OC::$server->getShareManager()->deleteShare($share);
}
public function testRenameSharedFile() {
\OC\Files\Filesystem::file_put_contents("test.txt", "test file");
- $fileInfo = \OC\Files\Filesystem::getFileInfo('test.txt');
-
$t1 = time();
// second version is two weeks older, this way we make sure that no
// version will be expired
@@ -486,7 +496,14 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->rootView->file_put_contents($v1, 'version1');
$this->rootView->file_put_contents($v2, 'version2');
- \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_VERSIONS_USER2, \OCP\Constants::PERMISSION_ALL);
+ $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('test.txt');
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedBy(self::TEST_VERSIONS_USER)
+ ->setSharedWith(self::TEST_VERSIONS_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE);
+ $share = \OC::$server->getShareManager()->createShare($share);
self::loginHelper(self::TEST_VERSIONS_USER2);
@@ -504,6 +521,8 @@ class Test_Files_Versioning extends \Test\TestCase {
$this->assertFalse($this->rootView->file_exists($v1Renamed));
$this->assertFalse($this->rootView->file_exists($v2Renamed));
+
+ \OC::$server->getShareManager()->deleteShare($share);
}
public function testCopy() {
@@ -605,7 +624,7 @@ class Test_Files_Versioning extends \Test\TestCase {
/**
* @param string $hookName name of hook called
- * @param string $params variable to recieve parameters provided by hook
+ * @param string $params variable to receive parameters provided by hook
*/
private function connectMockHooks($hookName, &$params) {
if ($hookName === null) {
@@ -744,15 +763,15 @@ class Test_Files_Versioning extends \Test\TestCase {
\OC\Files\Filesystem::mkdir('folder');
\OC\Files\Filesystem::file_put_contents('folder/test.txt', 'test file');
- $fileInfo = \OC\Files\Filesystem::getFileInfo('folder');
-
- \OCP\Share::shareItem(
- 'folder',
- $fileInfo['fileid'],
- \OCP\Share::SHARE_TYPE_USER,
- self::TEST_VERSIONS_USER2,
- \OCP\Constants::PERMISSION_ALL
- );
+
+ $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder');
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setNode($node)
+ ->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setSharedBy(self::TEST_VERSIONS_USER)
+ ->setSharedWith(self::TEST_VERSIONS_USER2)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL);
+ $share = \OC::$server->getShareManager()->createShare($share);
$this->loginAsUser(self::TEST_VERSIONS_USER2);
@@ -760,6 +779,8 @@ class Test_Files_Versioning extends \Test\TestCase {
\OC\Files\Filesystem::getView(),
'folder/test.txt'
);
+
+ \OC::$server->getShareManager()->deleteShare($share);
}
/**
diff --git a/apps/systemtags/activity/extension.php b/apps/systemtags/activity/extension.php
index 4a974611509..8c101a6f550 100644
--- a/apps/systemtags/activity/extension.php
+++ b/apps/systemtags/activity/extension.php
@@ -142,9 +142,15 @@ class Extension implements IExtension {
switch ($text) {
case self::ASSIGN_TAG:
$params[2] = $this->convertParameterToTag($params[2], $l);
+ if ($this->actorIsCurrentUser($params[0])) {
+ return (string) $l->t('You assigned system tag %3$s', $params);
+ }
return (string) $l->t('%1$s assigned system tag %3$s', $params);
case self::UNASSIGN_TAG:
$params[2] = $this->convertParameterToTag($params[2], $l);
+ if ($this->actorIsCurrentUser($params[0])) {
+ return (string) $l->t('You unassigned system tag %3$s', $params);
+ }
return (string) $l->t('%1$s unassigned system tag %3$s', $params);
}
@@ -162,19 +168,34 @@ class Extension implements IExtension {
switch ($text) {
case self::CREATE_TAG:
$params[1] = $this->convertParameterToTag($params[1], $l);
+ if ($this->actorIsCurrentUser($params[0])) {
+ return (string) $l->t('You created system tag %2$s', $params);
+ }
return (string) $l->t('%1$s created system tag %2$s', $params);
case self::DELETE_TAG:
$params[1] = $this->convertParameterToTag($params[1], $l);
+ if ($this->actorIsCurrentUser($params[0])) {
+ return (string) $l->t('You deleted system tag %2$s', $params);
+ }
return (string) $l->t('%1$s deleted system tag %2$s', $params);
case self::UPDATE_TAG:
$params[1] = $this->convertParameterToTag($params[1], $l);
$params[2] = $this->convertParameterToTag($params[2], $l);
+ if ($this->actorIsCurrentUser($params[0])) {
+ return (string) $l->t('You updated system tag %3$s to %2$s', $params);
+ }
return (string) $l->t('%1$s updated system tag %3$s to %2$s', $params);
case self::ASSIGN_TAG:
$params[2] = $this->convertParameterToTag($params[2], $l);
+ if ($this->actorIsCurrentUser($params[0])) {
+ return (string) $l->t('You assigned system tag %3$s to %2$s', $params);
+ }
return (string) $l->t('%1$s assigned system tag %3$s to %2$s', $params);
case self::UNASSIGN_TAG:
$params[2] = $this->convertParameterToTag($params[2], $l);
+ if ($this->actorIsCurrentUser($params[0])) {
+ return (string) $l->t('You unassigned system tag %3$s from %2$s', $params);
+ }
return (string) $l->t('%1$s unassigned system tag %3$s from %2$s', $params);
}
@@ -182,6 +203,20 @@ class Extension implements IExtension {
}
/**
+ * Check if the author is the current user
+ *
+ * @param string $user Parameter e.g. `<user display-name="admin">admin</user>`
+ * @return bool
+ */
+ protected function actorIsCurrentUser($user) {
+ try {
+ return strip_tags($user) === $this->activityManager->getCurrentUserId();
+ } catch (\UnexpectedValueException $e) {
+ return false;
+ }
+ }
+
+ /**
* The extension can define the type of parameters for translation
*
* Currently known types are:
diff --git a/apps/systemtags/js/app.js b/apps/systemtags/js/app.js
index d28514358c1..e027c0be123 100644
--- a/apps/systemtags/js/app.js
+++ b/apps/systemtags/js/app.js
@@ -28,7 +28,8 @@
{
id: 'systemtags',
scrollContainer: $('#app-content'),
- fileActions: this._createFileActions()
+ fileActions: this._createFileActions(),
+ config: OCA.Files.App.getFilesConfig()
}
);
diff --git a/apps/systemtags/l10n/de.js b/apps/systemtags/l10n/de.js
index 83f9ccb2dc5..49e7b2ae984 100644
--- a/apps/systemtags/l10n/de.js
+++ b/apps/systemtags/l10n/de.js
@@ -6,7 +6,6 @@ OC.L10N.register(
"%1$s unassigned system tag %3$s" : "%1$s hat den System-Tag %3$s entfernt",
"%1$s created system tag %2$s" : "%1$s hat erstellt System-Tag %2$s",
"%1$s deleted system tag %2$s" : "%1$s hat System-Tag %2$s gelöscht",
- "%1$s updated system tag %3$s to %2$s" : "%1$s hat System-Tag von %3$s zu %2$s aktualisiert",
"%1$s assigned system tag %3$s to %2$s" : "%1$s hat System-Tag %3$s an %2$s angebracht",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s hat den System-Tag %3$s von %2$s entfernt",
"%s (not-assignable)" : "%s (nicht anbringbar)",
diff --git a/apps/systemtags/l10n/de.json b/apps/systemtags/l10n/de.json
index 0534e1b3cef..01e44d9798d 100644
--- a/apps/systemtags/l10n/de.json
+++ b/apps/systemtags/l10n/de.json
@@ -4,7 +4,6 @@
"%1$s unassigned system tag %3$s" : "%1$s hat den System-Tag %3$s entfernt",
"%1$s created system tag %2$s" : "%1$s hat erstellt System-Tag %2$s",
"%1$s deleted system tag %2$s" : "%1$s hat System-Tag %2$s gelöscht",
- "%1$s updated system tag %3$s to %2$s" : "%1$s hat System-Tag von %3$s zu %2$s aktualisiert",
"%1$s assigned system tag %3$s to %2$s" : "%1$s hat System-Tag %3$s an %2$s angebracht",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s hat den System-Tag %3$s von %2$s entfernt",
"%s (not-assignable)" : "%s (nicht anbringbar)",
diff --git a/apps/systemtags/l10n/de_AT.js b/apps/systemtags/l10n/de_AT.js
new file mode 100644
index 00000000000..25ab44ecb4f
--- /dev/null
+++ b/apps/systemtags/l10n/de_AT.js
@@ -0,0 +1,6 @@
+OC.L10N.register(
+ "systemtags",
+ {
+ "Name" : "Name"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/systemtags/l10n/de_AT.json b/apps/systemtags/l10n/de_AT.json
new file mode 100644
index 00000000000..d00289bba5c
--- /dev/null
+++ b/apps/systemtags/l10n/de_AT.json
@@ -0,0 +1,4 @@
+{ "translations": {
+ "Name" : "Name"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/systemtags/l10n/de_DE.js b/apps/systemtags/l10n/de_DE.js
index 9a76c2fd9ce..d44a663f46e 100644
--- a/apps/systemtags/l10n/de_DE.js
+++ b/apps/systemtags/l10n/de_DE.js
@@ -2,12 +2,19 @@ OC.L10N.register(
"systemtags",
{
"<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei sind geändert worden",
+ "You assigned system tag %3$s" : "Sie haben den System-Tag %3$s angebracht",
"%1$s assigned system tag %3$s" : "%1$s hat System-Tag %3$s angebracht",
+ "You unassigned system tag %3$s" : "Sie haben den System-Tag %3$s entfernt",
"%1$s unassigned system tag %3$s" : "%1$s hat den System-Tag %3$s entfernt",
+ "You created system tag %2$s" : "Sie haben den System-Tag %2$s erstellt",
"%1$s created system tag %2$s" : "%1$s hat erstellt System-Tag %2$s",
+ "You deleted system tag %2$s" : "Sie haben den System-Tag %2$s gelöscht",
"%1$s deleted system tag %2$s" : "%1$s hat System-Tag %2$s gelöscht",
+ "You updated system tag %3$s to %2$s" : "Sie haben den System-Tag %3$s zu %2$s aktualisiert",
"%1$s updated system tag %3$s to %2$s" : "%1$s hat System-Tag von %3$s zu %2$s aktualisiert",
+ "You assigned system tag %3$s to %2$s" : "Sie haben den System-Tag %3$s an %2$s angebracht",
"%1$s assigned system tag %3$s to %2$s" : "%1$s hat System-Tag %3$s an %2$s angebracht",
+ "You unassigned system tag %3$s from %2$s" : "Sie haben den System-Tag %3$s von %2$s entfernt",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s hat den System-Tag %3$s von %2$s entfernt",
"%s (not-assignable)" : "%s (nicht anbringbar)",
"%s (invisible)" : "%s (unsichtbar)",
diff --git a/apps/systemtags/l10n/de_DE.json b/apps/systemtags/l10n/de_DE.json
index 815479bdc7f..22df20c6fca 100644
--- a/apps/systemtags/l10n/de_DE.json
+++ b/apps/systemtags/l10n/de_DE.json
@@ -1,11 +1,18 @@
{ "translations": {
"<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei sind geändert worden",
+ "You assigned system tag %3$s" : "Sie haben den System-Tag %3$s angebracht",
"%1$s assigned system tag %3$s" : "%1$s hat System-Tag %3$s angebracht",
+ "You unassigned system tag %3$s" : "Sie haben den System-Tag %3$s entfernt",
"%1$s unassigned system tag %3$s" : "%1$s hat den System-Tag %3$s entfernt",
+ "You created system tag %2$s" : "Sie haben den System-Tag %2$s erstellt",
"%1$s created system tag %2$s" : "%1$s hat erstellt System-Tag %2$s",
+ "You deleted system tag %2$s" : "Sie haben den System-Tag %2$s gelöscht",
"%1$s deleted system tag %2$s" : "%1$s hat System-Tag %2$s gelöscht",
+ "You updated system tag %3$s to %2$s" : "Sie haben den System-Tag %3$s zu %2$s aktualisiert",
"%1$s updated system tag %3$s to %2$s" : "%1$s hat System-Tag von %3$s zu %2$s aktualisiert",
+ "You assigned system tag %3$s to %2$s" : "Sie haben den System-Tag %3$s an %2$s angebracht",
"%1$s assigned system tag %3$s to %2$s" : "%1$s hat System-Tag %3$s an %2$s angebracht",
+ "You unassigned system tag %3$s from %2$s" : "Sie haben den System-Tag %3$s von %2$s entfernt",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s hat den System-Tag %3$s von %2$s entfernt",
"%s (not-assignable)" : "%s (nicht anbringbar)",
"%s (invisible)" : "%s (unsichtbar)",
diff --git a/apps/systemtags/l10n/hu_HU.js b/apps/systemtags/l10n/hu_HU.js
index 1e121781941..20df1176d06 100644
--- a/apps/systemtags/l10n/hu_HU.js
+++ b/apps/systemtags/l10n/hu_HU.js
@@ -2,12 +2,19 @@ OC.L10N.register(
"systemtags",
{
"<strong>System tags</strong> for a file have been modified" : "A fájl <strong>rendszer címkéje</strong> módosítva lett",
+ "You assigned system tag %3$s" : "%3$s rendszer címke hozzárendelve",
"%1$s assigned system tag %3$s" : "%1$s hozzárendelte ezt a rendszer címkét: %3$s",
+ "You unassigned system tag %3$s" : "Evette ezt a rendszer címkét: %3$s",
"%1$s unassigned system tag %3$s" : "%1$s elvette ezt a rendszer címkét: %3$s",
+ "You created system tag %2$s" : "%2$s rendszer címke létrehozva",
"%1$s created system tag %2$s" : "%1$s létrehozta ezt a rendszer címkét: %2$s",
+ "You deleted system tag %2$s" : "%2$s rendszer címke törölve",
"%1$s deleted system tag %2$s" : "%1$s törölte ezt a rendszer címkét: %2$s",
+ "You updated system tag %3$s to %2$s" : "%3$s rendszer címke frissítve erre: %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s frissítette ezt a rendszer címkét erről: %3$s erre: %2$s",
+ "You assigned system tag %3$s to %2$s" : "%3$s rendszer címkét hozzárendelte: %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s hozzárendelte ezt a rendszer címkét: %3$s neki: %2$s",
+ "You unassigned system tag %3$s from %2$s" : "%3$s rendszer címke hozzárendelést elvette tőle: %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s elvette ezt a rendszer címkét %3$s tőle: %2$s",
"%s (not-assignable)" : "%s (nem hozzárendelhető)",
"%s (invisible)" : "%s (láthatatlan)",
diff --git a/apps/systemtags/l10n/hu_HU.json b/apps/systemtags/l10n/hu_HU.json
index 182f7f11ecf..86430e42e33 100644
--- a/apps/systemtags/l10n/hu_HU.json
+++ b/apps/systemtags/l10n/hu_HU.json
@@ -1,11 +1,18 @@
{ "translations": {
"<strong>System tags</strong> for a file have been modified" : "A fájl <strong>rendszer címkéje</strong> módosítva lett",
+ "You assigned system tag %3$s" : "%3$s rendszer címke hozzárendelve",
"%1$s assigned system tag %3$s" : "%1$s hozzárendelte ezt a rendszer címkét: %3$s",
+ "You unassigned system tag %3$s" : "Evette ezt a rendszer címkét: %3$s",
"%1$s unassigned system tag %3$s" : "%1$s elvette ezt a rendszer címkét: %3$s",
+ "You created system tag %2$s" : "%2$s rendszer címke létrehozva",
"%1$s created system tag %2$s" : "%1$s létrehozta ezt a rendszer címkét: %2$s",
+ "You deleted system tag %2$s" : "%2$s rendszer címke törölve",
"%1$s deleted system tag %2$s" : "%1$s törölte ezt a rendszer címkét: %2$s",
+ "You updated system tag %3$s to %2$s" : "%3$s rendszer címke frissítve erre: %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s frissítette ezt a rendszer címkét erről: %3$s erre: %2$s",
+ "You assigned system tag %3$s to %2$s" : "%3$s rendszer címkét hozzárendelte: %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s hozzárendelte ezt a rendszer címkét: %3$s neki: %2$s",
+ "You unassigned system tag %3$s from %2$s" : "%3$s rendszer címke hozzárendelést elvette tőle: %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s elvette ezt a rendszer címkét %3$s tőle: %2$s",
"%s (not-assignable)" : "%s (nem hozzárendelhető)",
"%s (invisible)" : "%s (láthatatlan)",
diff --git a/apps/systemtags/l10n/it.js b/apps/systemtags/l10n/it.js
index b05cd7ea98f..df15aaac42c 100644
--- a/apps/systemtags/l10n/it.js
+++ b/apps/systemtags/l10n/it.js
@@ -2,12 +2,19 @@ OC.L10N.register(
"systemtags",
{
"<strong>System tags</strong> for a file have been modified" : "I <strong>tag di sistema</strong> per un file sono stati modificati",
+ "You assigned system tag %3$s" : "Hai assegnato il tag di sistema %3$s",
"%1$s assigned system tag %3$s" : "%1$s ha assegnato il tag di sistema %3$s",
+ "You unassigned system tag %3$s" : "Hai rimosso il tag di sistema %3$s",
"%1$s unassigned system tag %3$s" : "%1$s ha rimosso il tag di sistema %3$s",
+ "You created system tag %2$s" : "Hai creato il tag di sistema %2$s",
"%1$s created system tag %2$s" : "%1$s ha creato il tag di sistema %2$s",
+ "You deleted system tag %2$s" : "Hai eliminato il tag di sistema %2$s",
"%1$s deleted system tag %2$s" : "%1$s ha eliminato il tag di sistema %2$s",
+ "You updated system tag %3$s to %2$s" : "Hai aggiornato il tag di sistema %3$s in %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s ha aggiornato il tag di sistema %3$s in %2$s",
+ "You assigned system tag %3$s to %2$s" : "Hai assegnato il tag di sistema %3$s a %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s ha assegnato il tag di sistema %3$s a %2$s",
+ "You unassigned system tag %3$s from %2$s" : "Hai rimosso il tag di sistema %3$s da %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s ha rimosso il tag di sistema %3$s da %2$s",
"%s (not-assignable)" : "%s (non assegnabile)",
"%s (invisible)" : "%s (invisibile)",
diff --git a/apps/systemtags/l10n/it.json b/apps/systemtags/l10n/it.json
index 3d37068536f..4cb712a3462 100644
--- a/apps/systemtags/l10n/it.json
+++ b/apps/systemtags/l10n/it.json
@@ -1,11 +1,18 @@
{ "translations": {
"<strong>System tags</strong> for a file have been modified" : "I <strong>tag di sistema</strong> per un file sono stati modificati",
+ "You assigned system tag %3$s" : "Hai assegnato il tag di sistema %3$s",
"%1$s assigned system tag %3$s" : "%1$s ha assegnato il tag di sistema %3$s",
+ "You unassigned system tag %3$s" : "Hai rimosso il tag di sistema %3$s",
"%1$s unassigned system tag %3$s" : "%1$s ha rimosso il tag di sistema %3$s",
+ "You created system tag %2$s" : "Hai creato il tag di sistema %2$s",
"%1$s created system tag %2$s" : "%1$s ha creato il tag di sistema %2$s",
+ "You deleted system tag %2$s" : "Hai eliminato il tag di sistema %2$s",
"%1$s deleted system tag %2$s" : "%1$s ha eliminato il tag di sistema %2$s",
+ "You updated system tag %3$s to %2$s" : "Hai aggiornato il tag di sistema %3$s in %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s ha aggiornato il tag di sistema %3$s in %2$s",
+ "You assigned system tag %3$s to %2$s" : "Hai assegnato il tag di sistema %3$s a %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s ha assegnato il tag di sistema %3$s a %2$s",
+ "You unassigned system tag %3$s from %2$s" : "Hai rimosso il tag di sistema %3$s da %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s ha rimosso il tag di sistema %3$s da %2$s",
"%s (not-assignable)" : "%s (non assegnabile)",
"%s (invisible)" : "%s (invisibile)",
diff --git a/apps/systemtags/l10n/oc.js b/apps/systemtags/l10n/oc.js
index f6263a28b51..9864eefb7ab 100644
--- a/apps/systemtags/l10n/oc.js
+++ b/apps/systemtags/l10n/oc.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"systemtags",
{
+ "%s (invisible)" : "%s (invisible)",
"Tags" : "Etiquetas",
"No files in here" : "Pas cap de fichièr aicí",
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
diff --git a/apps/systemtags/l10n/oc.json b/apps/systemtags/l10n/oc.json
index 557e56fb541..372953b0e97 100644
--- a/apps/systemtags/l10n/oc.json
+++ b/apps/systemtags/l10n/oc.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "%s (invisible)" : "%s (invisible)",
"Tags" : "Etiquetas",
"No files in here" : "Pas cap de fichièr aicí",
"No entries found in this folder" : "Cap d'entrada pas trobada dins aqueste dorsièr",
diff --git a/apps/systemtags/l10n/pt_BR.js b/apps/systemtags/l10n/pt_BR.js
index ac755204c0a..fadca06e387 100644
--- a/apps/systemtags/l10n/pt_BR.js
+++ b/apps/systemtags/l10n/pt_BR.js
@@ -2,12 +2,19 @@ OC.L10N.register(
"systemtags",
{
"<strong>System tags</strong> for a file have been modified" : "<strong>As etiquetas do sistema</strong> para um arquivo foram modificadas",
+ "You assigned system tag %3$s" : "Você atribuiu uma etiqueta ao sistema %3$s",
"%1$s assigned system tag %3$s" : "%1$s etiqueta de sistema atribuída %3$s",
+ "You unassigned system tag %3$s" : "Você dasatribuiu uma etiqueta ao sistema %3$s",
"%1$s unassigned system tag %3$s" : "%1$s etiqueta de sistema não atribuída %3$s",
+ "You created system tag %2$s" : "Você criou uma etiqueta de sistema %2$s",
"%1$s created system tag %2$s" : "%1$s etiqueta de sistema criada %2$s",
+ "You deleted system tag %2$s" : "Você eliminou uma etiqueta de sistema %2$s",
"%1$s deleted system tag %2$s" : "%1$s etiqueta de sistema excluída %2$s",
+ "You updated system tag %3$s to %2$s" : "Você atualizou a etiqueta do sistema %3$s para %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s etiqueta de sistema atualizada %3$s para %2$s",
+ "You assigned system tag %3$s to %2$s" : "Você atribuiu a etiqueta do sistema %3$s para %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s etiqueta de sistema atribuída %3$s para %2$s",
+ "You unassigned system tag %3$s from %2$s" : "Você eliminou a atribuição da etiqueta do sistema %3$s de %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s etiqueta de sistema não atribuída %3$s de %2$s",
"%s (not-assignable)" : "%s (intransferível)",
"%s (invisible)" : "%s (invisivel)",
diff --git a/apps/systemtags/l10n/pt_BR.json b/apps/systemtags/l10n/pt_BR.json
index baa6a12064f..61b702ac530 100644
--- a/apps/systemtags/l10n/pt_BR.json
+++ b/apps/systemtags/l10n/pt_BR.json
@@ -1,11 +1,18 @@
{ "translations": {
"<strong>System tags</strong> for a file have been modified" : "<strong>As etiquetas do sistema</strong> para um arquivo foram modificadas",
+ "You assigned system tag %3$s" : "Você atribuiu uma etiqueta ao sistema %3$s",
"%1$s assigned system tag %3$s" : "%1$s etiqueta de sistema atribuída %3$s",
+ "You unassigned system tag %3$s" : "Você dasatribuiu uma etiqueta ao sistema %3$s",
"%1$s unassigned system tag %3$s" : "%1$s etiqueta de sistema não atribuída %3$s",
+ "You created system tag %2$s" : "Você criou uma etiqueta de sistema %2$s",
"%1$s created system tag %2$s" : "%1$s etiqueta de sistema criada %2$s",
+ "You deleted system tag %2$s" : "Você eliminou uma etiqueta de sistema %2$s",
"%1$s deleted system tag %2$s" : "%1$s etiqueta de sistema excluída %2$s",
+ "You updated system tag %3$s to %2$s" : "Você atualizou a etiqueta do sistema %3$s para %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s etiqueta de sistema atualizada %3$s para %2$s",
+ "You assigned system tag %3$s to %2$s" : "Você atribuiu a etiqueta do sistema %3$s para %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s etiqueta de sistema atribuída %3$s para %2$s",
+ "You unassigned system tag %3$s from %2$s" : "Você eliminou a atribuição da etiqueta do sistema %3$s de %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s etiqueta de sistema não atribuída %3$s de %2$s",
"%s (not-assignable)" : "%s (intransferível)",
"%s (invisible)" : "%s (invisivel)",
diff --git a/apps/systemtags/l10n/sq.js b/apps/systemtags/l10n/sq.js
index f473495be01..c5741c81506 100644
--- a/apps/systemtags/l10n/sq.js
+++ b/apps/systemtags/l10n/sq.js
@@ -2,12 +2,19 @@ OC.L10N.register(
"systemtags",
{
"<strong>System tags</strong> for a file have been modified" : "U ndryshyan <strong>etiketa sistemi</strong>për një kartelë",
+ "You assigned system tag %3$s" : "Caktuat etiketën e sistemit %3$s",
"%1$s assigned system tag %3$s" : "%1$s caktoi etiketën e sistemit %3$s",
+ "You unassigned system tag %3$s" : "I hoqët etiketën e sistemit %3$s",
"%1$s unassigned system tag %3$s" : "%1$s e hoqi %3$s si etiketë sistemi",
+ "You created system tag %2$s" : "Krijuat etiketën e sistemit %2$s",
"%1$s created system tag %2$s" : "%1$s krijoi etiketën e sistemit %2$s",
+ "You deleted system tag %2$s" : "Fshitë etiketën e sistemit %2$s",
"%1$s deleted system tag %2$s" : "%1$s fshiu etiketën e sistemit %2$s",
+ "You updated system tag %3$s to %2$s" : "Përditësuat etiketën e sistemit %3$s në %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s përditësoi etiketën e sistemit %3$s si %2$s",
+ "You assigned system tag %3$s to %2$s" : "Caktuat etiketë sistemi %3$s për %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s caktoi etiketën e sistemit %3$s si %2$s",
+ "You unassigned system tag %3$s from %2$s" : "I hoqët %2$s etiketën e sistemit %3$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s hoqi prej %2$s etiketën e sistemit %3$s",
"%s (not-assignable)" : "%s (e pacaktushme)",
"%s (invisible)" : "%s (e padukshme)",
diff --git a/apps/systemtags/l10n/sq.json b/apps/systemtags/l10n/sq.json
index b3058efd995..66704860cc1 100644
--- a/apps/systemtags/l10n/sq.json
+++ b/apps/systemtags/l10n/sq.json
@@ -1,11 +1,18 @@
{ "translations": {
"<strong>System tags</strong> for a file have been modified" : "U ndryshyan <strong>etiketa sistemi</strong>për një kartelë",
+ "You assigned system tag %3$s" : "Caktuat etiketën e sistemit %3$s",
"%1$s assigned system tag %3$s" : "%1$s caktoi etiketën e sistemit %3$s",
+ "You unassigned system tag %3$s" : "I hoqët etiketën e sistemit %3$s",
"%1$s unassigned system tag %3$s" : "%1$s e hoqi %3$s si etiketë sistemi",
+ "You created system tag %2$s" : "Krijuat etiketën e sistemit %2$s",
"%1$s created system tag %2$s" : "%1$s krijoi etiketën e sistemit %2$s",
+ "You deleted system tag %2$s" : "Fshitë etiketën e sistemit %2$s",
"%1$s deleted system tag %2$s" : "%1$s fshiu etiketën e sistemit %2$s",
+ "You updated system tag %3$s to %2$s" : "Përditësuat etiketën e sistemit %3$s në %2$s",
"%1$s updated system tag %3$s to %2$s" : "%1$s përditësoi etiketën e sistemit %3$s si %2$s",
+ "You assigned system tag %3$s to %2$s" : "Caktuat etiketë sistemi %3$s për %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s caktoi etiketën e sistemit %3$s si %2$s",
+ "You unassigned system tag %3$s from %2$s" : "I hoqët %2$s etiketën e sistemit %3$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s hoqi prej %2$s etiketën e sistemit %3$s",
"%s (not-assignable)" : "%s (e pacaktushme)",
"%s (invisible)" : "%s (e padukshme)",
diff --git a/apps/systemtags/l10n/th_TH.js b/apps/systemtags/l10n/th_TH.js
index 5649fbdbac7..ff22c44a4b6 100644
--- a/apps/systemtags/l10n/th_TH.js
+++ b/apps/systemtags/l10n/th_TH.js
@@ -5,12 +5,17 @@ OC.L10N.register(
"%1$s assigned system tag %3$s" : "%1$s ได้ถูกกำหนดแท็กระบบ %3$s",
"%1$s unassigned system tag %3$s" : "%1$s ไม่ได้ถูกกำหนดแท็กระบบ %3$s",
"%1$s created system tag %2$s" : "%1$s ได้สร้างแท็กระบบ %2$s",
- "%1$s updated system tag %3$s to %2$s" : "%1$s ได้อัพเดทแท็กระบบ %3$s เป็น %2$s",
+ "%1$s deleted system tag %2$s" : "%1$s ได้ลบแท็กระบบ %2$s",
+ "%1$s updated system tag %3$s to %2$s" : "แท็กระบบ %1$s ได้ถูกอัพเดทจาก %3$s เป็น %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s ได้ถูกกำหนดแท็กระบบ %3$s เป็น %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s ไม่ได้ถูกกำหนดแท็กระบบ %3$s เป็น %2$s",
"%s (not-assignable)" : "%s (ไม่สามารถกำหนดได้)",
"%s (invisible)" : "%s (มองไม่เห็น)",
"Tags" : "ป้ายกำกับ",
+ "Tagged files" : "ไฟล์ที่ติดแท็ก",
+ "Select tags to filter by" : "เลือกแท็กเพื่อกรองโดย",
+ "Please select tags to filter by" : "กรุณาเลือกแท็กเพื่อกรองโดย",
+ "No files found for the selected tags" : "ไม่พบไฟล์แท็กที่เลือก",
"No files in here" : "ไม่มีไฟล์ที่นี่",
"No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
"Name" : "ชื่อ",
diff --git a/apps/systemtags/l10n/th_TH.json b/apps/systemtags/l10n/th_TH.json
index 3a8464aa695..1c33750765c 100644
--- a/apps/systemtags/l10n/th_TH.json
+++ b/apps/systemtags/l10n/th_TH.json
@@ -3,12 +3,17 @@
"%1$s assigned system tag %3$s" : "%1$s ได้ถูกกำหนดแท็กระบบ %3$s",
"%1$s unassigned system tag %3$s" : "%1$s ไม่ได้ถูกกำหนดแท็กระบบ %3$s",
"%1$s created system tag %2$s" : "%1$s ได้สร้างแท็กระบบ %2$s",
- "%1$s updated system tag %3$s to %2$s" : "%1$s ได้อัพเดทแท็กระบบ %3$s เป็น %2$s",
+ "%1$s deleted system tag %2$s" : "%1$s ได้ลบแท็กระบบ %2$s",
+ "%1$s updated system tag %3$s to %2$s" : "แท็กระบบ %1$s ได้ถูกอัพเดทจาก %3$s เป็น %2$s",
"%1$s assigned system tag %3$s to %2$s" : "%1$s ได้ถูกกำหนดแท็กระบบ %3$s เป็น %2$s",
"%1$s unassigned system tag %3$s from %2$s" : "%1$s ไม่ได้ถูกกำหนดแท็กระบบ %3$s เป็น %2$s",
"%s (not-assignable)" : "%s (ไม่สามารถกำหนดได้)",
"%s (invisible)" : "%s (มองไม่เห็น)",
"Tags" : "ป้ายกำกับ",
+ "Tagged files" : "ไฟล์ที่ติดแท็ก",
+ "Select tags to filter by" : "เลือกแท็กเพื่อกรองโดย",
+ "Please select tags to filter by" : "กรุณาเลือกแท็กเพื่อกรองโดย",
+ "No files found for the selected tags" : "ไม่พบไฟล์แท็กที่เลือก",
"No files in here" : "ไม่มีไฟล์ที่นี่",
"No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้",
"Name" : "ชื่อ",
diff --git a/apps/updatenotification/appinfo/app.php b/apps/updatenotification/appinfo/app.php
index f257cba6974..a88861c0942 100644
--- a/apps/updatenotification/appinfo/app.php
+++ b/apps/updatenotification/appinfo/app.php
@@ -20,10 +20,9 @@
*/
if(\OC::$server->getConfig()->getSystemValue('updatechecker', true) === true) {
- $updater = new \OC\Updater(
- \OC::$server->getHTTPHelper(),
- \OC::$server->getConfig(),
- \OC::$server->getIntegrityCodeChecker()
+ $updater = new \OC\Updater\VersionCheck(
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getConfig()
);
$updateChecker = new \OCA\UpdateNotification\UpdateChecker(
$updater
diff --git a/apps/updatenotification/appinfo/application.php b/apps/updatenotification/appinfo/application.php
index 24c0a11af69..08ff4abf766 100644
--- a/apps/updatenotification/appinfo/application.php
+++ b/apps/updatenotification/appinfo/application.php
@@ -34,10 +34,9 @@ class Application extends App {
$container = $this->getContainer();
$container->registerService('AdminController', function(IAppContainer $c) {
- $updater = new \OC\Updater(
- \OC::$server->getHTTPHelper(),
- \OC::$server->getConfig(),
- \OC::$server->getIntegrityCodeChecker()
+ $updater = new \OC\Updater\VersionCheck(
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getConfig()
);
return new AdminController(
$c->query('AppName'),
diff --git a/apps/updatenotification/l10n/oc.js b/apps/updatenotification/l10n/oc.js
index cc30764b1c3..ce7931c17f9 100644
--- a/apps/updatenotification/l10n/oc.js
+++ b/apps/updatenotification/l10n/oc.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"updatenotification",
{
+ "Updated channel" : "Canal mes a jorn",
"{version} is available. Get more information on how to update." : "La version {version} es disponibla. Obtenètz mai d'informacions a prepaus d'aquesta mesa a jorn.",
"Update channel:" : "Canal de mesa a jorn :",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Podètz a tot moment metre a jorn cap a una version mai recenta o un canal experimental. Pasmens, poiretz pas jamai tornar a un canal mai estable."
diff --git a/apps/updatenotification/l10n/oc.json b/apps/updatenotification/l10n/oc.json
index b669c1cd19b..8478036242b 100644
--- a/apps/updatenotification/l10n/oc.json
+++ b/apps/updatenotification/l10n/oc.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Updated channel" : "Canal mes a jorn",
"{version} is available. Get more information on how to update." : "La version {version} es disponibla. Obtenètz mai d'informacions a prepaus d'aquesta mesa a jorn.",
"Update channel:" : "Canal de mesa a jorn :",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Podètz a tot moment metre a jorn cap a una version mai recenta o un canal experimental. Pasmens, poiretz pas jamai tornar a un canal mai estable."
diff --git a/apps/updatenotification/l10n/th_TH.js b/apps/updatenotification/l10n/th_TH.js
index 9a1213cd605..6b12d773c45 100644
--- a/apps/updatenotification/l10n/th_TH.js
+++ b/apps/updatenotification/l10n/th_TH.js
@@ -1,10 +1,14 @@
OC.L10N.register(
"updatenotification",
{
- "{version} is available. Get more information on how to update." : "{version} สามารถใช้ได้ รับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอัพเดท",
+ "Updated channel" : "อัพเดทช่องเรียบร้อยแล้ว",
+ "{version} is available. Get more information on how to update." : "มีรุ่นใหม่ {version} สามารถใช้ได้ รับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอัพเดท",
"Updater" : "อัพเดท",
+ "A new version is available: %s" : "มีรุ่นใหม่ที่สามารถใช่ได้: %s",
"Open updater" : "เปิดตัวอัพเดท",
+ "Your version is up to date." : "รุ่นของคุณได้ถูกอัพเดทแล้ว",
+ "Checked on %s" : "การตรวจสอบบน %s แล้ว",
"Update channel:" : "ปรับปรุงช่อง:",
- "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "คุณสามารถอัพเดทเป็นรุ่นที่ใหม่กว่าหรือใช้ตัวเบต้า แต่คุณไม่สามารถกลับไปใช้รุ่นที่เก่ากว่าเนื่องจากอาจมีปัญหาเรื่องความเสถียร"
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "คุณสามารถอัพเดทเป็นรุ่นที่ใหม่กว่าหรือใช้ตัวเบต้า แต่คุณไม่สามารถกลับไปใช้รุ่นที่เก่ากว่าเนื่องจากอาจมีปัญหาเรื่องเสถียรภาพ"
},
"nplurals=1; plural=0;");
diff --git a/apps/updatenotification/l10n/th_TH.json b/apps/updatenotification/l10n/th_TH.json
index f603cc3ff29..c731d216c36 100644
--- a/apps/updatenotification/l10n/th_TH.json
+++ b/apps/updatenotification/l10n/th_TH.json
@@ -1,8 +1,12 @@
{ "translations": {
- "{version} is available. Get more information on how to update." : "{version} สามารถใช้ได้ รับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอัพเดท",
+ "Updated channel" : "อัพเดทช่องเรียบร้อยแล้ว",
+ "{version} is available. Get more information on how to update." : "มีรุ่นใหม่ {version} สามารถใช้ได้ รับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการอัพเดท",
"Updater" : "อัพเดท",
+ "A new version is available: %s" : "มีรุ่นใหม่ที่สามารถใช่ได้: %s",
"Open updater" : "เปิดตัวอัพเดท",
+ "Your version is up to date." : "รุ่นของคุณได้ถูกอัพเดทแล้ว",
+ "Checked on %s" : "การตรวจสอบบน %s แล้ว",
"Update channel:" : "ปรับปรุงช่อง:",
- "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "คุณสามารถอัพเดทเป็นรุ่นที่ใหม่กว่าหรือใช้ตัวเบต้า แต่คุณไม่สามารถกลับไปใช้รุ่นที่เก่ากว่าเนื่องจากอาจมีปัญหาเรื่องความเสถียร"
+ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "คุณสามารถอัพเดทเป็นรุ่นที่ใหม่กว่าหรือใช้ตัวเบต้า แต่คุณไม่สามารถกลับไปใช้รุ่นที่เก่ากว่าเนื่องจากอาจมีปัญหาเรื่องเสถียรภาพ"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/updatenotification/lib/updatechecker.php b/apps/updatenotification/lib/updatechecker.php
index 965e21617e7..bf653c23b8f 100644
--- a/apps/updatenotification/lib/updatechecker.php
+++ b/apps/updatenotification/lib/updatechecker.php
@@ -21,16 +21,16 @@
namespace OCA\UpdateNotification;
-use OC\Updater;
+use OC\Updater\VersionCheck;
class UpdateChecker {
- /** @var Updater */
+ /** @var VersionCheck */
private $updater;
/**
- * @param Updater $updater
+ * @param VersionCheck $updater
*/
- public function __construct(Updater $updater) {
+ public function __construct(VersionCheck $updater) {
$this->updater = $updater;
}
diff --git a/apps/updatenotification/tests/UpdateCheckerTest.php b/apps/updatenotification/tests/UpdateCheckerTest.php
index 9591758c4c9..5865284a48e 100644
--- a/apps/updatenotification/tests/UpdateCheckerTest.php
+++ b/apps/updatenotification/tests/UpdateCheckerTest.php
@@ -34,7 +34,7 @@ class UpdateCheckerTest extends TestCase {
public function setUp() {
parent::setUp();
- $this->updater = $this->getMockBuilder('\OC\Updater')
+ $this->updater = $this->getMockBuilder('\OC\Updater\VersionCheck')
->disableOriginalConstructor()->getMock();
$this->updateChecker = new UpdateChecker($this->updater);
}
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
index c50ab0a8e1f..eba39ca50f7 100644
--- a/apps/user_ldap/group_ldap.php
+++ b/apps/user_ldap/group_ldap.php
@@ -72,8 +72,9 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
return false;
}
$cacheKey = 'inGroup'.$uid.':'.$gid;
- if($this->access->connection->isCached($cacheKey)) {
- return $this->access->connection->getFromCache($cacheKey);
+ $inGroup = $this->access->connection->getFromCache($cacheKey);
+ if(!is_null($inGroup)) {
+ return (bool)$inGroup;
}
$userDN = $this->access->username2dn($uid);
@@ -84,8 +85,8 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
}
$cacheKeyMembers = 'inGroup-members:'.$gid;
- if($this->access->connection->isCached($cacheKeyMembers)) {
- $members = $this->access->connection->getFromCache($cacheKeyMembers);
+ $members = $this->access->connection->getFromCache($cacheKeyMembers);
+ if(!is_null($members)) {
$this->cachedGroupMembers[$gid] = $members;
$isInGroup = in_array($userDN, $members);
$this->access->connection->writeToCache($cacheKey, $isInGroup);
@@ -204,8 +205,9 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
}
// used extensively in cron job, caching makes sense for nested groups
$cacheKey = '_groupMembers'.$dnGroup;
- if($this->access->connection->isCached($cacheKey)) {
- return $this->access->connection->getFromCache($cacheKey);
+ $groupMembers = $this->access->connection->getFromCache($cacheKey);
+ if(!is_null($groupMembers)) {
+ return $groupMembers;
}
$seen[$dnGroup] = 1;
$members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr,
@@ -267,11 +269,9 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
*/
public function primaryGroupID2Name($gid, $dn) {
$cacheKey = 'primaryGroupIDtoName';
- if($this->access->connection->isCached($cacheKey)) {
- $groupNames = $this->access->connection->getFromCache($cacheKey);
- if(isset($groupNames[$gid])) {
- return $groupNames[$gid];
- }
+ $groupNames = $this->access->connection->getFromCache($cacheKey);
+ if(!is_null($groupNames) && isset($groupNames[$gid])) {
+ return $groupNames[$gid];
}
$domainObjectSid = $this->access->getSID($dn);
@@ -440,8 +440,9 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
return array();
}
$cacheKey = 'getUserGroups'.$uid;
- if($this->access->connection->isCached($cacheKey)) {
- return $this->access->connection->getFromCache($cacheKey);
+ $userGroups = $this->access->connection->getFromCache($cacheKey);
+ if(!is_null($userGroups)) {
+ return $userGroups;
}
$userDN = $this->access->username2dn($uid);
if(!$userDN) {
@@ -861,8 +862,9 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
* @return bool
*/
public function groupExists($gid) {
- if($this->access->connection->isCached('groupExists'.$gid)) {
- return $this->access->connection->getFromCache('groupExists'.$gid);
+ $groupExists = $this->access->connection->getFromCache('groupExists'.$gid);
+ if(!is_null($groupExists)) {
+ return (bool)$groupExists;
}
//getting dn, if false the group does not exist. If dn, it may be mapped
diff --git a/apps/user_ldap/js/wizard/view.js b/apps/user_ldap/js/wizard/view.js
index 39133554121..9c7e2132dc6 100644
--- a/apps/user_ldap/js/wizard/view.js
+++ b/apps/user_ldap/js/wizard/view.js
@@ -24,6 +24,8 @@ OCA = OCA || {};
STATUS_INCOMPLETE: 1,
/** @constant {number} */
STATUS_SUCCESS: 2,
+ /** @constant {number} */
+ STATUS_UNTESTED: 3,
/**
* initializes the instance. Always call it after creating the instance.
@@ -210,6 +212,7 @@ OCA = OCA || {};
* @listens ConfigModel#configLoaded
*/
onConfigLoaded: function(view) {
+ view._updateStatusIndicator(view.STATUS_UNTESTED);
view.basicStatusCheck(view);
view.functionalityCheck();
},
@@ -370,6 +373,14 @@ OCA = OCA || {};
var $indicatorLight = $('.ldap_config_state_indicator_sign');
switch(state) {
+ case this.STATUS_UNTESTED:
+ $indicator.text(t('user_ldap',
+ 'Testing configuration…'
+ ));
+ $indicator.addClass('ldap_grey');
+ $indicatorLight.removeClass('error');
+ $indicatorLight.removeClass('success');
+ break;
case this.STATUS_ERROR:
$indicator.text(t('user_ldap',
'Configuration incorrect'
diff --git a/apps/user_ldap/js/wizard/wizardTabGeneric.js b/apps/user_ldap/js/wizard/wizardTabGeneric.js
index 21085e3a584..4415172a18c 100644
--- a/apps/user_ldap/js/wizard/wizardTabGeneric.js
+++ b/apps/user_ldap/js/wizard/wizardTabGeneric.js
@@ -391,7 +391,7 @@ OCA = OCA || {};
*/
_setCheckBox: function($element, value) {
if(parseInt(value, 10) === 1) {
- $element.attr('checked', 'checked');
+ $element.prop('checked', 'checked');
} else {
$element.removeAttr('checked');
}
diff --git a/apps/user_ldap/l10n/cs_CZ.js b/apps/user_ldap/l10n/cs_CZ.js
index 0bbe6c4afe3..8f261c39af0 100644
--- a/apps/user_ldap/l10n/cs_CZ.js
+++ b/apps/user_ldap/l10n/cs_CZ.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "Nelze nastavit konfiguraci %s",
"Action does not exist" : "Tato akce neexistuje",
"The Base DN appears to be wrong" : "Base DN nevypadá být v pořádku",
+ "Testing configuration…" : "Testování konfigurace...",
"Configuration incorrect" : "Nesprávná konfigurace",
"Configuration incomplete" : "Nekompletní konfigurace",
"Configuration OK" : "Konfigurace v pořádku",
diff --git a/apps/user_ldap/l10n/cs_CZ.json b/apps/user_ldap/l10n/cs_CZ.json
index 79cd96a7f8c..0dec48d25d0 100644
--- a/apps/user_ldap/l10n/cs_CZ.json
+++ b/apps/user_ldap/l10n/cs_CZ.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "Nelze nastavit konfiguraci %s",
"Action does not exist" : "Tato akce neexistuje",
"The Base DN appears to be wrong" : "Base DN nevypadá být v pořádku",
+ "Testing configuration…" : "Testování konfigurace...",
"Configuration incorrect" : "Nesprávná konfigurace",
"Configuration incomplete" : "Nekompletní konfigurace",
"Configuration OK" : "Konfigurace v pořádku",
diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js
index 8e185d3806d..051d24c5066 100644
--- a/apps/user_ldap/l10n/de.js
+++ b/apps/user_ldap/l10n/de.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden",
"Action does not exist" : "Aktion existiert nicht",
"The Base DN appears to be wrong" : "Die Base-DN scheint falsch zu sein",
+ "Testing configuration…" : "Teste Konfiguration…",
"Configuration incorrect" : "Konfiguration nicht korrekt",
"Configuration incomplete" : "Konfiguration nicht vollständig",
"Configuration OK" : "Konfiguration OK",
diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json
index 7ce59debdec..353ea1c6fda 100644
--- a/apps/user_ldap/l10n/de.json
+++ b/apps/user_ldap/l10n/de.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden",
"Action does not exist" : "Aktion existiert nicht",
"The Base DN appears to be wrong" : "Die Base-DN scheint falsch zu sein",
+ "Testing configuration…" : "Teste Konfiguration…",
"Configuration incorrect" : "Konfiguration nicht korrekt",
"Configuration incomplete" : "Konfiguration nicht vollständig",
"Configuration OK" : "Konfiguration OK",
diff --git a/apps/user_ldap/l10n/de_AT.js b/apps/user_ldap/l10n/de_AT.js
index 5695ad9c987..1c13871cd0f 100644
--- a/apps/user_ldap/l10n/de_AT.js
+++ b/apps/user_ldap/l10n/de_AT.js
@@ -22,6 +22,7 @@ OC.L10N.register(
"Could not find the desired feature" : "Funktion konnte nicht gefunden werden",
"Invalid Host" : "Ungültiger Host",
"Server" : "Server",
+ "Users" : "Benutzer",
"Test Configuration" : "Konfiguration testen",
"Help" : "Hilfe",
"Groups meeting these criteria are available in %s:" : "Gruppen die den Kriterien entsprechen sind verfügbar unter %s:",
diff --git a/apps/user_ldap/l10n/de_AT.json b/apps/user_ldap/l10n/de_AT.json
index f9aabf1e4d4..f26797280bf 100644
--- a/apps/user_ldap/l10n/de_AT.json
+++ b/apps/user_ldap/l10n/de_AT.json
@@ -20,6 +20,7 @@
"Could not find the desired feature" : "Funktion konnte nicht gefunden werden",
"Invalid Host" : "Ungültiger Host",
"Server" : "Server",
+ "Users" : "Benutzer",
"Test Configuration" : "Konfiguration testen",
"Help" : "Hilfe",
"Groups meeting these criteria are available in %s:" : "Gruppen die den Kriterien entsprechen sind verfügbar unter %s:",
diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js
index 87ec6ba222a..08f69982fa1 100644
--- a/apps/user_ldap/l10n/de_DE.js
+++ b/apps/user_ldap/l10n/de_DE.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden",
"Action does not exist" : "Aktion existiert nicht",
"The Base DN appears to be wrong" : "Die Base-DN scheint falsch zu sein",
+ "Testing configuration…" : "Teste Konfiguration",
"Configuration incorrect" : "Konfiguration nicht korrekt",
"Configuration incomplete" : "Konfiguration nicht vollständig",
"Configuration OK" : "Konfiguration OK",
diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json
index f345ba52c2c..92a3deccbc3 100644
--- a/apps/user_ldap/l10n/de_DE.json
+++ b/apps/user_ldap/l10n/de_DE.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "Die Konfiguration %s konnte nicht gesetzt werden",
"Action does not exist" : "Aktion existiert nicht",
"The Base DN appears to be wrong" : "Die Base-DN scheint falsch zu sein",
+ "Testing configuration…" : "Teste Konfiguration",
"Configuration incorrect" : "Konfiguration nicht korrekt",
"Configuration incomplete" : "Konfiguration nicht vollständig",
"Configuration OK" : "Konfiguration OK",
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index 9d934181190..60aec9f0a65 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "Impossible de spécifier la configuration %s",
"Action does not exist" : "L'action n'existe pas",
"The Base DN appears to be wrong" : "Le DN de base est erroné",
+ "Testing configuration…" : "Test de configuration",
"Configuration incorrect" : "Configuration incorrecte",
"Configuration incomplete" : "Configuration incomplète",
"Configuration OK" : "Configuration OK",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index 64df1a3db67..35258c3a1b3 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "Impossible de spécifier la configuration %s",
"Action does not exist" : "L'action n'existe pas",
"The Base DN appears to be wrong" : "Le DN de base est erroné",
+ "Testing configuration…" : "Test de configuration",
"Configuration incorrect" : "Configuration incorrecte",
"Configuration incomplete" : "Configuration incomplète",
"Configuration OK" : "Configuration OK",
diff --git a/apps/user_ldap/l10n/it.js b/apps/user_ldap/l10n/it.js
index 7bc6de0d622..98e71008d28 100644
--- a/apps/user_ldap/l10n/it.js
+++ b/apps/user_ldap/l10n/it.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "Impossibile impostare la configurazione %s",
"Action does not exist" : "L'azione non esiste",
"The Base DN appears to be wrong" : "Il DN base sembra essere errato",
+ "Testing configuration…" : "Prova della configurazione...",
"Configuration incorrect" : "Configurazione non corretta",
"Configuration incomplete" : "Configurazione incompleta",
"Configuration OK" : "Configurazione corretta",
diff --git a/apps/user_ldap/l10n/it.json b/apps/user_ldap/l10n/it.json
index 412508e64a7..7be99ae859a 100644
--- a/apps/user_ldap/l10n/it.json
+++ b/apps/user_ldap/l10n/it.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "Impossibile impostare la configurazione %s",
"Action does not exist" : "L'azione non esiste",
"The Base DN appears to be wrong" : "Il DN base sembra essere errato",
+ "Testing configuration…" : "Prova della configurazione...",
"Configuration incorrect" : "Configurazione non corretta",
"Configuration incomplete" : "Configurazione incompleta",
"Configuration OK" : "Configurazione corretta",
diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js
index f1b36b31cc7..dfe18d59f58 100644
--- a/apps/user_ldap/l10n/pt_BR.js
+++ b/apps/user_ldap/l10n/pt_BR.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "Não foi possível definir a configuração %s",
"Action does not exist" : "A ação não existe",
"The Base DN appears to be wrong" : "O DN de base parece estar errado",
+ "Testing configuration…" : "Testando configuração...",
"Configuration incorrect" : "Configuração incorreta",
"Configuration incomplete" : "Configuração incompleta",
"Configuration OK" : "Configuração OK",
diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json
index 8da92737704..45d31cbee71 100644
--- a/apps/user_ldap/l10n/pt_BR.json
+++ b/apps/user_ldap/l10n/pt_BR.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "Não foi possível definir a configuração %s",
"Action does not exist" : "A ação não existe",
"The Base DN appears to be wrong" : "O DN de base parece estar errado",
+ "Testing configuration…" : "Testando configuração...",
"Configuration incorrect" : "Configuração incorreta",
"Configuration incomplete" : "Configuração incompleta",
"Configuration OK" : "Configuração OK",
diff --git a/apps/user_ldap/l10n/sl.js b/apps/user_ldap/l10n/sl.js
index 57b80dc1345..6a8e8e5f273 100644
--- a/apps/user_ldap/l10n/sl.js
+++ b/apps/user_ldap/l10n/sl.js
@@ -20,11 +20,14 @@ OC.L10N.register(
"Select object classes" : "Izbor razredov predmeta",
"Please check the credentials, they seem to be wrong." : "Preverite poverila! Najverjetneje so napačna.",
"Base DN could not be auto-detected, please revise credentials, host and port." : "Osnovnega enoznačnega imena (DN) ni mogoče samodejno zaznati. Preverite poverila ter nastavitve gostitelja in vrat.",
+ "Could not detect Base DN, please enter it manually." : "Ni mogoče zaznati osnovnega enoznačnega imena (DN). Vnesti ga bo treba ročno.",
"{nthServer}. Server" : "{nthServer}. strežnik",
"No object found in the given Base DN. Please revise." : "Ni najdenega predmeta v osnovnem enoznačnem imenu (DN). Preverite nastavitve.",
"More than 1,000 directory entries available." : "Na voljo je več kot 1000 vnosov imenika",
"Do you really want to delete the current Server Configuration?" : "Ali res želite izbrisati trenutne nastavitve strežnika?",
"Confirm Deletion" : "Potrdi brisanje",
+ "Mappings cleared successfully!" : "Preslikave so uspešno počiščene!",
+ "Error while clearing the mappings." : "Napaka pri čiščenju preslikav.",
"Mode switch" : "Preklop načina",
"Select attributes" : "Izbor atributov",
"User found and settings verified." : "Uporabnik je najden in nastavitve so overjene.",
@@ -48,6 +51,7 @@ OC.L10N.register(
"Edit LDAP Query" : "Uredi poizvedbo LDAP",
"LDAP Filter:" : "Filter LDAP:",
"The filter specifies which LDAP groups shall have access to the %s instance." : "Filter določa, katere skupine LDAP bodo imele dostop do %s.",
+ "Verify settings and count groups" : "Preveri nastavitve in preštej skupine",
"LDAP / AD Username:" : "Uporabniško ime LDAP / AD:",
"Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Omogoča prijavo prek LDAP / AD, ki je ali UID ali ime računa, ki bo zaznano.",
"LDAP / AD Email Address:" : "Elektronski naslov LDAP / AD:",
@@ -57,6 +61,7 @@ OC.L10N.register(
"Verify settings" : "Preveri nastavitve",
"1. Server" : "1. strežnik",
"%s. Server:" : "%s. strežnik:",
+ "Add a new and blank configuration" : "In nova, privzeta nastavitev",
"Host" : "Gostitelj",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Protokol je lahko izpuščen, če ni posebej zahtevan SSL. V tem primeru se mora naslov začeti z ldaps://",
"Port" : "Vrata",
diff --git a/apps/user_ldap/l10n/sl.json b/apps/user_ldap/l10n/sl.json
index 39a8fae8cdb..f4622c44fa7 100644
--- a/apps/user_ldap/l10n/sl.json
+++ b/apps/user_ldap/l10n/sl.json
@@ -18,11 +18,14 @@
"Select object classes" : "Izbor razredov predmeta",
"Please check the credentials, they seem to be wrong." : "Preverite poverila! Najverjetneje so napačna.",
"Base DN could not be auto-detected, please revise credentials, host and port." : "Osnovnega enoznačnega imena (DN) ni mogoče samodejno zaznati. Preverite poverila ter nastavitve gostitelja in vrat.",
+ "Could not detect Base DN, please enter it manually." : "Ni mogoče zaznati osnovnega enoznačnega imena (DN). Vnesti ga bo treba ročno.",
"{nthServer}. Server" : "{nthServer}. strežnik",
"No object found in the given Base DN. Please revise." : "Ni najdenega predmeta v osnovnem enoznačnem imenu (DN). Preverite nastavitve.",
"More than 1,000 directory entries available." : "Na voljo je več kot 1000 vnosov imenika",
"Do you really want to delete the current Server Configuration?" : "Ali res želite izbrisati trenutne nastavitve strežnika?",
"Confirm Deletion" : "Potrdi brisanje",
+ "Mappings cleared successfully!" : "Preslikave so uspešno počiščene!",
+ "Error while clearing the mappings." : "Napaka pri čiščenju preslikav.",
"Mode switch" : "Preklop načina",
"Select attributes" : "Izbor atributov",
"User found and settings verified." : "Uporabnik je najden in nastavitve so overjene.",
@@ -46,6 +49,7 @@
"Edit LDAP Query" : "Uredi poizvedbo LDAP",
"LDAP Filter:" : "Filter LDAP:",
"The filter specifies which LDAP groups shall have access to the %s instance." : "Filter določa, katere skupine LDAP bodo imele dostop do %s.",
+ "Verify settings and count groups" : "Preveri nastavitve in preštej skupine",
"LDAP / AD Username:" : "Uporabniško ime LDAP / AD:",
"Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Omogoča prijavo prek LDAP / AD, ki je ali UID ali ime računa, ki bo zaznano.",
"LDAP / AD Email Address:" : "Elektronski naslov LDAP / AD:",
@@ -55,6 +59,7 @@
"Verify settings" : "Preveri nastavitve",
"1. Server" : "1. strežnik",
"%s. Server:" : "%s. strežnik:",
+ "Add a new and blank configuration" : "In nova, privzeta nastavitev",
"Host" : "Gostitelj",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Protokol je lahko izpuščen, če ni posebej zahtevan SSL. V tem primeru se mora naslov začeti z ldaps://",
"Port" : "Vrata",
diff --git a/apps/user_ldap/l10n/sq.js b/apps/user_ldap/l10n/sq.js
index 81da1fbf76b..965b8bc38db 100644
--- a/apps/user_ldap/l10n/sq.js
+++ b/apps/user_ldap/l10n/sq.js
@@ -13,6 +13,7 @@ OC.L10N.register(
" Could not set configuration %s" : "S’vuri dot në punë formësimin %s",
"Action does not exist" : "Veprimi s’ekziston",
"The Base DN appears to be wrong" : "DN-ja Bazë duket se është e gabuar",
+ "Testing configuration…" : "Po provohet formësimi…",
"Configuration incorrect" : "Formësim i pasaktë",
"Configuration incomplete" : "Formësim jo i plotë",
"Configuration OK" : "Formësimi OK",
diff --git a/apps/user_ldap/l10n/sq.json b/apps/user_ldap/l10n/sq.json
index f4f0224dd0a..09ff2ce39d0 100644
--- a/apps/user_ldap/l10n/sq.json
+++ b/apps/user_ldap/l10n/sq.json
@@ -11,6 +11,7 @@
" Could not set configuration %s" : "S’vuri dot në punë formësimin %s",
"Action does not exist" : "Veprimi s’ekziston",
"The Base DN appears to be wrong" : "DN-ja Bazë duket se është e gabuar",
+ "Testing configuration…" : "Po provohet formësimi…",
"Configuration incorrect" : "Formësim i pasaktë",
"Configuration incomplete" : "Formësim jo i plotë",
"Configuration OK" : "Formësimi OK",
diff --git a/apps/user_ldap/l10n/th_TH.js b/apps/user_ldap/l10n/th_TH.js
index 8b155dcfe23..be13cad195e 100644
--- a/apps/user_ldap/l10n/th_TH.js
+++ b/apps/user_ldap/l10n/th_TH.js
@@ -120,8 +120,9 @@ OC.L10N.register(
"Cache Time-To-Live" : "แคช TTL",
"in seconds. A change empties the cache." : "ในอีกไม่กี่วินาที ระบบจะล้างข้อมูลในแคชให้ว่างเปล่า",
"Directory Settings" : "ตั้งค่าไดเร็กทอรี่",
- "User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งานที่ต้องการ",
+ "User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งาน",
"The LDAP attribute to use to generate the user's display name." : "คุณลักษณะ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของผู้ใช้",
+ "2nd User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งานคนที่ 2",
"Base User Tree" : "รายการผู้ใช้งานหลักแบบ Tree",
"One User Base DN per line" : "หนึ่งผู้ใช้ Base DN ต่อหนึ่งบรรทัด",
"User Search Attributes" : "คุณลักษณะการค้นหาชื่อผู้ใช้",
diff --git a/apps/user_ldap/l10n/th_TH.json b/apps/user_ldap/l10n/th_TH.json
index 9787ba10037..09e69a655b0 100644
--- a/apps/user_ldap/l10n/th_TH.json
+++ b/apps/user_ldap/l10n/th_TH.json
@@ -118,8 +118,9 @@
"Cache Time-To-Live" : "แคช TTL",
"in seconds. A change empties the cache." : "ในอีกไม่กี่วินาที ระบบจะล้างข้อมูลในแคชให้ว่างเปล่า",
"Directory Settings" : "ตั้งค่าไดเร็กทอรี่",
- "User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งานที่ต้องการ",
+ "User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งาน",
"The LDAP attribute to use to generate the user's display name." : "คุณลักษณะ LDAP เพื่อใช้ในการสร้างชื่อที่ปรากฏของผู้ใช้",
+ "2nd User Display Name Field" : "ช่องแสดงชื่อผู้ใช้งานคนที่ 2",
"Base User Tree" : "รายการผู้ใช้งานหลักแบบ Tree",
"One User Base DN per line" : "หนึ่งผู้ใช้ Base DN ต่อหนึ่งบรรทัด",
"User Search Attributes" : "คุณลักษณะการค้นหาชื่อผู้ใช้",
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 135eca1e625..f92ded64797 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -364,8 +364,9 @@ class Access extends LDAPUtility implements user\IUserTools {
$validGroupDNs = [];
foreach($groupDNs as $dn) {
$cacheKey = 'groupsMatchFilter-'.$dn;
- if($this->connection->isCached($cacheKey)) {
- if($this->connection->getFromCache($cacheKey)) {
+ $groupMatchFilter = $this->connection->getFromCache($cacheKey);
+ if(!is_null($groupMatchFilter)) {
+ if($groupMatchFilter) {
$validGroupDNs[] = $dn;
}
continue;
@@ -1295,9 +1296,7 @@ class Access extends LDAPUtility implements user\IUserTools {
if(!$testConnection->setConfiguration($credentials)) {
return false;
}
- $result=$testConnection->bind();
- $this->ldap->unbind($this->connection->getConnectionResource());
- return $result;
+ return $testConnection->bind();
}
/**
@@ -1505,8 +1504,9 @@ class Access extends LDAPUtility implements user\IUserTools {
public function getSID($dn) {
$domainDN = $this->getDomainDNFromDN($dn);
$cacheKey = 'getSID-'.$domainDN;
- if($this->connection->isCached($cacheKey)) {
- return $this->connection->getFromCache($cacheKey);
+ $sid = $this->connection->getFromCache($cacheKey);
+ if(!is_null($sid)) {
+ return $sid;
}
$objectSid = $this->readAttribute($domainDN, 'objectsid');
diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php
index daec2bed13a..418a2bfc015 100644
--- a/apps/user_ldap/lib/configuration.php
+++ b/apps/user_ldap/lib/configuration.php
@@ -28,6 +28,9 @@
namespace OCA\user_ldap\lib;
+/**
+ * @property int ldapPagingSize holds an integer
+ */
class Configuration {
protected $configPrefix = null;
diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php
index c485ac74395..93e7e4bf974 100644
--- a/apps/user_ldap/lib/connection.php
+++ b/apps/user_ldap/lib/connection.php
@@ -49,9 +49,6 @@ class Connection extends LDAPUtility {
private $configPrefix;
private $configID;
private $configured = false;
-
- //whether connection should be kept on __destruct
- private $dontDestruct = false;
private $hasPagedResultSupport = true;
/**
@@ -85,16 +82,16 @@ class Connection extends LDAPUtility {
if($memcache->isAvailable()) {
$this->cache = $memcache->create();
}
- $this->hasPagedResultSupport =
- $this->ldap->hasPagedResultSupport();
$helper = new Helper();
$this->doNotValidate = !in_array($this->configPrefix,
$helper->getServerConfigurationPrefixes());
+ $this->hasPagedResultSupport =
+ intval($this->configuration->ldapPagingSize) !== 0
+ || $this->ldap->hasPagedResultSupport();
}
public function __destruct() {
- if(!$this->dontDestruct &&
- $this->ldap->isResource($this->ldapConnectionRes)) {
+ if($this->ldap->isResource($this->ldapConnectionRes)) {
@$this->ldap->unbind($this->ldapConnectionRes);
};
}
@@ -103,11 +100,9 @@ class Connection extends LDAPUtility {
* defines behaviour when the instance is cloned
*/
public function __clone() {
- //a cloned instance inherits the connection resource. It may use it,
- //but it may not disconnect it
- $this->dontDestruct = true;
$this->configuration = new Configuration($this->configPrefix,
!is_null($this->configID));
+ $this->ldapConnectionRes = null;
}
/**
@@ -212,10 +207,6 @@ class Connection extends LDAPUtility {
if(is_null($this->cache) || !$this->configuration->ldapCacheTTL) {
return null;
}
- if(!$this->isCached($key)) {
- return null;
-
- }
$key = $this->getCacheKey($key);
return json_decode(base64_decode($this->cache->get($key)), true);
@@ -223,21 +214,6 @@ class Connection extends LDAPUtility {
/**
* @param string $key
- * @return bool
- */
- public function isCached($key) {
- if(!$this->configured) {
- $this->readConfiguration();
- }
- if(is_null($this->cache) || !$this->configuration->ldapCacheTTL) {
- return false;
- }
- $key = $this->getCacheKey($key);
- return $this->cache->hasKey($key);
- }
-
- /**
- * @param string $key
* @param mixed $value
*
* @return string
diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php
index 23aba0e0d85..4da8ae5f098 100644
--- a/apps/user_ldap/lib/user/user.php
+++ b/apps/user_ldap/lib/user/user.php
@@ -297,8 +297,9 @@ class User {
public function getMemberOfGroups() {
$cacheKey = 'getMemberOf'.$this->getUsername();
- if($this->connection->isCached($cacheKey)) {
- return $this->connection->getFromCache($cacheKey);
+ $memberOfGroups = $this->connection->getFromCache($cacheKey);
+ if(!is_null($memberOfGroups)) {
+ return $memberOfGroups;
}
$groupDNs = $this->access->readAttribute($this->getDN(), 'memberOf');
$this->connection->writeToCache($cacheKey, $groupDNs);
diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php
index 5235011fb96..0b475ee7143 100644
--- a/apps/user_ldap/lib/wizard.php
+++ b/apps/user_ldap/lib/wizard.php
@@ -221,7 +221,7 @@ class Wizard extends LDAPUtility {
$count = intval($this->countUsersWithAttribute($attr, true));
if($count > 0) {
//no change, but we sent it back to make sure the user interface
- //is still correct, even if the ajax call was cancelled inbetween
+ //is still correct, even if the ajax call was cancelled meanwhile
$this->result->addChange('ldap_display_name', $attr);
return $this->result;
}
diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php
index 667a1c3acb2..51bb1d84732 100644
--- a/apps/user_ldap/tests/group_ldap.php
+++ b/apps/user_ldap/tests/group_ldap.php
@@ -294,10 +294,6 @@ class Test_Group_Ldap extends \Test\TestCase {
$uid = 'someUser';
$gid = 'someGroup';
$cacheKey = 'inGroup'.$uid.':'.$gid;
- $access->connection->expects($this->once())
- ->method('isCached')
- ->with($cacheKey)
- ->will($this->returnValue(true));
$access->connection->expects($this->once())
->method('getFromCache')
diff --git a/apps/user_ldap/tests/mapping/abstractmappingtest.php b/apps/user_ldap/tests/mapping/abstractmappingtest.php
index c6427be516b..a931a07a44c 100644
--- a/apps/user_ldap/tests/mapping/abstractmappingtest.php
+++ b/apps/user_ldap/tests/mapping/abstractmappingtest.php
@@ -112,7 +112,7 @@ abstract class AbstractMappingTest extends \Test\TestCase {
}
/**
- * tests unmap() for both successfuly and not successful removing of
+ * tests unmap() for both successful and unsuccessful removing of
* mapping entries
*/
public function testUnmap() {
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index 26d3429818f..224cf5c9a35 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -250,8 +250,9 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
* @throws \Exception when connection could not be established
*/
public function userExists($uid) {
- if($this->access->connection->isCached('userExists'.$uid)) {
- return $this->access->connection->getFromCache('userExists'.$uid);
+ $userExists = $this->access->connection->getFromCache('userExists'.$uid);
+ if(!is_null($userExists)) {
+ return (bool)$userExists;
}
//getting dn, if false the user does not exist. If dn, he may be mapped only, requires more checking.
$user = $this->access->userManager->get($uid);
@@ -321,8 +322,9 @@ class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserIn
}
$cacheKey = 'getHome'.$uid;
- if($this->access->connection->isCached($cacheKey)) {
- return $this->access->connection->getFromCache($cacheKey);
+ $path = $this->access->connection->getFromCache($cacheKey);
+ if(!is_null($path)) {
+ return $path;
}
$user = $this->access->userManager->get($uid);
diff --git a/autotest-external.sh b/autotest-external.sh
index 643153bb064..9705980aa2b 100755
--- a/autotest-external.sh
+++ b/autotest-external.sh
@@ -178,7 +178,7 @@ EOF
return;
fi
- FILES_EXTERNAL_BACKEND_PATH=../apps/files_external/tests/backends
+ FILES_EXTERNAL_BACKEND_PATH=../apps/files_external/tests/storage
FILES_EXTERNAL_BACKEND_ENV_PATH=../apps/files_external/tests/env
for startFile in `ls -1 $FILES_EXTERNAL_BACKEND_ENV_PATH | grep start`; do
@@ -198,16 +198,17 @@ EOF
# getting backend to test from filename
# it's the part between the dots startSomething.TestToRun.sh
testToRun=`echo $startFile | cut -d '-' -f 2`
+ testToRun="${testToRun}test.php"
# run the specific test
if [ -z "$NOCOVERAGE" ]; then
rm -rf "coverage-external-html-$1-$name"
mkdir "coverage-external-html-$1-$name"
- "$PHPUNIT" --configuration phpunit-autotest-external.xml --log-junit "autotest-external-results-$1-$name.xml" --coverage-clover "autotest-external-clover-$1-$name.xml" --coverage-html "coverage-external-html-$1-$name" "$FILES_EXTERNAL_BACKEND_PATH/$testToRun.php"
+ "$PHPUNIT" --configuration phpunit-autotest-external.xml --log-junit "autotest-external-results-$1-$name.xml" --coverage-clover "autotest-external-clover-$1-$name.xml" --coverage-html "coverage-external-html-$1-$name" "$FILES_EXTERNAL_BACKEND_PATH/$testToRun"
RESULT=$?
else
echo "No coverage"
- "$PHPUNIT" --configuration phpunit-autotest-external.xml --log-junit "autotest-external-results-$1-$name.xml" "$FILES_EXTERNAL_BACKEND_PATH/$testToRun.php"
+ "$PHPUNIT" --configuration phpunit-autotest-external.xml --log-junit "autotest-external-results-$1-$name.xml" "$FILES_EXTERNAL_BACKEND_PATH/$testToRun"
RESULT=$?
fi
else
@@ -218,7 +219,7 @@ EOF
stopFile=`echo "$startFile" | sed 's/start/stop/'`
echo "stop: $stopFile"
if [ -f $FILES_EXTERNAL_BACKEND_ENV_PATH/$stopFile ]; then
- # execute stop file if existant
+ # execute stop file if existent
./$FILES_EXTERNAL_BACKEND_ENV_PATH/$stopFile
fi
if [ "$DOEXIT" ]; then
diff --git a/bower.json b/bower.json
index ae9575249c9..74c4be96a21 100644
--- a/bower.json
+++ b/bower.json
@@ -16,8 +16,8 @@
"blueimp-md5": "~1.1.0",
"handlebars": "~1.3.0",
"jcrop": "~0.9.12",
- "jquery": "~1.10.0",
- "jquery-migrate": "~1.2.1",
+ "jquery": "~2.2.0",
+ "jquery-migrate": "~1.4.0",
"jquery-ui": "1.10.0",
"jsTimezoneDetect": "~1.0.5",
"moment": "~2.10.0",
diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php
index 2ef5f252f11..79c447ac573 100644
--- a/build/integration/features/bootstrap/WebDav.php
+++ b/build/integration/features/bootstrap/WebDav.php
@@ -100,6 +100,25 @@ trait WebDav {
}
/**
+ * @When /^Downloading last public shared file inside a folder "([^"]*)" with range "([^"]*)"$/
+ * @param string $range
+ */
+ public function downloadPublicFileInsideAFolderWithRange($path, $range){
+ $token = $this->lastShareData->data->token;
+ $fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav" . "$path";
+ $headers['Range'] = $range;
+
+ $client = new GClient();
+ $options = [];
+ $options['auth'] = [$token, ""];
+
+ $request = $client->createRequest("GET", $fullUrl, $options);
+ $request->addHeader('Range', $range);
+
+ $this->response = $client->send($request);
+ }
+
+ /**
* @Then /^Downloaded content should be "([^"]*)"$/
* @param string $content
*/
@@ -373,5 +392,37 @@ trait WebDav {
$this->makeDavRequest($user, 'PUT', $file, ['OC-Chunked' => '1'], $data);
}
+ /**
+ * @Given user :user creates a new chunking upload with id :id
+ */
+ public function userCreatesANewChunkingUploadWithId($user, $id)
+ {
+ $destination = '/uploads/'.$user.'/'.$id;
+ $this->makeDavRequest($user, 'MKCOL', $destination, []);
+ }
+
+ /**
+ * @Given user :user uploads new chunk file :num with :data to id :id
+ */
+ public function userUploadsNewChunkFileOfWithToId($user, $num, $data, $id)
+ {
+ $data = \GuzzleHttp\Stream\Stream::factory($data);
+ $destination = '/uploads/'.$user.'/'.$id.'/'.$num;
+ $this->makeDavRequest($user, 'PUT', $destination, [], $data);
+ }
+
+ /**
+ * @Given user :user moves new chunk file with id :id to :dest
+ */
+ public function userMovesNewChunkFileWithIdToMychunkedfile($user, $id, $dest)
+ {
+ $source = '/uploads/'.$user.'/'.$id.'/.file';
+ $destination = substr($this->baseUrl, 0, -4) . $this->davPath . '/files/'.$user.$dest;
+ $this->makeDavRequest($user, 'MOVE', $source, [
+ 'Destination' => $destination
+ ]);
+ }
+
+
}
diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature
index b9d77120b9c..49c2dbf58c6 100644
--- a/build/integration/features/sharing-v1.feature
+++ b/build/integration/features/sharing-v1.feature
@@ -251,6 +251,20 @@ Feature: sharing
And User "user2" should be included in the response
And User "user3" should not be included in the response
+ Scenario: Reshared files can be still accessed if a user in the middle removes it.
+ Given user "user0" exists
+ And user "user1" exists
+ And user "user2" exists
+ And user "user3" exists
+ And file "textfile0.txt" of user "user0" is shared with user "user1"
+ And file "textfile0 (2).txt" of user "user1" is shared with user "user2"
+ And file "textfile0 (2).txt" of user "user2" is shared with user "user3"
+ And As an "user1"
+ When User "user1" deletes file "/textfile0 (2).txt"
+ And As an "user3"
+ And Downloading file "/textfile0 (2).txt" with range "bytes=1-7"
+ Then Downloaded content should be "wnCloud"
+
Scenario: getting share info of a share
Given user "user0" exists
And user "user1" exists
@@ -571,8 +585,8 @@ Feature: sharing
Given user "user0" exists
And User "user0" uploads file with content "foo" to "/tmp.txt"
When as "user0" gets properties of folder "/tmp.txt" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "19"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "19"
Scenario: Correct webdav share-permissions for received file with edit and reshare permissions
Given user "user0" exists
@@ -580,8 +594,8 @@ Feature: sharing
And User "user0" uploads file with content "foo" to "/tmp.txt"
And file "tmp.txt" of user "user0" is shared with user "user1"
When as "user1" gets properties of folder "/tmp.txt" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "19"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "19"
Scenario: Correct webdav share-permissions for received file with edit permissions but no reshare permissions
Given user "user0" exists
@@ -592,8 +606,8 @@ Feature: sharing
And Updating last share with
| permissions | 3 |
When as "user1" gets properties of folder "/tmp.txt" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "0"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "3"
Scenario: Correct webdav share-permissions for received file with reshare permissions but no edit permissions
Given user "user0" exists
@@ -604,15 +618,15 @@ Feature: sharing
And Updating last share with
| permissions | 17 |
When as "user1" gets properties of folder "/tmp.txt" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "17"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "17"
Scenario: Correct webdav share-permissions for owned folder
Given user "user0" exists
And user "user0" created a folder "/tmp"
When as "user0" gets properties of folder "/" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "31"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "31"
Scenario: Correct webdav share-permissions for received folder with all permissions
Given user "user0" exists
@@ -620,8 +634,8 @@ Feature: sharing
And user "user0" created a folder "/tmp"
And file "/tmp" of user "user0" is shared with user "user1"
When as "user1" gets properties of folder "/tmp" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "31"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "31"
Scenario: Correct webdav share-permissions for received folder with all permissions but edit
Given user "user0" exists
@@ -632,8 +646,8 @@ Feature: sharing
And Updating last share with
| permissions | 29 |
When as "user1" gets properties of folder "/tmp" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "29"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "29"
Scenario: Correct webdav share-permissions for received folder with all permissions but create
Given user "user0" exists
@@ -644,8 +658,8 @@ Feature: sharing
And Updating last share with
| permissions | 27 |
When as "user1" gets properties of folder "/tmp" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "27"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "27"
Scenario: Correct webdav share-permissions for received folder with all permissions but delete
Given user "user0" exists
@@ -656,8 +670,8 @@ Feature: sharing
And Updating last share with
| permissions | 23 |
When as "user1" gets properties of folder "/tmp" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "23"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "23"
Scenario: Correct webdav share-permissions for received folder with all permissions but share
Given user "user0" exists
@@ -668,5 +682,17 @@ Feature: sharing
And Updating last share with
| permissions | 15 |
When as "user1" gets properties of folder "/tmp" with
- |{http://owncloud.org/ns}share-permissions|
- Then the single response should contain a property "{http://owncloud.org/ns}share-permissions" with value "0"
+ |{http://open-collaboration-services.org/ns}share-permissions |
+ Then the single response should contain a property "{http://open-collaboration-services.org/ns}share-permissions" with value "15"
+
+ Scenario: unique target names for incomming shares
+ Given user "user0" exists
+ And user "user1" exists
+ And user "user2" exists
+ And user "user0" created a folder "/foo"
+ And user "user1" created a folder "/foo"
+ When file "/foo" of user "user0" is shared with user "user2"
+ And file "/foo" of user "user1" is shared with user "user2"
+ Then user "user2" should see following elements
+ | /foo/ |
+ | /foo%20(2)/ |
diff --git a/build/integration/features/webdav-related.feature b/build/integration/features/webdav-related.feature
index ee841f9eb5b..abdc63935e9 100644
--- a/build/integration/features/webdav-related.feature
+++ b/build/integration/features/webdav-related.feature
@@ -68,13 +68,22 @@ Feature: webdav-related
And Downloading last public shared file with range "bytes=51-77"
Then Downloaded content should be "example file for developers"
+ Scenario: download a public shared file inside a folder with range
+ Given user "user0" exists
+ And As an "user0"
+ When creating a share with
+ | path | PARENT |
+ | shareType | 3 |
+ And Downloading last public shared file inside a folder "/parent.txt" with range "bytes=1-7"
+ Then Downloaded content should be "wnCloud"
+
Scenario: Downloading a file on the old endpoint should serve security headers
Given using dav path "remote.php/webdav"
And As an "admin"
When Downloading file "/welcome.txt"
Then The following headers should be set
|Content-Disposition|attachment|
- |Content-Security-Policy|default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src *; img-src * data: blob:; font-src 'self' data:; media-src *; connect-src *|
+ |Content-Security-Policy|default-src 'none';|
|X-Content-Type-Options |nosniff|
|X-Download-Options|noopen|
|X-Frame-Options|Sameorigin|
@@ -89,7 +98,7 @@ Feature: webdav-related
When Downloading file "/welcome.txt"
Then The following headers should be set
|Content-Disposition|attachment|
- |Content-Security-Policy|default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src *; img-src * data: blob:; font-src 'self' data:; media-src *; connect-src *|
+ |Content-Security-Policy|default-src 'none';|
|X-Content-Type-Options |nosniff|
|X-Download-Options|noopen|
|X-Frame-Options|Sameorigin|
@@ -241,3 +250,39 @@ Feature: webdav-related
| 0 |
| 1 |
| 3 |
+
+ Scenario: Upload chunked file asc with new chunking
+ Given using dav path "remote.php/dav"
+ And user "user0" exists
+ And user "user0" creates a new chunking upload with id "chunking-42"
+ And user "user0" uploads new chunk file "1" with "AAAAA" to id "chunking-42"
+ And user "user0" uploads new chunk file "2" with "BBBBB" to id "chunking-42"
+ And user "user0" uploads new chunk file "3" with "CCCCC" to id "chunking-42"
+ And user "user0" moves new chunk file with id "chunking-42" to "/myChunkedFile.txt"
+ When As an "user0"
+ And Downloading file "/files/user0/myChunkedFile.txt"
+ Then Downloaded content should be "AAAAABBBBBCCCCC"
+
+ Scenario: Upload chunked file desc with new chunking
+ Given using dav path "remote.php/dav"
+ And user "user0" exists
+ And user "user0" creates a new chunking upload with id "chunking-42"
+ And user "user0" uploads new chunk file "3" with "CCCCC" to id "chunking-42"
+ And user "user0" uploads new chunk file "2" with "BBBBB" to id "chunking-42"
+ And user "user0" uploads new chunk file "1" with "AAAAA" to id "chunking-42"
+ And user "user0" moves new chunk file with id "chunking-42" to "/myChunkedFile.txt"
+ When As an "user0"
+ And Downloading file "/files/user0/myChunkedFile.txt"
+ Then Downloaded content should be "AAAAABBBBBCCCCC"
+
+ Scenario: Upload chunked file random with new chunking
+ Given using dav path "remote.php/dav"
+ And user "user0" exists
+ And user "user0" creates a new chunking upload with id "chunking-42"
+ And user "user0" uploads new chunk file "2" with "BBBBB" to id "chunking-42"
+ And user "user0" uploads new chunk file "3" with "CCCCC" to id "chunking-42"
+ And user "user0" uploads new chunk file "1" with "AAAAA" to id "chunking-42"
+ And user "user0" moves new chunk file with id "chunking-42" to "/myChunkedFile.txt"
+ When As an "user0"
+ And Downloading file "/files/user0/myChunkedFile.txt"
+ Then Downloaded content should be "AAAAABBBBBCCCCC"
diff --git a/config/config.sample.php b/config/config.sample.php
index 6005352e9d5..db662cfd74f 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -430,14 +430,14 @@ $CONFIG = array(
* Both minimum and maximum times can be set together to explicitly define
* version deletion. For migration purposes, this setting is installed
* initially set to "auto", which is equivalent to the default setting in
- * ownCloud 8.1 and before.
+ * ownCloud 8.1 and before.
*
* Available values:
*
* * ``auto``
* default setting. Automatically expire versions according to expire
- * rules. Please refer to Files_versions online documentation for more
- * info.
+ * rules. Please refer to :doc:`../configuration_files/file_versioning` for
+ * more information.
* * ``D, auto``
* keep versions at least for D days, apply expire rules to all versions
* that are older than D days
@@ -612,21 +612,6 @@ $CONFIG = array(
*/
/**
- * ownCloud uses some 3rd party PHP components to provide certain functionality.
- * These components are shipped as part of the software package and reside in
- * ``owncloud/3rdparty``. Use this option to configure a different location.
- * For example, if your location is /var/www/owncloud/foo/3rdparty, then the
- * correct configuration is '3rdpartyroot' => '/var/www/owncloud/foo/',
- */
-'3rdpartyroot' => '',
-
-/**
- * If you have an alternate ``3rdpartyroot``, you must also configure the URL as
- * seen by a Web browser.
- */
-'3rdpartyurl' => '',
-
-/**
* This section is for configuring the download links for ownCloud clients, as
* seen in the first-run wizard and on Personal pages.
*/
@@ -740,7 +725,7 @@ $CONFIG = array(
*/
'preview_office_cl_parameters' =>
' --headless --nologo --nofirststartwizard --invisible --norestore '.
- '-convert-to pdf -outdir ',
+ '--convert-to pdf --outdir ',
/**
* Only register providers that have been explicitly enabled
@@ -1010,10 +995,11 @@ $CONFIG = array(
/**
* Additional driver options for the database connection, eg. to enable SSL
- * encryption in MySQL.
+ * encryption in MySQL or specify a custom wait timeout on a cheap hoster.
*/
'dbdriveroptions' => array(
PDO::MYSQL_ATTR_SSL_CA => '/file/path/to/ca_cert.pem',
+ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET wait_timeout = 28800'
),
/**
@@ -1211,6 +1197,11 @@ $CONFIG = array(
'memcache.locking' => '\\OC\\Memcache\\Redis',
/**
+ * Disable the web based updater
+ */
+'upgrade.disable-web' => false,
+
+/**
* Set this ownCloud instance to debugging mode
*
* Only enable this for local development and not in production environments
@@ -1219,6 +1210,19 @@ $CONFIG = array(
'debug' => false,
/**
+ * Sets the data-fingerprint of the current data served
+ *
+ * This is a property used by the clients to find out if a backup has been
+ * restored on the server. Once a backup is restored run
+ * ./occ maintenance:data-fingerprint
+ * To set this to a new value.
+ *
+ * Updating/Deleting this value can make connected clients stall until
+ * the user has resolved conflicts.
+ */
+'data-fingerprint' => '',
+
+/**
* This entry is just here to show a warning in case somebody copied the sample
* configuration. DO NOT ADD THIS SWITCH TO YOUR CONFIGURATION!
*
diff --git a/console.php b/console.php
index fc571b03f1e..559c1778f1d 100644
--- a/console.php
+++ b/console.php
@@ -42,6 +42,11 @@ if (version_compare(PHP_VERSION, '5.4.0') === -1) {
return;
}
+function exceptionHandler($exception) {
+ echo "An unhandled exception has been thrown:" . PHP_EOL;
+ echo $exception;
+ exit(1);
+}
try {
require_once 'lib/base.php';
@@ -53,6 +58,8 @@ try {
exit(0);
}
+ set_exception_handler('exceptionHandler');
+
if (!OC_Util::runningOnWindows()) {
if (!function_exists('posix_getuid')) {
echo "The posix extensions are required - see http://php.net/manual/en/book.posix.php" . PHP_EOL;
@@ -87,7 +94,7 @@ try {
$application->loadCommands(new ArgvInput(), new ConsoleOutput());
$application->run();
} catch (Exception $ex) {
- echo "An unhandled exception has been thrown:" . PHP_EOL;
- echo $ex;
- exit(1);
+ exceptionHandler($ex);
+} catch (Error $ex) {
+ exceptionHandler($ex);
}
diff --git a/core/Application.php b/core/Application.php
index 30376ee4f2e..0a54386a2ce 100644
--- a/core/Application.php
+++ b/core/Application.php
@@ -28,6 +28,7 @@ namespace OC\Core;
use OC\AppFramework\Utility\SimpleContainer;
use OC\AppFramework\Utility\TimeFactory;
+use OC\Core\Controller\LoginController;
use \OCP\AppFramework\App;
use OC\Core\Controller\LostController;
use OC\Core\Controller\UserController;
@@ -89,6 +90,17 @@ class Application extends App {
$c->query('Logger')
);
});
+ $container->registerService('LoginController', function(SimpleContainer $c) {
+ return new LoginController(
+ $c->query('AppName'),
+ $c->query('Request'),
+ $c->query('UserManager'),
+ $c->query('Config'),
+ $c->query('Session'),
+ $c->query('UserSession'),
+ $c->query('URLGenerator')
+ );
+ });
/**
* Core class wrappers
@@ -114,6 +126,9 @@ class Application extends App {
$container->registerService('AvatarManager', function(SimpleContainer $c) {
return $c->query('ServerContainer')->getAvatarManager();
});
+ $container->registerService('Session', function(SimpleContainer $c) {
+ return $c->query('ServerContainer')->getSession();
+ });
$container->registerService('UserSession', function(SimpleContainer $c) {
return $c->query('ServerContainer')->getUserSession();
});
diff --git a/core/Command/App/CheckCode.php b/core/Command/App/CheckCode.php
index 78f4390e70a..f73c8457032 100644
--- a/core/Command/App/CheckCode.php
+++ b/core/Command/App/CheckCode.php
@@ -170,6 +170,8 @@ class CheckCode extends Command {
$errors = array_merge($errors, $infoErrors);
}
+ $this->analyseUpdateFile($appId, $output);
+
if (empty($errors)) {
$output->writeln('<info>App is compliant - awesome job!</info>');
return 0;
@@ -178,4 +180,20 @@ class CheckCode extends Command {
return 101;
}
}
+
+ /**
+ * @param string $appId
+ * @param $output
+ */
+ private function analyseUpdateFile($appId, OutputInterface $output) {
+ $appPath = \OC_App::getAppPath($appId);
+ if ($appPath === false) {
+ throw new \RuntimeException("No app with given id <$appId> known.");
+ }
+
+ $updatePhp = $appPath . '/appinfo/update.php';
+ if (file_exists($updatePhp)) {
+ $output->writeln("<info>Deprecated file found: $updatePhp - please use repair steps</info>");
+ }
+ }
}
diff --git a/core/Command/Maintenance/DataFingerprint.php b/core/Command/Maintenance/DataFingerprint.php
new file mode 100644
index 00000000000..38f490fd12a
--- /dev/null
+++ b/core/Command/Maintenance/DataFingerprint.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Core\Command\Maintenance;
+
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\IConfig;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+
+class DataFingerprint extends Command {
+
+ /** @var IConfig */
+ protected $config;
+ /** @var ITimeFactory */
+ protected $timeFactory;
+
+ public function __construct(IConfig $config,
+ ITimeFactory $timeFactory) {
+ $this->config = $config;
+ $this->timeFactory = $timeFactory;
+ parent::__construct();
+ }
+
+ protected function configure() {
+ $this
+ ->setName('maintenance:data-fingerprint')
+ ->setDescription('update the systems data-fingerprint after a backup is restored');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $this->config->setSystemValue('data-fingerprint', md5($this->timeFactory->getTime()));
+ }
+}
diff --git a/core/Command/Maintenance/Repair.php b/core/Command/Maintenance/Repair.php
index 95e2b872227..2da76143390 100644
--- a/core/Command/Maintenance/Repair.php
+++ b/core/Command/Maintenance/Repair.php
@@ -24,15 +24,14 @@
namespace OC\Core\Command\Maintenance;
+use Exception;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class Repair extends Command {
- /**
- * @var \OC\Repair $repair
- */
+ /** @var \OC\Repair $repair */
protected $repair;
/** @var \OCP\IConfig */
protected $config;
@@ -55,9 +54,7 @@ class Repair extends Command {
'include-expensive',
null,
InputOption::VALUE_NONE,
- 'Use this option when you want to include resource and load expensive tasks'
- )
- ;
+ 'Use this option when you want to include resource and load expensive tasks');
}
protected function execute(InputInterface $input, OutputInterface $output) {
@@ -68,6 +65,25 @@ class Repair extends Command {
}
}
+ $apps = \OC::$server->getAppManager()->getInstalledApps();
+ foreach ($apps as $app) {
+ if (!\OC_App::isEnabled($app)) {
+ continue;
+ }
+ $info = \OC_App::getAppInfo($app);
+ if (!is_array($info)) {
+ continue;
+ }
+ $steps = $info['repair-steps']['post-migration'];
+ foreach ($steps as $step) {
+ try {
+ $this->repair->addStep($step);
+ } catch (Exception $ex) {
+ $output->writeln("<error>Failed to load repair step for $app: {$ex->getMessage()}</error>");
+ }
+ }
+ }
+
$maintenanceMode = $this->config->getSystemValue('maintenance', false);
$this->config->setSystemValue('maintenance', true);
diff --git a/core/Command/Upgrade.php b/core/Command/Upgrade.php
index cbb1f26f938..1001962c6af 100644
--- a/core/Command/Upgrade.php
+++ b/core/Command/Upgrade.php
@@ -128,7 +128,6 @@ class Upgrade extends Command {
$self = $this;
$updater = new Updater(
- \OC::$server->getHTTPHelper(),
$this->config,
\OC::$server->getIntegrityCodeChecker(),
$this->logger
diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php
new file mode 100644
index 00000000000..796706d364a
--- /dev/null
+++ b/core/Controller/LoginController.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Core\Controller;
+
+use OC\Setup;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IConfig;
+use OCP\IRequest;
+use OCP\ISession;
+use OCP\IURLGenerator;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\IUserSession;
+
+class LoginController extends Controller {
+ /** @var IUserManager */
+ private $userManager;
+ /** @var IConfig */
+ private $config;
+ /** @var ISession */
+ private $session;
+ /** @var IUserSession */
+ private $userSession;
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ /**
+ * @param string $appName
+ * @param IRequest $request
+ * @param IUserManager $userManager
+ * @param IConfig $config
+ * @param ISession $session
+ * @param IUserSession $userSession
+ * @param IURLGenerator $urlGenerator
+ */
+ function __construct($appName,
+ IRequest $request,
+ IUserManager $userManager,
+ IConfig $config,
+ ISession $session,
+ IUserSession $userSession,
+ IURLGenerator $urlGenerator) {
+ parent::__construct($appName, $request);
+ $this->userManager = $userManager;
+ $this->config = $config;
+ $this->session = $session;
+ $this->userSession = $userSession;
+ $this->urlGenerator = $urlGenerator;
+ }
+
+ /**
+ * @NoAdminRequired
+ * @UseSession
+ *
+ * @return RedirectResponse
+ */
+ public function logout() {
+ $loginToken = $this->request->getCookie('oc_token');
+ if (!is_null($loginToken)) {
+ $this->config->deleteUserValue($this->userSession->getUser()->getUID(), 'login_token', $loginToken);
+ }
+ $this->userSession->logout();
+
+ return new RedirectResponse($this->urlGenerator->linkToRouteAbsolute('core.login.showLoginForm'));
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ * @UseSession
+ *
+ * @param string $user
+ * @param string $redirect_url
+ * @param string $remember_login
+ *
+ * @return TemplateResponse
+ */
+ public function showLoginForm($user,
+ $redirect_url,
+ $remember_login) {
+ if($this->userSession->isLoggedIn()) {
+ return new RedirectResponse(\OC_Util::getDefaultPageUrl());
+ }
+
+ $parameters = array();
+ $loginMessages = $this->session->get('loginMessages');
+ $errors = [];
+ $messages = [];
+ if(is_array($loginMessages)) {
+ list($errors, $messages) = $loginMessages;
+ }
+ $this->session->remove('loginMessages');
+ foreach ($errors as $value) {
+ $parameters[$value] = true;
+ }
+
+ $parameters['messages'] = $messages;
+ if (!is_null($user) && $user !== '') {
+ $parameters['loginName'] = $user;
+ $parameters['user_autofocus'] = false;
+ } else {
+ $parameters['loginName'] = '';
+ $parameters['user_autofocus'] = true;
+ }
+ if (!empty($redirect_url)) {
+ $parameters['redirect_url'] = $redirect_url;
+ }
+
+ $parameters['canResetPassword'] = true;
+ if (!$this->config->getSystemValue('lost_password_link')) {
+ if (!is_null($user) && $user !== '') {
+ $userObj = $this->userManager->get($user);
+ if ($userObj instanceof IUser) {
+ $parameters['canResetPassword'] = $userObj->canChangePassword();
+ }
+ }
+ }
+
+ $parameters['alt_login'] = \OC_App::getAlternativeLogIns();
+ $parameters['rememberLoginAllowed'] = \OC_Util::rememberLoginAllowed();
+ $parameters['rememberLoginState'] = !empty($remember_login) ? $remember_login : 0;
+
+ if (!is_null($user) && $user !== '') {
+ $parameters['loginName'] = $user;
+ $parameters['user_autofocus'] = false;
+ } else {
+ $parameters['loginName'] = '';
+ $parameters['user_autofocus'] = true;
+ }
+
+ return new TemplateResponse(
+ $this->appName,
+ 'login',
+ $parameters,
+ 'guest'
+ );
+ }
+
+}
diff --git a/core/ajax/update.php b/core/ajax/update.php
index 631a8a7871c..0e6c1176ac1 100644
--- a/core/ajax/update.php
+++ b/core/ajax/update.php
@@ -40,6 +40,14 @@ $eventSource = \OC::$server->createEventSource();
$eventSource->send('success', (string)$l->t('Preparing update'));
if (OC::checkUpgrade(false)) {
+
+ $config = \OC::$server->getSystemConfig();
+ if ($config->getValue('upgrade.disable-web', false)) {
+ $eventSource->send('failure', (string)$l->t('Please use the command line updater because automatic updating is disabled in the config.php.'));
+ $eventSource->close();
+ exit();
+ }
+
// if a user is currently logged in, their session must be ignored to
// avoid side effects
\OC_User::setIncognitoMode(true);
@@ -47,7 +55,6 @@ if (OC::checkUpgrade(false)) {
$logger = \OC::$server->getLogger();
$config = \OC::$server->getConfig();
$updater = new \OC\Updater(
- \OC::$server->getHTTPHelper(),
$config,
\OC::$server->getIntegrityCodeChecker(),
$logger
diff --git a/core/css/apps.css b/core/css/apps.css
index 79044fbaee5..e8b33ecba65 100644
--- a/core/css/apps.css
+++ b/core/css/apps.css
@@ -573,11 +573,11 @@ h3 {
}
.appear {
opacity: 1;
- transition: opacity 500ms ease 0s;
+ -webkit-transition: opacity 500ms ease 0s;
-moz-transition: opacity 500ms ease 0s;
-ms-transition: opacity 500ms ease 0s;
-o-transition: opacity 500ms ease 0s;
- -webkit-transition: opacity 500ms ease 0s;
+ transition: opacity 500ms ease 0s;
}
.appear.transparent {
opacity: 0;
diff --git a/core/css/fonts.css b/core/css/fonts.css
index 2a894031e54..f72aa2930cf 100644
--- a/core/css/fonts.css
+++ b/core/css/fonts.css
@@ -4,7 +4,7 @@
font-family: 'Open Sans';
font-style: normal;
font-weight: normal;
- src: local('Open Sans'), local('OpenSans'), url(../fonts/OpenSans-Regular.woff) format('woff');
+ src: local('Open Sans'), local('OpenSans'), url('../fonts/OpenSans-Regular.woff') format('woff');
}
}
@@ -12,12 +12,12 @@
font-family: 'Open Sans';
font-style: normal;
font-weight: 300;
- src: local('Open Sans Light'), local('OpenSans-Light'), url(../fonts/OpenSans-Light.woff) format('woff');
+ src: local('Open Sans Light'), local('OpenSans-Light'), url('../fonts/OpenSans-Light.woff') format('woff');
}
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 600;
- src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(../fonts/OpenSans-Semibold.woff) format('woff');
+ src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url('../fonts/OpenSans-Semibold.woff') format('woff');
}
diff --git a/core/css/header.css b/core/css/header.css
index 5a5acb269ab..af4bbac57a5 100644
--- a/core/css/header.css
+++ b/core/css/header.css
@@ -68,7 +68,7 @@
}
#header .logo {
- background-image: url(../img/logo-icon.svg);
+ background-image: url('../img/logo-icon.svg');
background-repeat: no-repeat;
background-size: 175px;
background-position: center 30px;
@@ -294,6 +294,12 @@
color: #bbb;
cursor: pointer;
}
+#settings .icon-loading-dark {
+ display: inline-block;
+ margin-bottom: -3px;
+ margin-right: 6px;
+ background-size: 16px 16px;
+}
#expand {
display: block;
padding: 7px 30px 6px 10px;
diff --git a/core/css/inputs.css b/core/css/inputs.css
index f02a606decd..edec870dfbc 100644
--- a/core/css/inputs.css
+++ b/core/css/inputs.css
@@ -57,7 +57,8 @@ input[type="email"],
input[type="tel"],
input[type="url"],
input[type="time"] {
- -webkit-appearance:textfield; -moz-appearance:textfield;
+ -webkit-appearance:textfield;
+ -moz-appearance:textfield;
box-sizing:content-box;
}
input[type="text"]:hover, input[type="text"]:focus, input[type="text"]:active,
diff --git a/core/css/jquery-ui-fixes.css b/core/css/jquery-ui-fixes.css
index 7e0cdd18204..f76595ab3fd 100644
--- a/core/css/jquery-ui-fixes.css
+++ b/core/css/jquery-ui-fixes.css
@@ -9,7 +9,7 @@
}
.ui-widget-content {
border: 1px solid #dddddd;
- background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;
+ background: #eeeeee url('images/ui-bg_highlight-soft_100_eeeeee_1x100.png') 50% top repeat-x;
color: #333333;
}
.ui-widget-content a {
@@ -17,7 +17,7 @@
}
.ui-widget-header {
border: 1px solid #1d2d44;
- background: #1d2d44 url(images/ui-bg_flat_35_1d2d44_40x100.png) 50% 50% repeat-x;
+ background: #1d2d44 url('images/ui-bg_flat_35_1d2d44_40x100.png') 50% 50% repeat-x;
color: #ffffff;
}
.ui-widget-header a {
@@ -30,7 +30,7 @@
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default {
border: 1px solid #ddd;
- background: #f8f8f8 url(images/ui-bg_glass_100_f8f8f8_1x400.png) 50% 50% repeat-x;
+ background: #f8f8f8 url('images/ui-bg_glass_100_f8f8f8_1x400.png') 50% 50% repeat-x;
font-weight: bold;
color: #555;
}
@@ -46,7 +46,7 @@
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus {
border: 1px solid #ddd;
- background: #ffffff url(images/ui-bg_flat_100_ffffff_40x100.png) 50% 50% repeat-x;
+ background: #ffffff url('images/ui-bg_flat_100_ffffff_40x100.png') 50% 50% repeat-x;
font-weight: bold;
color: #333;
}
@@ -60,7 +60,7 @@
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active {
border: 1px solid #1d2d44;
- background: #f8f8f8 url(images/ui-bg_glass_100_f8f8f8_1x400.png) 50% 50% repeat-x;
+ background: #f8f8f8 url('images/ui-bg_glass_100_f8f8f8_1x400.png') 50% 50% repeat-x;
font-weight: bold;
color: #1d2d44;
}
@@ -76,7 +76,7 @@
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #ddd;
- background: #f8f8f8 url(images/ui-bg_highlight-hard_100_f8f8f8_1x100.png) 50% top repeat-x;
+ background: #f8f8f8 url('images/ui-bg_highlight-hard_100_f8f8f8_1x100.png') 50% top repeat-x;
color: #555;
}
.ui-state-highlight a,
@@ -88,7 +88,7 @@
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
- background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;
+ background: #b81900 url('images/ui-bg_diagonals-thick_18_b81900_40x40.png') 50% 50% repeat;
color: #ffffff;
}
.ui-state-error a,
@@ -105,34 +105,34 @@
/* Icons
----------------------------------*/
.ui-state-default .ui-icon {
- background-image: url(images/ui-icons_1d2d44_256x240.png);
+ background-image: url('images/ui-icons_1d2d44_256x240.png');
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon {
- background-image: url(images/ui-icons_1d2d44_256x240.png);
+ background-image: url('images/ui-icons_1d2d44_256x240.png');
}
.ui-state-active .ui-icon {
- background-image: url(images/ui-icons_1d2d44_256x240.png);
+ background-image: url('images/ui-icons_1d2d44_256x240.png');
}
.ui-state-highlight .ui-icon {
- background-image: url(images/ui-icons_ffffff_256x240.png);
+ background-image: url('images/ui-icons_ffffff_256x240.png');
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
- background-image: url(images/ui-icons_ffd27a_256x240.png);
+ background-image: url('images/ui-icons_ffd27a_256x240.png');
}
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay {
- background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;
+ background: #666666 url('images/ui-bg_diagonals-thick_20_666666_40x40.png') 50% 50% repeat;
opacity: .5;
}
.ui-widget-shadow {
margin: -5px 0 0 -5px;
padding: 5px;
- background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;
+ background: #000000 url('images/ui-bg_flat_10_000000_40x100.png') 50% 50% repeat-x;
opacity: .2;
border-radius: 5px;
}
diff --git a/core/css/mobile.css b/core/css/mobile.css
index 5bf0b1e58a7..0ef6a08c24f 100644
--- a/core/css/mobile.css
+++ b/core/css/mobile.css
@@ -10,15 +10,25 @@
-webkit-box-pack: center;
-webkit-box-align: center;
+ display: -webkit-flex;
+ -webkit-flex-direction: row;
+ -webkit-align-self: center;
+ -webkit-align-items: center;
+
display: -moz-box;
-moz-box-orient: horizontal;
-moz-box-pack: center;
-moz-box-align: center;
- display: box;
- box-orient: horizontal;
- box-pack: center;
- box-align: center;
+ display: -ms-flexbox;
+ -ms-flex-direction: row;
+ -ms-flex-pack: center;
+ -ms-flex-align: center;
+
+ display: flex;
+ flex-direction: row;
+ align-self: center;
+ align-items: center;
}
/* on mobile public share, show only the icon of the logo, hide the text */
diff --git a/core/css/styles.css b/core/css/styles.css
index a1dda59a86b..9257ae82669 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -25,12 +25,10 @@ body {
#body-login {
text-align: center;
- background: #1d2d44; /* Old browsers */
- background: -moz-linear-gradient(top, #35537a 0%, #1d2d44 100%); /* FF3.6+ */
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#35537a), color-stop(100%,#1d2d44)); /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(top, #35537a 0%,#1d2d44 100%); /* Chrome10+,Safari5.1+ */
- background: linear-gradient(top, #35537a 0%,#1d2d44 100%); /* W3C */
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#35537a', endColorstr='#1d2d44',GradientType=0 ); /* IE6-9 */
+ background-image: url('../img/background.jpg');
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ background-size: cover;
}
.float-spinner {
@@ -223,9 +221,7 @@ body {
#body-login form fieldset .warning-info,
#body-login form input[type="checkbox"]+label {
text-align: center;
- color: #ccc;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";
- opacity: .6;
+ color: #fff;
}
/* overrides another !important statement that sets this to unreadable black */
#body-login form .warning input[type="checkbox"]:hover+label,
@@ -421,24 +417,21 @@ html.ie8 #body-login form input[type="checkbox"] {
#body-login form .errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 2em; padding:1em; }
#body-login .success { background:#d7fed7; border:1px solid #0f0; width: 35%; margin: 30px auto; padding:1em; text-align: center;}
-#body-login #remember_login:hover+label,
-#body-login #remember_login:focus+label {
- color: #fff !important;
-}
-
#body-login #showAdvanced > img {
padding: 4px;
box-sizing: border-box;
}
#body-login p.info a, #body-login #showAdvanced {
- color: #ccc;
-}
-
-#body-login p.info a:hover, #body-login p.info a:focus {
color: #fff;
}
+#body-login #remember_login:hover+label,
+#body-login #remember_login:focus+label,
+#body-login p.info a:hover,
+#body-login p.info a:focus {
+ opacity: .6;
+}
#body-login footer .info {
white-space: nowrap;
@@ -618,8 +611,6 @@ html.ie8 #body-login form input[type="checkbox"] {
}
#remember_login {
margin: 18px 5px 0 16px !important;
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
- opacity: .7;
}
#body-login .remember-login-container {
margin-top: 10px;
@@ -906,11 +897,11 @@ div.crumb:active {
.appear {
opacity: 1;
- transition: opacity 500ms ease 0s;
+ -webkit-transition: opacity 500ms ease 0s;
-moz-transition: opacity 500ms ease 0s;
-ms-transition: opacity 500ms ease 0s;
-o-transition: opacity 500ms ease 0s;
- -webkit-transition: opacity 500ms ease 0s;
+ transition: opacity 500ms ease 0s;
}
.appear.transparent {
opacity: 0;
diff --git a/core/img/background.jpg b/core/img/background.jpg
new file mode 100644
index 00000000000..a4ede839cb5
--- /dev/null
+++ b/core/img/background.jpg
Binary files differ
diff --git a/core/js/core.json b/core/js/core.json
index d894d59ca54..03c72e9b3ff 100644
--- a/core/js/core.json
+++ b/core/js/core.json
@@ -1,6 +1,6 @@
{
"vendor": [
- "jquery/jquery.min.js",
+ "jquery/dist/jquery.min.js",
"jquery-migrate/jquery-migrate.min.js",
"jquery-ui/ui/jquery-ui.custom.js",
"underscore/underscore.js",
@@ -32,6 +32,7 @@
"sharedialogview.js",
"sharedialogexpirationview.js",
"sharedialoglinkshareview.js",
+ "sharedialogmailview.js",
"sharedialogresharerinfoview.js",
"sharedialogshareelistview.js",
"octemplate.js",
diff --git a/core/js/js.js b/core/js/js.js
index 598e0dcd185..69ebabdb419 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -752,7 +752,8 @@ var OC={
// sometimes "beforeunload" happens later, so need to defer the reload a bit
setTimeout(function() {
if (!self._userIsNavigatingAway && !self._reloadCalled) {
- OC.reload();
+ OC.Notification.show(t('core', 'Problem loading page, reloading in 5 seconds'));
+ setTimeout(OC.reload, 5000);
// only call reload once
self._reloadCalled = true;
}
@@ -1337,9 +1338,6 @@ if(typeof localStorage !=='undefined' && localStorage !== null){
var item = localStorage.getItem(OC.localStorage.namespace+name);
if(item === null) {
return null;
- } else if (typeof JSON === 'undefined') {
- //fallback to jquery for IE6/7/8
- return $.parseJSON(item);
} else {
return JSON.parse(item);
}
@@ -1439,11 +1437,15 @@ function initCore() {
*/
moment.locale(OC.getLocale());
- if ($.browser.msie || !!navigator.userAgent.match(/Trident\/7\./)) {
- // for IE10+ that don't have conditional comments
- // and IE11 doesn't identify as MSIE any more...
+ var userAgent = window.navigator.userAgent;
+ var msie = userAgent.indexOf('MSIE ');
+ var trident = userAgent.indexOf('Trident/');
+ var edge = userAgent.indexOf('Edge/');
+
+ if (msie > 0 || trident > 0) {
+ // (IE 10 or older) || IE 11
$('html').addClass('ie');
- } else if (!!navigator.userAgent.match(/Edge\/12/)) {
+ } else if (edge > 0) {
// for edge
$('html').addClass('edge');
}
@@ -1498,9 +1500,15 @@ function initCore() {
interval = maxInterval;
}
var url = OC.generateUrl('/heartbeat');
- setInterval(function(){
- $.post(url);
- }, interval * 1000);
+ var heartBeatTimeout = null;
+ var heartBeat = function() {
+ clearTimeout(heartBeatTimeout);
+ heartBeatTimeout = setInterval(function() {
+ $.post(url);
+ }, interval * 1000);
+ };
+ $(document).ajaxComplete(heartBeat);
+ heartBeat();
}
// session heartbeat (defaults to enabled)
@@ -1553,11 +1561,30 @@ function initCore() {
}
if(!event.ctrlKey) {
$app.addClass('app-loading');
+ } else {
+ // Close navigation when opening app in
+ // a new tab
+ OC.hideMenus();
+ }
+ });
+ }
+
+ function setupUserMenu() {
+ var $menu = $('#header #settings');
+
+ $menu.delegate('a', 'click', function(event) {
+ var $page = $(event.target);
+ if (!$page.is('a')) {
+ $page = $page.closest('a');
}
+ $page.find('img').remove();
+ $page.find('div').remove(); // prevent odd double-clicks
+ $page.prepend($('<div/>').addClass('icon-loading-dark'));
});
}
setupMainMenu();
+ setupUserMenu();
// move triangle of apps dropdown to align with app name triangle
// 2 is the additional offset between the triangles
diff --git a/core/js/lostpassword.js b/core/js/lostpassword.js
index df28c2308cb..30d7b98f4e8 100644
--- a/core/js/lostpassword.js
+++ b/core/js/lostpassword.js
@@ -81,12 +81,12 @@ OC.Lostpassword = {
$('#password').parents('form').attr('action'),
{
password : $('#password').val(),
- proceed: $('#encrypted-continue').attr('checked') ? 'true' : 'false'
+ proceed: $('#encrypted-continue').is(':checked') ? 'true' : 'false'
},
OC.Lostpassword.resetDone
);
}
- if($('#encrypted-continue').attr('checked')) {
+ if($('#encrypted-continue').is(':checked')) {
$('#reset-password #submit').hide();
$('#reset-password #float-spinner').removeClass('hidden');
}
diff --git a/core/js/multiselect.js b/core/js/multiselect.js
index 6d5c54ac0f5..71cf3e10a69 100644
--- a/core/js/multiselect.js
+++ b/core/js/multiselect.js
@@ -120,7 +120,7 @@
label.text(element.text() || item);
label.attr('title', element.text() || item);
if(settings.checked.indexOf(item) !== -1 || checked) {
- input.attr('checked', true);
+ input.prop('checked', true);
}
if(checked){
if(settings.singleSelect) {
@@ -145,7 +145,7 @@
element.attr('selected','selected');
if(typeof settings.oncheck === 'function') {
if(settings.oncheck(value)===false) {
- $(this).attr('checked', false);
+ $(this).prop('checked', false);
return;
}
}
@@ -157,7 +157,7 @@
element.attr('selected',null);
if(typeof settings.onuncheck === 'function') {
if(settings.onuncheck(value)===false) {
- $(this).attr('checked',true);
+ $(this).prop('checked',true);
return;
}
}
diff --git a/core/js/placeholder.js b/core/js/placeholder.js
index da721ac5bcb..1b03a28ecca 100644
--- a/core/js/placeholder.js
+++ b/core/js/placeholder.js
@@ -92,7 +92,7 @@
// Init vars
var result = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var rgb = [0, 0, 0];
- var sat = 80;
+ var sat = 70;
var lum = 68;
var modulo = 16;
@@ -106,6 +106,12 @@
for(var count=1;count<modulo;count++) {
rgb[count%3] += parseInt(result[count]);
}
+
+ // Reduce values bigger than rgb requirements
+ rgb[0] = rgb[0]%255;
+ rgb[1] = rgb[1]%255;
+ rgb[2] = rgb[2]%255;
+
var hsl = rgbToHsl(rgb[0], rgb[1], rgb[2]);
// Classic formulla to check the brigtness for our eye
diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js
index 025cdb0fcd6..4cc50e51ae6 100644
--- a/core/js/setupchecks.js
+++ b/core/js/setupchecks.js
@@ -273,7 +273,7 @@
}
}
- var minimumSeconds = 15768000;
+ var minimumSeconds = 15552000;
if(isNaN(transportSecurityValidity) || transportSecurityValidity <= (minimumSeconds - 1)) {
messages.push({
msg: t('core', 'The "Strict-Transport-Security" HTTP header is not configured to at least "{seconds}" seconds. For enhanced security we recommend enabling HSTS as described in our <a href="{docUrl}" rel="noreferrer">security tips</a>.', {'seconds': minimumSeconds, docUrl: '#admin-tips'}),
diff --git a/core/js/sharedialoglinkshareview.js b/core/js/sharedialoglinkshareview.js
index 1d158ccec16..2fc6f657b02 100644
--- a/core/js/sharedialoglinkshareview.js
+++ b/core/js/sharedialoglinkshareview.js
@@ -40,12 +40,6 @@
'<label for="sharingDialogAllowPublicUpload-{{cid}}">{{publicUploadLabel}}</label>' +
'</div>' +
' {{/if}}' +
- ' {{#if mailPublicNotificationEnabled}}' +
- '<form id="emailPrivateLink" class="emailPrivateLinkForm">' +
- ' <input id="email" class="emailField" value="" placeholder="{{mailPrivatePlaceholder}}" type="text" />' +
- ' <input id="emailButton" class="emailButton" type="submit" value="{{mailButtonText}}" />' +
- '</form>' +
- ' {{/if}}' +
'{{else}}' +
// FIXME: this doesn't belong in this view
'{{#if noSharingPlaceholder}}<input id="shareWith-{{cid}}" class="shareWithField" type="text" placeholder="{{noSharingPlaceholder}}" disabled="disabled"/>{{/if}}' +
@@ -76,7 +70,6 @@
showLink: true,
events: {
- 'submit .emailPrivateLinkForm': '_onEmailPrivateLink',
'focusout input.linkPassText': 'onPasswordEntered',
'keyup input.linkPassText': 'onPasswordKeyUp',
'click .linkCheckbox': 'onLinkCheckBoxChange',
@@ -112,7 +105,6 @@
_.bindAll(
this,
- '_onEmailPrivateLink',
'onLinkCheckBoxChange',
'onPasswordEntered',
'onPasswordKeyUp',
@@ -218,34 +210,6 @@
});
},
- _onEmailPrivateLink: function(event) {
- event.preventDefault();
-
- var $emailField = this.$el.find('.emailField');
- var $emailButton = this.$el.find('.emailButton');
- var email = $emailField.val();
- if (email !== '') {
- $emailField.prop('disabled', true);
- $emailButton.prop('disabled', true);
- $emailField.val(t('core', 'Sending ...'));
- this.model.sendEmailPrivateLink(email).done(function() {
- $emailField.css('font-weight', 'bold').val(t('core','Email sent'));
- setTimeout(function() {
- $emailField.val('');
- $emailField.css('font-weight', 'normal');
- $emailField.prop('disabled', false);
- $emailButton.prop('disabled', false);
- }, 2000);
- }).fail(function() {
- $emailField.val(email);
- $emailField.css('font-weight', 'normal');
- $emailField.prop('disabled', false);
- $emailButton.prop('disabled', false);
- });
- }
- return false;
- },
-
render: function() {
var linkShareTemplate = this.template();
var resharingAllowed = this.model.sharePermissionPossible();
@@ -299,39 +263,6 @@
mailButtonText: t('core', 'Send')
}));
- var $emailField = this.$el.find('.emailField');
- if (isLinkShare && $emailField.length !== 0) {
- $emailField.autocomplete({
- minLength: 1,
- source: function (search, response) {
- $.get(
- OC.generateUrl('core/ajax/share.php'), {
- fetch: 'getShareWithEmail',
- search: search.term
- }, function(result) {
- if (result.status == 'success' && result.data.length > 0) {
- response(result.data);
- }
- });
- },
- select: function( event, item ) {
- $emailField.val(item.item.email);
- return false;
- }
- })
- .data("ui-autocomplete")._renderItem = function( ul, item ) {
- return $('<li>')
- .append('<a>' + escapeHTML(item.displayname) + "<br>" + escapeHTML(item.email) + '</a>' )
- .appendTo( ul );
- };
- }
-
- // TODO drop with IE8 drop
- if($('html').hasClass('ie8')) {
- this.$el.find('#linkPassText').removeAttr('placeholder');
- this.$el.find('#linkPassText').val('');
- }
-
this.delegateEvents();
return this;
diff --git a/core/js/sharedialogmailview.js b/core/js/sharedialogmailview.js
new file mode 100644
index 00000000000..84e3f3242ad
--- /dev/null
+++ b/core/js/sharedialogmailview.js
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2016
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function() {
+ if (!OC.Share) {
+ OC.Share = {};
+ }
+
+ var TEMPLATE =
+ '{{#if shareAllowed}}' +
+ ' {{#if mailPublicNotificationEnabled}}' +
+ '<form id="emailPrivateLink" class="emailPrivateLinkForm">' +
+ ' <input id="email" class="emailField" value="{{email}}" placeholder="{{mailPrivatePlaceholder}}" type="text" />' +
+ ' <input id="emailButton" class="emailButton" type="submit" value="{{mailButtonText}}" />' +
+ '</form>' +
+ ' {{/if}}' +
+ '{{/if}}'
+ ;
+
+ /**
+ * @class OCA.Share.ShareDialogMailView
+ * @member {OC.Share.ShareItemModel} model
+ * @member {jQuery} $el
+ * @memberof OCA.Sharing
+ * @classdesc
+ *
+ * Represents the GUI of the share dialogue
+ *
+ */
+ var ShareDialogMailView = OC.Backbone.View.extend({
+ /** @type {string} **/
+ id: 'shareDialogMailView',
+
+ /** @type {OC.Share.ShareConfigModel} **/
+ configModel: undefined,
+
+ /** @type {Function} **/
+ _template: undefined,
+
+ /** @type {boolean} **/
+ showLink: true,
+
+ events: {
+ 'submit .emailPrivateLinkForm': '_onEmailPrivateLink'
+ },
+
+ initialize: function(options) {
+ var view = this;
+
+ this.model.on('change:linkShare', function() {
+ view.render();
+ });
+
+ if(!_.isUndefined(options.configModel)) {
+ this.configModel = options.configModel;
+ } else {
+ throw 'missing OC.Share.ShareConfigModel';
+ }
+
+ _.bindAll(
+ this,
+ '_onEmailPrivateLink'
+ );
+ },
+
+ _onEmailPrivateLink: function(event) {
+ event.preventDefault();
+
+ var $emailField = this.$el.find('.emailField');
+ var $emailButton = this.$el.find('.emailButton');
+ var email = $emailField.val();
+ if (email !== '') {
+ $emailField.prop('disabled', true);
+ $emailButton.prop('disabled', true);
+ $emailField.val(t('core', 'Sending ...'));
+ this.model.sendEmailPrivateLink(email).done(function() {
+ $emailField.css('font-weight', 'bold').val(t('core','Email sent'));
+ setTimeout(function() {
+ $emailField.val('');
+ $emailField.css('font-weight', 'normal');
+ $emailField.prop('disabled', false);
+ $emailButton.prop('disabled', false);
+ }, 2000);
+ }).fail(function() {
+ $emailField.val(email);
+ $emailField.css('font-weight', 'normal');
+ $emailField.prop('disabled', false);
+ $emailButton.prop('disabled', false);
+ });
+ }
+ return false;
+ },
+
+ render: function() {
+ var linkShareTemplate = this.template();
+ var resharingAllowed = this.model.sharePermissionPossible();
+ var email = this.$el.find('.emailField').val();
+
+ if(!resharingAllowed
+ || !this.showLink
+ || !this.configModel.isShareWithLinkAllowed())
+ {
+ var templateData = {shareAllowed: false};
+ if (!resharingAllowed) {
+ // add message
+ templateData.noSharingPlaceholder = t('core', 'Resharing is not allowed');
+ }
+ this.$el.html(linkShareTemplate(templateData));
+ return this;
+ }
+
+ var isLinkShare = this.model.get('linkShare').isLinkShare;
+
+ this.$el.html(linkShareTemplate({
+ cid: this.cid,
+ shareAllowed: true,
+ mailPublicNotificationEnabled: isLinkShare && this.configModel.isMailPublicNotificationEnabled(),
+ mailPrivatePlaceholder: t('core', 'Email link to person'),
+ mailButtonText: t('core', 'Send link via email'),
+ email: email
+ }));
+
+ var $emailField = this.$el.find('.emailField');
+ if (isLinkShare && $emailField.length !== 0) {
+ $emailField.autocomplete({
+ minLength: 1,
+ source: function (search, response) {
+ $.get(
+ OC.generateUrl('core/ajax/share.php'), {
+ fetch: 'getShareWithEmail',
+ search: search.term
+ }, function(result) {
+ if (result.status == 'success' && result.data.length > 0) {
+ response(result.data);
+ }
+ });
+ },
+ select: function( event, item ) {
+ $emailField.val(item.item.email);
+ return false;
+ }
+ })
+ .data("ui-autocomplete")._renderItem = function( ul, item ) {
+ return $('<li>')
+ .append('<a>' + escapeHTML(item.displayname) + "<br>" + escapeHTML(item.email) + '</a>' )
+ .appendTo( ul );
+ };
+ }
+ this.delegateEvents();
+
+ return this;
+ },
+
+ /**
+ * @returns {Function} from Handlebars
+ * @private
+ */
+ template: function () {
+ if (!this._template) {
+ this._template = Handlebars.compile(TEMPLATE);
+ }
+ return this._template;
+ }
+
+ });
+
+ OC.Share.ShareDialogMailView = ShareDialogMailView;
+
+})(); \ No newline at end of file
diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js
index e4edbf24c08..83fde154615 100644
--- a/core/js/sharedialogshareelistview.js
+++ b/core/js/sharedialogshareelistview.js
@@ -22,28 +22,25 @@
'<div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>' +
'{{/if}}' +
'<span class="has-tooltip username" title="{{shareWith}}">{{shareWithDisplayName}}</span>' +
- '{{#if mailNotificationEnabled}} {{#unless isRemoteShare}}' +
+ '{{#if mailNotificationEnabled}} {{#unless isRemoteShare}}' +
'<span class="shareOption">' +
'<input id="mail-{{cid}}-{{shareWith}}" type="checkbox" name="mailNotification" class="mailNotification checkbox" {{#if wasMailSent}}checked="checked"{{/if}} />' +
'<label for="mail-{{cid}}-{{shareWith}}">{{notifyByMailLabel}}</label>' +
'</span>' +
'{{/unless}} {{/if}}' +
- '{{#if isResharingAllowed}} {{#if sharePermissionPossible}} {{#unless isRemoteShare}}' +
+ '{{#if isResharingAllowed}} {{#if sharePermissionPossible}}' +
'<span class="shareOption">' +
'<input id="canShare-{{cid}}-{{shareWith}}" type="checkbox" name="share" class="permissions checkbox" {{#if hasSharePermission}}checked="checked"{{/if}} data-permissions="{{sharePermission}}" />' +
'<label for="canShare-{{cid}}-{{shareWith}}">{{canShareLabel}}</label>' +
'</span>' +
- '{{/unless}} {{/if}} {{/if}}' +
+ '{{/if}} {{/if}}' +
'{{#if editPermissionPossible}}' +
'<span class="shareOption">' +
'<input id="canEdit-{{cid}}-{{shareWith}}" type="checkbox" name="edit" class="permissions checkbox" {{#if hasEditPermission}}checked="checked"{{/if}} />' +
'<label for="canEdit-{{cid}}-{{shareWith}}">{{canEditLabel}}</label>' +
- '{{#unless isRemoteShare}}' +
'<a href="#" class="showCruds"><img class="svg" alt="{{crudsLabel}}" src="{{triangleSImage}}"/></a>' +
- '{{/unless}}' +
'</span>' +
'{{/if}}' +
- '{{#unless isRemoteShare}}' +
'<div class="cruds hidden">' +
'{{#if createPermissionPossible}}' +
'<span class="shareOption">' +
@@ -57,14 +54,13 @@
'<label for="canUpdate-{{cid}}-{{shareWith}}">{{updatePermissionLabel}}</label>' +
'</span>' +
'{{/if}}' +
- '{{#if deletePermissionPossible}} {{#unless isRemoteShare}}' +
+ '{{#if deletePermissionPossible}}' +
'<span class="shareOption">' +
'<input id="canDelete-{{cid}}-{{shareWith}}" type="checkbox" name="delete" class="permissions checkbox" {{#if hasDeletePermission}}checked="checked"{{/if}} data-permissions="{{deletePermission}}"/>' +
'<label for="canDelete-{{cid}}-{{shareWith}}">{{deletePermissionLabel}}</label>' +
'</span>' +
- '{{/unless}} {{/if}}' +
+ '{{/if}}' +
'</div>' +
- '{{/unless}}' +
'</li>' +
'{{/each}}' +
'</ul>'
@@ -125,10 +121,6 @@
shareWithDisplayName = shareWithDisplayName + " (" + t('core', 'group') + ')';
} else if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
shareWithDisplayName = shareWithDisplayName + " (" + t('core', 'remote') + ')';
- hasPermissionOverride = {
- createPermissionPossible: true,
- updatePermissionPossible: true
- };
}
return _.extend(hasPermissionOverride, {
@@ -268,11 +260,11 @@
if ($element.attr('name') === 'edit') {
checked = $element.is(':checked');
// Check/uncheck Create, Update, and Delete checkboxes if Edit is checked/unck
- $($checkboxes).attr('checked', checked);
+ $($checkboxes).prop('checked', checked);
} else {
var numberChecked = $checkboxes.filter(':checked').length;
checked = numberChecked > 0;
- $('input[name="edit"]', $li).attr('checked', checked);
+ $('input[name="edit"]', $li).prop('checked', checked);
}
var permissions = OC.PERMISSION_READ;
diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js
index 56f53caddae..a4bfde1777b 100644
--- a/core/js/sharedialogview.js
+++ b/core/js/sharedialogview.js
@@ -26,6 +26,7 @@
'<div class="shareeListView subView"></div>' +
'<div class="linkShareView subView"></div>' +
'<div class="expirationView subView"></div>' +
+ '<div class="mailView subView"></div>' +
'<div class="loading hidden" style="height: 50px"></div>';
var TEMPLATE_REMOTE_SHARE_INFO =
@@ -67,6 +68,9 @@
/** @type {object} **/
shareeListView: undefined,
+ /** @type {object} **/
+ mailView: undefined,
+
events: {
'input .shareWithField': 'onShareWithFieldChanged'
},
@@ -103,7 +107,8 @@
resharerInfoView: 'ShareDialogResharerInfoView',
linkShareView: 'ShareDialogLinkShareView',
expirationView: 'ShareDialogExpirationView',
- shareeListView: 'ShareDialogShareeListView'
+ shareeListView: 'ShareDialogShareeListView',
+ mailView: 'ShareDialogMailView'
};
for(var name in subViews) {
@@ -360,6 +365,9 @@
this.shareeListView.$el = this.$el.find('.shareeListView');
this.shareeListView.render();
+ this.mailView.$el = this.$el.find('.mailView');
+ this.mailView.render();
+
this.$el.find('.hasTooltip').tooltip();
return this;
diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js
index 292230d26d5..3ced66a1a78 100644
--- a/core/js/shareitemmodel.js
+++ b/core/js/shareitemmodel.js
@@ -154,21 +154,17 @@
// Default permissions are Edit (CRUD) and Share
// Check if these permissions are possible
var permissions = OC.PERMISSION_READ;
- if (shareType === OC.Share.SHARE_TYPE_REMOTE) {
- permissions = OC.PERMISSION_CREATE | OC.PERMISSION_UPDATE | OC.PERMISSION_READ;
- } else {
- if (this.updatePermissionPossible()) {
- permissions = permissions | OC.PERMISSION_UPDATE;
- }
- if (this.createPermissionPossible()) {
- permissions = permissions | OC.PERMISSION_CREATE;
- }
- if (this.deletePermissionPossible()) {
- permissions = permissions | OC.PERMISSION_DELETE;
- }
- if (this.configModel.get('isResharingAllowed') && (this.sharePermissionPossible())) {
- permissions = permissions | OC.PERMISSION_SHARE;
- }
+ if (this.updatePermissionPossible()) {
+ permissions = permissions | OC.PERMISSION_UPDATE;
+ }
+ if (this.createPermissionPossible()) {
+ permissions = permissions | OC.PERMISSION_CREATE;
+ }
+ if (this.deletePermissionPossible()) {
+ permissions = permissions | OC.PERMISSION_DELETE;
+ }
+ if (this.configModel.get('isResharingAllowed') && (this.sharePermissionPossible())) {
+ permissions = permissions | OC.PERMISSION_SHARE;
}
attributes.permissions = permissions;
@@ -411,12 +407,6 @@
if(!_.isObject(share)) {
throw "Unknown Share";
}
- if( share.share_type === OC.Share.SHARE_TYPE_REMOTE
- && ( permission === OC.PERMISSION_SHARE
- || permission === OC.PERMISSION_DELETE))
- {
- return false;
- }
return (share.permissions & permission) === permission;
},
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index f18ecbc1a44..3d19a38c416 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -305,6 +305,7 @@ describe('Core base tests', function() {
counter++;
xhr.respond(200, {'Content-Type': 'application/json'}, '{}');
});
+ $(document).off('ajaxComplete'); // ignore previously registered heartbeats
});
afterEach(function() {
clock.restore();
@@ -312,6 +313,7 @@ describe('Core base tests', function() {
window.oc_config = oldConfig;
routeStub.restore();
$(document).off('ajaxError');
+ $(document).off('ajaxComplete');
});
it('sends heartbeat half the session lifetime when heartbeat enabled', function() {
/* jshint camelcase: false */
@@ -340,7 +342,7 @@ describe('Core base tests', function() {
clock.tick(20 * 1000);
expect(counter).toEqual(2);
});
- it('does no send heartbeat when heartbeat disabled', function() {
+ it('does not send heartbeat when heartbeat disabled', function() {
/* jshint camelcase: false */
window.oc_config = {
session_keepalive: false,
@@ -470,6 +472,7 @@ describe('Core base tests', function() {
var $navigation;
beforeEach(function() {
+ jQuery.fx.off = true;
clock = sinon.useFakeTimers();
$('#testArea').append('<div id="header">' +
'<a class="menutoggle header-appname-container" href="#">' +
@@ -482,6 +485,7 @@ describe('Core base tests', function() {
$navigation = $('#navigation');
});
afterEach(function() {
+ jQuery.fx.off = false;
clock.restore();
$(document).off('ajaxError');
});
@@ -491,7 +495,6 @@ describe('Core base tests', function() {
});
it('Clicking menu toggle toggles navigation in', function() {
window.initCore();
- $navigation.hide(); // normally done through media query triggered CSS
expect($navigation.is(':visible')).toEqual(false);
$toggle.click();
clock.tick(1 * 1000);
@@ -935,10 +938,13 @@ describe('Core base tests', function() {
});
describe('global ajax errors', function() {
var reloadStub, ajaxErrorStub, clock;
+ var notificationStub;
+ var waitTimeMs = 6000;
beforeEach(function() {
clock = sinon.useFakeTimers();
reloadStub = sinon.stub(OC, 'reload');
+ notificationStub = sinon.stub(OC.Notification, 'show');
// unstub the error processing method
ajaxErrorStub = OC._processAjaxError;
ajaxErrorStub.restore();
@@ -946,6 +952,7 @@ describe('Core base tests', function() {
});
afterEach(function() {
reloadStub.restore();
+ notificationStub.restore();
clock.restore();
});
@@ -970,7 +977,7 @@ describe('Core base tests', function() {
$(document).trigger(new $.Event('ajaxError'), xhr);
// trigger timers
- clock.tick(1000);
+ clock.tick(waitTimeMs);
if (expectedCall) {
expect(reloadStub.calledOnce).toEqual(true);
@@ -986,7 +993,7 @@ describe('Core base tests', function() {
$(document).trigger(new $.Event('ajaxError'), xhr);
// trigger timers
- clock.tick(1000);
+ clock.tick(waitTimeMs);
expect(reloadStub.calledOnce).toEqual(true);
});
@@ -997,9 +1004,17 @@ describe('Core base tests', function() {
$(document).trigger(new $.Event('ajaxError'), xhr);
- clock.tick(1000);
+ clock.tick(waitTimeMs);
expect(reloadStub.notCalled).toEqual(true);
});
+ it('displays notification', function() {
+ var xhr = { status: 401 };
+
+ $(document).trigger(new $.Event('ajaxError'), xhr);
+
+ clock.tick(waitTimeMs);
+ expect(notificationStub.calledOnce).toEqual(true);
+ });
});
});
diff --git a/core/js/tests/specs/setupchecksSpec.js b/core/js/tests/specs/setupchecksSpec.js
index 6dd8657a077..4931ca990da 100644
--- a/core/js/tests/specs/setupchecksSpec.js
+++ b/core/js/tests/specs/setupchecksSpec.js
@@ -542,7 +542,7 @@ describe('OC.SetupChecks tests', function() {
async.done(function( data, s, x ){
expect(data).toEqual([{
- msg: 'The "Strict-Transport-Security" HTTP header is not configured to at least "15768000" seconds. For enhanced security we recommend enabling HSTS as described in our <a href="#admin-tips" rel="noreferrer">security tips</a>.',
+ msg: 'The "Strict-Transport-Security" HTTP header is not configured to at least "15552000" seconds. For enhanced security we recommend enabling HSTS as described in our <a href="#admin-tips" rel="noreferrer">security tips</a>.',
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
}]);
done();
@@ -555,7 +555,7 @@ describe('OC.SetupChecks tests', function() {
suite.server.requests[0].respond(200,
{
- 'Strict-Transport-Security': 'max-age=15767999',
+ 'Strict-Transport-Security': 'max-age=15551999',
'X-XSS-Protection': '1; mode=block',
'X-Content-Type-Options': 'nosniff',
'X-Robots-Tag': 'none',
@@ -567,7 +567,7 @@ describe('OC.SetupChecks tests', function() {
async.done(function( data, s, x ){
expect(data).toEqual([{
- msg: 'The "Strict-Transport-Security" HTTP header is not configured to at least "15768000" seconds. For enhanced security we recommend enabling HSTS as described in our <a href="#admin-tips" rel="noreferrer">security tips</a>.',
+ msg: 'The "Strict-Transport-Security" HTTP header is not configured to at least "15552000" seconds. For enhanced security we recommend enabling HSTS as described in our <a href="#admin-tips" rel="noreferrer">security tips</a>.',
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
}]);
done();
@@ -592,7 +592,7 @@ describe('OC.SetupChecks tests', function() {
async.done(function( data, s, x ){
expect(data).toEqual([{
- msg: 'The "Strict-Transport-Security" HTTP header is not configured to at least "15768000" seconds. For enhanced security we recommend enabling HSTS as described in our <a href="#admin-tips" rel="noreferrer">security tips</a>.',
+ msg: 'The "Strict-Transport-Security" HTTP header is not configured to at least "15552000" seconds. For enhanced security we recommend enabling HSTS as described in our <a href="#admin-tips" rel="noreferrer">security tips</a>.',
type: OC.SetupChecks.MESSAGE_TYPE_WARNING
}]);
done();
diff --git a/core/l10n/af_ZA.js b/core/l10n/af_ZA.js
index 6df3f73078b..33fa93394a3 100644
--- a/core/l10n/af_ZA.js
+++ b/core/l10n/af_ZA.js
@@ -64,13 +64,13 @@ OC.L10N.register(
"Error setting expiration date" : "Fout met opstel van verval datum",
"Set expiration date" : "Stel verval datum",
"Expiration date" : "Verval datum",
- "Sending ..." : "Stuur ...",
- "Email sent" : "E-pos gestuur",
"Resharing is not allowed" : "Herdeling is nie toegelaat nie ",
"Password protect" : "Beskerm met Wagwoord",
"Password" : "Wagwoord",
"Email link to person" : "E-pos aan persoon",
"Send" : "Stuur",
+ "Sending ..." : "Stuur ...",
+ "Email sent" : "E-pos gestuur",
"Shared with you and the group {group} by {owner}" : "Met jou en die groep {group} gedeel deur {owner}",
"Shared with you by {owner}" : "Met jou gedeel deur {owner}",
"group" : "groep",
diff --git a/core/l10n/af_ZA.json b/core/l10n/af_ZA.json
index f43703ab3f9..a22c1480a65 100644
--- a/core/l10n/af_ZA.json
+++ b/core/l10n/af_ZA.json
@@ -62,13 +62,13 @@
"Error setting expiration date" : "Fout met opstel van verval datum",
"Set expiration date" : "Stel verval datum",
"Expiration date" : "Verval datum",
- "Sending ..." : "Stuur ...",
- "Email sent" : "E-pos gestuur",
"Resharing is not allowed" : "Herdeling is nie toegelaat nie ",
"Password protect" : "Beskerm met Wagwoord",
"Password" : "Wagwoord",
"Email link to person" : "E-pos aan persoon",
"Send" : "Stuur",
+ "Sending ..." : "Stuur ...",
+ "Email sent" : "E-pos gestuur",
"Shared with you and the group {group} by {owner}" : "Met jou en die groep {group} gedeel deur {owner}",
"Shared with you by {owner}" : "Met jou gedeel deur {owner}",
"group" : "groep",
diff --git a/core/l10n/ar.js b/core/l10n/ar.js
index 6ef54aca7ad..4a7e4f059f1 100644
--- a/core/l10n/ar.js
+++ b/core/l10n/ar.js
@@ -75,8 +75,6 @@ OC.L10N.register(
"Expiration" : "إنتهاء",
"Expiration date" : "تاريخ إنتهاء الصلاحية",
"Choose a password for the public link" : "اختر كلمة مرور للرابط العام",
- "Sending ..." : "جاري الارسال ...",
- "Email sent" : "تم ارسال البريد الالكتروني",
"Resharing is not allowed" : "لا يسمح بعملية إعادة المشاركة",
"Share link" : "شارك الرابط",
"Link" : "الرابط",
@@ -85,6 +83,8 @@ OC.L10N.register(
"Allow editing" : "السماح بالتعديلات",
"Email link to person" : "ارسل الرابط بالبريد الى صديق",
"Send" : "أرسل",
+ "Sending ..." : "جاري الارسال ...",
+ "Email sent" : "تم ارسال البريد الالكتروني",
"Shared with you and the group {group} by {owner}" : "شورك معك ومع المجموعة {group} من قبل {owner}",
"Shared with you by {owner}" : "شورك معك من قبل {owner}",
"group" : "مجموعة",
diff --git a/core/l10n/ar.json b/core/l10n/ar.json
index a9ceb76aeb0..e92d5ef8c30 100644
--- a/core/l10n/ar.json
+++ b/core/l10n/ar.json
@@ -73,8 +73,6 @@
"Expiration" : "إنتهاء",
"Expiration date" : "تاريخ إنتهاء الصلاحية",
"Choose a password for the public link" : "اختر كلمة مرور للرابط العام",
- "Sending ..." : "جاري الارسال ...",
- "Email sent" : "تم ارسال البريد الالكتروني",
"Resharing is not allowed" : "لا يسمح بعملية إعادة المشاركة",
"Share link" : "شارك الرابط",
"Link" : "الرابط",
@@ -83,6 +81,8 @@
"Allow editing" : "السماح بالتعديلات",
"Email link to person" : "ارسل الرابط بالبريد الى صديق",
"Send" : "أرسل",
+ "Sending ..." : "جاري الارسال ...",
+ "Email sent" : "تم ارسال البريد الالكتروني",
"Shared with you and the group {group} by {owner}" : "شورك معك ومع المجموعة {group} من قبل {owner}",
"Shared with you by {owner}" : "شورك معك من قبل {owner}",
"group" : "مجموعة",
diff --git a/core/l10n/ast.js b/core/l10n/ast.js
index c7a0f566f07..9cbd176e5e5 100644
--- a/core/l10n/ast.js
+++ b/core/l10n/ast.js
@@ -103,8 +103,6 @@ OC.L10N.register(
"Expiration" : "Caducidá",
"Expiration date" : "Data de caducidá",
"Choose a password for the public link" : "Escueyi una contraseña pal enllaz públicu",
- "Sending ..." : "Unviando ...",
- "Email sent" : "Corréu unviáu",
"Resharing is not allowed" : "Recompartir nun ta permitíu",
"Share link" : "Compartir enllaz",
"Link" : "Enllaz",
@@ -113,6 +111,8 @@ OC.L10N.register(
"Allow editing" : "Permitir edición",
"Email link to person" : "Enllaz de corréu-e a la persona",
"Send" : "Unviar",
+ "Sending ..." : "Unviando ...",
+ "Email sent" : "Corréu unviáu",
"Shared with you and the group {group} by {owner}" : "Compartíu contigo y col grupu {group} por {owner}",
"Shared with you by {owner}" : "Compartíu contigo por {owner}",
"group" : "grupu",
diff --git a/core/l10n/ast.json b/core/l10n/ast.json
index 8ac9feca564..123201074a7 100644
--- a/core/l10n/ast.json
+++ b/core/l10n/ast.json
@@ -101,8 +101,6 @@
"Expiration" : "Caducidá",
"Expiration date" : "Data de caducidá",
"Choose a password for the public link" : "Escueyi una contraseña pal enllaz públicu",
- "Sending ..." : "Unviando ...",
- "Email sent" : "Corréu unviáu",
"Resharing is not allowed" : "Recompartir nun ta permitíu",
"Share link" : "Compartir enllaz",
"Link" : "Enllaz",
@@ -111,6 +109,8 @@
"Allow editing" : "Permitir edición",
"Email link to person" : "Enllaz de corréu-e a la persona",
"Send" : "Unviar",
+ "Sending ..." : "Unviando ...",
+ "Email sent" : "Corréu unviáu",
"Shared with you and the group {group} by {owner}" : "Compartíu contigo y col grupu {group} por {owner}",
"Shared with you by {owner}" : "Compartíu contigo por {owner}",
"group" : "grupu",
diff --git a/core/l10n/az.js b/core/l10n/az.js
index 7f3d1731116..9db5ae4cbbd 100644
--- a/core/l10n/az.js
+++ b/core/l10n/az.js
@@ -62,10 +62,10 @@ OC.L10N.register(
"Strong password" : "Çətin şifrə",
"Error" : "Səhv",
"Expiration" : "Vaxtın bitməsi",
- "Email sent" : "Məktub göndərildi",
"Share link" : "Linki yayımla",
"Password" : "Şifrə",
"Send" : "Göndər",
+ "Email sent" : "Məktub göndərildi",
"group" : "qrup",
"Unshare" : "Paylaşımı durdur",
"can share" : "yayımlaya bilərsiniz",
diff --git a/core/l10n/az.json b/core/l10n/az.json
index 80d218c5396..b3c3c113bc4 100644
--- a/core/l10n/az.json
+++ b/core/l10n/az.json
@@ -60,10 +60,10 @@
"Strong password" : "Çətin şifrə",
"Error" : "Səhv",
"Expiration" : "Vaxtın bitməsi",
- "Email sent" : "Məktub göndərildi",
"Share link" : "Linki yayımla",
"Password" : "Şifrə",
"Send" : "Göndər",
+ "Email sent" : "Məktub göndərildi",
"group" : "qrup",
"Unshare" : "Paylaşımı durdur",
"can share" : "yayımlaya bilərsiniz",
diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js
index 00f7d00ba6b..db1a0601a95 100644
--- a/core/l10n/bg_BG.js
+++ b/core/l10n/bg_BG.js
@@ -111,8 +111,6 @@ OC.L10N.register(
"Expiration" : "Изтичане",
"Expiration date" : "Дата на изтичане",
"Choose a password for the public link" : "Изберете парола за общодостъпната връзка",
- "Sending ..." : "Изпращане ...",
- "Email sent" : "Електронната поща е изпратена",
"Resharing is not allowed" : "Повторно споделяне не е разрешено.",
"Share link" : "Връзка за споделяне",
"Link" : "Връзка",
@@ -121,6 +119,8 @@ OC.L10N.register(
"Allow editing" : "Позволяване на редактиране",
"Email link to person" : "Имейл връзка към човек",
"Send" : "Изпращане",
+ "Sending ..." : "Изпращане ...",
+ "Email sent" : "Електронната поща е изпратена",
"Shared with you and the group {group} by {owner}" : "Споделено от {owner} с Вас и групата {group} .",
"Shared with you by {owner}" : "Споделено с Вас от {owner}.",
"group" : "група",
diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json
index e5debe80699..b1f1759152f 100644
--- a/core/l10n/bg_BG.json
+++ b/core/l10n/bg_BG.json
@@ -109,8 +109,6 @@
"Expiration" : "Изтичане",
"Expiration date" : "Дата на изтичане",
"Choose a password for the public link" : "Изберете парола за общодостъпната връзка",
- "Sending ..." : "Изпращане ...",
- "Email sent" : "Електронната поща е изпратена",
"Resharing is not allowed" : "Повторно споделяне не е разрешено.",
"Share link" : "Връзка за споделяне",
"Link" : "Връзка",
@@ -119,6 +117,8 @@
"Allow editing" : "Позволяване на редактиране",
"Email link to person" : "Имейл връзка към човек",
"Send" : "Изпращане",
+ "Sending ..." : "Изпращане ...",
+ "Email sent" : "Електронната поща е изпратена",
"Shared with you and the group {group} by {owner}" : "Споделено от {owner} с Вас и групата {group} .",
"Shared with you by {owner}" : "Споделено с Вас от {owner}.",
"group" : "група",
diff --git a/core/l10n/bn_BD.js b/core/l10n/bn_BD.js
index a2bfeeebc24..d6a2ab7c74d 100644
--- a/core/l10n/bn_BD.js
+++ b/core/l10n/bn_BD.js
@@ -72,14 +72,14 @@ OC.L10N.register(
"Error setting expiration date" : "মেয়াদোত্তীর্ণ হওয়ার তারিখ নির্ধারণ করতে সমস্যা দেখা দিয়েছে",
"Set expiration date" : "মেয়াদোত্তীর্ণ হওয়ার তারিখ নির্ধারণ করুন",
"Expiration date" : "মেয়াদোত্তীর্ণ হওয়ার তারিখ",
- "Sending ..." : "পাঠানো হচ্ছে......",
- "Email sent" : "ই-মেইল পাঠানো হয়েছে",
"Resharing is not allowed" : "পূনঃরায় ভাগাভাগি অনুমোদিত নয়",
"Share link" : "লিংক ভাগাভাগি করেন",
"Password protect" : "কূটশব্দ সুরক্ষিত",
"Password" : "কূটশব্দ",
"Email link to person" : "ব্যক্তির সাথে ই-মেইল যুক্ত কর",
"Send" : "পাঠাও",
+ "Sending ..." : "পাঠানো হচ্ছে......",
+ "Email sent" : "ই-মেইল পাঠানো হয়েছে",
"Shared with you and the group {group} by {owner}" : "{owner} আপনার এবং {group} গোষ্ঠীর সাথে ভাগাভাগি করেছেন",
"Shared with you by {owner}" : "{owner} আপনার সাথে ভাগাভাগি করেছেন",
"group" : "দল",
diff --git a/core/l10n/bn_BD.json b/core/l10n/bn_BD.json
index 7eff82b0833..fd50f12db7d 100644
--- a/core/l10n/bn_BD.json
+++ b/core/l10n/bn_BD.json
@@ -70,14 +70,14 @@
"Error setting expiration date" : "মেয়াদোত্তীর্ণ হওয়ার তারিখ নির্ধারণ করতে সমস্যা দেখা দিয়েছে",
"Set expiration date" : "মেয়াদোত্তীর্ণ হওয়ার তারিখ নির্ধারণ করুন",
"Expiration date" : "মেয়াদোত্তীর্ণ হওয়ার তারিখ",
- "Sending ..." : "পাঠানো হচ্ছে......",
- "Email sent" : "ই-মেইল পাঠানো হয়েছে",
"Resharing is not allowed" : "পূনঃরায় ভাগাভাগি অনুমোদিত নয়",
"Share link" : "লিংক ভাগাভাগি করেন",
"Password protect" : "কূটশব্দ সুরক্ষিত",
"Password" : "কূটশব্দ",
"Email link to person" : "ব্যক্তির সাথে ই-মেইল যুক্ত কর",
"Send" : "পাঠাও",
+ "Sending ..." : "পাঠানো হচ্ছে......",
+ "Email sent" : "ই-মেইল পাঠানো হয়েছে",
"Shared with you and the group {group} by {owner}" : "{owner} আপনার এবং {group} গোষ্ঠীর সাথে ভাগাভাগি করেছেন",
"Shared with you by {owner}" : "{owner} আপনার সাথে ভাগাভাগি করেছেন",
"group" : "দল",
diff --git a/core/l10n/bs.js b/core/l10n/bs.js
index 0ba85de64db..65e1ad654b0 100644
--- a/core/l10n/bs.js
+++ b/core/l10n/bs.js
@@ -101,8 +101,6 @@ OC.L10N.register(
"Expiration" : "Istek",
"Expiration date" : "Datum isteka",
"Choose a password for the public link" : "Izaberite lozinku za javnu vezu",
- "Sending ..." : "Slanje...",
- "Email sent" : "E-pošta poslana",
"Resharing is not allowed" : "Ponovno dijeljenje nije dopušteno",
"Share link" : "Podijelite vezu",
"Link" : "Veza",
@@ -111,6 +109,8 @@ OC.L10N.register(
"Allow editing" : "Dozvolite izmjenu",
"Email link to person" : "Pošaljite osobi vezu e-poštom",
"Send" : "Pošalji",
+ "Sending ..." : "Slanje...",
+ "Email sent" : "E-pošta poslana",
"Shared with you and the group {group} by {owner}" : "Dijeljeno s vama i grupom {group} vlasnika {owner}",
"Shared with you by {owner}" : "Podijeljeno sa vama od {owner}",
"group" : "grupa",
diff --git a/core/l10n/bs.json b/core/l10n/bs.json
index 96f23f07859..d91ac7ecd58 100644
--- a/core/l10n/bs.json
+++ b/core/l10n/bs.json
@@ -99,8 +99,6 @@
"Expiration" : "Istek",
"Expiration date" : "Datum isteka",
"Choose a password for the public link" : "Izaberite lozinku za javnu vezu",
- "Sending ..." : "Slanje...",
- "Email sent" : "E-pošta poslana",
"Resharing is not allowed" : "Ponovno dijeljenje nije dopušteno",
"Share link" : "Podijelite vezu",
"Link" : "Veza",
@@ -109,6 +107,8 @@
"Allow editing" : "Dozvolite izmjenu",
"Email link to person" : "Pošaljite osobi vezu e-poštom",
"Send" : "Pošalji",
+ "Sending ..." : "Slanje...",
+ "Email sent" : "E-pošta poslana",
"Shared with you and the group {group} by {owner}" : "Dijeljeno s vama i grupom {group} vlasnika {owner}",
"Shared with you by {owner}" : "Podijeljeno sa vama od {owner}",
"group" : "grupa",
diff --git a/core/l10n/ca.js b/core/l10n/ca.js
index 63372865b90..0290a8fb318 100644
--- a/core/l10n/ca.js
+++ b/core/l10n/ca.js
@@ -126,8 +126,6 @@ OC.L10N.register(
"Expiration" : "Expiració",
"Expiration date" : "Data de venciment",
"Choose a password for the public link" : "Escolliu una contrasenya per l'enllaç públic",
- "Sending ..." : "Enviant...",
- "Email sent" : "El correu electrónic s'ha enviat",
"Resharing is not allowed" : "No es permet compartir de nou",
"Share link" : "Enllaç de compartició",
"Link" : "Enllaç",
@@ -136,6 +134,8 @@ OC.L10N.register(
"Allow editing" : "Permetre edició",
"Email link to person" : "Enllaç per correu electrónic amb la persona",
"Send" : "Envia",
+ "Sending ..." : "Enviant...",
+ "Email sent" : "El correu electrónic s'ha enviat",
"Shared with you and the group {group} by {owner}" : "Compartit amb vos i amb el grup {group} per {owner}",
"Shared with you by {owner}" : "Compartit amb vos per {owner}",
"group" : "grup",
diff --git a/core/l10n/ca.json b/core/l10n/ca.json
index fdfb49231a8..3cc62e36222 100644
--- a/core/l10n/ca.json
+++ b/core/l10n/ca.json
@@ -124,8 +124,6 @@
"Expiration" : "Expiració",
"Expiration date" : "Data de venciment",
"Choose a password for the public link" : "Escolliu una contrasenya per l'enllaç públic",
- "Sending ..." : "Enviant...",
- "Email sent" : "El correu electrónic s'ha enviat",
"Resharing is not allowed" : "No es permet compartir de nou",
"Share link" : "Enllaç de compartició",
"Link" : "Enllaç",
@@ -134,6 +132,8 @@
"Allow editing" : "Permetre edició",
"Email link to person" : "Enllaç per correu electrónic amb la persona",
"Send" : "Envia",
+ "Sending ..." : "Enviant...",
+ "Email sent" : "El correu electrónic s'ha enviat",
"Shared with you and the group {group} by {owner}" : "Compartit amb vos i amb el grup {group} per {owner}",
"Shared with you by {owner}" : "Compartit amb vos per {owner}",
"group" : "grup",
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index a627b824251..43434b2f012 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -152,8 +152,6 @@ OC.L10N.register(
"Expiration" : "Konec platnosti",
"Expiration date" : "Datum vypršení platnosti",
"Choose a password for the public link" : "Zadej heslo pro tento veřejný odkaz",
- "Sending ..." : "Odesílám ...",
- "Email sent" : "Email odeslán",
"Resharing is not allowed" : "Sdílení již sdílené položky není povoleno",
"Share link" : "Sdílet odkaz",
"Link" : "Odkaz",
@@ -162,6 +160,9 @@ OC.L10N.register(
"Allow editing" : "Povolit úpravy",
"Email link to person" : "Odeslat osobě odkaz emailem",
"Send" : "Odeslat",
+ "Sending ..." : "Odesílám ...",
+ "Email sent" : "Email odeslán",
+ "Send link via email" : "Odeslat odkaz přes email",
"Shared with you and the group {group} by {owner}" : "S Vámi a skupinou {group} sdílí {owner}",
"Shared with you by {owner}" : "S Vámi sdílí {owner}",
"group" : "skupina",
@@ -178,6 +179,7 @@ OC.L10N.register(
"Share details could not be loaded for this item." : "Detaily sdílení pro tuto položku nelze načíst.",
"No users or groups found for {search}" : "Nebyli nalezeni žádní členové ani skupiny pro {search}",
"No users found for {search}" : "Nebyli nalezeni žádní uživatelé pro {search}",
+ "An error occurred. Please try again" : "Došlo k chybě. Zkuste to prosím znovu",
"{sharee} (group)" : "{sharee} (skupina)",
"{sharee} (at {server})" : "{sharee} (na {server})",
"{sharee} (remote)" : "{sharee} (vzdálený)",
@@ -211,6 +213,7 @@ OC.L10N.register(
"new" : "nový",
"_download %n file_::_download %n files_" : ["stáhnout %n soubor","stáhnout %n soubory","stáhnout %n souborů"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Probíhá aktualizace, opuštění této stránky může v některých prostředích přerušit proces.",
+ "Updating to {version}" : "Aktualizace na {version}",
"An error occurred." : "Došlo k chybě.",
"Please reload the page." : "Načtěte stránku znovu, prosím.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Aktualizace nebyla úspěšná. Pro více informací si <a href=\"{url}\">přečtěte komentáře ve fóru</a> pojednávající o tomto problému.",
@@ -275,6 +278,7 @@ OC.L10N.register(
"Search" : "Hledat",
"Server side authentication failed!" : "Autentizace na serveru selhala!",
"Please contact your administrator." : "Kontaktujte prosím svého správce systému.",
+ "An internal error occurred." : "Nastala vnitřní chyba.",
"Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.",
"Log in" : "Přihlásit",
"Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?",
@@ -302,6 +306,8 @@ OC.L10N.register(
"Start update" : "Spustit aktualizaci",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Abyste zabránili vypršení časového limitu u větších instalací, můžete namísto toho spustit následující příkaz v hlavním adresáři:",
"Detailed logs" : "Podrobné logy",
+ "Update needed" : "Potřeba aktualizace",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Pro pomoc, shlédněte <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaci</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Tato instalace %s je právě ve stavu údržby a to může chvíli trvat.",
"This page will refresh itself when the %s instance is available again." : "Tato stránka se automaticky načte poté, co bude opět dostupná instance %s."
},
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index a49a955dbbf..1a79aeb53ea 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -150,8 +150,6 @@
"Expiration" : "Konec platnosti",
"Expiration date" : "Datum vypršení platnosti",
"Choose a password for the public link" : "Zadej heslo pro tento veřejný odkaz",
- "Sending ..." : "Odesílám ...",
- "Email sent" : "Email odeslán",
"Resharing is not allowed" : "Sdílení již sdílené položky není povoleno",
"Share link" : "Sdílet odkaz",
"Link" : "Odkaz",
@@ -160,6 +158,9 @@
"Allow editing" : "Povolit úpravy",
"Email link to person" : "Odeslat osobě odkaz emailem",
"Send" : "Odeslat",
+ "Sending ..." : "Odesílám ...",
+ "Email sent" : "Email odeslán",
+ "Send link via email" : "Odeslat odkaz přes email",
"Shared with you and the group {group} by {owner}" : "S Vámi a skupinou {group} sdílí {owner}",
"Shared with you by {owner}" : "S Vámi sdílí {owner}",
"group" : "skupina",
@@ -176,6 +177,7 @@
"Share details could not be loaded for this item." : "Detaily sdílení pro tuto položku nelze načíst.",
"No users or groups found for {search}" : "Nebyli nalezeni žádní členové ani skupiny pro {search}",
"No users found for {search}" : "Nebyli nalezeni žádní uživatelé pro {search}",
+ "An error occurred. Please try again" : "Došlo k chybě. Zkuste to prosím znovu",
"{sharee} (group)" : "{sharee} (skupina)",
"{sharee} (at {server})" : "{sharee} (na {server})",
"{sharee} (remote)" : "{sharee} (vzdálený)",
@@ -209,6 +211,7 @@
"new" : "nový",
"_download %n file_::_download %n files_" : ["stáhnout %n soubor","stáhnout %n soubory","stáhnout %n souborů"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Probíhá aktualizace, opuštění této stránky může v některých prostředích přerušit proces.",
+ "Updating to {version}" : "Aktualizace na {version}",
"An error occurred." : "Došlo k chybě.",
"Please reload the page." : "Načtěte stránku znovu, prosím.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Aktualizace nebyla úspěšná. Pro více informací si <a href=\"{url}\">přečtěte komentáře ve fóru</a> pojednávající o tomto problému.",
@@ -273,6 +276,7 @@
"Search" : "Hledat",
"Server side authentication failed!" : "Autentizace na serveru selhala!",
"Please contact your administrator." : "Kontaktujte prosím svého správce systému.",
+ "An internal error occurred." : "Nastala vnitřní chyba.",
"Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.",
"Log in" : "Přihlásit",
"Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?",
@@ -300,6 +304,8 @@
"Start update" : "Spustit aktualizaci",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Abyste zabránili vypršení časového limitu u větších instalací, můžete namísto toho spustit následující příkaz v hlavním adresáři:",
"Detailed logs" : "Podrobné logy",
+ "Update needed" : "Potřeba aktualizace",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Pro pomoc, shlédněte <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentaci</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Tato instalace %s je právě ve stavu údržby a to může chvíli trvat.",
"This page will refresh itself when the %s instance is available again." : "Tato stránka se automaticky načte poté, co bude opět dostupná instance %s."
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
diff --git a/core/l10n/cy_GB.js b/core/l10n/cy_GB.js
index d8fdf1ce707..cad7e66ed0d 100644
--- a/core/l10n/cy_GB.js
+++ b/core/l10n/cy_GB.js
@@ -54,13 +54,13 @@ OC.L10N.register(
"Error setting expiration date" : "Gwall wrth osod dyddiad dod i ben",
"Set expiration date" : "Gosod dyddiad dod i ben",
"Expiration date" : "Dyddiad dod i ben",
- "Sending ..." : "Yn anfon ...",
- "Email sent" : "Anfonwyd yr e-bost",
"Resharing is not allowed" : "Does dim hawl ail-rannu",
"Password protect" : "Diogelu cyfrinair",
"Password" : "Cyfrinair",
"Email link to person" : "E-bostio dolen at berson",
"Send" : "Anfon",
+ "Sending ..." : "Yn anfon ...",
+ "Email sent" : "Anfonwyd yr e-bost",
"Shared with you and the group {group} by {owner}" : "Rhannwyd â chi a'r grŵp {group} gan {owner}",
"Shared with you by {owner}" : "Rhannwyd â chi gan {owner}",
"group" : "grŵp",
diff --git a/core/l10n/cy_GB.json b/core/l10n/cy_GB.json
index 50274c6d05f..964755b2bd1 100644
--- a/core/l10n/cy_GB.json
+++ b/core/l10n/cy_GB.json
@@ -52,13 +52,13 @@
"Error setting expiration date" : "Gwall wrth osod dyddiad dod i ben",
"Set expiration date" : "Gosod dyddiad dod i ben",
"Expiration date" : "Dyddiad dod i ben",
- "Sending ..." : "Yn anfon ...",
- "Email sent" : "Anfonwyd yr e-bost",
"Resharing is not allowed" : "Does dim hawl ail-rannu",
"Password protect" : "Diogelu cyfrinair",
"Password" : "Cyfrinair",
"Email link to person" : "E-bostio dolen at berson",
"Send" : "Anfon",
+ "Sending ..." : "Yn anfon ...",
+ "Email sent" : "Anfonwyd yr e-bost",
"Shared with you and the group {group} by {owner}" : "Rhannwyd â chi a'r grŵp {group} gan {owner}",
"Shared with you by {owner}" : "Rhannwyd â chi gan {owner}",
"group" : "grŵp",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index 929c979b323..6bbd72f3922 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -141,8 +141,6 @@ OC.L10N.register(
"Expiration" : "Udløb",
"Expiration date" : "Udløbsdato",
"Choose a password for the public link" : "Vælg et kodeord til det offentlige link",
- "Sending ..." : "Sender ...",
- "Email sent" : "E-mail afsendt",
"Resharing is not allowed" : "Videredeling ikke tilladt",
"Share link" : "Del link",
"Link" : "Link",
@@ -151,6 +149,8 @@ OC.L10N.register(
"Allow editing" : "Tillad redigering",
"Email link to person" : "E-mail link til person",
"Send" : "Send",
+ "Sending ..." : "Sender ...",
+ "Email sent" : "E-mail afsendt",
"Shared with you and the group {group} by {owner}" : "Delt med dig og gruppen {group} af {owner}",
"Shared with you by {owner}" : "Delt med dig af {owner}",
"group" : "gruppe",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index c4788ea8862..a70047077e3 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -139,8 +139,6 @@
"Expiration" : "Udløb",
"Expiration date" : "Udløbsdato",
"Choose a password for the public link" : "Vælg et kodeord til det offentlige link",
- "Sending ..." : "Sender ...",
- "Email sent" : "E-mail afsendt",
"Resharing is not allowed" : "Videredeling ikke tilladt",
"Share link" : "Del link",
"Link" : "Link",
@@ -149,6 +147,8 @@
"Allow editing" : "Tillad redigering",
"Email link to person" : "E-mail link til person",
"Send" : "Send",
+ "Sending ..." : "Sender ...",
+ "Email sent" : "E-mail afsendt",
"Shared with you and the group {group} by {owner}" : "Delt med dig og gruppen {group} af {owner}",
"Shared with you by {owner}" : "Delt med dig af {owner}",
"group" : "gruppe",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 73a24c5ae27..e3936c3a03a 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -27,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Fehler beim Entfernen aus den Favoriten",
"Couldn't send mail to following users: %s " : "Die E-Mail konnte nicht an folgende Benutzer gesendet werden: %s",
"Preparing update" : "Update vorbereiten",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Da automatische Updates in der config.php deaktivert sind, nutze bitte den Updater über die Kommandozeile.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Überprüfe Tabelle %s",
"Turned on maintenance mode" : "Wartungsmodus eingeschaltet",
@@ -97,6 +98,7 @@ OC.L10N.register(
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme mit dem Code - Integritätsprüfung. Mehr Informationen…</a>",
"Settings" : "Einstellungen",
+ "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden nochmals geladen",
"Saving..." : "Speichern…",
"Dismiss" : "Ausblenden",
"seconds ago" : "Gerade eben",
@@ -152,8 +154,6 @@ OC.L10N.register(
"Expiration" : "Ablaufdatum",
"Expiration date" : "Ablaufdatum",
"Choose a password for the public link" : "Wählen Sie ein Passwort für den öffentlichen Link",
- "Sending ..." : "Senden…",
- "Email sent" : "E-Mail wurde verschickt",
"Resharing is not allowed" : "Weiterverteilen ist nicht erlaubt",
"Share link" : "Link teilen",
"Link" : "Link",
@@ -162,6 +162,9 @@ OC.L10N.register(
"Allow editing" : "Bearbeitung erlauben",
"Email link to person" : "Link per E-Mail verschicken",
"Send" : "Senden",
+ "Sending ..." : "Senden…",
+ "Email sent" : "E-Mail wurde verschickt",
+ "Send link via email" : "Link als E-Mail verschicken",
"Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Dir und der Gruppe {group} geteilt",
"Shared with you by {owner}" : "{owner} hat dies mit Dir geteilt",
"group" : "Gruppe",
@@ -305,6 +308,9 @@ OC.L10N.register(
"Start update" : "Aktualisierung starten",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Zur Vermeidung von Zeitüberschreitungen bei größeren Installationen kannst Du stattdessen den folgenden Befehl in Deinem Installationsverzeichnis ausführen:",
"Detailed logs" : "Detaillierte Fehlermeldungen",
+ "Update needed" : "Update wird benötigt",
+ "Please use the command line updater because you have a big instance." : "Da du eine große Instanz von Owncloud besitzt, nutze bitte den Updater über die Kommandozeile.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Für weitere Hilfen, schaue bitte in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Diese %s-Instanz befindet sich gerade im Wartungsmodus, was eine Weile dauern kann.",
"This page will refresh itself when the %s instance is available again." : "Diese Seite aktualisiert sich automatisch, wenn die %s-Instanz wieder verfügbar ist."
},
diff --git a/core/l10n/de.json b/core/l10n/de.json
index 4007413cc1a..4e4cc5e682f 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -25,6 +25,7 @@
"Error unfavoriting" : "Fehler beim Entfernen aus den Favoriten",
"Couldn't send mail to following users: %s " : "Die E-Mail konnte nicht an folgende Benutzer gesendet werden: %s",
"Preparing update" : "Update vorbereiten",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Da automatische Updates in der config.php deaktivert sind, nutze bitte den Updater über die Kommandozeile.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Überprüfe Tabelle %s",
"Turned on maintenance mode" : "Wartungsmodus eingeschaltet",
@@ -95,6 +96,7 @@
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme mit dem Code - Integritätsprüfung. Mehr Informationen…</a>",
"Settings" : "Einstellungen",
+ "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden nochmals geladen",
"Saving..." : "Speichern…",
"Dismiss" : "Ausblenden",
"seconds ago" : "Gerade eben",
@@ -150,8 +152,6 @@
"Expiration" : "Ablaufdatum",
"Expiration date" : "Ablaufdatum",
"Choose a password for the public link" : "Wählen Sie ein Passwort für den öffentlichen Link",
- "Sending ..." : "Senden…",
- "Email sent" : "E-Mail wurde verschickt",
"Resharing is not allowed" : "Weiterverteilen ist nicht erlaubt",
"Share link" : "Link teilen",
"Link" : "Link",
@@ -160,6 +160,9 @@
"Allow editing" : "Bearbeitung erlauben",
"Email link to person" : "Link per E-Mail verschicken",
"Send" : "Senden",
+ "Sending ..." : "Senden…",
+ "Email sent" : "E-Mail wurde verschickt",
+ "Send link via email" : "Link als E-Mail verschicken",
"Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Dir und der Gruppe {group} geteilt",
"Shared with you by {owner}" : "{owner} hat dies mit Dir geteilt",
"group" : "Gruppe",
@@ -303,6 +306,9 @@
"Start update" : "Aktualisierung starten",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Zur Vermeidung von Zeitüberschreitungen bei größeren Installationen kannst Du stattdessen den folgenden Befehl in Deinem Installationsverzeichnis ausführen:",
"Detailed logs" : "Detaillierte Fehlermeldungen",
+ "Update needed" : "Update wird benötigt",
+ "Please use the command line updater because you have a big instance." : "Da du eine große Instanz von Owncloud besitzt, nutze bitte den Updater über die Kommandozeile.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Für weitere Hilfen, schaue bitte in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Diese %s-Instanz befindet sich gerade im Wartungsmodus, was eine Weile dauern kann.",
"This page will refresh itself when the %s instance is available again." : "Diese Seite aktualisiert sich automatisch, wenn die %s-Instanz wieder verfügbar ist."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/core/l10n/de_AT.js b/core/l10n/de_AT.js
index d0a5e054fca..756bc057121 100644
--- a/core/l10n/de_AT.js
+++ b/core/l10n/de_AT.js
@@ -1,6 +1,55 @@
OC.L10N.register(
"core",
{
+ "Please select a file." : "Bitte wähle eine Datei aus.",
+ "File is too big" : "Datei ist zu groß",
+ "Invalid file provided" : "Ungültige Datei zur Verfügung gestellt",
+ "No image or file provided" : "Es wurde weder ein Bild noch eine Datei zur Verfügung gestellt",
+ "Unknown filetype" : "Unbekannter Dateityp",
+ "Invalid image" : "Ungültiges Bild",
+ "An error occurred. Please contact your admin." : "Ein Fehler ist aufgetreten. Bitte kontaktiere den Administrator.",
+ "No temporary profile picture available, try again" : "Kein temporäres Profilbild verfügbar, bitte versuche es noch einmal",
+ "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt",
+ "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt",
+ "Crop is not square" : "Zuschnitt ist nicht quadratisch",
+ "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden",
+ "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist",
+ "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.",
+ "%s password reset" : "%s-Passwort zurücksetzen",
+ "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.",
+ "Error loading tags" : "Fehler beim Laden der Schlagwörter",
+ "Tag already exists" : "Schlagwort ist bereits vorhanden",
+ "Error deleting tag(s)" : "Fehler beim Löschen des Schlagwortes bzw. der Schlagwörter",
+ "Error tagging" : "Fehler beim Hinzufügen der Schlagwörter",
+ "Error untagging" : "Fehler beim Entfernen der Schlagwörter",
+ "Error favoriting" : "Fehler beim Favorisieren",
+ "Error unfavoriting" : "Fehler beim Entfernen aus den Favoriten",
+ "Couldn't send mail to following users: %s " : "Die E-Mail konnte nicht an folgende Benutzer gesendet werden: %s",
+ "Preparing update" : "Update vorbereiten",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Überprüfe Tabelle %s",
+ "Turned on maintenance mode" : "Wartungsmodus eingeschaltet",
+ "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet",
+ "Maintenance mode is kept active" : "Wartungsmodus bleibt aktiviert",
+ "Updating database schema" : "Datenbank-Schema wird upgedatet",
+ "Updated database" : "Datenbank aktualisiert",
+ "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Prüfen, ob das Datenbankschema aktualisiert werden kann (dies kann je nach Datenbankgröße sehr lange dauern)",
+ "Checked database schema update" : "Datenbankschema-Aktualisierung überprüft",
+ "Checking updates of apps" : "Es wird nach Updates für die Apps gesucht",
+ "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Prüfen, ob das Datenbankschema für %s aktualisiert werden kann (dies kann je nach Datenbankgröße sehr lange dauern)",
+ "Checked database schema update for apps" : "Datenbankschema-Aktualisierung für Apps überprüft",
+ "Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert",
+ "Repair warning: " : "Reparaturwarnung:",
+ "Repair error: " : "Reparaturfehler:",
+ "Set log level to debug" : "Log-Level auf \"debug\" gesetzt",
+ "Reset log level" : "Ursprüngliches Log-Level wiederhergestellt",
+ "Starting code integrity check" : "Code-Integrität wird überprüft",
+ "Finished code integrity check" : "Code-Integritätsprüfung abgeschlossen",
+ "%s (3rdparty)" : "%s (3rdparty)",
+ "%s (incompatible)" : "%s (nicht kompatibel)",
+ "Following apps have been disabled: %s" : "Die folgenden Apps sind deaktiviert worden: %s",
+ "Already up to date" : "Bereits aktuell",
"Sunday" : "Sonntag",
"Monday" : "Montag",
"Tuesday" : "Dienstag",
@@ -15,6 +64,13 @@ OC.L10N.register(
"Thu." : "Do",
"Fri." : "Fr",
"Sat." : "Sa",
+ "Su" : "So",
+ "Mo" : "Mo",
+ "Tu" : "Di",
+ "We" : "Mi",
+ "Th" : "Do",
+ "Fr" : "Fr",
+ "Sa" : "Sa",
"January" : "Januar",
"February" : "Februar",
"March" : "März",
@@ -39,25 +95,217 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme mit dem Code - Integritätsprüfung. Mehr Informationen…</a>",
"Settings" : "Einstellungen",
- "seconds ago" : "Sekunden zuvor",
+ "Saving..." : "Speichern…",
+ "Dismiss" : "Ausblenden",
+ "seconds ago" : "Gerade eben",
+ "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Deines Passworts ist an Deine E-Mail-Adresse versandt worden. Solltest Du ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfe bitte Deine Spam-Ordner.<br>Wenn er sich nicht darin befindet, frage bitte bei Deinem lokalen Administrator nach.",
+ "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Solltest Du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, Deine Daten zurückzuerhalten, nachdem Dein Passwort zurückgesetzt ist.<br />Falls Du Dir nicht sicher bist, was zu tun ist, kontaktiere bitte Deinen Administrator, bevor Du fortfährst.<br />Willst Du wirklich fortfahren?",
+ "I know what I'm doing" : "Ich weiß, was ich mache",
+ "Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktiere Deinen Administrator.",
"No" : "Nein",
"Yes" : "Ja",
+ "Choose" : "Auswählen",
+ "Error loading file picker template: {error}" : "Fehler beim Laden der Dateiauswahlvorlage: {error}",
+ "Ok" : "OK",
+ "Error loading message template: {error}" : "Fehler beim Laden der Nachrichtenvorlage: {error}",
+ "read-only" : "Schreibgeschützt",
+ "_{count} file conflict_::_{count} file conflicts_" : ["{count} Dateikonflikt","{count} Dateikonflikte"],
+ "One file conflict" : "Ein Dateikonflikt",
+ "New Files" : "Neue Dateien",
+ "Already existing files" : "Bereits existierende Dateien",
+ "Which files do you want to keep?" : "Welche Dateien möchtest Du behalten?",
+ "If you select both versions, the copied file will have a number added to its name." : "Wenn Du beide Versionen auswählst, erhält die kopierte Datei eine Zahl am Ende des Dateinamens.",
"Cancel" : "Abbrechen",
- "Continue" : "Weiter",
+ "Continue" : "Fortsetzen",
+ "(all selected)" : "(Alle ausgewählt)",
+ "({count} selected)" : "({count} ausgewählt)",
+ "Error loading file exists template" : "Fehler beim Laden der vorhanden Dateivorlage",
+ "Very weak password" : "Sehr schwaches Passwort",
+ "Weak password" : "Schwaches Passwort",
+ "So-so password" : "Durchschnittliches Passwort",
+ "Good password" : "Gutes Passwort",
+ "Strong password" : "Starkes Passwort",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Dein Webserver ist noch nicht hinreichend für Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Dein Web-Server ist nicht richtig eingerichtet um die folgende URL richtig aufzulösen \"{url}\". Weitere Informationen findest du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Du alle Funktionen nutzen möchtest.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfiguriere zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP hat keine Leserechte auf /dev/urandom wovon aus Sicherheitsgründen höchst abzuraten ist. Weitere Informationen sind in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a> zu finden.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Du verwendest im Moment PHP {version}. Wir empfehlen ein Upgrade deiner PHP Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP Gruppe bereitgestellt werden</a>, sobald diese deine Distribution diese unterstützt.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Die Header-Einstellungen des Reverse Proxy sind falsch, oder du versuchst, dich mit ownCloud von einem vertrauten Proxy aus zu verbinden. Solltest du ownCloud nicht von einem vertrauten Proxy aus benutzen wollen, dann stellt die momentane Situation ein Sicherheitsproblem da und erlaubt Hackern, eine für ownCloud sichtbare IP-Adresse zu nutzen. Weitere Informationen findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached ist als distributed cache konfiguriert aber das falsche PHP-Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nur \"memcached\" jedoch nicht \"memcache\". Schau in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki nach beiden Modulen</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Einige Dateien haben die Integritätsprüfung nicht bestanden. Weiterführende Information findest Du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien ...</a> / <a href=\"{rescanEndpoint}\">Erneut analysieren…</a>)",
+ "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Deinen Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Du es aus dem Document-Root-Verzeichnis des Webservers herausverschiebst.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Der \"Strict-Transport-Security\" HTTP-Header ist nicht auf mindestens \"{seconds}\" Sekunden eingestellt. Um die Sicherheit zu erhöhen, empfehlen wir das Aktivieren von HSTS, wie es in den <a href=\"{docUrl}\" rel=\"noreferrer\">Sicherheitshinweisen</a> erläutert ist.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du greifst auf diese Site über HTTP zu. Wir raten dringend dazu, Deinen Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.",
+ "Shared" : "Geteilt",
+ "Shared with {recipients}" : "Geteilt mit {recipients}",
"Error" : "Fehler",
+ "Error while sharing" : "Fehler beim Teilen",
+ "Error while unsharing" : "Fehler beim Aufheben der Freigabe",
+ "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums",
+ "The public link will expire no later than {days} days after it is created" : "Der öffentliche Link wird spätestens {days} Tage nach seiner Erstellung ablaufen",
+ "Set expiration date" : "Setze ein Ablaufdatum",
+ "Expiration" : "Ablaufdatum",
+ "Expiration date" : "Ablaufdatum",
+ "Choose a password for the public link" : "Wählen Sie ein Passwort für den öffentlichen Link",
+ "Resharing is not allowed" : "Weiterverteilen ist nicht erlaubt",
"Share link" : "Link teilen",
+ "Link" : "Link",
+ "Password protect" : "Passwortschutz",
"Password" : "Passwort",
+ "Allow editing" : "Bearbeitung erlauben",
+ "Email link to person" : "Link per E-Mail verschicken",
"Send" : "Senden",
+ "Sending ..." : "Senden…",
+ "Email sent" : "E-Mail wurde verschickt",
+ "Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Dir und der Gruppe {group} geteilt",
+ "Shared with you by {owner}" : "{owner} hat dies mit Dir geteilt",
"group" : "Gruppe",
- "Unshare" : "Teilung zurücknehmen",
- "can share" : "Kann teilen",
+ "remote" : "Entfernte Freigabe",
+ "notify by email" : "per E-Mail benachrichtigen",
+ "Unshare" : "Freigabe aufheben",
+ "can share" : "kann teilen",
"can edit" : "kann bearbeiten",
- "Share" : "Freigeben",
+ "create" : "erstellen",
+ "change" : "Ändern",
+ "delete" : "löschen",
+ "access control" : "Zugriffskontrolle",
+ "Could not unshare" : "Freigabe konnte nicht entfernt werden",
+ "Share details could not be loaded for this item." : "Details der geteilten Freigabe konnten nicht geladen werden zu diesem Eintrag.",
+ "No users or groups found for {search}" : "Kein Benutzer oder Gruppen gefunden für {search}",
+ "No users found for {search}" : "Kein Benutzer gefunden für {search}",
+ "An error occurred. Please try again" : "Es ist ein Fehler aufgetreten. Bitte versuche es noch einmal",
+ "{sharee} (group)" : "{sharee} (group)",
+ "{sharee} (at {server})" : "{sharee} (at {server})",
+ "{sharee} (remote)" : "{sharee} (remote)",
+ "Share" : "Teilen",
+ "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Mit Benutzern anderer ownClouds unter Verwendung der Syntax benutzername@beispiel.com/owncloud teilen",
+ "Share with users…" : "Mit Benutzern teilen…",
+ "Share with users, groups or remote users…" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…",
+ "Share with users or groups…" : "Mit Benutzern oder Gruppen teilen…",
+ "Share with users or remote users…" : "Mit Benutzern oder entfernten Benutzern teilen…",
+ "Error removing share" : "Fehler beim Entfernen der Freigabe",
+ "Warning" : "Warnung",
+ "Error while sending notification" : "Fehler beim Senden der Benachrichtigung",
+ "Non-existing tag #{tag}" : "Nicht vorhandener Tag #{tag}",
+ "not assignable" : "nicht übertragbar",
+ "invisible" : "unsichtbar",
+ "({scope})" : "({scope})",
"Delete" : "Löschen",
+ "Rename" : "Umbenennen",
+ "Collaborative tags" : "Gemeinschaftliche Tags",
+ "The object type is not specified." : "Der Objekttyp ist nicht angegeben.",
+ "Enter new" : "Neuen eingeben",
"Add" : "Hinzufügen",
+ "Edit tags" : "Schlagwörter bearbeiten",
+ "Error loading dialog template: {error}" : "Fehler beim Laden der Dialogvorlage: {error}",
+ "No tags selected for deletion." : "Es wurden keine Schlagwörter zum Löschen ausgewählt.",
+ "unknown text" : "Unbekannter Text",
+ "Hello world!" : "Hallo Welt!",
+ "sunny" : "sonnig",
+ "Hello {name}, the weather is {weather}" : "Hallo {name}, das Wetter ist {weather}",
+ "Hello {name}" : "Hallo {name}",
+ "new" : "neu",
+ "_download %n file_::_download %n files_" : ["Lade %n Datei herunter","Lade %n Dateien herunter"],
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Das Update läuft gerade. Das Verlassen dieser Seite könnte den Update Prozess in einigen Umgebungen unterbrechen.",
+ "Updating to {version}" : "Aktualisierung auf {version}",
+ "An error occurred." : "Es ist ein Fehler aufgetreten.",
+ "Please reload the page." : "Bitte lade die Seite neu.",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Das Update war nicht erfolgreich. Für weitere Informationen <a href=\"{url}\"> schaue bitte in unser Forum </a> um das Problem zu lösen.",
+ "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Das Update ist fehlgeschlagen. Bitte melde dieses Problem an die <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud Community</a>.",
+ "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.",
+ "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Du wirst nun zu ownCloud weitergeleitet.",
+ "Searching other places" : "Andere Orte durchsuchen",
+ "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis im anderen Ordner","{count} Suchergebnisse in anderen Ordnern"],
"Personal" : "Persönlich",
+ "Users" : "Benutzer",
+ "Apps" : "Apps",
+ "Admin" : "Administration",
"Help" : "Hilfe",
- "Username" : "Benutzername"
+ "Access forbidden" : "Zugriff verboten",
+ "File not found" : "Datei nicht gefunden",
+ "The specified document has not been found on the server." : "Das ausgewählte Dokument wurde auf dem Server nicht gefunden.",
+ "You can click here to return to %s." : "Du kannst zur Rückkehr zu %s hier klicken.",
+ "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass %s %s mit Dir geteilt hat.\nZum Anzeigen: %s\n\n",
+ "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
+ "Cheers!" : "Noch einen schönen Tag!",
+ "Internal Server Error" : "Interner Serverfehler",
+ "The server encountered an internal error and was unable to complete your request." : "Der Server hat einen internen Fehler und konnte Ihre Anfrage nicht vervollständigen.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Bitte wende Dich an den Serveradministrator, sollte dieser Fehler mehrfach auftreten, und füge Deiner Anfrage die unten stehenden technischen Details bei.",
+ "More details can be found in the server log." : "Weitere Details können im Serverprotokoll gefunden werden.",
+ "Technical details" : "Technische Details",
+ "Remote Address: %s" : "Entfernte Adresse: %s",
+ "Request ID: %s" : "Anforderungskennung: %s",
+ "Type: %s" : "Typ: %s",
+ "Code: %s" : "Code: %s",
+ "Message: %s" : "Nachricht: %s",
+ "File: %s" : "Datei: %s",
+ "Line: %s" : "Zeile: %s",
+ "Trace" : "Spur",
+ "Security warning" : "Sicherheitshinweis",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar, weil die .htaccess-Datei nicht funktioniert.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Informationen zum richtigen Konfigurieren Deines Servers kannst Du der <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">Dokumentation</a> entnehmen.",
+ "Create an <strong>admin account</strong>" : "<strong>Administrator-Konto</strong> anlegen",
+ "Username" : "Benutzername",
+ "Storage & database" : "Speicher & Datenbank",
+ "Data folder" : "Datenverzeichnis",
+ "Configure the database" : "Datenbank einrichten",
+ "Only %s is available." : "Es ist nur %s verfügbar.",
+ "Install and activate additional PHP modules to choose other database types." : "Installiere und aktiviere zusätzliche PHP-Module, um andere Datenbank-Typen auswählen zu können.",
+ "For more details check out the documentation." : "Schau für weitere Informationen in die Dokumentation.",
+ "Database user" : "Datenbank-Benutzer",
+ "Database password" : "Datenbank-Passwort",
+ "Database name" : "Datenbank-Name",
+ "Database tablespace" : "Datenbank-Tablespace",
+ "Database host" : "Datenbank-Host",
+ "Performance warning" : "Leistungswarnung",
+ "SQLite will be used as database." : "SQLite wird als Datenbank benutzt.",
+ "For larger installations we recommend to choose a different database backend." : "Bei größeren Installationen wird die Wahl eines anderen Datenbank-Backends empfohlen.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
+ "Finish setup" : "Installation abschließen",
+ "Finishing …" : "Abschließen…",
+ "Need help?" : "Hilfe nötig?",
+ "See the documentation" : "Schau in die Dokumentation",
+ "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Hallo,<br><br>hier nur kurz die Mitteilung, dass %s <strong>%s</strong> mit Dir geteilt hat.<br><a href=\"%s\">Sieh es Dir an!</a><br><br>",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Diese Anwendung benötigt zum ordnungsgemäßen Betrieb JavaScript. Bitte {linkstart}aktiviere JavaScript{linkend} und lade die Seite neu.",
+ "Log out" : "Abmelden",
+ "Search" : "Suche",
+ "Server side authentication failed!" : "Serverseitige Authentifizierung fehlgeschlagen!",
+ "Please contact your administrator." : "Bitte kontaktiere Deinen Administrator.",
+ "An internal error occurred." : "Es ist ein interner Fehler aufgetreten.",
+ "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere Deinen Administrator.",
+ "Log in" : "Anmelden",
+ "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?",
+ "Wrong password." : "Falsches Passwort.",
+ "Stay logged in" : "Angemeldet bleiben",
+ "Alternative Logins" : "Alternative Logins",
+ "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}",
+ "New password" : "Neues Passwort",
+ "New Password" : "Neues Passwort",
+ "Reset password" : "Passwort zurücksetzen",
+ "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.",
+ "This means only administrators can use the instance." : "Dies bedeutet, dass diese Instanz nur von Administratoren genutzt werden kann.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktiere Deinen Systemadministrator, wenn diese Meldung dauerhaft oder unerwartet erscheint.",
+ "Thank you for your patience." : "Vielen Dank für Deine Geduld.",
+ "You are accessing the server from an untrusted domain." : "Du greifst von einer nicht vertrauenswürdigen Domain auf den Server zu.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Bitte kontaktiere deinen Administrator. Wenn du ein Administrator dieser Instanz bist, konfigurieren die \"TRUSTED_DOMAINS\" Einstellung in config/config.php .Eine Beispielkonfiguration ist in config/config.sample.php zur Verfügung gestellt.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Wenn es Deine Konfiguration zulässt, kannst Du als Administrator gegebenenfalls den Button unten benutzen, um diese Domain als vertrauenswürdig einzustufen.",
+ "Add \"%s\" as trusted domain" : "„%s“ als vertrauenswürdige Domain hinzufügen",
+ "App update required" : "Appupdate notwendig",
+ "%s will be updated to version %s" : "%s wird auf Version %s aktuallisiert",
+ "These apps will be updated:" : "Diese Apps werden aktuallisiert:",
+ "These incompatible apps will be disabled:" : "Diese inkompatiblen Apps werden deaktiviert:",
+ "The theme %s has been disabled." : "Das Theme %s wurde deaktiviert.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Bitte stelle vor dem Fortsetzen sicher, dass die Datenbank, der Konfigurationsordner und der Datenordner gesichert wurden.",
+ "Start update" : "Aktualisierung starten",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Zur Vermeidung von Zeitüberschreitungen bei größeren Installationen kannst Du stattdessen den folgenden Befehl in Deinem Installationsverzeichnis ausführen:",
+ "Detailed logs" : "Detaillierte Fehlermeldungen",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Diese %s-Instanz befindet sich gerade im Wartungsmodus, was eine Weile dauern kann.",
+ "This page will refresh itself when the %s instance is available again." : "Diese Seite aktualisiert sich automatisch, wenn die %s-Instanz wieder verfügbar ist."
},
"nplurals=2; plural=(n != 1);");
diff --git a/core/l10n/de_AT.json b/core/l10n/de_AT.json
index 6ab59d45c2d..ff097ed0ba2 100644
--- a/core/l10n/de_AT.json
+++ b/core/l10n/de_AT.json
@@ -1,4 +1,53 @@
{ "translations": {
+ "Please select a file." : "Bitte wähle eine Datei aus.",
+ "File is too big" : "Datei ist zu groß",
+ "Invalid file provided" : "Ungültige Datei zur Verfügung gestellt",
+ "No image or file provided" : "Es wurde weder ein Bild noch eine Datei zur Verfügung gestellt",
+ "Unknown filetype" : "Unbekannter Dateityp",
+ "Invalid image" : "Ungültiges Bild",
+ "An error occurred. Please contact your admin." : "Ein Fehler ist aufgetreten. Bitte kontaktiere den Administrator.",
+ "No temporary profile picture available, try again" : "Kein temporäres Profilbild verfügbar, bitte versuche es noch einmal",
+ "No crop data provided" : "Keine Beschnittdaten zur Verfügung gestellt",
+ "No valid crop data provided" : "Keine gültigen Zuschnittdaten zur Verfügung gestellt",
+ "Crop is not square" : "Zuschnitt ist nicht quadratisch",
+ "Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden",
+ "Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist",
+ "Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Es konnte keine E-Mail verschickt werden um das Passwort zurückzusetzten, da keine E-Mail im Benutzerkonto hinterlegt ist. Bitte kontaktiere den Administrator.",
+ "%s password reset" : "%s-Passwort zurücksetzen",
+ "Couldn't send reset email. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versendet werden. Bitte kontaktiere Deinen Administrator.",
+ "Error loading tags" : "Fehler beim Laden der Schlagwörter",
+ "Tag already exists" : "Schlagwort ist bereits vorhanden",
+ "Error deleting tag(s)" : "Fehler beim Löschen des Schlagwortes bzw. der Schlagwörter",
+ "Error tagging" : "Fehler beim Hinzufügen der Schlagwörter",
+ "Error untagging" : "Fehler beim Entfernen der Schlagwörter",
+ "Error favoriting" : "Fehler beim Favorisieren",
+ "Error unfavoriting" : "Fehler beim Entfernen aus den Favoriten",
+ "Couldn't send mail to following users: %s " : "Die E-Mail konnte nicht an folgende Benutzer gesendet werden: %s",
+ "Preparing update" : "Update vorbereiten",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Überprüfe Tabelle %s",
+ "Turned on maintenance mode" : "Wartungsmodus eingeschaltet",
+ "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet",
+ "Maintenance mode is kept active" : "Wartungsmodus bleibt aktiviert",
+ "Updating database schema" : "Datenbank-Schema wird upgedatet",
+ "Updated database" : "Datenbank aktualisiert",
+ "Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "Prüfen, ob das Datenbankschema aktualisiert werden kann (dies kann je nach Datenbankgröße sehr lange dauern)",
+ "Checked database schema update" : "Datenbankschema-Aktualisierung überprüft",
+ "Checking updates of apps" : "Es wird nach Updates für die Apps gesucht",
+ "Checking whether the database schema for %s can be updated (this can take a long time depending on the database size)" : "Prüfen, ob das Datenbankschema für %s aktualisiert werden kann (dies kann je nach Datenbankgröße sehr lange dauern)",
+ "Checked database schema update for apps" : "Datenbankschema-Aktualisierung für Apps überprüft",
+ "Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert",
+ "Repair warning: " : "Reparaturwarnung:",
+ "Repair error: " : "Reparaturfehler:",
+ "Set log level to debug" : "Log-Level auf \"debug\" gesetzt",
+ "Reset log level" : "Ursprüngliches Log-Level wiederhergestellt",
+ "Starting code integrity check" : "Code-Integrität wird überprüft",
+ "Finished code integrity check" : "Code-Integritätsprüfung abgeschlossen",
+ "%s (3rdparty)" : "%s (3rdparty)",
+ "%s (incompatible)" : "%s (nicht kompatibel)",
+ "Following apps have been disabled: %s" : "Die folgenden Apps sind deaktiviert worden: %s",
+ "Already up to date" : "Bereits aktuell",
"Sunday" : "Sonntag",
"Monday" : "Montag",
"Tuesday" : "Dienstag",
@@ -13,6 +62,13 @@
"Thu." : "Do",
"Fri." : "Fr",
"Sat." : "Sa",
+ "Su" : "So",
+ "Mo" : "Mo",
+ "Tu" : "Di",
+ "We" : "Mi",
+ "Th" : "Do",
+ "Fr" : "Fr",
+ "Sa" : "Sa",
"January" : "Januar",
"February" : "Februar",
"March" : "März",
@@ -37,25 +93,217 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dez.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme mit dem Code - Integritätsprüfung. Mehr Informationen…</a>",
"Settings" : "Einstellungen",
- "seconds ago" : "Sekunden zuvor",
+ "Saving..." : "Speichern…",
+ "Dismiss" : "Ausblenden",
+ "seconds ago" : "Gerade eben",
+ "The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Der Link zum Rücksetzen Deines Passworts ist an Deine E-Mail-Adresse versandt worden. Solltest Du ihn innerhalb eines annehmbaren Zeitraums nicht empfangen, prüfe bitte Deine Spam-Ordner.<br>Wenn er sich nicht darin befindet, frage bitte bei Deinem lokalen Administrator nach.",
+ "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Deine Dateien sind verschlüsselt. Solltest Du den Wiederherstellungsschlüssel nicht aktiviert haben, gibt es keine Möglichkeit, Deine Daten zurückzuerhalten, nachdem Dein Passwort zurückgesetzt ist.<br />Falls Du Dir nicht sicher bist, was zu tun ist, kontaktiere bitte Deinen Administrator, bevor Du fortfährst.<br />Willst Du wirklich fortfahren?",
+ "I know what I'm doing" : "Ich weiß, was ich mache",
+ "Password can not be changed. Please contact your administrator." : "Passwort kann nicht geändert werden. Bitte kontaktiere Deinen Administrator.",
"No" : "Nein",
"Yes" : "Ja",
+ "Choose" : "Auswählen",
+ "Error loading file picker template: {error}" : "Fehler beim Laden der Dateiauswahlvorlage: {error}",
+ "Ok" : "OK",
+ "Error loading message template: {error}" : "Fehler beim Laden der Nachrichtenvorlage: {error}",
+ "read-only" : "Schreibgeschützt",
+ "_{count} file conflict_::_{count} file conflicts_" : ["{count} Dateikonflikt","{count} Dateikonflikte"],
+ "One file conflict" : "Ein Dateikonflikt",
+ "New Files" : "Neue Dateien",
+ "Already existing files" : "Bereits existierende Dateien",
+ "Which files do you want to keep?" : "Welche Dateien möchtest Du behalten?",
+ "If you select both versions, the copied file will have a number added to its name." : "Wenn Du beide Versionen auswählst, erhält die kopierte Datei eine Zahl am Ende des Dateinamens.",
"Cancel" : "Abbrechen",
- "Continue" : "Weiter",
+ "Continue" : "Fortsetzen",
+ "(all selected)" : "(Alle ausgewählt)",
+ "({count} selected)" : "({count} ausgewählt)",
+ "Error loading file exists template" : "Fehler beim Laden der vorhanden Dateivorlage",
+ "Very weak password" : "Sehr schwaches Passwort",
+ "Weak password" : "Schwaches Passwort",
+ "So-so password" : "Durchschnittliches Passwort",
+ "Good password" : "Gutes Passwort",
+ "Strong password" : "Starkes Passwort",
+ "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Dein Webserver ist noch nicht hinreichend für Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Dein Web-Server ist nicht richtig eingerichtet um die folgende URL richtig aufzulösen \"{url}\". Weitere Informationen findest du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet, dass einige Funktionen wie das Einhängen externen Speicherplatzes, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren werden. Der Fernzugriff auf Dateien und der Versand von E-Mail-Benachrichtigungen kann ebenfalls nicht funktionieren. Es wird empfohlen, die Internetverbindung dieses Servers zu aktivieren, wenn Du alle Funktionen nutzen möchtest.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Es wurde kein PHP Memory Cache konfiguriert. Konfiguriere zur Erhöhung der Leistungsfähigkeit, soweit verfügbar, einen Memory Cache. Weitere Informationen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "PHP hat keine Leserechte auf /dev/urandom wovon aus Sicherheitsgründen höchst abzuraten ist. Weitere Informationen sind in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a> zu finden.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Du verwendest im Moment PHP {version}. Wir empfehlen ein Upgrade deiner PHP Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP Gruppe bereitgestellt werden</a>, sobald diese deine Distribution diese unterstützt.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Die Header-Einstellungen des Reverse Proxy sind falsch, oder du versuchst, dich mit ownCloud von einem vertrauten Proxy aus zu verbinden. Solltest du ownCloud nicht von einem vertrauten Proxy aus benutzen wollen, dann stellt die momentane Situation ein Sicherheitsproblem da und erlaubt Hackern, eine für ownCloud sichtbare IP-Adresse zu nutzen. Weitere Informationen findest du in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached ist als distributed cache konfiguriert aber das falsche PHP-Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nur \"memcached\" jedoch nicht \"memcache\". Schau in der <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki nach beiden Modulen</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Einige Dateien haben die Integritätsprüfung nicht bestanden. Weiterführende Information findest Du in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien ...</a> / <a href=\"{rescanEndpoint}\">Erneut analysieren…</a>)",
+ "Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Deinen Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Du es aus dem Document-Root-Verzeichnis des Webservers herausverschiebst.",
+ "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Der „{header}“-HTTP-Header ist nicht so konfiguriert, dass er „{expected}“ entspricht. Dies ist ein potentielles Sicherheitsrisiko und es wird empfohlen, diese Einstellung zu ändern.",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Der \"Strict-Transport-Security\" HTTP-Header ist nicht auf mindestens \"{seconds}\" Sekunden eingestellt. Um die Sicherheit zu erhöhen, empfehlen wir das Aktivieren von HSTS, wie es in den <a href=\"{docUrl}\" rel=\"noreferrer\">Sicherheitshinweisen</a> erläutert ist.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du greifst auf diese Site über HTTP zu. Wir raten dringend dazu, Deinen Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.",
+ "Shared" : "Geteilt",
+ "Shared with {recipients}" : "Geteilt mit {recipients}",
"Error" : "Fehler",
+ "Error while sharing" : "Fehler beim Teilen",
+ "Error while unsharing" : "Fehler beim Aufheben der Freigabe",
+ "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums",
+ "The public link will expire no later than {days} days after it is created" : "Der öffentliche Link wird spätestens {days} Tage nach seiner Erstellung ablaufen",
+ "Set expiration date" : "Setze ein Ablaufdatum",
+ "Expiration" : "Ablaufdatum",
+ "Expiration date" : "Ablaufdatum",
+ "Choose a password for the public link" : "Wählen Sie ein Passwort für den öffentlichen Link",
+ "Resharing is not allowed" : "Weiterverteilen ist nicht erlaubt",
"Share link" : "Link teilen",
+ "Link" : "Link",
+ "Password protect" : "Passwortschutz",
"Password" : "Passwort",
+ "Allow editing" : "Bearbeitung erlauben",
+ "Email link to person" : "Link per E-Mail verschicken",
"Send" : "Senden",
+ "Sending ..." : "Senden…",
+ "Email sent" : "E-Mail wurde verschickt",
+ "Shared with you and the group {group} by {owner}" : "{owner} hat dies mit Dir und der Gruppe {group} geteilt",
+ "Shared with you by {owner}" : "{owner} hat dies mit Dir geteilt",
"group" : "Gruppe",
- "Unshare" : "Teilung zurücknehmen",
- "can share" : "Kann teilen",
+ "remote" : "Entfernte Freigabe",
+ "notify by email" : "per E-Mail benachrichtigen",
+ "Unshare" : "Freigabe aufheben",
+ "can share" : "kann teilen",
"can edit" : "kann bearbeiten",
- "Share" : "Freigeben",
+ "create" : "erstellen",
+ "change" : "Ändern",
+ "delete" : "löschen",
+ "access control" : "Zugriffskontrolle",
+ "Could not unshare" : "Freigabe konnte nicht entfernt werden",
+ "Share details could not be loaded for this item." : "Details der geteilten Freigabe konnten nicht geladen werden zu diesem Eintrag.",
+ "No users or groups found for {search}" : "Kein Benutzer oder Gruppen gefunden für {search}",
+ "No users found for {search}" : "Kein Benutzer gefunden für {search}",
+ "An error occurred. Please try again" : "Es ist ein Fehler aufgetreten. Bitte versuche es noch einmal",
+ "{sharee} (group)" : "{sharee} (group)",
+ "{sharee} (at {server})" : "{sharee} (at {server})",
+ "{sharee} (remote)" : "{sharee} (remote)",
+ "Share" : "Teilen",
+ "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Mit Benutzern anderer ownClouds unter Verwendung der Syntax benutzername@beispiel.com/owncloud teilen",
+ "Share with users…" : "Mit Benutzern teilen…",
+ "Share with users, groups or remote users…" : "Mit Benutzern, Gruppen oder entfernten Benutzern teilen…",
+ "Share with users or groups…" : "Mit Benutzern oder Gruppen teilen…",
+ "Share with users or remote users…" : "Mit Benutzern oder entfernten Benutzern teilen…",
+ "Error removing share" : "Fehler beim Entfernen der Freigabe",
+ "Warning" : "Warnung",
+ "Error while sending notification" : "Fehler beim Senden der Benachrichtigung",
+ "Non-existing tag #{tag}" : "Nicht vorhandener Tag #{tag}",
+ "not assignable" : "nicht übertragbar",
+ "invisible" : "unsichtbar",
+ "({scope})" : "({scope})",
"Delete" : "Löschen",
+ "Rename" : "Umbenennen",
+ "Collaborative tags" : "Gemeinschaftliche Tags",
+ "The object type is not specified." : "Der Objekttyp ist nicht angegeben.",
+ "Enter new" : "Neuen eingeben",
"Add" : "Hinzufügen",
+ "Edit tags" : "Schlagwörter bearbeiten",
+ "Error loading dialog template: {error}" : "Fehler beim Laden der Dialogvorlage: {error}",
+ "No tags selected for deletion." : "Es wurden keine Schlagwörter zum Löschen ausgewählt.",
+ "unknown text" : "Unbekannter Text",
+ "Hello world!" : "Hallo Welt!",
+ "sunny" : "sonnig",
+ "Hello {name}, the weather is {weather}" : "Hallo {name}, das Wetter ist {weather}",
+ "Hello {name}" : "Hallo {name}",
+ "new" : "neu",
+ "_download %n file_::_download %n files_" : ["Lade %n Datei herunter","Lade %n Dateien herunter"],
+ "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Das Update läuft gerade. Das Verlassen dieser Seite könnte den Update Prozess in einigen Umgebungen unterbrechen.",
+ "Updating to {version}" : "Aktualisierung auf {version}",
+ "An error occurred." : "Es ist ein Fehler aufgetreten.",
+ "Please reload the page." : "Bitte lade die Seite neu.",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Das Update war nicht erfolgreich. Für weitere Informationen <a href=\"{url}\"> schaue bitte in unser Forum </a> um das Problem zu lösen.",
+ "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Das Update ist fehlgeschlagen. Bitte melde dieses Problem an die <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud Community</a>.",
+ "The update was successful. There were warnings." : "Das Update war erfolgreich. Warnungen wurden ausgegeben.",
+ "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Du wirst nun zu ownCloud weitergeleitet.",
+ "Searching other places" : "Andere Orte durchsuchen",
+ "No search results in other folders" : "Keine Suchergebnisse in anderen Ordnern",
+ "_{count} search result in another folder_::_{count} search results in other folders_" : ["{count} Suchergebnis im anderen Ordner","{count} Suchergebnisse in anderen Ordnern"],
"Personal" : "Persönlich",
+ "Users" : "Benutzer",
+ "Apps" : "Apps",
+ "Admin" : "Administration",
"Help" : "Hilfe",
- "Username" : "Benutzername"
+ "Access forbidden" : "Zugriff verboten",
+ "File not found" : "Datei nicht gefunden",
+ "The specified document has not been found on the server." : "Das ausgewählte Dokument wurde auf dem Server nicht gefunden.",
+ "You can click here to return to %s." : "Du kannst zur Rückkehr zu %s hier klicken.",
+ "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass %s %s mit Dir geteilt hat.\nZum Anzeigen: %s\n\n",
+ "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.",
+ "Cheers!" : "Noch einen schönen Tag!",
+ "Internal Server Error" : "Interner Serverfehler",
+ "The server encountered an internal error and was unable to complete your request." : "Der Server hat einen internen Fehler und konnte Ihre Anfrage nicht vervollständigen.",
+ "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Bitte wende Dich an den Serveradministrator, sollte dieser Fehler mehrfach auftreten, und füge Deiner Anfrage die unten stehenden technischen Details bei.",
+ "More details can be found in the server log." : "Weitere Details können im Serverprotokoll gefunden werden.",
+ "Technical details" : "Technische Details",
+ "Remote Address: %s" : "Entfernte Adresse: %s",
+ "Request ID: %s" : "Anforderungskennung: %s",
+ "Type: %s" : "Typ: %s",
+ "Code: %s" : "Code: %s",
+ "Message: %s" : "Nachricht: %s",
+ "File: %s" : "Datei: %s",
+ "Line: %s" : "Zeile: %s",
+ "Trace" : "Spur",
+ "Security warning" : "Sicherheitshinweis",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Dein Datenverzeichnis und Deine Dateien sind wahrscheinlich vom Internet aus erreichbar, weil die .htaccess-Datei nicht funktioniert.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Informationen zum richtigen Konfigurieren Deines Servers kannst Du der <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">Dokumentation</a> entnehmen.",
+ "Create an <strong>admin account</strong>" : "<strong>Administrator-Konto</strong> anlegen",
+ "Username" : "Benutzername",
+ "Storage & database" : "Speicher & Datenbank",
+ "Data folder" : "Datenverzeichnis",
+ "Configure the database" : "Datenbank einrichten",
+ "Only %s is available." : "Es ist nur %s verfügbar.",
+ "Install and activate additional PHP modules to choose other database types." : "Installiere und aktiviere zusätzliche PHP-Module, um andere Datenbank-Typen auswählen zu können.",
+ "For more details check out the documentation." : "Schau für weitere Informationen in die Dokumentation.",
+ "Database user" : "Datenbank-Benutzer",
+ "Database password" : "Datenbank-Passwort",
+ "Database name" : "Datenbank-Name",
+ "Database tablespace" : "Datenbank-Tablespace",
+ "Database host" : "Datenbank-Host",
+ "Performance warning" : "Leistungswarnung",
+ "SQLite will be used as database." : "SQLite wird als Datenbank benutzt.",
+ "For larger installations we recommend to choose a different database backend." : "Bei größeren Installationen wird die Wahl eines anderen Datenbank-Backends empfohlen.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
+ "Finish setup" : "Installation abschließen",
+ "Finishing …" : "Abschließen…",
+ "Need help?" : "Hilfe nötig?",
+ "See the documentation" : "Schau in die Dokumentation",
+ "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Hallo,<br><br>hier nur kurz die Mitteilung, dass %s <strong>%s</strong> mit Dir geteilt hat.<br><a href=\"%s\">Sieh es Dir an!</a><br><br>",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Diese Anwendung benötigt zum ordnungsgemäßen Betrieb JavaScript. Bitte {linkstart}aktiviere JavaScript{linkend} und lade die Seite neu.",
+ "Log out" : "Abmelden",
+ "Search" : "Suche",
+ "Server side authentication failed!" : "Serverseitige Authentifizierung fehlgeschlagen!",
+ "Please contact your administrator." : "Bitte kontaktiere Deinen Administrator.",
+ "An internal error occurred." : "Es ist ein interner Fehler aufgetreten.",
+ "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere Deinen Administrator.",
+ "Log in" : "Anmelden",
+ "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?",
+ "Wrong password." : "Falsches Passwort.",
+ "Stay logged in" : "Angemeldet bleiben",
+ "Alternative Logins" : "Alternative Logins",
+ "Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}",
+ "New password" : "Neues Passwort",
+ "New Password" : "Neues Passwort",
+ "Reset password" : "Passwort zurücksetzen",
+ "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.",
+ "This means only administrators can use the instance." : "Dies bedeutet, dass diese Instanz nur von Administratoren genutzt werden kann.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Kontaktiere Deinen Systemadministrator, wenn diese Meldung dauerhaft oder unerwartet erscheint.",
+ "Thank you for your patience." : "Vielen Dank für Deine Geduld.",
+ "You are accessing the server from an untrusted domain." : "Du greifst von einer nicht vertrauenswürdigen Domain auf den Server zu.",
+ "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Bitte kontaktiere deinen Administrator. Wenn du ein Administrator dieser Instanz bist, konfigurieren die \"TRUSTED_DOMAINS\" Einstellung in config/config.php .Eine Beispielkonfiguration ist in config/config.sample.php zur Verfügung gestellt.",
+ "Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "Wenn es Deine Konfiguration zulässt, kannst Du als Administrator gegebenenfalls den Button unten benutzen, um diese Domain als vertrauenswürdig einzustufen.",
+ "Add \"%s\" as trusted domain" : "„%s“ als vertrauenswürdige Domain hinzufügen",
+ "App update required" : "Appupdate notwendig",
+ "%s will be updated to version %s" : "%s wird auf Version %s aktuallisiert",
+ "These apps will be updated:" : "Diese Apps werden aktuallisiert:",
+ "These incompatible apps will be disabled:" : "Diese inkompatiblen Apps werden deaktiviert:",
+ "The theme %s has been disabled." : "Das Theme %s wurde deaktiviert.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Bitte stelle vor dem Fortsetzen sicher, dass die Datenbank, der Konfigurationsordner und der Datenordner gesichert wurden.",
+ "Start update" : "Aktualisierung starten",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Zur Vermeidung von Zeitüberschreitungen bei größeren Installationen kannst Du stattdessen den folgenden Befehl in Deinem Installationsverzeichnis ausführen:",
+ "Detailed logs" : "Detaillierte Fehlermeldungen",
+ "This %s instance is currently in maintenance mode, which may take a while." : "Diese %s-Instanz befindet sich gerade im Wartungsmodus, was eine Weile dauern kann.",
+ "This page will refresh itself when the %s instance is available again." : "Diese Seite aktualisiert sich automatisch, wenn die %s-Instanz wieder verfügbar ist."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index f62b07f42b1..9a3cc82be44 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -27,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Fehler beim Entfernen aus den Favoriten",
"Couldn't send mail to following users: %s " : "An folgende Benutzer konnte keine E-Mail gesendet werden: %s",
"Preparing update" : "Update vorbereiten",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Da automatische Updates in der config.php deaktivert sind, nutzen Sie bitte den Updater über die Kommandozeile.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Überprüfe Tabelle %s",
"Turned on maintenance mode" : "Wartungsmodus eingeschaltet ",
@@ -97,6 +98,7 @@ OC.L10N.register(
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme bei der Code Integritätsprüfung. Mehr Information...</a>",
"Settings" : "Einstellungen",
+ "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden nochmals geladen",
"Saving..." : "Speichervorgang…",
"Dismiss" : "Ausblenden",
"seconds ago" : "Gerade eben",
@@ -134,7 +136,7 @@ OC.L10N.register(
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom ist von PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
"You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Sie verwenden im Moment PHP {version}. Wir empfehlen ein Upgrade ihrer PHP Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP Gruppe bereitgestellt werden</a>, sobald diese ihre Distribution diese unterstützt.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Die Einstellung der Reverse Proxy Kopfzeile is falsch oder Sie greifen über einen gesicherten Proxy auf ownCloud zu. Falls Sie nicht über einen gesicherten Proxy auf ownCloud zugreifen handelt es sich um eine Sicherheitslücke, die es Angreifern erlaubt ihre IP-Adresse ownCloud gegenüber als sichtbar darzustellen. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
- "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcache ist als verteilter Cache konfiguriert, aber das falsche PHP Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nud \"memcached\" und nicht \"memcache\". Siehe <<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached Wiki über beide Module</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcache ist als verteilter Cache konfiguriert, aber das falsche PHP Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nud \"memcached\" und nicht \"memcache\". Siehe <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached Wiki über beide Module</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Manche Dateien haben die Integritätsprüfung nicht bestanden. Weitere Informationen um den Fehler zu behen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien...</a> / <a href=\"{rescanEndpoint}\">Erneut scannen…</a>)",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Ihren Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Sie es aus dem Document-Root-Verzeichnis des Webservers herausverschieben.",
@@ -152,8 +154,6 @@ OC.L10N.register(
"Expiration" : "Ablaufdatum",
"Expiration date" : "Ablaufdatum",
"Choose a password for the public link" : "Wählen Sie ein Passwort für den öffentlichen Link",
- "Sending ..." : "Senden…",
- "Email sent" : "E-Mail gesendet",
"Resharing is not allowed" : "Das Weiterverteilen ist nicht erlaubt",
"Share link" : "Link teilen",
"Link" : "Link",
@@ -162,6 +162,9 @@ OC.L10N.register(
"Allow editing" : "Bearbeitung erlauben",
"Email link to person" : "Link per E-Mail verschicken",
"Send" : "Senden",
+ "Sending ..." : "Senden…",
+ "Email sent" : "E-Mail gesendet",
+ "Send link via email" : "Link als E-Mail verschicken",
"Shared with you and the group {group} by {owner}" : "Von {owner} mit Ihnen und der Gruppe {group} geteilt.",
"Shared with you by {owner}" : "Von {owner} mit Ihnen geteilt.",
"group" : "Gruppe",
@@ -305,6 +308,9 @@ OC.L10N.register(
"Start update" : "Aktualisierung starten",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Zur Vermeidung von Zeitüberschreitungen bei größeren Installationen können Sie stattdessen den folgenden Befehl in Ihrem Installationsverzeichnis ausführen:",
"Detailed logs" : "Detaillierte Fehlermeldungen",
+ "Update needed" : "Update erforderlich",
+ "Please use the command line updater because you have a big instance." : "Da Sie eine große Instanz von Owncloud besitzt, nutzen Sie bitte den Updater über die Kommandozeile.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Für weitere Hilfen, schauen Sie bitte in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Diese %s-Instanz befindet sich gerade im Wartungsmodus, was eine Weile dauern kann.",
"This page will refresh itself when the %s instance is available again." : "Diese Seite aktualisiert sich automatisch, wenn die %s-Instanz wieder verfügbar ist."
},
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index bc9115c2d19..3f328b482d7 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -25,6 +25,7 @@
"Error unfavoriting" : "Fehler beim Entfernen aus den Favoriten",
"Couldn't send mail to following users: %s " : "An folgende Benutzer konnte keine E-Mail gesendet werden: %s",
"Preparing update" : "Update vorbereiten",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Da automatische Updates in der config.php deaktivert sind, nutzen Sie bitte den Updater über die Kommandozeile.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Überprüfe Tabelle %s",
"Turned on maintenance mode" : "Wartungsmodus eingeschaltet ",
@@ -95,6 +96,7 @@
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme bei der Code Integritätsprüfung. Mehr Information...</a>",
"Settings" : "Einstellungen",
+ "Problem loading page, reloading in 5 seconds" : "Problem beim Laden der Seite, Seite wird in 5 Sekunden nochmals geladen",
"Saving..." : "Speichervorgang…",
"Dismiss" : "Ausblenden",
"seconds ago" : "Gerade eben",
@@ -132,7 +134,7 @@
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom ist von PHP nicht lesbar, wovon aus Sicherheitsgründen dringend abgeraten wird. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
"You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Sie verwenden im Moment PHP {version}. Wir empfehlen ein Upgrade ihrer PHP Version, um die <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">Geschwindigkeits- und Sicherheitsupdates zu nutzen, welche von der PHP Gruppe bereitgestellt werden</a>, sobald diese ihre Distribution diese unterstützt.",
"The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Die Einstellung der Reverse Proxy Kopfzeile is falsch oder Sie greifen über einen gesicherten Proxy auf ownCloud zu. Falls Sie nicht über einen gesicherten Proxy auf ownCloud zugreifen handelt es sich um eine Sicherheitslücke, die es Angreifern erlaubt ihre IP-Adresse ownCloud gegenüber als sichtbar darzustellen. Weitere Informationen hierzu finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>.",
- "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcache ist als verteilter Cache konfiguriert, aber das falsche PHP Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nud \"memcached\" und nicht \"memcache\". Siehe <<a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached Wiki über beide Module</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcache ist als verteilter Cache konfiguriert, aber das falsche PHP Modul \"memcache\" ist installiert. \\OC\\Memcache\\Memcached unterstützt nud \"memcached\" und nicht \"memcache\". Siehe <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached Wiki über beide Module</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Manche Dateien haben die Integritätsprüfung nicht bestanden. Weitere Informationen um den Fehler zu behen finden Sie in unserer <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dokumentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste der ungültigen Dateien...</a> / <a href=\"{rescanEndpoint}\">Erneut scannen…</a>)",
"Error occurred while checking server setup" : "Fehler beim Überprüfen der Servereinrichtung",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar. Die .htaccess-Datei funktioniert nicht. Es wird dringend empfohlen, Ihren Webserver dahingehend zu konfigurieren, dass das Datenverzeichnis nicht mehr vom Internet aus erreichbar ist oder dass Sie es aus dem Document-Root-Verzeichnis des Webservers herausverschieben.",
@@ -150,8 +152,6 @@
"Expiration" : "Ablaufdatum",
"Expiration date" : "Ablaufdatum",
"Choose a password for the public link" : "Wählen Sie ein Passwort für den öffentlichen Link",
- "Sending ..." : "Senden…",
- "Email sent" : "E-Mail gesendet",
"Resharing is not allowed" : "Das Weiterverteilen ist nicht erlaubt",
"Share link" : "Link teilen",
"Link" : "Link",
@@ -160,6 +160,9 @@
"Allow editing" : "Bearbeitung erlauben",
"Email link to person" : "Link per E-Mail verschicken",
"Send" : "Senden",
+ "Sending ..." : "Senden…",
+ "Email sent" : "E-Mail gesendet",
+ "Send link via email" : "Link als E-Mail verschicken",
"Shared with you and the group {group} by {owner}" : "Von {owner} mit Ihnen und der Gruppe {group} geteilt.",
"Shared with you by {owner}" : "Von {owner} mit Ihnen geteilt.",
"group" : "Gruppe",
@@ -303,6 +306,9 @@
"Start update" : "Aktualisierung starten",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Zur Vermeidung von Zeitüberschreitungen bei größeren Installationen können Sie stattdessen den folgenden Befehl in Ihrem Installationsverzeichnis ausführen:",
"Detailed logs" : "Detaillierte Fehlermeldungen",
+ "Update needed" : "Update erforderlich",
+ "Please use the command line updater because you have a big instance." : "Da Sie eine große Instanz von Owncloud besitzt, nutzen Sie bitte den Updater über die Kommandozeile.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Für weitere Hilfen, schauen Sie bitte in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Diese %s-Instanz befindet sich gerade im Wartungsmodus, was eine Weile dauern kann.",
"This page will refresh itself when the %s instance is available again." : "Diese Seite aktualisiert sich automatisch, wenn die %s-Instanz wieder verfügbar ist."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/core/l10n/el.js b/core/l10n/el.js
index 5d52b3347df..285b8f796ae 100644
--- a/core/l10n/el.js
+++ b/core/l10n/el.js
@@ -136,8 +136,6 @@ OC.L10N.register(
"Expiration" : "Λήξη",
"Expiration date" : "Ημερομηνία λήξης",
"Choose a password for the public link" : "Επιλέξτε κωδικό για τον δημόσιο σύνδεσμο",
- "Sending ..." : "Αποστολή...",
- "Email sent" : "Το Email απεστάλη ",
"Resharing is not allowed" : "Ξαναμοιρασμός δεν επιτρέπεται",
"Share link" : "Διαμοιρασμός συνδέσμου",
"Link" : "Σύνδεσμος",
@@ -146,6 +144,8 @@ OC.L10N.register(
"Allow editing" : "Επιτρέπεται η επεξεργασία",
"Email link to person" : "Αποστολή συνδέσμου με email ",
"Send" : "Αποστολή",
+ "Sending ..." : "Αποστολή...",
+ "Email sent" : "Το Email απεστάλη ",
"Shared with you and the group {group} by {owner}" : "Διαμοιράστηκε με σας και με την ομάδα {group} του {owner}",
"Shared with you by {owner}" : "Διαμοιράστηκε με σας από τον {owner}",
"group" : "ομάδα",
diff --git a/core/l10n/el.json b/core/l10n/el.json
index e23bf6aea37..d0dc62c2a85 100644
--- a/core/l10n/el.json
+++ b/core/l10n/el.json
@@ -134,8 +134,6 @@
"Expiration" : "Λήξη",
"Expiration date" : "Ημερομηνία λήξης",
"Choose a password for the public link" : "Επιλέξτε κωδικό για τον δημόσιο σύνδεσμο",
- "Sending ..." : "Αποστολή...",
- "Email sent" : "Το Email απεστάλη ",
"Resharing is not allowed" : "Ξαναμοιρασμός δεν επιτρέπεται",
"Share link" : "Διαμοιρασμός συνδέσμου",
"Link" : "Σύνδεσμος",
@@ -144,6 +142,8 @@
"Allow editing" : "Επιτρέπεται η επεξεργασία",
"Email link to person" : "Αποστολή συνδέσμου με email ",
"Send" : "Αποστολή",
+ "Sending ..." : "Αποστολή...",
+ "Email sent" : "Το Email απεστάλη ",
"Shared with you and the group {group} by {owner}" : "Διαμοιράστηκε με σας και με την ομάδα {group} του {owner}",
"Shared with you by {owner}" : "Διαμοιράστηκε με σας από τον {owner}",
"group" : "ομάδα",
diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js
index 934fdf79ad4..1781670a7f6 100644
--- a/core/l10n/en_GB.js
+++ b/core/l10n/en_GB.js
@@ -142,8 +142,6 @@ OC.L10N.register(
"Expiration" : "Expiration",
"Expiration date" : "Expiration date",
"Choose a password for the public link" : "Choose a password for the public link",
- "Sending ..." : "Sending ...",
- "Email sent" : "Email sent",
"Resharing is not allowed" : "Resharing is not allowed",
"Share link" : "Share link",
"Link" : "Link",
@@ -152,6 +150,8 @@ OC.L10N.register(
"Allow editing" : "Allow editing",
"Email link to person" : "Email link to person",
"Send" : "Send",
+ "Sending ..." : "Sending ...",
+ "Email sent" : "Email sent",
"Shared with you and the group {group} by {owner}" : "Shared with you and the group {group} by {owner}",
"Shared with you by {owner}" : "Shared with you by {owner}",
"group" : "group",
diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json
index 44781db05a3..51eabe6fe60 100644
--- a/core/l10n/en_GB.json
+++ b/core/l10n/en_GB.json
@@ -140,8 +140,6 @@
"Expiration" : "Expiration",
"Expiration date" : "Expiration date",
"Choose a password for the public link" : "Choose a password for the public link",
- "Sending ..." : "Sending ...",
- "Email sent" : "Email sent",
"Resharing is not allowed" : "Resharing is not allowed",
"Share link" : "Share link",
"Link" : "Link",
@@ -150,6 +148,8 @@
"Allow editing" : "Allow editing",
"Email link to person" : "Email link to person",
"Send" : "Send",
+ "Sending ..." : "Sending ...",
+ "Email sent" : "Email sent",
"Shared with you and the group {group} by {owner}" : "Shared with you and the group {group} by {owner}",
"Shared with you by {owner}" : "Shared with you by {owner}",
"group" : "group",
diff --git a/core/l10n/eo.js b/core/l10n/eo.js
index 38d5e87f2fb..45ee7db15bf 100644
--- a/core/l10n/eo.js
+++ b/core/l10n/eo.js
@@ -100,8 +100,6 @@ OC.L10N.register(
"Expiration" : "Eksvalidiĝo",
"Expiration date" : "Limdato",
"Choose a password for the public link" : "Elektu pasvorton por la publika ligilo",
- "Sending ..." : "Sendante...",
- "Email sent" : "La retpoŝtaĵo sendiĝis",
"Resharing is not allowed" : "Rekunhavigo ne permesatas",
"Share link" : "Konhavigi ligilon",
"Link" : "Ligilo",
@@ -110,6 +108,8 @@ OC.L10N.register(
"Allow editing" : "Permesi redakton",
"Email link to person" : "Retpoŝti la ligilon al ulo",
"Send" : "Sendi",
+ "Sending ..." : "Sendante...",
+ "Email sent" : "La retpoŝtaĵo sendiĝis",
"Shared with you and the group {group} by {owner}" : "Kunhavigita kun vi kaj la grupo {group} de {owner}",
"Shared with you by {owner}" : "Kunhavigita kun vi de {owner}",
"group" : "grupo",
diff --git a/core/l10n/eo.json b/core/l10n/eo.json
index 200bb72f7fd..fafe6301225 100644
--- a/core/l10n/eo.json
+++ b/core/l10n/eo.json
@@ -98,8 +98,6 @@
"Expiration" : "Eksvalidiĝo",
"Expiration date" : "Limdato",
"Choose a password for the public link" : "Elektu pasvorton por la publika ligilo",
- "Sending ..." : "Sendante...",
- "Email sent" : "La retpoŝtaĵo sendiĝis",
"Resharing is not allowed" : "Rekunhavigo ne permesatas",
"Share link" : "Konhavigi ligilon",
"Link" : "Ligilo",
@@ -108,6 +106,8 @@
"Allow editing" : "Permesi redakton",
"Email link to person" : "Retpoŝti la ligilon al ulo",
"Send" : "Sendi",
+ "Sending ..." : "Sendante...",
+ "Email sent" : "La retpoŝtaĵo sendiĝis",
"Shared with you and the group {group} by {owner}" : "Kunhavigita kun vi kaj la grupo {group} de {owner}",
"Shared with you by {owner}" : "Kunhavigita kun vi de {owner}",
"group" : "grupo",
diff --git a/core/l10n/es.js b/core/l10n/es.js
index ed4d738fe46..faa1a1aceb9 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -144,8 +144,6 @@ OC.L10N.register(
"Expiration" : "Expira en:",
"Expiration date" : "Fecha de caducidad",
"Choose a password for the public link" : "Elija una contraseña para el enlace publico",
- "Sending ..." : "Enviando...",
- "Email sent" : "Correo electrónico enviado",
"Resharing is not allowed" : "No se permite compartir de nuevo",
"Share link" : "Enlace compartido",
"Link" : "Enlace",
@@ -154,6 +152,8 @@ OC.L10N.register(
"Allow editing" : "Permitir edición",
"Email link to person" : "Enviar enlace por correo electrónico a una persona",
"Send" : "Enviar",
+ "Sending ..." : "Enviando...",
+ "Email sent" : "Correo electrónico enviado",
"Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido contigo por {owner}",
"group" : "grupo",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index b411ef03c19..49bc8c2e91d 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -142,8 +142,6 @@
"Expiration" : "Expira en:",
"Expiration date" : "Fecha de caducidad",
"Choose a password for the public link" : "Elija una contraseña para el enlace publico",
- "Sending ..." : "Enviando...",
- "Email sent" : "Correo electrónico enviado",
"Resharing is not allowed" : "No se permite compartir de nuevo",
"Share link" : "Enlace compartido",
"Link" : "Enlace",
@@ -152,6 +150,8 @@
"Allow editing" : "Permitir edición",
"Email link to person" : "Enviar enlace por correo electrónico a una persona",
"Send" : "Enviar",
+ "Sending ..." : "Enviando...",
+ "Email sent" : "Correo electrónico enviado",
"Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido contigo por {owner}",
"group" : "grupo",
diff --git a/core/l10n/es_AR.js b/core/l10n/es_AR.js
index cab16cb5553..c03dd6e04a2 100644
--- a/core/l10n/es_AR.js
+++ b/core/l10n/es_AR.js
@@ -88,14 +88,14 @@ OC.L10N.register(
"Set expiration date" : "Asignar fecha de vencimiento",
"Expiration" : "Vencimiento",
"Expiration date" : "Fecha de vencimiento",
- "Sending ..." : "Mandando...",
- "Email sent" : "e-mail mandado",
"Resharing is not allowed" : "No se permite volver a compartir",
"Share link" : "Compartir vínculo",
"Password protect" : "Proteger con contraseña ",
"Password" : "Contraseña",
"Email link to person" : "Enviar el enlace por e-mail.",
"Send" : "Mandar",
+ "Sending ..." : "Mandando...",
+ "Email sent" : "e-mail mandado",
"Shared with you and the group {group} by {owner}" : "Compartido con vos y el grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido con vos por {owner}",
"group" : "grupo",
diff --git a/core/l10n/es_AR.json b/core/l10n/es_AR.json
index 44ba2344a16..53897d2e631 100644
--- a/core/l10n/es_AR.json
+++ b/core/l10n/es_AR.json
@@ -86,14 +86,14 @@
"Set expiration date" : "Asignar fecha de vencimiento",
"Expiration" : "Vencimiento",
"Expiration date" : "Fecha de vencimiento",
- "Sending ..." : "Mandando...",
- "Email sent" : "e-mail mandado",
"Resharing is not allowed" : "No se permite volver a compartir",
"Share link" : "Compartir vínculo",
"Password protect" : "Proteger con contraseña ",
"Password" : "Contraseña",
"Email link to person" : "Enviar el enlace por e-mail.",
"Send" : "Mandar",
+ "Sending ..." : "Mandando...",
+ "Email sent" : "e-mail mandado",
"Shared with you and the group {group} by {owner}" : "Compartido con vos y el grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido con vos por {owner}",
"group" : "grupo",
diff --git a/core/l10n/es_MX.js b/core/l10n/es_MX.js
index 1764f8e78d0..91229d3bb01 100644
--- a/core/l10n/es_MX.js
+++ b/core/l10n/es_MX.js
@@ -82,14 +82,14 @@ OC.L10N.register(
"Set expiration date" : "Establecer fecha de caducidad",
"Expiration" : "Caducidad",
"Expiration date" : "Fecha de caducidad",
- "Sending ..." : "Enviando...",
- "Email sent" : "Correo electrónico enviado",
"Resharing is not allowed" : "No se permite compartir de nuevo",
"Share link" : "Enlace compartido",
"Password protect" : "Protección con contraseña",
"Password" : "Contraseña",
"Email link to person" : "Enviar enlace por correo electrónico a una persona",
"Send" : "Enviar",
+ "Sending ..." : "Enviando...",
+ "Email sent" : "Correo electrónico enviado",
"Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido contigo por {owner}",
"group" : "grupo",
diff --git a/core/l10n/es_MX.json b/core/l10n/es_MX.json
index 7e981ab9862..916cc8a8dd2 100644
--- a/core/l10n/es_MX.json
+++ b/core/l10n/es_MX.json
@@ -80,14 +80,14 @@
"Set expiration date" : "Establecer fecha de caducidad",
"Expiration" : "Caducidad",
"Expiration date" : "Fecha de caducidad",
- "Sending ..." : "Enviando...",
- "Email sent" : "Correo electrónico enviado",
"Resharing is not allowed" : "No se permite compartir de nuevo",
"Share link" : "Enlace compartido",
"Password protect" : "Protección con contraseña",
"Password" : "Contraseña",
"Email link to person" : "Enviar enlace por correo electrónico a una persona",
"Send" : "Enviar",
+ "Sending ..." : "Enviando...",
+ "Email sent" : "Correo electrónico enviado",
"Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido contigo por {owner}",
"group" : "grupo",
diff --git a/core/l10n/et_EE.js b/core/l10n/et_EE.js
index 9e912f140b3..59e899751cf 100644
--- a/core/l10n/et_EE.js
+++ b/core/l10n/et_EE.js
@@ -128,8 +128,6 @@ OC.L10N.register(
"Expiration" : "Aegumine",
"Expiration date" : "Aegumise kuupäev",
"Choose a password for the public link" : "Vali avaliku lingi jaoks parool",
- "Sending ..." : "Saatmine ...",
- "Email sent" : "E-kiri on saadetud",
"Resharing is not allowed" : "Edasijagamine pole lubatud",
"Share link" : "Jaga linki",
"Link" : "Link",
@@ -138,6 +136,8 @@ OC.L10N.register(
"Allow editing" : "Luba muutmine",
"Email link to person" : "Saada link isikule e-postiga",
"Send" : "Saada",
+ "Sending ..." : "Saatmine ...",
+ "Email sent" : "E-kiri on saadetud",
"Shared with you and the group {group} by {owner}" : "Jagatud sinu ja {group} grupiga {owner} poolt",
"Shared with you by {owner}" : "Sinuga jagas {owner}",
"group" : "grupp",
diff --git a/core/l10n/et_EE.json b/core/l10n/et_EE.json
index 3d2ccf84e9e..800fd9aa492 100644
--- a/core/l10n/et_EE.json
+++ b/core/l10n/et_EE.json
@@ -126,8 +126,6 @@
"Expiration" : "Aegumine",
"Expiration date" : "Aegumise kuupäev",
"Choose a password for the public link" : "Vali avaliku lingi jaoks parool",
- "Sending ..." : "Saatmine ...",
- "Email sent" : "E-kiri on saadetud",
"Resharing is not allowed" : "Edasijagamine pole lubatud",
"Share link" : "Jaga linki",
"Link" : "Link",
@@ -136,6 +134,8 @@
"Allow editing" : "Luba muutmine",
"Email link to person" : "Saada link isikule e-postiga",
"Send" : "Saada",
+ "Sending ..." : "Saatmine ...",
+ "Email sent" : "E-kiri on saadetud",
"Shared with you and the group {group} by {owner}" : "Jagatud sinu ja {group} grupiga {owner} poolt",
"Shared with you by {owner}" : "Sinuga jagas {owner}",
"group" : "grupp",
diff --git a/core/l10n/eu.js b/core/l10n/eu.js
index 2b6ab7d5c8f..05b0077ed5c 100644
--- a/core/l10n/eu.js
+++ b/core/l10n/eu.js
@@ -106,8 +106,6 @@ OC.L10N.register(
"Expiration" : "Iraungitzea",
"Expiration date" : "Muga data",
"Choose a password for the public link" : "Aukeratu pasahitz bat esteka publikorako",
- "Sending ..." : "Bidaltzen ...",
- "Email sent" : "Eposta bidalia",
"Resharing is not allowed" : "Berriz elkarbanatzea ez dago baimendua",
"Share link" : "Elkarbanatu lotura",
"Link" : "Esteka",
@@ -116,6 +114,8 @@ OC.L10N.register(
"Allow editing" : "Baimendu editatzea",
"Email link to person" : "Postaz bidali lotura ",
"Send" : "Bidali",
+ "Sending ..." : "Bidaltzen ...",
+ "Email sent" : "Eposta bidalia",
"Shared with you and the group {group} by {owner}" : "{owner}-k zu eta {group} taldearekin elkarbanatuta",
"Shared with you by {owner}" : "{owner}-k zurekin elkarbanatuta",
"group" : "taldea",
diff --git a/core/l10n/eu.json b/core/l10n/eu.json
index 712b41544f6..0e24727650f 100644
--- a/core/l10n/eu.json
+++ b/core/l10n/eu.json
@@ -104,8 +104,6 @@
"Expiration" : "Iraungitzea",
"Expiration date" : "Muga data",
"Choose a password for the public link" : "Aukeratu pasahitz bat esteka publikorako",
- "Sending ..." : "Bidaltzen ...",
- "Email sent" : "Eposta bidalia",
"Resharing is not allowed" : "Berriz elkarbanatzea ez dago baimendua",
"Share link" : "Elkarbanatu lotura",
"Link" : "Esteka",
@@ -114,6 +112,8 @@
"Allow editing" : "Baimendu editatzea",
"Email link to person" : "Postaz bidali lotura ",
"Send" : "Bidali",
+ "Sending ..." : "Bidaltzen ...",
+ "Email sent" : "Eposta bidalia",
"Shared with you and the group {group} by {owner}" : "{owner}-k zu eta {group} taldearekin elkarbanatuta",
"Shared with you by {owner}" : "{owner}-k zurekin elkarbanatuta",
"group" : "taldea",
diff --git a/core/l10n/fa.js b/core/l10n/fa.js
index a479055304d..c7b65e617d0 100644
--- a/core/l10n/fa.js
+++ b/core/l10n/fa.js
@@ -114,8 +114,6 @@ OC.L10N.register(
"Expiration" : "تاریخ انقضا",
"Expiration date" : "تاریخ انقضا",
"Choose a password for the public link" : "انتخاب رمز برای لینک عمومی",
- "Sending ..." : "درحال ارسال ...",
- "Email sent" : "ایمیل ارسال شد",
"Resharing is not allowed" : "اشتراک گذاری مجدد مجاز نمی باشد",
"Share link" : "اشتراک گذاشتن لینک",
"Link" : "لینک",
@@ -124,6 +122,8 @@ OC.L10N.register(
"Allow editing" : "اجازه‌ی ویرایش",
"Email link to person" : "پیوند ایمیل برای شخص.",
"Send" : "ارسال",
+ "Sending ..." : "درحال ارسال ...",
+ "Email sent" : "ایمیل ارسال شد",
"Shared with you and the group {group} by {owner}" : "به اشتراک گذاشته شده با شما و گروه {گروه} توسط {دارنده}",
"Shared with you by {owner}" : "به اشتراک گذاشته شده با شما توسط { دارنده}",
"group" : "گروه",
diff --git a/core/l10n/fa.json b/core/l10n/fa.json
index c88152e61aa..c31b48ee42f 100644
--- a/core/l10n/fa.json
+++ b/core/l10n/fa.json
@@ -112,8 +112,6 @@
"Expiration" : "تاریخ انقضا",
"Expiration date" : "تاریخ انقضا",
"Choose a password for the public link" : "انتخاب رمز برای لینک عمومی",
- "Sending ..." : "درحال ارسال ...",
- "Email sent" : "ایمیل ارسال شد",
"Resharing is not allowed" : "اشتراک گذاری مجدد مجاز نمی باشد",
"Share link" : "اشتراک گذاشتن لینک",
"Link" : "لینک",
@@ -122,6 +120,8 @@
"Allow editing" : "اجازه‌ی ویرایش",
"Email link to person" : "پیوند ایمیل برای شخص.",
"Send" : "ارسال",
+ "Sending ..." : "درحال ارسال ...",
+ "Email sent" : "ایمیل ارسال شد",
"Shared with you and the group {group} by {owner}" : "به اشتراک گذاشته شده با شما و گروه {گروه} توسط {دارنده}",
"Shared with you by {owner}" : "به اشتراک گذاشته شده با شما توسط { دارنده}",
"group" : "گروه",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index 166bf75a6f6..6ff9ea70572 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -27,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Suosituksen poisto virhe",
"Couldn't send mail to following users: %s " : "Sähköpostin lähetys seuraaville käyttäjille epäonnistui: %s",
"Preparing update" : "Valmistellaan päivitystä",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Käytä komentorivipäivitintä, koska automaattinen päivitys on estetty config.php-asetustiedostossa.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Tarkistetaan taulua %s",
"Turned on maintenance mode" : "Siirrytty huoltotilaan",
@@ -97,6 +98,7 @@ OC.L10N.register(
"Dec." : "Joulu",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Eheystarkistus tuotti ongelmia. Lisätietoja…</a>",
"Settings" : "Asetukset",
+ "Problem loading page, reloading in 5 seconds" : "Ongelma sivun lataamisessa, päivitetään 5 sekunnin kuluttua",
"Saving..." : "Tallennetaan...",
"Dismiss" : "Hylkää",
"seconds ago" : "sekuntia sitten",
@@ -144,8 +146,6 @@ OC.L10N.register(
"Expiration" : "Erääntyminen",
"Expiration date" : "Päättymispäivä",
"Choose a password for the public link" : "Valitse salasana julkiselle linkille",
- "Sending ..." : "Lähetetään...",
- "Email sent" : "Sähköposti lähetetty",
"Resharing is not allowed" : "Jakaminen uudelleen ei ole salittu",
"Share link" : "Jaa linkki",
"Link" : "Linkki",
@@ -154,6 +154,9 @@ OC.L10N.register(
"Allow editing" : "Salli muokkaus",
"Email link to person" : "Lähetä linkki sähköpostitse",
"Send" : "Lähetä",
+ "Sending ..." : "Lähetetään...",
+ "Email sent" : "Sähköposti lähetetty",
+ "Send link via email" : "Lähetä linkki sähköpostitse",
"Shared with you and the group {group} by {owner}" : "Jaettu sinun ja ryhmän {group} kanssa käyttäjän {owner} toimesta",
"Shared with you by {owner}" : "Jaettu kanssasi käyttäjän {owner} toimesta",
"group" : "ryhmä",
@@ -296,6 +299,8 @@ OC.L10N.register(
"Start update" : "Käynnistä päivitys",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Välttääksesi aikakatkaisuja suurikokoisten asennusten kanssa, voit suorittaa vaihtoehtoisesti seuraavan komennon asennushakemistossa:",
"Detailed logs" : "Yksityiskohtainen loki",
+ "Update needed" : "Päivitys vaaditaan",
+ "Please use the command line updater because you have a big instance." : "Käytä komentorivipäivitintä, koska käyttämäsi ownCloud on sen verran suuri.",
"This %s instance is currently in maintenance mode, which may take a while." : "Tämä %s-instanssi on parhaillaan huoltotilassa, huollossa saattaa kestää hetki.",
"This page will refresh itself when the %s instance is available again." : "Tämä sivu päivittää itsensä, kun %s on jälleen käytettävissä."
},
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index 7cc34482005..3f93989b1eb 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -25,6 +25,7 @@
"Error unfavoriting" : "Suosituksen poisto virhe",
"Couldn't send mail to following users: %s " : "Sähköpostin lähetys seuraaville käyttäjille epäonnistui: %s",
"Preparing update" : "Valmistellaan päivitystä",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Käytä komentorivipäivitintä, koska automaattinen päivitys on estetty config.php-asetustiedostossa.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Tarkistetaan taulua %s",
"Turned on maintenance mode" : "Siirrytty huoltotilaan",
@@ -95,6 +96,7 @@
"Dec." : "Joulu",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Eheystarkistus tuotti ongelmia. Lisätietoja…</a>",
"Settings" : "Asetukset",
+ "Problem loading page, reloading in 5 seconds" : "Ongelma sivun lataamisessa, päivitetään 5 sekunnin kuluttua",
"Saving..." : "Tallennetaan...",
"Dismiss" : "Hylkää",
"seconds ago" : "sekuntia sitten",
@@ -142,8 +144,6 @@
"Expiration" : "Erääntyminen",
"Expiration date" : "Päättymispäivä",
"Choose a password for the public link" : "Valitse salasana julkiselle linkille",
- "Sending ..." : "Lähetetään...",
- "Email sent" : "Sähköposti lähetetty",
"Resharing is not allowed" : "Jakaminen uudelleen ei ole salittu",
"Share link" : "Jaa linkki",
"Link" : "Linkki",
@@ -152,6 +152,9 @@
"Allow editing" : "Salli muokkaus",
"Email link to person" : "Lähetä linkki sähköpostitse",
"Send" : "Lähetä",
+ "Sending ..." : "Lähetetään...",
+ "Email sent" : "Sähköposti lähetetty",
+ "Send link via email" : "Lähetä linkki sähköpostitse",
"Shared with you and the group {group} by {owner}" : "Jaettu sinun ja ryhmän {group} kanssa käyttäjän {owner} toimesta",
"Shared with you by {owner}" : "Jaettu kanssasi käyttäjän {owner} toimesta",
"group" : "ryhmä",
@@ -294,6 +297,8 @@
"Start update" : "Käynnistä päivitys",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Välttääksesi aikakatkaisuja suurikokoisten asennusten kanssa, voit suorittaa vaihtoehtoisesti seuraavan komennon asennushakemistossa:",
"Detailed logs" : "Yksityiskohtainen loki",
+ "Update needed" : "Päivitys vaaditaan",
+ "Please use the command line updater because you have a big instance." : "Käytä komentorivipäivitintä, koska käyttämäsi ownCloud on sen verran suuri.",
"This %s instance is currently in maintenance mode, which may take a while." : "Tämä %s-instanssi on parhaillaan huoltotilassa, huollossa saattaa kestää hetki.",
"This page will refresh itself when the %s instance is available again." : "Tämä sivu päivittää itsensä, kun %s on jälleen käytettävissä."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index 8f333a1e23e..76ee7b7a268 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -95,6 +95,7 @@ OC.L10N.register(
"Dec." : "Déc.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Il y a eu des problèmes à la vérification d’intégrité du code. Plus d'infos...</a>",
"Settings" : "Paramètres",
+ "Problem loading page, reloading in 5 seconds" : "Problème de chargement de la page , actualisation dans 5 secondes",
"Saving..." : "Enregistrement…",
"Dismiss" : "Ignorer",
"seconds ago" : "à l'instant",
@@ -150,8 +151,6 @@ OC.L10N.register(
"Expiration" : "Expiration",
"Expiration date" : "Date d'expiration",
"Choose a password for the public link" : "Choisissez un mot de passe pour le lien public",
- "Sending ..." : "Envoi…",
- "Email sent" : "Courriel envoyé",
"Resharing is not allowed" : "Le repartage n'est pas autorisé",
"Share link" : "Partager par lien public",
"Link" : "Lien",
@@ -160,6 +159,9 @@ OC.L10N.register(
"Allow editing" : "Permettre la modification",
"Email link to person" : "Envoyer le lien par courriel",
"Send" : "Envoyer",
+ "Sending ..." : "Envoi…",
+ "Email sent" : "Courriel envoyé",
+ "Send link via email" : "Envoyer le lien par mail",
"Shared with you and the group {group} by {owner}" : "Partagé avec vous et le groupe {group} par {owner}",
"Shared with you by {owner}" : "Partagé avec vous par {owner}",
"group" : "groupe",
@@ -210,6 +212,7 @@ OC.L10N.register(
"new" : "Nouveau ",
"_download %n file_::_download %n files_" : ["Télécharger %n fichier","Télécharger %n fichiers"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "La mise à jour est en cours. Selon la configuration, le fait de quitter cette page peut entraîner l'interruption de la procédure.",
+ "Updating to {version}" : "En cours de mise à jour vers la version {version}",
"An error occurred." : "Une erreur est survenue.",
"Please reload the page." : "Veuillez recharger la page.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "La mise à jour a échoué. Pour plus d'informations <a href=\"{url}\">consultez notre publication sur le forum</a> à propos de ce problème.",
@@ -302,6 +305,7 @@ OC.L10N.register(
"Start update" : "Démarrer la mise à jour",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Afin d'éviter les timeouts avec les installations de volume conséquent, vous pouvez exécuter la commande suivante depuis le répertoire d'installation :",
"Detailed logs" : "Journaux détaillés",
+ "Update needed" : "Mise à jour nécessaire",
"This %s instance is currently in maintenance mode, which may take a while." : "Cette instance de %s est en cours de maintenance, cela peut prendre du temps.",
"This page will refresh itself when the %s instance is available again." : "Cette page se rafraîchira d'elle-même lorsque l'instance %s sera à nouveau disponible."
},
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index 64f7312dd35..3bfa9a1ba2a 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -93,6 +93,7 @@
"Dec." : "Déc.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Il y a eu des problèmes à la vérification d’intégrité du code. Plus d'infos...</a>",
"Settings" : "Paramètres",
+ "Problem loading page, reloading in 5 seconds" : "Problème de chargement de la page , actualisation dans 5 secondes",
"Saving..." : "Enregistrement…",
"Dismiss" : "Ignorer",
"seconds ago" : "à l'instant",
@@ -148,8 +149,6 @@
"Expiration" : "Expiration",
"Expiration date" : "Date d'expiration",
"Choose a password for the public link" : "Choisissez un mot de passe pour le lien public",
- "Sending ..." : "Envoi…",
- "Email sent" : "Courriel envoyé",
"Resharing is not allowed" : "Le repartage n'est pas autorisé",
"Share link" : "Partager par lien public",
"Link" : "Lien",
@@ -158,6 +157,9 @@
"Allow editing" : "Permettre la modification",
"Email link to person" : "Envoyer le lien par courriel",
"Send" : "Envoyer",
+ "Sending ..." : "Envoi…",
+ "Email sent" : "Courriel envoyé",
+ "Send link via email" : "Envoyer le lien par mail",
"Shared with you and the group {group} by {owner}" : "Partagé avec vous et le groupe {group} par {owner}",
"Shared with you by {owner}" : "Partagé avec vous par {owner}",
"group" : "groupe",
@@ -208,6 +210,7 @@
"new" : "Nouveau ",
"_download %n file_::_download %n files_" : ["Télécharger %n fichier","Télécharger %n fichiers"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "La mise à jour est en cours. Selon la configuration, le fait de quitter cette page peut entraîner l'interruption de la procédure.",
+ "Updating to {version}" : "En cours de mise à jour vers la version {version}",
"An error occurred." : "Une erreur est survenue.",
"Please reload the page." : "Veuillez recharger la page.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "La mise à jour a échoué. Pour plus d'informations <a href=\"{url}\">consultez notre publication sur le forum</a> à propos de ce problème.",
@@ -300,6 +303,7 @@
"Start update" : "Démarrer la mise à jour",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Afin d'éviter les timeouts avec les installations de volume conséquent, vous pouvez exécuter la commande suivante depuis le répertoire d'installation :",
"Detailed logs" : "Journaux détaillés",
+ "Update needed" : "Mise à jour nécessaire",
"This %s instance is currently in maintenance mode, which may take a while." : "Cette instance de %s est en cours de maintenance, cela peut prendre du temps.",
"This page will refresh itself when the %s instance is available again." : "Cette page se rafraîchira d'elle-même lorsque l'instance %s sera à nouveau disponible."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index af7f1fdc32b..f6c7ee96918 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -125,8 +125,6 @@ OC.L10N.register(
"Expiration" : "Caducidade",
"Expiration date" : "Data de caducidade",
"Choose a password for the public link" : "Escolla un contrasinal para a ligazón pública",
- "Sending ..." : "Enviando...",
- "Email sent" : "Correo enviado",
"Resharing is not allowed" : "Non se permite volver compartir",
"Share link" : "Ligazón para compartir",
"Link" : "Ligazón",
@@ -135,6 +133,8 @@ OC.L10N.register(
"Allow editing" : "Permitir a edición",
"Email link to person" : "Enviar ligazón por correo",
"Send" : "Enviar",
+ "Sending ..." : "Enviando...",
+ "Email sent" : "Correo enviado",
"Shared with you and the group {group} by {owner}" : "Compartido con vostede e co grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido con vostede por {owner}",
"group" : "grupo",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index aee11d6f7f5..38fae1bf521 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -123,8 +123,6 @@
"Expiration" : "Caducidade",
"Expiration date" : "Data de caducidade",
"Choose a password for the public link" : "Escolla un contrasinal para a ligazón pública",
- "Sending ..." : "Enviando...",
- "Email sent" : "Correo enviado",
"Resharing is not allowed" : "Non se permite volver compartir",
"Share link" : "Ligazón para compartir",
"Link" : "Ligazón",
@@ -133,6 +131,8 @@
"Allow editing" : "Permitir a edición",
"Email link to person" : "Enviar ligazón por correo",
"Send" : "Enviar",
+ "Sending ..." : "Enviando...",
+ "Email sent" : "Correo enviado",
"Shared with you and the group {group} by {owner}" : "Compartido con vostede e co grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartido con vostede por {owner}",
"group" : "grupo",
diff --git a/core/l10n/he.js b/core/l10n/he.js
index 79a5a495fc5..317cd79a835 100644
--- a/core/l10n/he.js
+++ b/core/l10n/he.js
@@ -142,8 +142,6 @@ OC.L10N.register(
"Expiration" : "תפוגה",
"Expiration date" : "תאריך התפוגה",
"Choose a password for the public link" : "בחירת סיסמא לקישור ציבורי",
- "Sending ..." : "מתבצעת שליחה ...",
- "Email sent" : "הודעת הדוא״ל נשלחה",
"Resharing is not allowed" : "אסור לעשות שיתוף מחדש",
"Share link" : "קישור לשיתוף",
"Link" : "קישור",
@@ -152,6 +150,8 @@ OC.L10N.register(
"Allow editing" : "אישור עריכה",
"Email link to person" : "שליחת קישור בדוא״ל למשתמש",
"Send" : "שליחה",
+ "Sending ..." : "מתבצעת שליחה ...",
+ "Email sent" : "הודעת הדוא״ל נשלחה",
"Shared with you and the group {group} by {owner}" : "שותף אתך ועם הקבוצה {group} שבבעלות {owner}",
"Shared with you by {owner}" : "שותף אתך על ידי {owner}",
"group" : "קבוצה",
diff --git a/core/l10n/he.json b/core/l10n/he.json
index 9017d60636b..f94421b3553 100644
--- a/core/l10n/he.json
+++ b/core/l10n/he.json
@@ -140,8 +140,6 @@
"Expiration" : "תפוגה",
"Expiration date" : "תאריך התפוגה",
"Choose a password for the public link" : "בחירת סיסמא לקישור ציבורי",
- "Sending ..." : "מתבצעת שליחה ...",
- "Email sent" : "הודעת הדוא״ל נשלחה",
"Resharing is not allowed" : "אסור לעשות שיתוף מחדש",
"Share link" : "קישור לשיתוף",
"Link" : "קישור",
@@ -150,6 +148,8 @@
"Allow editing" : "אישור עריכה",
"Email link to person" : "שליחת קישור בדוא״ל למשתמש",
"Send" : "שליחה",
+ "Sending ..." : "מתבצעת שליחה ...",
+ "Email sent" : "הודעת הדוא״ל נשלחה",
"Shared with you and the group {group} by {owner}" : "שותף אתך ועם הקבוצה {group} שבבעלות {owner}",
"Shared with you by {owner}" : "שותף אתך על ידי {owner}",
"group" : "קבוצה",
diff --git a/core/l10n/hi.js b/core/l10n/hi.js
index df717fd1ac5..ee8f248c4e6 100644
--- a/core/l10n/hi.js
+++ b/core/l10n/hi.js
@@ -24,10 +24,10 @@ OC.L10N.register(
"Saving..." : "सहेज रहे हैं...",
"Cancel" : "रद्द करें ",
"Error" : "त्रुटि",
- "Sending ..." : "भेजा जा रहा है",
- "Email sent" : "ईमेल भेज दिया गया है ",
"Password" : "पासवर्ड",
"Send" : "भेजें",
+ "Sending ..." : "भेजा जा रहा है",
+ "Email sent" : "ईमेल भेज दिया गया है ",
"Share" : "साझा करें",
"Warning" : "चेतावनी ",
"Add" : "डाले",
diff --git a/core/l10n/hi.json b/core/l10n/hi.json
index 877b65381a7..49231ad0df9 100644
--- a/core/l10n/hi.json
+++ b/core/l10n/hi.json
@@ -22,10 +22,10 @@
"Saving..." : "सहेज रहे हैं...",
"Cancel" : "रद्द करें ",
"Error" : "त्रुटि",
- "Sending ..." : "भेजा जा रहा है",
- "Email sent" : "ईमेल भेज दिया गया है ",
"Password" : "पासवर्ड",
"Send" : "भेजें",
+ "Sending ..." : "भेजा जा रहा है",
+ "Email sent" : "ईमेल भेज दिया गया है ",
"Share" : "साझा करें",
"Warning" : "चेतावनी ",
"Add" : "डाले",
diff --git a/core/l10n/hr.js b/core/l10n/hr.js
index ff1e220ae68..d2c6c1757f2 100644
--- a/core/l10n/hr.js
+++ b/core/l10n/hr.js
@@ -105,8 +105,6 @@ OC.L10N.register(
"Expiration" : "Istjeće",
"Expiration date" : "Datum isteka",
"Choose a password for the public link" : "Odaberite lozinku za javnu vezu",
- "Sending ..." : "Slanje...",
- "Email sent" : "E-pošta poslana",
"Resharing is not allowed" : "Ponovno dijeljenje nije dopušteno",
"Share link" : "Podijelite vezu",
"Link" : "Poveznica",
@@ -115,6 +113,8 @@ OC.L10N.register(
"Allow editing" : "Omogući uređivanje",
"Email link to person" : "Pošaljite osobi vezu e-poštom",
"Send" : "Pošaljite",
+ "Sending ..." : "Slanje...",
+ "Email sent" : "E-pošta poslana",
"Shared with you and the group {group} by {owner}" : "Dijeljeno s vama i grupom {group} vlasnika {owner}",
"Shared with you by {owner}" : "S vama podijelio {owner}",
"group" : "Grupa",
diff --git a/core/l10n/hr.json b/core/l10n/hr.json
index a42d7c797b0..6b1196c1c08 100644
--- a/core/l10n/hr.json
+++ b/core/l10n/hr.json
@@ -103,8 +103,6 @@
"Expiration" : "Istjeće",
"Expiration date" : "Datum isteka",
"Choose a password for the public link" : "Odaberite lozinku za javnu vezu",
- "Sending ..." : "Slanje...",
- "Email sent" : "E-pošta poslana",
"Resharing is not allowed" : "Ponovno dijeljenje nije dopušteno",
"Share link" : "Podijelite vezu",
"Link" : "Poveznica",
@@ -113,6 +111,8 @@
"Allow editing" : "Omogući uređivanje",
"Email link to person" : "Pošaljite osobi vezu e-poštom",
"Send" : "Pošaljite",
+ "Sending ..." : "Slanje...",
+ "Email sent" : "E-pošta poslana",
"Shared with you and the group {group} by {owner}" : "Dijeljeno s vama i grupom {group} vlasnika {owner}",
"Shared with you by {owner}" : "S vama podijelio {owner}",
"group" : "Grupa",
diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js
index 3d0abfb07ac..992d3f9a4f8 100644
--- a/core/l10n/hu_HU.js
+++ b/core/l10n/hu_HU.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"core",
{
- "Please select a file." : "Kérjük, válasszon egy fájlt.",
+ "Please select a file." : "Kérjük, válasszon ki egy fájlt.",
"File is too big" : "A fájl túl nagy",
"Invalid file provided" : "Érvénytelen fájl van megadva",
"No image or file provided" : "Nincs kép vagy fájl megadva",
@@ -27,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Hiba a kedvencekből törléskor",
"Couldn't send mail to following users: %s " : "Nem sikerült e-mailt küldeni a következő felhasználóknak: %s",
"Preparing update" : "Felkészülés a frissítésre",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Kérjük, a frissítéshez a parancssort használja, mert az automatikus frissítés ki van kapcsolva a config.php-ban.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Tábla ellenőrzése: %s",
"Turned on maintenance mode" : "A karbantartási mód bekapcsolva",
@@ -97,7 +98,9 @@ OC.L10N.register(
"Dec." : "dec.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Problémák vannak a kódintegritás ellenőrzéssel. Bővebb információ…</a>",
"Settings" : "Beállítások",
+ "Problem loading page, reloading in 5 seconds" : "Probléma adódott az oldal betöltése közben, újratöltés 5 másodpercen belül",
"Saving..." : "Mentés...",
+ "Dismiss" : "Elutasít",
"seconds ago" : "pár másodperce",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A jelszó felülírásához a linket e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.",
"Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Az Ön állományai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne.<br />Biztos, hogy folytatni kívánja?",
@@ -127,11 +130,19 @@ OC.L10N.register(
"Good password" : "Jó jelszó",
"Strong password" : "Erős jelszó",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "A webszerver nincs megfelelően beállítva a fájl szinkronizációhoz, mert a WebDAV interfész nem működik.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A webszerver nincs jól beállítva, hogy kiszolgálja a(z) „{url}” hivatkozást. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány tulajdonság, mint pl. külső tárolók felcsatolása, frissítési értesítések, vagy egyéb alkalmazások nem működnek. A fájlok távoli elérése és az e-mail értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden tulajdonságot használni szeretne.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Nincs memória gyorsítótár beállítva. A teljesítmény növelése érdekében kérjük állítsa be a memcache-t, ha elérhető. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom nem olvasható a PHP számára, mely nagy biztonsági probléma. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Jelenleg {version} PHP verziót használ. Javasoljuk, hogy frissítse a PHP verziót, hogy kihasználhassa a <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">teljesítménybeli és a biztonságbeli előnyöket, amiket a PHP csoport kínál</a>, amilyen hamar a disztribúciója támogatja.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézze meg a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Néhány fájl nem felelt meg az integritás ellenőrzésen. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat. (<a href=\"{codeIntegrityDownloadEndpoint}\">Érvénytelen fájlok listája…</a> / <a href=\"{rescanEndpoint}\">Újra ellenőrzés…</a>)",
"Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Az adat könyvtára és a fájljai valószínűleg elérhetőek az internetről, mert a .htaccess fájl nem működik. Erősen ajánlott, hogy úgy állítsa be a webszerverét, hogy az adatkönyvtár ne legyen elérhető az internetről, vagy mozgassa ki az adatokat a webszerver gyökérkönyvtárából.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.",
- "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Nagyon ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\" rel=\"noreferrer\">biztonsági tippek</a> dokumentációban.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Erősen ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
"Shared" : "Megosztott",
"Shared with {recipients}" : "Megosztva ővelük: {recipients}",
"Error" : "Hiba",
@@ -143,16 +154,17 @@ OC.L10N.register(
"Expiration" : "Lejárat",
"Expiration date" : "Lejárati idő",
"Choose a password for the public link" : "Válasszon egy jelszót a nyilvános linkhez",
- "Sending ..." : "Küldés ...",
- "Email sent" : "Az e-mailt elküldtük!",
"Resharing is not allowed" : "Ezt az állományt csak a tulajdonosa oszthatja meg másokkal",
"Share link" : "Megosztás hivatkozással",
- "Link" : "Link",
+ "Link" : "Hivatkozás",
"Password protect" : "Jelszóval védett",
"Password" : "Jelszó",
"Allow editing" : "Szerkesztés engedélyezése",
"Email link to person" : "Hivatkozás elküldése e-mail címre",
"Send" : "Küldés",
+ "Sending ..." : "Küldés ...",
+ "Email sent" : "Az e-mailt elküldtük!",
+ "Send link via email" : "Hivatkozás küldése levélben",
"Shared with you and the group {group} by {owner}" : "{owner} megosztotta Önnel és a(z) {group} csoporttal",
"Shared with you by {owner}" : "{owner} megosztotta Önnel",
"group" : "csoport",
@@ -174,7 +186,7 @@ OC.L10N.register(
"{sharee} (at {server})" : "{sharee} ({server} szerveren)",
"{sharee} (remote)" : "{sharee} (távoli)",
"Share" : "Megosztás",
- "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasznalo@példa.com/owncloud",
+ "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasználó@példa.hu/owncloud",
"Share with users…" : "Megosztás felhasználókkal",
"Share with users, groups or remote users…" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal...",
"Share with users or groups…" : "Megosztás felhasználókkal vagy csoportokkal...",
@@ -188,6 +200,7 @@ OC.L10N.register(
"({scope})" : "({scope})",
"Delete" : "Törlés",
"Rename" : "Átnevezés",
+ "Collaborative tags" : "Címke hozzárendelése",
"The object type is not specified." : "Az objektum típusa nincs megadva.",
"Enter new" : "Új beírása",
"Add" : "Hozzáadás",
@@ -195,7 +208,7 @@ OC.L10N.register(
"Error loading dialog template: {error}" : "Hiba a párbeszédpanel-sablon betöltésekor: {error}",
"No tags selected for deletion." : "Nincs törlésre kijelölt címke.",
"unknown text" : "ismeretlen szöveg",
- "Hello world!" : "Üdv, világ!",
+ "Hello world!" : "Üdv, Világ!",
"sunny" : "napos",
"Hello {name}, the weather is {weather}" : "Üdv {name}, {weather} időnk van",
"Hello {name}" : "Üdv {name}!",
@@ -220,7 +233,7 @@ OC.L10N.register(
"Access forbidden" : "A hozzáférés nem engedélyezett",
"File not found" : "Fájl nem található",
"The specified document has not been found on the server." : "A meghatározott dokumentum nem található a szerveren.",
- "You can click here to return to %s." : "Ide kattintva visszatérhetsz ide: %s.",
+ "You can click here to return to %s." : "Ide kattintva visszatérhet ide: %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Üdvözöljük!\n\nÉrtesítjük, hogy %s megosztotta Önnel a következőt: %s.\nItt nézheti meg: %s\n\n",
"The share will expire on %s." : "A megosztás lejár ekkor: %s.",
"Cheers!" : "Üdv.",
@@ -239,14 +252,15 @@ OC.L10N.register(
"Trace" : "Lekövetés",
"Security warning" : "Biztonsági figyelmeztetés",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Az adatkönyvtár és a benne levő állományok valószínűleg közvetlenül is elérhetők az internetről, mert a .htaccess állomány nem érvényesül.",
- "Create an <strong>admin account</strong>" : "<strong>Rendszergazdai belépés</strong> létrehozása",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "A kiszolgáló megfelelő beállításához kérjük olvassa el a <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentációt</a>.",
+ "Create an <strong>admin account</strong>" : "<strong>Rendszergazdai fiók</strong> létrehozása",
"Username" : "Felhasználónév",
- "Storage & database" : "Tárolás és adatbázis",
+ "Storage & database" : "Tárhely és adatbázis",
"Data folder" : "Adatkönyvtár",
"Configure the database" : "Adatbázis konfigurálása",
"Only %s is available." : "Csak %s érhető el.",
"Install and activate additional PHP modules to choose other database types." : "Telepítse és aktiválja a bővített PHP modulokat, hogy tudjon más adatbázis típust is kiválasztani.",
- "For more details check out the documentation." : "További részletekért kérem ellenőrizze a dokumentációt.",
+ "For more details check out the documentation." : "További részletekért kérjük ellenőrizze a dokumentációt.",
"Database user" : "Adatbázis felhasználónév",
"Database password" : "Adatbázis jelszó",
"Database name" : "Az adatbázis neve",
@@ -261,13 +275,13 @@ OC.L10N.register(
"Need help?" : "Segítségre van szüksége?",
"See the documentation" : "Nézze meg a dokumentációt",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Üdvözöljük!<br /><br />\n\nÉrtesítjük, hogy %s megosztotta Önnel a következőt: <strong>%s</strong><br />\n<a href=\"%s\">Itt nézheti meg.</a><br /><br />",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Az alkalmazás megfelelő működéséhez JavaScript szükséges. Kérjük {linkstart}engedélyezze a JavaScript-et{linkend} és frissítse a lapot.",
- "Log out" : "Kilépés",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Az alkalmazás megfelelő működéséhez JavaScript szükséges. Kérjük, {linkstart}engedélyezze a JavaScript-et{linkend} és frissítse a lapot.",
+ "Log out" : "Kijelentkezés",
"Search" : "Keresés",
"Server side authentication failed!" : "A szerveroldali hitelesítés sikertelen!",
"Please contact your administrator." : "Kérjük, lépjen kapcsolatba a rendszergazdával.",
"An internal error occurred." : "Belső hiba történt.",
- "Please try again or contact your administrator." : "Kérem próbálja újra, vagy vegye fel a kapcsolatot a rendszergazdával.",
+ "Please try again or contact your administrator." : "Kérjük, próbálja meg újra, vagy vegye fel a kapcsolatot a rendszergazdával.",
"Log in" : "Bejelentkezés",
"Wrong password. Reset it?" : "Hibás jelszó. Visszaállítja?",
"Wrong password." : "Hibás jelszó.",
@@ -284,16 +298,20 @@ OC.L10N.register(
"You are accessing the server from an untrusted domain." : "A kiszolgálót nem megbízható domain névvel éri el.",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Kérjük keresse fel a rendszergazdát! Ha ennek a telepítésnek Ön a rendszergazdája, akkor állítsa be a config/config.php állományban a \"trusted_domain\" paramétert! A config/config.sample.php állományban talál példát a beállításra.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "A beállításoktól függően, rendszergazdaként lehetséges, hogy az alábbi gombot is használhatja a domain név megbízhatóvá tételéhez.",
- "Add \"%s\" as trusted domain" : "Adjuk hozzá \"%s\"-t a megbízható domain nevekhez!",
- "App update required" : "Alkalmazás frissítés szükséges",
+ "Add \"%s\" as trusted domain" : "Adjuk hozzá „%s”-t a megbízható domain nevekhez!",
+ "App update required" : "Alkalmazás frissítése szükséges",
"%s will be updated to version %s" : "%s frissítve lesz erre a verzióra: %s",
"These apps will be updated:" : "A következő alkalmazások lesznek frissítve:",
"These incompatible apps will be disabled:" : "A követlező inkompatibilis alkalmazások tiltva lesznek:",
- "The theme %s has been disabled." : "Ez a smink: %s letiltásra került.",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Kérjük gondoskodjon róla, hogy elmentse az adatbázist, a konfigurációs mappa és az adatamappa tartalmát, mielőtt folytatja.",
+ "The theme %s has been disabled." : "%s téma letiltásra került.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Kérjük, gondoskodjon róla, hogy elmentse az adatbázist, a konfigurációs mappa és az adatmappa tartalmát, mielőtt folytatja.",
"Start update" : "A frissítés megkezdése",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Nagyobb telepítések esetén úgy kerülhetők el az időtúllépések, ha inkább a következő parancsot adja ki a telepítési alkönyvtárban:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Nagyobb telepítések esetén úgy kerülhetők el az időtúllépések, hogy inkább a következő parancsot adja ki a telepítési alkönyvtárban:",
+ "Detailed logs" : "Részletezett naplók",
+ "Update needed" : "Frissítés szükséges",
+ "Please use the command line updater because you have a big instance." : "Kérjük, a frissítéshez a parancssort használja, mert nagyobb frissítést készül telepíteni.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Segítségért keresse fel a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentációt</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Ez a %s folyamat éppen karbantartó üzemmódban van, ami eltarthat egy darabig.",
- "This page will refresh itself when the %s instance is available again." : "Ez az oldal frissíteni fogja magát amint a %s példány ismét elérhető."
+ "This page will refresh itself when the %s instance is available again." : "Ez az oldal frissíteni fogja magát amint a(z) %s példány ismét elérhető."
},
"nplurals=2; plural=(n != 1);");
diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json
index f11b0811437..be40792f277 100644
--- a/core/l10n/hu_HU.json
+++ b/core/l10n/hu_HU.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Please select a file." : "Kérjük, válasszon egy fájlt.",
+ "Please select a file." : "Kérjük, válasszon ki egy fájlt.",
"File is too big" : "A fájl túl nagy",
"Invalid file provided" : "Érvénytelen fájl van megadva",
"No image or file provided" : "Nincs kép vagy fájl megadva",
@@ -25,6 +25,7 @@
"Error unfavoriting" : "Hiba a kedvencekből törléskor",
"Couldn't send mail to following users: %s " : "Nem sikerült e-mailt küldeni a következő felhasználóknak: %s",
"Preparing update" : "Felkészülés a frissítésre",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Kérjük, a frissítéshez a parancssort használja, mert az automatikus frissítés ki van kapcsolva a config.php-ban.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Tábla ellenőrzése: %s",
"Turned on maintenance mode" : "A karbantartási mód bekapcsolva",
@@ -95,7 +96,9 @@
"Dec." : "dec.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Problémák vannak a kódintegritás ellenőrzéssel. Bővebb információ…</a>",
"Settings" : "Beállítások",
+ "Problem loading page, reloading in 5 seconds" : "Probléma adódott az oldal betöltése közben, újratöltés 5 másodpercen belül",
"Saving..." : "Mentés...",
+ "Dismiss" : "Elutasít",
"seconds ago" : "pár másodperce",
"The link to reset your password has been sent to your email. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "A jelszó felülírásához a linket e-mailben elküldtük. Ha a levél elfogadható időn belül nem érkezik meg, ellenőrizze a spam/levélszemét mappát.<br>Ha nincs ott, kérdezze meg a helyi rendszergazdát.",
"Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Az Ön állományai titkosítva vannak. Ha nem engedélyezte korábban az adatok visszanyeréséhez szükséges kulcs használatát, akkor a jelszó megváltoztatását követően nem fog hozzáférni az adataihoz. Ha nem biztos abban, hogy mit kellene tennie, akkor kérdezze meg a rendszergazdát, mielőtt továbbmenne.<br />Biztos, hogy folytatni kívánja?",
@@ -125,11 +128,19 @@
"Good password" : "Jó jelszó",
"Strong password" : "Erős jelszó",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "A webszerver nincs megfelelően beállítva a fájl szinkronizációhoz, mert a WebDAV interfész nem működik.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A webszerver nincs jól beállítva, hogy kiszolgálja a(z) „{url}” hivatkozást. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Ennek a szervernek nincs működő internet kapcsolata. Ez azt jelenti, hogy néhány tulajdonság, mint pl. külső tárolók felcsatolása, frissítési értesítések, vagy egyéb alkalmazások nem működnek. A fájlok távoli elérése és az e-mail értesítések is lehet, hogy nem működnek. Ajánlott az internet kapcsolat engedélyezése a szerveren, ha minden tulajdonságot használni szeretne.",
+ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Nincs memória gyorsítótár beállítva. A teljesítmény növelése érdekében kérjük állítsa be a memcache-t, ha elérhető. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom nem olvasható a PHP számára, mely nagy biztonsági probléma. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Jelenleg {version} PHP verziót használ. Javasoljuk, hogy frissítse a PHP verziót, hogy kihasználhassa a <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">teljesítménybeli és a biztonságbeli előnyöket, amiket a PHP csoport kínál</a>, amilyen hamar a disztribúciója támogatja.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A fordított proxy fejlécek konfigurációs beállításai helytelenek, vagy egy megbízható proxy-ból próbálja az ownCloud-ot elérni. Ha nem megbízható proxy-ból próbálja elérni az ownCloud-ot, akkor ez egy biztonsági probléma, a támadó az ownCloud számára látható IP cím csalást tud végrehajtani. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached be van konfigurálva gyorsítótárnak, de rossz \"memcache\" PHP modul van telepítve. \\OC\\Memcache\\Memcached csak a \"memcached\"-t támogatja, és nem a \"memcache\"-t. Kérjük, nézze meg a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki oldalt a modulokkal kapcsolatban</a>.",
+ "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Néhány fájl nem felelt meg az integritás ellenőrzésen. Bővebb információt a <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentációban</a> találhat. (<a href=\"{codeIntegrityDownloadEndpoint}\">Érvénytelen fájlok listája…</a> / <a href=\"{rescanEndpoint}\">Újra ellenőrzés…</a>)",
"Error occurred while checking server setup" : "Hiba történt a szerver beállítások ellenőrzése közben",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Az adat könyvtára és a fájljai valószínűleg elérhetőek az internetről, mert a .htaccess fájl nem működik. Erősen ajánlott, hogy úgy állítsa be a webszerverét, hogy az adatkönyvtár ne legyen elérhető az internetről, vagy mozgassa ki az adatokat a webszerver gyökérkönyvtárából.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "A \"{header}\" HTTP fejléc nincs beállítva, hogy megegyezzen az elvárttal \"{expected}\". Ez egy potenciális biztonsági kockázat és kérjük, hogy változtassa meg a beállításokat.",
- "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Nagyon ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
+ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "A \"Strict-Transport-Security\" HTTP fejléc nincs beállítva hogy \"{seconds}\" másodpercig tartson. Biztonsági okokból ajánljuk, hogy engedélyezze a HSTS, ahogyan ezt részletezzük a <a href=\"{docUrl}\" rel=\"noreferrer\">biztonsági tippek</a> dokumentációban.",
+ "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Jelenleg HTTP-vel éri el a weboldalt. Erősen ajánlott a HTTPS konfiguráció használata ehelyett, ahogyan ezt részleteztük a <a href=\"{docUrl}\">biztonsági tippek</a> dokumentációban",
"Shared" : "Megosztott",
"Shared with {recipients}" : "Megosztva ővelük: {recipients}",
"Error" : "Hiba",
@@ -141,16 +152,17 @@
"Expiration" : "Lejárat",
"Expiration date" : "Lejárati idő",
"Choose a password for the public link" : "Válasszon egy jelszót a nyilvános linkhez",
- "Sending ..." : "Küldés ...",
- "Email sent" : "Az e-mailt elküldtük!",
"Resharing is not allowed" : "Ezt az állományt csak a tulajdonosa oszthatja meg másokkal",
"Share link" : "Megosztás hivatkozással",
- "Link" : "Link",
+ "Link" : "Hivatkozás",
"Password protect" : "Jelszóval védett",
"Password" : "Jelszó",
"Allow editing" : "Szerkesztés engedélyezése",
"Email link to person" : "Hivatkozás elküldése e-mail címre",
"Send" : "Küldés",
+ "Sending ..." : "Küldés ...",
+ "Email sent" : "Az e-mailt elküldtük!",
+ "Send link via email" : "Hivatkozás küldése levélben",
"Shared with you and the group {group} by {owner}" : "{owner} megosztotta Önnel és a(z) {group} csoporttal",
"Shared with you by {owner}" : "{owner} megosztotta Önnel",
"group" : "csoport",
@@ -172,7 +184,7 @@
"{sharee} (at {server})" : "{sharee} ({server} szerveren)",
"{sharee} (remote)" : "{sharee} (távoli)",
"Share" : "Megosztás",
- "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasznalo@példa.com/owncloud",
+ "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Megosztás más ownCloud szerverekkel, a következő formátum használatával felhasználó@példa.hu/owncloud",
"Share with users…" : "Megosztás felhasználókkal",
"Share with users, groups or remote users…" : "Megosztás felhasználókkal, csoportokkal vagy távoli felhasználókkal...",
"Share with users or groups…" : "Megosztás felhasználókkal vagy csoportokkal...",
@@ -186,6 +198,7 @@
"({scope})" : "({scope})",
"Delete" : "Törlés",
"Rename" : "Átnevezés",
+ "Collaborative tags" : "Címke hozzárendelése",
"The object type is not specified." : "Az objektum típusa nincs megadva.",
"Enter new" : "Új beírása",
"Add" : "Hozzáadás",
@@ -193,7 +206,7 @@
"Error loading dialog template: {error}" : "Hiba a párbeszédpanel-sablon betöltésekor: {error}",
"No tags selected for deletion." : "Nincs törlésre kijelölt címke.",
"unknown text" : "ismeretlen szöveg",
- "Hello world!" : "Üdv, világ!",
+ "Hello world!" : "Üdv, Világ!",
"sunny" : "napos",
"Hello {name}, the weather is {weather}" : "Üdv {name}, {weather} időnk van",
"Hello {name}" : "Üdv {name}!",
@@ -218,7 +231,7 @@
"Access forbidden" : "A hozzáférés nem engedélyezett",
"File not found" : "Fájl nem található",
"The specified document has not been found on the server." : "A meghatározott dokumentum nem található a szerveren.",
- "You can click here to return to %s." : "Ide kattintva visszatérhetsz ide: %s.",
+ "You can click here to return to %s." : "Ide kattintva visszatérhet ide: %s.",
"Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Üdvözöljük!\n\nÉrtesítjük, hogy %s megosztotta Önnel a következőt: %s.\nItt nézheti meg: %s\n\n",
"The share will expire on %s." : "A megosztás lejár ekkor: %s.",
"Cheers!" : "Üdv.",
@@ -237,14 +250,15 @@
"Trace" : "Lekövetés",
"Security warning" : "Biztonsági figyelmeztetés",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Az adatkönyvtár és a benne levő állományok valószínűleg közvetlenül is elérhetők az internetről, mert a .htaccess állomány nem érvényesül.",
- "Create an <strong>admin account</strong>" : "<strong>Rendszergazdai belépés</strong> létrehozása",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "A kiszolgáló megfelelő beállításához kérjük olvassa el a <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentációt</a>.",
+ "Create an <strong>admin account</strong>" : "<strong>Rendszergazdai fiók</strong> létrehozása",
"Username" : "Felhasználónév",
- "Storage & database" : "Tárolás és adatbázis",
+ "Storage & database" : "Tárhely és adatbázis",
"Data folder" : "Adatkönyvtár",
"Configure the database" : "Adatbázis konfigurálása",
"Only %s is available." : "Csak %s érhető el.",
"Install and activate additional PHP modules to choose other database types." : "Telepítse és aktiválja a bővített PHP modulokat, hogy tudjon más adatbázis típust is kiválasztani.",
- "For more details check out the documentation." : "További részletekért kérem ellenőrizze a dokumentációt.",
+ "For more details check out the documentation." : "További részletekért kérjük ellenőrizze a dokumentációt.",
"Database user" : "Adatbázis felhasználónév",
"Database password" : "Adatbázis jelszó",
"Database name" : "Az adatbázis neve",
@@ -259,13 +273,13 @@
"Need help?" : "Segítségre van szüksége?",
"See the documentation" : "Nézze meg a dokumentációt",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Üdvözöljük!<br /><br />\n\nÉrtesítjük, hogy %s megosztotta Önnel a következőt: <strong>%s</strong><br />\n<a href=\"%s\">Itt nézheti meg.</a><br /><br />",
- "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Az alkalmazás megfelelő működéséhez JavaScript szükséges. Kérjük {linkstart}engedélyezze a JavaScript-et{linkend} és frissítse a lapot.",
- "Log out" : "Kilépés",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Az alkalmazás megfelelő működéséhez JavaScript szükséges. Kérjük, {linkstart}engedélyezze a JavaScript-et{linkend} és frissítse a lapot.",
+ "Log out" : "Kijelentkezés",
"Search" : "Keresés",
"Server side authentication failed!" : "A szerveroldali hitelesítés sikertelen!",
"Please contact your administrator." : "Kérjük, lépjen kapcsolatba a rendszergazdával.",
"An internal error occurred." : "Belső hiba történt.",
- "Please try again or contact your administrator." : "Kérem próbálja újra, vagy vegye fel a kapcsolatot a rendszergazdával.",
+ "Please try again or contact your administrator." : "Kérjük, próbálja meg újra, vagy vegye fel a kapcsolatot a rendszergazdával.",
"Log in" : "Bejelentkezés",
"Wrong password. Reset it?" : "Hibás jelszó. Visszaállítja?",
"Wrong password." : "Hibás jelszó.",
@@ -282,16 +296,20 @@
"You are accessing the server from an untrusted domain." : "A kiszolgálót nem megbízható domain névvel éri el.",
"Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domains\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Kérjük keresse fel a rendszergazdát! Ha ennek a telepítésnek Ön a rendszergazdája, akkor állítsa be a config/config.php állományban a \"trusted_domain\" paramétert! A config/config.sample.php állományban talál példát a beállításra.",
"Depending on your configuration, as an administrator you might also be able to use the button below to trust this domain." : "A beállításoktól függően, rendszergazdaként lehetséges, hogy az alábbi gombot is használhatja a domain név megbízhatóvá tételéhez.",
- "Add \"%s\" as trusted domain" : "Adjuk hozzá \"%s\"-t a megbízható domain nevekhez!",
- "App update required" : "Alkalmazás frissítés szükséges",
+ "Add \"%s\" as trusted domain" : "Adjuk hozzá „%s”-t a megbízható domain nevekhez!",
+ "App update required" : "Alkalmazás frissítése szükséges",
"%s will be updated to version %s" : "%s frissítve lesz erre a verzióra: %s",
"These apps will be updated:" : "A következő alkalmazások lesznek frissítve:",
"These incompatible apps will be disabled:" : "A követlező inkompatibilis alkalmazások tiltva lesznek:",
- "The theme %s has been disabled." : "Ez a smink: %s letiltásra került.",
- "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Kérjük gondoskodjon róla, hogy elmentse az adatbázist, a konfigurációs mappa és az adatamappa tartalmát, mielőtt folytatja.",
+ "The theme %s has been disabled." : "%s téma letiltásra került.",
+ "Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Kérjük, gondoskodjon róla, hogy elmentse az adatbázist, a konfigurációs mappa és az adatmappa tartalmát, mielőtt folytatja.",
"Start update" : "A frissítés megkezdése",
- "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Nagyobb telepítések esetén úgy kerülhetők el az időtúllépések, ha inkább a következő parancsot adja ki a telepítési alkönyvtárban:",
+ "To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Nagyobb telepítések esetén úgy kerülhetők el az időtúllépések, hogy inkább a következő parancsot adja ki a telepítési alkönyvtárban:",
+ "Detailed logs" : "Részletezett naplók",
+ "Update needed" : "Frissítés szükséges",
+ "Please use the command line updater because you have a big instance." : "Kérjük, a frissítéshez a parancssort használja, mert nagyobb frissítést készül telepíteni.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Segítségért keresse fel a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentációt</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Ez a %s folyamat éppen karbantartó üzemmódban van, ami eltarthat egy darabig.",
- "This page will refresh itself when the %s instance is available again." : "Ez az oldal frissíteni fogja magát amint a %s példány ismét elérhető."
+ "This page will refresh itself when the %s instance is available again." : "Ez az oldal frissíteni fogja magát amint a(z) %s példány ismét elérhető."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/core/l10n/ia.js b/core/l10n/ia.js
index 28bc78f8dfc..a300c477831 100644
--- a/core/l10n/ia.js
+++ b/core/l10n/ia.js
@@ -86,14 +86,14 @@ OC.L10N.register(
"Set expiration date" : "Fixa data de expiration",
"Expiration date" : "Data de expiration",
"Choose a password for the public link" : "Selige un contrasigno pro le ligamine public",
- "Sending ..." : "Inviante ...",
- "Email sent" : "Message de e-posta inviate",
"Resharing is not allowed" : "Il non es permittite compartir plus que un vice",
"Share link" : "Compartir ligamine",
"Password protect" : "Protegite per contrasigno",
"Password" : "Contrasigno",
"Email link to person" : "Ligamine de e-posta a persona",
"Send" : "Invia",
+ "Sending ..." : "Inviante ...",
+ "Email sent" : "Message de e-posta inviate",
"Shared with you and the group {group} by {owner}" : "Compartite con te e le gruppo {group} per {owner}",
"Shared with you by {owner}" : "Compartite con te per {owner} ",
"group" : "gruppo",
diff --git a/core/l10n/ia.json b/core/l10n/ia.json
index ea546d0bdcd..9874e125665 100644
--- a/core/l10n/ia.json
+++ b/core/l10n/ia.json
@@ -84,14 +84,14 @@
"Set expiration date" : "Fixa data de expiration",
"Expiration date" : "Data de expiration",
"Choose a password for the public link" : "Selige un contrasigno pro le ligamine public",
- "Sending ..." : "Inviante ...",
- "Email sent" : "Message de e-posta inviate",
"Resharing is not allowed" : "Il non es permittite compartir plus que un vice",
"Share link" : "Compartir ligamine",
"Password protect" : "Protegite per contrasigno",
"Password" : "Contrasigno",
"Email link to person" : "Ligamine de e-posta a persona",
"Send" : "Invia",
+ "Sending ..." : "Inviante ...",
+ "Email sent" : "Message de e-posta inviate",
"Shared with you and the group {group} by {owner}" : "Compartite con te e le gruppo {group} per {owner}",
"Shared with you by {owner}" : "Compartite con te per {owner} ",
"group" : "gruppo",
diff --git a/core/l10n/id.js b/core/l10n/id.js
index 623fb0dc5d3..76d0fff6006 100644
--- a/core/l10n/id.js
+++ b/core/l10n/id.js
@@ -135,8 +135,6 @@ OC.L10N.register(
"Expiration" : "Kedaluwarsa",
"Expiration date" : "Tanggal kedaluwarsa",
"Choose a password for the public link" : "Tetapkan sandi untuk tautan publik",
- "Sending ..." : "Mengirim ...",
- "Email sent" : "Email terkirim",
"Resharing is not allowed" : "Berbagi ulang tidak diizinkan",
"Share link" : "Bagikan tautan",
"Link" : "Tautan",
@@ -145,6 +143,8 @@ OC.L10N.register(
"Allow editing" : "Izinkan penyuntingan",
"Email link to person" : "Emailkan tautan ini ke orang",
"Send" : "Kirim",
+ "Sending ..." : "Mengirim ...",
+ "Email sent" : "Email terkirim",
"Shared with you and the group {group} by {owner}" : "Dibagikan dengan anda dan grup {group} oleh {owner}",
"Shared with you by {owner}" : "Dibagikan dengan anda oleh {owner}",
"group" : "grup",
diff --git a/core/l10n/id.json b/core/l10n/id.json
index c55e50ff41f..50a03100353 100644
--- a/core/l10n/id.json
+++ b/core/l10n/id.json
@@ -133,8 +133,6 @@
"Expiration" : "Kedaluwarsa",
"Expiration date" : "Tanggal kedaluwarsa",
"Choose a password for the public link" : "Tetapkan sandi untuk tautan publik",
- "Sending ..." : "Mengirim ...",
- "Email sent" : "Email terkirim",
"Resharing is not allowed" : "Berbagi ulang tidak diizinkan",
"Share link" : "Bagikan tautan",
"Link" : "Tautan",
@@ -143,6 +141,8 @@
"Allow editing" : "Izinkan penyuntingan",
"Email link to person" : "Emailkan tautan ini ke orang",
"Send" : "Kirim",
+ "Sending ..." : "Mengirim ...",
+ "Email sent" : "Email terkirim",
"Shared with you and the group {group} by {owner}" : "Dibagikan dengan anda dan grup {group} oleh {owner}",
"Shared with you by {owner}" : "Dibagikan dengan anda oleh {owner}",
"group" : "grup",
diff --git a/core/l10n/is.js b/core/l10n/is.js
index ca8e79ebbde..5e4ac4fec5d 100644
--- a/core/l10n/is.js
+++ b/core/l10n/is.js
@@ -142,8 +142,6 @@ OC.L10N.register(
"Expiration" : "Rennur út",
"Expiration date" : "Gildir til",
"Choose a password for the public link" : "Veldu þér lykilorð fyrir almenningstengil",
- "Sending ..." : "Sendi ...",
- "Email sent" : "Tölvupóstur sendur",
"Resharing is not allowed" : "Endurdeiling er ekki leyfð",
"Share link" : "Deila tengli",
"Link" : "Tengill",
@@ -152,6 +150,8 @@ OC.L10N.register(
"Allow editing" : "Leyfa breytingar",
"Email link to person" : "Senda veftengil í tölvupósti til notanda",
"Send" : "Senda",
+ "Sending ..." : "Sendi ...",
+ "Email sent" : "Tölvupóstur sendur",
"Shared with you and the group {group} by {owner}" : "Deilt með þér og hópnum {group} af {owner}",
"Shared with you by {owner}" : "Deilt með þér af {owner}",
"group" : "hópur",
diff --git a/core/l10n/is.json b/core/l10n/is.json
index ab954fece2d..7fae2146d13 100644
--- a/core/l10n/is.json
+++ b/core/l10n/is.json
@@ -140,8 +140,6 @@
"Expiration" : "Rennur út",
"Expiration date" : "Gildir til",
"Choose a password for the public link" : "Veldu þér lykilorð fyrir almenningstengil",
- "Sending ..." : "Sendi ...",
- "Email sent" : "Tölvupóstur sendur",
"Resharing is not allowed" : "Endurdeiling er ekki leyfð",
"Share link" : "Deila tengli",
"Link" : "Tengill",
@@ -150,6 +148,8 @@
"Allow editing" : "Leyfa breytingar",
"Email link to person" : "Senda veftengil í tölvupósti til notanda",
"Send" : "Senda",
+ "Sending ..." : "Sendi ...",
+ "Email sent" : "Tölvupóstur sendur",
"Shared with you and the group {group} by {owner}" : "Deilt með þér og hópnum {group} af {owner}",
"Shared with you by {owner}" : "Deilt með þér af {owner}",
"group" : "hópur",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 613ccb0ef8b..0d9d5870349 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -27,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Errore di rimozione dai preferiti",
"Couldn't send mail to following users: %s " : "Impossibile inviare email ai seguenti utenti: %s",
"Preparing update" : "Preparazione aggiornamento",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Utilizza lo strumento da riga di comando poiché l'aggiornamento automatico è disabilitato nel file config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: controllo della tabella %s",
"Turned on maintenance mode" : "Modalità di manutenzione attivata",
@@ -97,6 +98,7 @@ OC.L10N.register(
"Dec." : "Dic.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Si sono verificati errori con il controllo di integrità del codice. Ulteriori informazioni…</a>",
"Settings" : "Impostazioni",
+ "Problem loading page, reloading in 5 seconds" : "Problema durante il caricamento della pagina, aggiornamento tra 5 secondi",
"Saving..." : "Salvataggio in corso...",
"Dismiss" : "Annulla",
"seconds ago" : "secondi fa",
@@ -152,8 +154,6 @@ OC.L10N.register(
"Expiration" : "Scadenza",
"Expiration date" : "Data di scadenza",
"Choose a password for the public link" : "Scegli una password per il collegamento pubblico",
- "Sending ..." : "Invio in corso...",
- "Email sent" : "Messaggio inviato",
"Resharing is not allowed" : "La ri-condivisione non è consentita",
"Share link" : "Condividi collegamento",
"Link" : "Collegamento",
@@ -162,6 +162,9 @@ OC.L10N.register(
"Allow editing" : "Consenti la modifica",
"Email link to person" : "Invia collegamento via email",
"Send" : "Invia",
+ "Sending ..." : "Invio in corso...",
+ "Email sent" : "Messaggio inviato",
+ "Send link via email" : "Invia collegamento tramite email",
"Shared with you and the group {group} by {owner}" : "Condiviso con te e con il gruppo {group} da {owner}",
"Shared with you by {owner}" : "Condiviso con te da {owner}",
"group" : "gruppo",
@@ -305,6 +308,9 @@ OC.L10N.register(
"Start update" : "Avvia l'aggiornamento",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Per evitare timeout con installazioni di grandi dimensioni, puoi eseguire il comando che segue dalla cartella di installazione:",
"Detailed logs" : "Log dettagliati",
+ "Update needed" : "Aggiornamento necessario",
+ "Please use the command line updater because you have a big instance." : "Utilizza lo strumento da riga di comando per la grandezza della tua istanza.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Per la guida, vedi la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentazione</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Questa istanza di %s è attualmente in manutenzione, potrebbe richiedere del tempo.",
"This page will refresh itself when the %s instance is available again." : "Questa pagina si aggiornerà quando l'istanza di %s sarà nuovamente disponibile."
},
diff --git a/core/l10n/it.json b/core/l10n/it.json
index c6c9c5841e4..ade154261bd 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -25,6 +25,7 @@
"Error unfavoriting" : "Errore di rimozione dai preferiti",
"Couldn't send mail to following users: %s " : "Impossibile inviare email ai seguenti utenti: %s",
"Preparing update" : "Preparazione aggiornamento",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Utilizza lo strumento da riga di comando poiché l'aggiornamento automatico è disabilitato nel file config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: controllo della tabella %s",
"Turned on maintenance mode" : "Modalità di manutenzione attivata",
@@ -95,6 +96,7 @@
"Dec." : "Dic.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Si sono verificati errori con il controllo di integrità del codice. Ulteriori informazioni…</a>",
"Settings" : "Impostazioni",
+ "Problem loading page, reloading in 5 seconds" : "Problema durante il caricamento della pagina, aggiornamento tra 5 secondi",
"Saving..." : "Salvataggio in corso...",
"Dismiss" : "Annulla",
"seconds ago" : "secondi fa",
@@ -150,8 +152,6 @@
"Expiration" : "Scadenza",
"Expiration date" : "Data di scadenza",
"Choose a password for the public link" : "Scegli una password per il collegamento pubblico",
- "Sending ..." : "Invio in corso...",
- "Email sent" : "Messaggio inviato",
"Resharing is not allowed" : "La ri-condivisione non è consentita",
"Share link" : "Condividi collegamento",
"Link" : "Collegamento",
@@ -160,6 +160,9 @@
"Allow editing" : "Consenti la modifica",
"Email link to person" : "Invia collegamento via email",
"Send" : "Invia",
+ "Sending ..." : "Invio in corso...",
+ "Email sent" : "Messaggio inviato",
+ "Send link via email" : "Invia collegamento tramite email",
"Shared with you and the group {group} by {owner}" : "Condiviso con te e con il gruppo {group} da {owner}",
"Shared with you by {owner}" : "Condiviso con te da {owner}",
"group" : "gruppo",
@@ -303,6 +306,9 @@
"Start update" : "Avvia l'aggiornamento",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Per evitare timeout con installazioni di grandi dimensioni, puoi eseguire il comando che segue dalla cartella di installazione:",
"Detailed logs" : "Log dettagliati",
+ "Update needed" : "Aggiornamento necessario",
+ "Please use the command line updater because you have a big instance." : "Utilizza lo strumento da riga di comando per la grandezza della tua istanza.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Per la guida, vedi la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentazione</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Questa istanza di %s è attualmente in manutenzione, potrebbe richiedere del tempo.",
"This page will refresh itself when the %s instance is available again." : "Questa pagina si aggiornerà quando l'istanza di %s sarà nuovamente disponibile."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/core/l10n/ja.js b/core/l10n/ja.js
index eb56aa5a132..ae390b14bed 100644
--- a/core/l10n/ja.js
+++ b/core/l10n/ja.js
@@ -142,8 +142,6 @@ OC.L10N.register(
"Expiration" : "期限切れ",
"Expiration date" : "有効期限",
"Choose a password for the public link" : "URLによる共有のパスワードを入力",
- "Sending ..." : "送信中...",
- "Email sent" : "メールを送信しました",
"Resharing is not allowed" : "再共有は許可されていません",
"Share link" : "URLで共有",
"Link" : "リンク",
@@ -152,6 +150,8 @@ OC.L10N.register(
"Allow editing" : "編集を許可",
"Email link to person" : "メールリンク",
"Send" : "送信",
+ "Sending ..." : "送信中...",
+ "Email sent" : "メールを送信しました",
"Shared with you and the group {group} by {owner}" : "あなたと {owner} のグループ {group} で共有中",
"Shared with you by {owner}" : "{owner} と共有中",
"group" : "グループ",
diff --git a/core/l10n/ja.json b/core/l10n/ja.json
index 5255e65d625..000069bedbc 100644
--- a/core/l10n/ja.json
+++ b/core/l10n/ja.json
@@ -140,8 +140,6 @@
"Expiration" : "期限切れ",
"Expiration date" : "有効期限",
"Choose a password for the public link" : "URLによる共有のパスワードを入力",
- "Sending ..." : "送信中...",
- "Email sent" : "メールを送信しました",
"Resharing is not allowed" : "再共有は許可されていません",
"Share link" : "URLで共有",
"Link" : "リンク",
@@ -150,6 +148,8 @@
"Allow editing" : "編集を許可",
"Email link to person" : "メールリンク",
"Send" : "送信",
+ "Sending ..." : "送信中...",
+ "Email sent" : "メールを送信しました",
"Shared with you and the group {group} by {owner}" : "あなたと {owner} のグループ {group} で共有中",
"Shared with you by {owner}" : "{owner} と共有中",
"group" : "グループ",
diff --git a/core/l10n/ka_GE.js b/core/l10n/ka_GE.js
index 34f6870ced1..4b2fb1c322c 100644
--- a/core/l10n/ka_GE.js
+++ b/core/l10n/ka_GE.js
@@ -56,13 +56,13 @@ OC.L10N.register(
"Set expiration date" : "მიუთითე ვადის გასვლის დრო",
"Expiration" : "ვადის გასვლის დრო",
"Expiration date" : "ვადის გასვლის დრო",
- "Sending ..." : "გაგზავნა ....",
- "Email sent" : "იმეილი გაიგზავნა",
"Resharing is not allowed" : "მეორეჯერ გაზიარება არ არის დაშვებული",
"Password protect" : "პაროლით დაცვა",
"Password" : "პაროლი",
"Email link to person" : "ლინკის პიროვნების იმეილზე გაგზავნა",
"Send" : "გაგზავნა",
+ "Sending ..." : "გაგზავნა ....",
+ "Email sent" : "იმეილი გაიგზავნა",
"Shared with you and the group {group} by {owner}" : "გაზიარდა თქვენთვის და ჯგუფისთვის {group}, {owner}–ის მიერ",
"Shared with you by {owner}" : "გაზიარდა თქვენთვის {owner}–ის მიერ",
"group" : "ჯგუფი",
diff --git a/core/l10n/ka_GE.json b/core/l10n/ka_GE.json
index 30572fd1353..cce256a0c97 100644
--- a/core/l10n/ka_GE.json
+++ b/core/l10n/ka_GE.json
@@ -54,13 +54,13 @@
"Set expiration date" : "მიუთითე ვადის გასვლის დრო",
"Expiration" : "ვადის გასვლის დრო",
"Expiration date" : "ვადის გასვლის დრო",
- "Sending ..." : "გაგზავნა ....",
- "Email sent" : "იმეილი გაიგზავნა",
"Resharing is not allowed" : "მეორეჯერ გაზიარება არ არის დაშვებული",
"Password protect" : "პაროლით დაცვა",
"Password" : "პაროლი",
"Email link to person" : "ლინკის პიროვნების იმეილზე გაგზავნა",
"Send" : "გაგზავნა",
+ "Sending ..." : "გაგზავნა ....",
+ "Email sent" : "იმეილი გაიგზავნა",
"Shared with you and the group {group} by {owner}" : "გაზიარდა თქვენთვის და ჯგუფისთვის {group}, {owner}–ის მიერ",
"Shared with you by {owner}" : "გაზიარდა თქვენთვის {owner}–ის მიერ",
"group" : "ჯგუფი",
diff --git a/core/l10n/km.js b/core/l10n/km.js
index de686fb77f1..c3f65dc9db1 100644
--- a/core/l10n/km.js
+++ b/core/l10n/km.js
@@ -65,12 +65,12 @@ OC.L10N.register(
"Error while unsharing" : "កំពុង​ពេល​លែង​ចែក​រំលែក",
"Set expiration date" : "កំណត់​ពេល​ផុត​កំណត់",
"Expiration date" : "ពេល​ផុត​កំណត់",
- "Sending ..." : "កំពុង​ផ្ញើ ...",
- "Email sent" : "បាន​ផ្ញើ​អ៊ីមែល",
"Resharing is not allowed" : "មិន​អនុញ្ញាត​ឲ្យ​មាន​ការ​ចែក​រំលែក​ឡើង​វិញ",
"Password protect" : "ការ​ពារ​ដោយ​ពាក្យ​សម្ងាត់",
"Password" : "ពាក្យសម្ងាត់",
"Send" : "ផ្ញើ",
+ "Sending ..." : "កំពុង​ផ្ញើ ...",
+ "Email sent" : "បាន​ផ្ញើ​អ៊ីមែល",
"Shared with you and the group {group} by {owner}" : "បាន​ចែក​រំលែក​ជាមួយ​អ្នក និង​ក្រុម {group} ដោយ {owner}",
"Shared with you by {owner}" : "បាន​ចែក​រំលែក​ជាមួយ​អ្នក​ដោយ {owner}",
"group" : "ក្រុម",
diff --git a/core/l10n/km.json b/core/l10n/km.json
index 4c8a72f6864..4705382cc04 100644
--- a/core/l10n/km.json
+++ b/core/l10n/km.json
@@ -63,12 +63,12 @@
"Error while unsharing" : "កំពុង​ពេល​លែង​ចែក​រំលែក",
"Set expiration date" : "កំណត់​ពេល​ផុត​កំណត់",
"Expiration date" : "ពេល​ផុត​កំណត់",
- "Sending ..." : "កំពុង​ផ្ញើ ...",
- "Email sent" : "បាន​ផ្ញើ​អ៊ីមែល",
"Resharing is not allowed" : "មិន​អនុញ្ញាត​ឲ្យ​មាន​ការ​ចែក​រំលែក​ឡើង​វិញ",
"Password protect" : "ការ​ពារ​ដោយ​ពាក្យ​សម្ងាត់",
"Password" : "ពាក្យសម្ងាត់",
"Send" : "ផ្ញើ",
+ "Sending ..." : "កំពុង​ផ្ញើ ...",
+ "Email sent" : "បាន​ផ្ញើ​អ៊ីមែល",
"Shared with you and the group {group} by {owner}" : "បាន​ចែក​រំលែក​ជាមួយ​អ្នក និង​ក្រុម {group} ដោយ {owner}",
"Shared with you by {owner}" : "បាន​ចែក​រំលែក​ជាមួយ​អ្នក​ដោយ {owner}",
"group" : "ក្រុម",
diff --git a/core/l10n/kn.js b/core/l10n/kn.js
index 7c056b79098..16031e94317 100644
--- a/core/l10n/kn.js
+++ b/core/l10n/kn.js
@@ -80,8 +80,6 @@ OC.L10N.register(
"Expiration" : "ಮುಕ್ತಾಯ",
"Expiration date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ",
"Choose a password for the public link" : "ಸಾರ್ವಜನಿಕ ಸಂಪರ್ಕ ಕೊಂಡಿಗೆ ಗುಪ್ತಪದ ಆಯ್ಕೆಮಾಡಿ",
- "Sending ..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...",
- "Email sent" : "ಇ-ಅಂಚೆ ಕಳುಹಿಸಲಾಗಿದೆ",
"Resharing is not allowed" : "ಮರುಹಂಚಿಕೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ",
"Share link" : "ಸಂಪರ್ಕ ಕೊಂಡಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು",
"Link" : "ಸಂಪರ್ಕ ಕೊಂಡಿ",
@@ -90,6 +88,8 @@ OC.L10N.register(
"Allow editing" : "ಸಂಪಾದನೆಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡಿ",
"Email link to person" : "ಬಳಕೆದಾರನ ಇ-ಅಂಚೆಯ ಸಂಪರ್ಕಕೊಂಡಿ",
"Send" : "ಕಳುಹಿಸಿ",
+ "Sending ..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...",
+ "Email sent" : "ಇ-ಅಂಚೆ ಕಳುಹಿಸಲಾಗಿದೆ",
"Shared with you and the group {group} by {owner}" : "ನಿಮಗೆ ಮತ್ತು {group} ಗುಂಪಿನೂಂದಿಗೆ {owner} ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ",
"Shared with you by {owner}" : "ನಿಮ್ಮೊಂದಿಗೆ {owner} ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ",
"group" : "ಗುಂಪು",
diff --git a/core/l10n/kn.json b/core/l10n/kn.json
index eb525427661..c4d48a9323a 100644
--- a/core/l10n/kn.json
+++ b/core/l10n/kn.json
@@ -78,8 +78,6 @@
"Expiration" : "ಮುಕ್ತಾಯ",
"Expiration date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ",
"Choose a password for the public link" : "ಸಾರ್ವಜನಿಕ ಸಂಪರ್ಕ ಕೊಂಡಿಗೆ ಗುಪ್ತಪದ ಆಯ್ಕೆಮಾಡಿ",
- "Sending ..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...",
- "Email sent" : "ಇ-ಅಂಚೆ ಕಳುಹಿಸಲಾಗಿದೆ",
"Resharing is not allowed" : "ಮರುಹಂಚಿಕೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ",
"Share link" : "ಸಂಪರ್ಕ ಕೊಂಡಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು",
"Link" : "ಸಂಪರ್ಕ ಕೊಂಡಿ",
@@ -88,6 +86,8 @@
"Allow editing" : "ಸಂಪಾದನೆಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡಿ",
"Email link to person" : "ಬಳಕೆದಾರನ ಇ-ಅಂಚೆಯ ಸಂಪರ್ಕಕೊಂಡಿ",
"Send" : "ಕಳುಹಿಸಿ",
+ "Sending ..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...",
+ "Email sent" : "ಇ-ಅಂಚೆ ಕಳುಹಿಸಲಾಗಿದೆ",
"Shared with you and the group {group} by {owner}" : "ನಿಮಗೆ ಮತ್ತು {group} ಗುಂಪಿನೂಂದಿಗೆ {owner} ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ",
"Shared with you by {owner}" : "ನಿಮ್ಮೊಂದಿಗೆ {owner} ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ",
"group" : "ಗುಂಪು",
diff --git a/core/l10n/ko.js b/core/l10n/ko.js
index 8d3c53dd9bd..94c65dd13ad 100644
--- a/core/l10n/ko.js
+++ b/core/l10n/ko.js
@@ -142,8 +142,6 @@ OC.L10N.register(
"Expiration" : "만료",
"Expiration date" : "만료 날짜",
"Choose a password for the public link" : "공개 링크 암호를 입력하십시오",
- "Sending ..." : "전송 중...",
- "Email sent" : "이메일 발송됨",
"Resharing is not allowed" : "다시 공유할 수 없습니다",
"Share link" : "링크 공유",
"Link" : "링크",
@@ -152,6 +150,8 @@ OC.L10N.register(
"Allow editing" : "편집 허용",
"Email link to person" : "이메일 주소",
"Send" : "전송",
+ "Sending ..." : "전송 중...",
+ "Email sent" : "이메일 발송됨",
"Shared with you and the group {group} by {owner}" : "{owner} 님이 여러분 및 그룹 {group}와(과) 공유 중",
"Shared with you by {owner}" : "{owner} 님이 공유 중",
"group" : "그룹",
diff --git a/core/l10n/ko.json b/core/l10n/ko.json
index 4969337831e..5e6364fb711 100644
--- a/core/l10n/ko.json
+++ b/core/l10n/ko.json
@@ -140,8 +140,6 @@
"Expiration" : "만료",
"Expiration date" : "만료 날짜",
"Choose a password for the public link" : "공개 링크 암호를 입력하십시오",
- "Sending ..." : "전송 중...",
- "Email sent" : "이메일 발송됨",
"Resharing is not allowed" : "다시 공유할 수 없습니다",
"Share link" : "링크 공유",
"Link" : "링크",
@@ -150,6 +148,8 @@
"Allow editing" : "편집 허용",
"Email link to person" : "이메일 주소",
"Send" : "전송",
+ "Sending ..." : "전송 중...",
+ "Email sent" : "이메일 발송됨",
"Shared with you and the group {group} by {owner}" : "{owner} 님이 여러분 및 그룹 {group}와(과) 공유 중",
"Shared with you by {owner}" : "{owner} 님이 공유 중",
"group" : "그룹",
diff --git a/core/l10n/lb.js b/core/l10n/lb.js
index e0db4908c68..92d10ed3661 100644
--- a/core/l10n/lb.js
+++ b/core/l10n/lb.js
@@ -67,14 +67,14 @@ OC.L10N.register(
"Error setting expiration date" : "Feeler beim Setze vum Verfallsdatum",
"Set expiration date" : "Verfallsdatum setzen",
"Expiration date" : "Verfallsdatum",
- "Sending ..." : "Gëtt geschéckt...",
- "Email sent" : "Email geschéckt",
"Resharing is not allowed" : "Weiderdeelen ass net erlaabt",
"Share link" : "Link deelen",
"Password protect" : "Passwuertgeschützt",
"Password" : "Passwuert",
"Email link to person" : "Link enger Persoun mailen",
"Send" : "Schécken",
+ "Sending ..." : "Gëtt geschéckt...",
+ "Email sent" : "Email geschéckt",
"Shared with you and the group {group} by {owner}" : "Gedeelt mat dir an der Grupp {group} vum {owner}",
"Shared with you by {owner}" : "Gedeelt mat dir vum {owner}",
"group" : "Grupp",
diff --git a/core/l10n/lb.json b/core/l10n/lb.json
index 652930cab89..382da7f58d2 100644
--- a/core/l10n/lb.json
+++ b/core/l10n/lb.json
@@ -65,14 +65,14 @@
"Error setting expiration date" : "Feeler beim Setze vum Verfallsdatum",
"Set expiration date" : "Verfallsdatum setzen",
"Expiration date" : "Verfallsdatum",
- "Sending ..." : "Gëtt geschéckt...",
- "Email sent" : "Email geschéckt",
"Resharing is not allowed" : "Weiderdeelen ass net erlaabt",
"Share link" : "Link deelen",
"Password protect" : "Passwuertgeschützt",
"Password" : "Passwuert",
"Email link to person" : "Link enger Persoun mailen",
"Send" : "Schécken",
+ "Sending ..." : "Gëtt geschéckt...",
+ "Email sent" : "Email geschéckt",
"Shared with you and the group {group} by {owner}" : "Gedeelt mat dir an der Grupp {group} vum {owner}",
"Shared with you by {owner}" : "Gedeelt mat dir vum {owner}",
"group" : "Grupp",
diff --git a/core/l10n/lt_LT.js b/core/l10n/lt_LT.js
index 36cc1cdbdff..e2cd5f4af4b 100644
--- a/core/l10n/lt_LT.js
+++ b/core/l10n/lt_LT.js
@@ -114,8 +114,6 @@ OC.L10N.register(
"Expiration" : "Galiojimo laikas",
"Expiration date" : "Galiojimo laikas",
"Choose a password for the public link" : "Viešos nuorodos slaptažodis",
- "Sending ..." : "Siunčiama...",
- "Email sent" : "Laiškas išsiųstas",
"Resharing is not allowed" : "Dalijinasis išnaujo negalimas",
"Share link" : "Dalintis nuoroda",
"Link" : "Nuoroda",
@@ -124,6 +122,8 @@ OC.L10N.register(
"Allow editing" : "Leisti redaguoti",
"Email link to person" : "Nusiųsti nuorodą paštu",
"Send" : "Siųsti",
+ "Sending ..." : "Siunčiama...",
+ "Email sent" : "Laiškas išsiųstas",
"Shared with you and the group {group} by {owner}" : "Pasidalino su Jumis ir {group} grupe {owner}",
"Shared with you by {owner}" : "Pasidalino su Jumis {owner}",
"group" : "grupė",
diff --git a/core/l10n/lt_LT.json b/core/l10n/lt_LT.json
index f5a0d2354e7..8051b7b338c 100644
--- a/core/l10n/lt_LT.json
+++ b/core/l10n/lt_LT.json
@@ -112,8 +112,6 @@
"Expiration" : "Galiojimo laikas",
"Expiration date" : "Galiojimo laikas",
"Choose a password for the public link" : "Viešos nuorodos slaptažodis",
- "Sending ..." : "Siunčiama...",
- "Email sent" : "Laiškas išsiųstas",
"Resharing is not allowed" : "Dalijinasis išnaujo negalimas",
"Share link" : "Dalintis nuoroda",
"Link" : "Nuoroda",
@@ -122,6 +120,8 @@
"Allow editing" : "Leisti redaguoti",
"Email link to person" : "Nusiųsti nuorodą paštu",
"Send" : "Siųsti",
+ "Sending ..." : "Siunčiama...",
+ "Email sent" : "Laiškas išsiųstas",
"Shared with you and the group {group} by {owner}" : "Pasidalino su Jumis ir {group} grupe {owner}",
"Shared with you by {owner}" : "Pasidalino su Jumis {owner}",
"group" : "grupė",
diff --git a/core/l10n/lv.js b/core/l10n/lv.js
index 409d14a6bd2..71fa7f8ce40 100644
--- a/core/l10n/lv.js
+++ b/core/l10n/lv.js
@@ -71,14 +71,14 @@ OC.L10N.register(
"Error setting expiration date" : "Kļūda, iestatot termiņa datumu",
"Set expiration date" : "Iestaties termiņa datumu",
"Expiration date" : "Termiņa datums",
- "Sending ..." : "Sūta...",
- "Email sent" : "Vēstule nosūtīta",
"Resharing is not allowed" : "Atkārtota dalīšanās nav atļauta",
"Share link" : "Dalīt saiti",
"Password protect" : "Aizsargāt ar paroli",
"Password" : "Parole",
"Email link to person" : "Sūtīt saiti personai pa e-pastu",
"Send" : "Sūtīt",
+ "Sending ..." : "Sūta...",
+ "Email sent" : "Vēstule nosūtīta",
"Shared with you and the group {group} by {owner}" : "{owner} dalījās ar jums un grupu {group}",
"Shared with you by {owner}" : "{owner} dalījās ar jums",
"group" : "grupa",
diff --git a/core/l10n/lv.json b/core/l10n/lv.json
index 1d343f9f5f5..f6befe4ba84 100644
--- a/core/l10n/lv.json
+++ b/core/l10n/lv.json
@@ -69,14 +69,14 @@
"Error setting expiration date" : "Kļūda, iestatot termiņa datumu",
"Set expiration date" : "Iestaties termiņa datumu",
"Expiration date" : "Termiņa datums",
- "Sending ..." : "Sūta...",
- "Email sent" : "Vēstule nosūtīta",
"Resharing is not allowed" : "Atkārtota dalīšanās nav atļauta",
"Share link" : "Dalīt saiti",
"Password protect" : "Aizsargāt ar paroli",
"Password" : "Parole",
"Email link to person" : "Sūtīt saiti personai pa e-pastu",
"Send" : "Sūtīt",
+ "Sending ..." : "Sūta...",
+ "Email sent" : "Vēstule nosūtīta",
"Shared with you and the group {group} by {owner}" : "{owner} dalījās ar jums un grupu {group}",
"Shared with you by {owner}" : "{owner} dalījās ar jums",
"group" : "grupa",
diff --git a/core/l10n/mk.js b/core/l10n/mk.js
index 73bf1b147dc..37ddb9b5043 100644
--- a/core/l10n/mk.js
+++ b/core/l10n/mk.js
@@ -122,8 +122,6 @@ OC.L10N.register(
"Expiration" : "Истекување",
"Expiration date" : "Рок на траење",
"Choose a password for the public link" : "Одбери лозинка за јавниот линк",
- "Sending ..." : "Праќање...",
- "Email sent" : "Е-порака пратена",
"Resharing is not allowed" : "Повторно споделување не е дозволено",
"Share link" : "Сподели ја врската",
"Link" : "Линк",
@@ -132,6 +130,8 @@ OC.L10N.register(
"Allow editing" : "Овозможи уредување",
"Email link to person" : "Прати врска по е-пошта на личност",
"Send" : "Прати",
+ "Sending ..." : "Праќање...",
+ "Email sent" : "Е-порака пратена",
"Shared with you and the group {group} by {owner}" : "Споделено со Вас и групата {group} од {owner}",
"Shared with you by {owner}" : "Споделено со Вас од {owner}",
"group" : "група",
diff --git a/core/l10n/mk.json b/core/l10n/mk.json
index 595ade878a9..d0cae443944 100644
--- a/core/l10n/mk.json
+++ b/core/l10n/mk.json
@@ -120,8 +120,6 @@
"Expiration" : "Истекување",
"Expiration date" : "Рок на траење",
"Choose a password for the public link" : "Одбери лозинка за јавниот линк",
- "Sending ..." : "Праќање...",
- "Email sent" : "Е-порака пратена",
"Resharing is not allowed" : "Повторно споделување не е дозволено",
"Share link" : "Сподели ја врската",
"Link" : "Линк",
@@ -130,6 +128,8 @@
"Allow editing" : "Овозможи уредување",
"Email link to person" : "Прати врска по е-пошта на личност",
"Send" : "Прати",
+ "Sending ..." : "Праќање...",
+ "Email sent" : "Е-порака пратена",
"Shared with you and the group {group} by {owner}" : "Споделено со Вас и групата {group} од {owner}",
"Shared with you by {owner}" : "Споделено со Вас од {owner}",
"group" : "група",
diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js
index e4d27897a99..001f8b041f6 100644
--- a/core/l10n/nb_NO.js
+++ b/core/l10n/nb_NO.js
@@ -142,8 +142,6 @@ OC.L10N.register(
"Expiration" : "Utløpsdato",
"Expiration date" : "Utløpsdato",
"Choose a password for the public link" : "Velg et passord for den offentlige lenken",
- "Sending ..." : "Sender...",
- "Email sent" : "E-post sendt",
"Resharing is not allowed" : "Videre deling er ikke tillatt",
"Share link" : "Del lenke",
"Link" : "Lenke",
@@ -152,6 +150,8 @@ OC.L10N.register(
"Allow editing" : "Tillat redigering",
"Email link to person" : "Email lenke til person",
"Send" : "Send",
+ "Sending ..." : "Sender...",
+ "Email sent" : "E-post sendt",
"Shared with you and the group {group} by {owner}" : "Delt med deg og gruppen {group} av {owner}",
"Shared with you by {owner}" : "Delt med deg av {owner}",
"group" : "gruppe",
diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json
index f08a5721507..34f8a76f7a2 100644
--- a/core/l10n/nb_NO.json
+++ b/core/l10n/nb_NO.json
@@ -140,8 +140,6 @@
"Expiration" : "Utløpsdato",
"Expiration date" : "Utløpsdato",
"Choose a password for the public link" : "Velg et passord for den offentlige lenken",
- "Sending ..." : "Sender...",
- "Email sent" : "E-post sendt",
"Resharing is not allowed" : "Videre deling er ikke tillatt",
"Share link" : "Del lenke",
"Link" : "Lenke",
@@ -150,6 +148,8 @@
"Allow editing" : "Tillat redigering",
"Email link to person" : "Email lenke til person",
"Send" : "Send",
+ "Sending ..." : "Sender...",
+ "Email sent" : "E-post sendt",
"Shared with you and the group {group} by {owner}" : "Delt med deg og gruppen {group} av {owner}",
"Shared with you by {owner}" : "Delt med deg av {owner}",
"group" : "gruppe",
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index 51179c71d82..eb68aaf5b72 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -27,6 +27,9 @@ OC.L10N.register(
"Error unfavoriting" : "Fout bij verwijderen favorietstatus",
"Couldn't send mail to following users: %s " : "Kon geen e-mail sturen aan de volgende gebruikers: %s",
"Preparing update" : "Update voorbereiden",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Gebruik de commandoregel updater, omdat automatische update is uitgeschakeld in config.php.",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Controleren tabel %s",
"Turned on maintenance mode" : "Onderhoudsmodus ingeschakeld",
"Turned off maintenance mode" : "Onderhoudsmodus uitgeschakeld",
"Maintenance mode is kept active" : "Onderhoudsmodus blijft actief",
@@ -150,8 +153,6 @@ OC.L10N.register(
"Expiration" : "Vervaltermijn",
"Expiration date" : "Vervaldatum",
"Choose a password for the public link" : "Kies een wachtwoord voor de openbare link",
- "Sending ..." : "Versturen ...",
- "Email sent" : "E-mail verzonden",
"Resharing is not allowed" : "Verder delen is niet toegestaan",
"Share link" : "Deel link",
"Link" : "Link",
@@ -160,6 +161,9 @@ OC.L10N.register(
"Allow editing" : "Toestaan bewerken",
"Email link to person" : "E-mail link naar persoon",
"Send" : "Versturen",
+ "Sending ..." : "Versturen ...",
+ "Email sent" : "E-mail verzonden",
+ "Send link via email" : "Versturen link via e-mail",
"Shared with you and the group {group} by {owner}" : "Gedeeld met u en de groep {group} door {owner}",
"Shared with you by {owner}" : "Gedeeld met u door {owner}",
"group" : "groep",
@@ -303,6 +307,9 @@ OC.L10N.register(
"Start update" : "Begin de update",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Om time-outs tijdens grotere installaties te voorkomen, kunt u in plaats hiervan de volgende opdracht geven vanaf uw installatiedirectory:",
"Detailed logs" : "Gedetailleerde logs",
+ "Update needed" : "Update vereist",
+ "Please use the command line updater because you have a big instance." : "Gebruik de commandoregel updater, omdat u een grote ownCloud hebt.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Voor hulp, lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentatie</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Deze %s staat momenteel in de onderhoudsstand, dat kan enige tijd duren.",
"This page will refresh itself when the %s instance is available again." : "Deze pagina wordt ververst als de %s-installatie weer beschikbaar is."
},
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index f124ecb6442..b55fc853080 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -25,6 +25,9 @@
"Error unfavoriting" : "Fout bij verwijderen favorietstatus",
"Couldn't send mail to following users: %s " : "Kon geen e-mail sturen aan de volgende gebruikers: %s",
"Preparing update" : "Update voorbereiden",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Gebruik de commandoregel updater, omdat automatische update is uitgeschakeld in config.php.",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Controleren tabel %s",
"Turned on maintenance mode" : "Onderhoudsmodus ingeschakeld",
"Turned off maintenance mode" : "Onderhoudsmodus uitgeschakeld",
"Maintenance mode is kept active" : "Onderhoudsmodus blijft actief",
@@ -148,8 +151,6 @@
"Expiration" : "Vervaltermijn",
"Expiration date" : "Vervaldatum",
"Choose a password for the public link" : "Kies een wachtwoord voor de openbare link",
- "Sending ..." : "Versturen ...",
- "Email sent" : "E-mail verzonden",
"Resharing is not allowed" : "Verder delen is niet toegestaan",
"Share link" : "Deel link",
"Link" : "Link",
@@ -158,6 +159,9 @@
"Allow editing" : "Toestaan bewerken",
"Email link to person" : "E-mail link naar persoon",
"Send" : "Versturen",
+ "Sending ..." : "Versturen ...",
+ "Email sent" : "E-mail verzonden",
+ "Send link via email" : "Versturen link via e-mail",
"Shared with you and the group {group} by {owner}" : "Gedeeld met u en de groep {group} door {owner}",
"Shared with you by {owner}" : "Gedeeld met u door {owner}",
"group" : "groep",
@@ -301,6 +305,9 @@
"Start update" : "Begin de update",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Om time-outs tijdens grotere installaties te voorkomen, kunt u in plaats hiervan de volgende opdracht geven vanaf uw installatiedirectory:",
"Detailed logs" : "Gedetailleerde logs",
+ "Update needed" : "Update vereist",
+ "Please use the command line updater because you have a big instance." : "Gebruik de commandoregel updater, omdat u een grote ownCloud hebt.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Voor hulp, lees de <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentatie</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Deze %s staat momenteel in de onderhoudsstand, dat kan enige tijd duren.",
"This page will refresh itself when the %s instance is available again." : "Deze pagina wordt ververst als de %s-installatie weer beschikbaar is."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/core/l10n/nn_NO.js b/core/l10n/nn_NO.js
index 380bf6088b1..20fccbc4f0d 100644
--- a/core/l10n/nn_NO.js
+++ b/core/l10n/nn_NO.js
@@ -78,14 +78,14 @@ OC.L10N.register(
"Set expiration date" : "Set utløpsdato",
"Expiration date" : "Utløpsdato",
"Choose a password for the public link" : "Vel eit passord for den offentlege lenkja",
- "Sending ..." : "Sender …",
- "Email sent" : "E-post sendt",
"Resharing is not allowed" : "Vidaredeling er ikkje tillate",
"Share link" : "Del lenkje",
"Password protect" : "Passordvern",
"Password" : "Passord",
"Email link to person" : "Send lenkja over e-post",
"Send" : "Send",
+ "Sending ..." : "Sender …",
+ "Email sent" : "E-post sendt",
"Shared with you and the group {group} by {owner}" : "Delt med deg og gruppa {group} av {owner}",
"Shared with you by {owner}" : "Delt med deg av {owner}",
"group" : "gruppe",
diff --git a/core/l10n/nn_NO.json b/core/l10n/nn_NO.json
index d3b42300831..d4cc54bfc09 100644
--- a/core/l10n/nn_NO.json
+++ b/core/l10n/nn_NO.json
@@ -76,14 +76,14 @@
"Set expiration date" : "Set utløpsdato",
"Expiration date" : "Utløpsdato",
"Choose a password for the public link" : "Vel eit passord for den offentlege lenkja",
- "Sending ..." : "Sender …",
- "Email sent" : "E-post sendt",
"Resharing is not allowed" : "Vidaredeling er ikkje tillate",
"Share link" : "Del lenkje",
"Password protect" : "Passordvern",
"Password" : "Passord",
"Email link to person" : "Send lenkja over e-post",
"Send" : "Send",
+ "Sending ..." : "Sender …",
+ "Email sent" : "E-post sendt",
"Shared with you and the group {group} by {owner}" : "Delt med deg og gruppa {group} av {owner}",
"Shared with you by {owner}" : "Delt med deg av {owner}",
"group" : "gruppe",
diff --git a/core/l10n/oc.js b/core/l10n/oc.js
index 5f665ad4ac0..53fca9a0acf 100644
--- a/core/l10n/oc.js
+++ b/core/l10n/oc.js
@@ -135,8 +135,6 @@ OC.L10N.register(
"Expiration" : "Expiracion",
"Expiration date" : "Data d'expiracion",
"Choose a password for the public link" : "Causissètz un senhal pel ligam public",
- "Sending ..." : "Mandadís…",
- "Email sent" : "Corrièl mandat",
"Resharing is not allowed" : "Lo repartiment es pas autorizat",
"Share link" : "Partejar per ligam public",
"Link" : "Ligam",
@@ -145,6 +143,8 @@ OC.L10N.register(
"Allow editing" : "Permetre la modificacion",
"Email link to person" : "Mandar lo ligam per corrièl",
"Send" : "Mandar",
+ "Sending ..." : "Mandadís…",
+ "Email sent" : "Corrièl mandat",
"Shared with you and the group {group} by {owner}" : "Partejat amb vos e lo grop {group} per {owner}",
"Shared with you by {owner}" : "Partejat amb vos per {owner}",
"group" : "grop",
diff --git a/core/l10n/oc.json b/core/l10n/oc.json
index 7280fc217dc..6b19614320e 100644
--- a/core/l10n/oc.json
+++ b/core/l10n/oc.json
@@ -133,8 +133,6 @@
"Expiration" : "Expiracion",
"Expiration date" : "Data d'expiracion",
"Choose a password for the public link" : "Causissètz un senhal pel ligam public",
- "Sending ..." : "Mandadís…",
- "Email sent" : "Corrièl mandat",
"Resharing is not allowed" : "Lo repartiment es pas autorizat",
"Share link" : "Partejar per ligam public",
"Link" : "Ligam",
@@ -143,6 +141,8 @@
"Allow editing" : "Permetre la modificacion",
"Email link to person" : "Mandar lo ligam per corrièl",
"Send" : "Mandar",
+ "Sending ..." : "Mandadís…",
+ "Email sent" : "Corrièl mandat",
"Shared with you and the group {group} by {owner}" : "Partejat amb vos e lo grop {group} per {owner}",
"Shared with you by {owner}" : "Partejat amb vos per {owner}",
"group" : "grop",
diff --git a/core/l10n/pl.js b/core/l10n/pl.js
index dde53a7e4f7..31319a97dbd 100644
--- a/core/l10n/pl.js
+++ b/core/l10n/pl.js
@@ -134,8 +134,6 @@ OC.L10N.register(
"Expiration" : "Wygaśnięcie",
"Expiration date" : "Data wygaśnięcia",
"Choose a password for the public link" : "Wybierz hasło dla linku publicznego",
- "Sending ..." : "Wysyłanie...",
- "Email sent" : "E-mail wysłany",
"Resharing is not allowed" : "Współdzielenie nie jest możliwe",
"Share link" : "Udostępnij link",
"Link" : "Odnośnik",
@@ -144,6 +142,8 @@ OC.L10N.register(
"Allow editing" : "Pozwól na edycję",
"Email link to person" : "Wyślij osobie odnośnik poprzez e-mail",
"Send" : "Wyślij",
+ "Sending ..." : "Wysyłanie...",
+ "Email sent" : "E-mail wysłany",
"Shared with you and the group {group} by {owner}" : "Udostępnione tobie i grupie {group} przez {owner}",
"Shared with you by {owner}" : "Udostępnione tobie przez {owner}",
"group" : "grupa",
diff --git a/core/l10n/pl.json b/core/l10n/pl.json
index 8ac4840ef2b..1b4e4aed8e8 100644
--- a/core/l10n/pl.json
+++ b/core/l10n/pl.json
@@ -132,8 +132,6 @@
"Expiration" : "Wygaśnięcie",
"Expiration date" : "Data wygaśnięcia",
"Choose a password for the public link" : "Wybierz hasło dla linku publicznego",
- "Sending ..." : "Wysyłanie...",
- "Email sent" : "E-mail wysłany",
"Resharing is not allowed" : "Współdzielenie nie jest możliwe",
"Share link" : "Udostępnij link",
"Link" : "Odnośnik",
@@ -142,6 +140,8 @@
"Allow editing" : "Pozwól na edycję",
"Email link to person" : "Wyślij osobie odnośnik poprzez e-mail",
"Send" : "Wyślij",
+ "Sending ..." : "Wysyłanie...",
+ "Email sent" : "E-mail wysłany",
"Shared with you and the group {group} by {owner}" : "Udostępnione tobie i grupie {group} przez {owner}",
"Shared with you by {owner}" : "Udostępnione tobie przez {owner}",
"group" : "grupa",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index d4c0445ff4e..9a9c4ca46c1 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -27,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Erro retirando do favoritos",
"Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s",
"Preparing update" : "Preparando atualização",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor, use a atualização de linha de comando, porque a atualização automática está desativado no config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Verificando tabela %s",
"Turned on maintenance mode" : "Ativar modo de manutenção",
@@ -97,6 +98,7 @@ OC.L10N.register(
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Houve problemas com a verificação de integridade do código. Mais informações…</a>",
"Settings" : "Configurações",
+ "Problem loading page, reloading in 5 seconds" : "Problema no carregamento da página, recarregando em 5 segundos",
"Saving..." : "Salvando...",
"Dismiss" : "Dispensar",
"seconds ago" : "segundos atrás",
@@ -152,8 +154,6 @@ OC.L10N.register(
"Expiration" : "Expiração",
"Expiration date" : "Data de expiração",
"Choose a password for the public link" : "Escolha uma senha para o link público",
- "Sending ..." : "Enviando ...",
- "Email sent" : "E-mail enviado",
"Resharing is not allowed" : "Não é permitido re-compartilhar",
"Share link" : "Compartilhar link",
"Link" : "Link",
@@ -162,6 +162,9 @@ OC.L10N.register(
"Allow editing" : "Permitir edição",
"Email link to person" : "Enviar link por e-mail",
"Send" : "Enviar",
+ "Sending ..." : "Enviando ...",
+ "Email sent" : "E-mail enviado",
+ "Send link via email" : "Enviar link por email",
"Shared with you and the group {group} by {owner}" : "Compartilhado com você e com o grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartilhado com você por {owner}",
"group" : "grupo",
@@ -305,6 +308,9 @@ OC.L10N.register(
"Start update" : "Iniciar atualização",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos de espera com instalações maiores, você pode em vez disso executar o seguinte comando a partir do diretório de instalação:",
"Detailed logs" : "Logs detalhados",
+ "Update needed" : "Atualização necessária",
+ "Please use the command line updater because you have a big instance." : "Por favor, use a atualização de linha de comando, porque você tem um grande exemplo.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Para obter ajuda, consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está em modo de manutenção, o que pode demorar um pouco.",
"This page will refresh itself when the %s instance is available again." : "Esta página será atualizada automaticamente quando esta instância %s estiver disponível novamente."
},
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index 74c63306f34..6fbceabc2e5 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -25,6 +25,7 @@
"Error unfavoriting" : "Erro retirando do favoritos",
"Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s",
"Preparing update" : "Preparando atualização",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor, use a atualização de linha de comando, porque a atualização automática está desativado no config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Verificando tabela %s",
"Turned on maintenance mode" : "Ativar modo de manutenção",
@@ -95,6 +96,7 @@
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Houve problemas com a verificação de integridade do código. Mais informações…</a>",
"Settings" : "Configurações",
+ "Problem loading page, reloading in 5 seconds" : "Problema no carregamento da página, recarregando em 5 segundos",
"Saving..." : "Salvando...",
"Dismiss" : "Dispensar",
"seconds ago" : "segundos atrás",
@@ -150,8 +152,6 @@
"Expiration" : "Expiração",
"Expiration date" : "Data de expiração",
"Choose a password for the public link" : "Escolha uma senha para o link público",
- "Sending ..." : "Enviando ...",
- "Email sent" : "E-mail enviado",
"Resharing is not allowed" : "Não é permitido re-compartilhar",
"Share link" : "Compartilhar link",
"Link" : "Link",
@@ -160,6 +160,9 @@
"Allow editing" : "Permitir edição",
"Email link to person" : "Enviar link por e-mail",
"Send" : "Enviar",
+ "Sending ..." : "Enviando ...",
+ "Email sent" : "E-mail enviado",
+ "Send link via email" : "Enviar link por email",
"Shared with you and the group {group} by {owner}" : "Compartilhado com você e com o grupo {group} por {owner}",
"Shared with you by {owner}" : "Compartilhado com você por {owner}",
"group" : "grupo",
@@ -303,6 +306,9 @@
"Start update" : "Iniciar atualização",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos de espera com instalações maiores, você pode em vez disso executar o seguinte comando a partir do diretório de instalação:",
"Detailed logs" : "Logs detalhados",
+ "Update needed" : "Atualização necessária",
+ "Please use the command line updater because you have a big instance." : "Por favor, use a atualização de linha de comando, porque você tem um grande exemplo.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Para obter ajuda, consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está em modo de manutenção, o que pode demorar um pouco.",
"This page will refresh itself when the %s instance is available again." : "Esta página será atualizada automaticamente quando esta instância %s estiver disponível novamente."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 4a2100f9269..f300c542ed4 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"core",
{
- "Please select a file." : "Por favor, selecione um ficheiro.",
- "File is too big" : "O ficheiro é muito grande",
+ "Please select a file." : "Por favor seleccione um ficheiro.",
+ "File is too big" : "O ficheiro é demasiado grande",
"Invalid file provided" : "Ficheiro indicado inválido",
"No image or file provided" : "Não foi fornecido nenhum ficheiro ou imagem",
"Unknown filetype" : "Tipo de ficheiro desconhecido",
@@ -22,11 +22,12 @@ OC.L10N.register(
"Tag already exists" : "A etiqueta já existe",
"Error deleting tag(s)" : "Ocorreu um erro ao apagar etiqueta(s)",
"Error tagging" : "Erro ao etiquetar",
- "Error untagging" : "Erro ao desetiquetar",
+ "Error untagging" : "Erro ao remover etiqueta",
"Error favoriting" : "Erro a definir como favorito",
"Error unfavoriting" : "Erro a remover como favorito",
"Couldn't send mail to following users: %s " : "Não foi possível enviar a mensagem para os seguintes utilizadores: %s",
"Preparing update" : "A preparar atualização",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor utilize o actualizador disponível na linha de comandos pois a actualização automática está inibida em config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: A verificar a tabela %s",
"Turned on maintenance mode" : "Ativado o modo de manutenção",
@@ -42,7 +43,7 @@ OC.L10N.register(
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
"Repair warning: " : "Aviso de reparação:",
"Repair error: " : "Corrija o erro:",
- "Set log level to debug" : "Definir o nível de log para debug",
+ "Set log level to debug" : "Definir depuração como o nível de log",
"Reset log level" : "Reiniciar nível de registo",
"Starting code integrity check" : "A iniciar verificação de integridade do código",
"Finished code integrity check" : "Terminada a verificação de integridade do código",
@@ -97,6 +98,7 @@ OC.L10N.register(
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Existiram alguns problemas com a verificação de integridade do código. Mais informação…</a>",
"Settings" : "Definições",
+ "Problem loading page, reloading in 5 seconds" : "Problema a carregar a página, recarregando dentro de 5 segundos",
"Saving..." : "A guardar ...",
"Dismiss" : "Rejeitar",
"seconds ago" : "segundos atrás",
@@ -133,11 +135,11 @@ OC.L10N.register(
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desencorajado por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Neste momento está a executar PHP {version}. Aconselhamos actualizar a versão de PHP para tirar partido das <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">actualizações de desempenho e segurança fornecidas pelo PHP Group</a> assim que a sua distribuição as suporte.",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos proxy headers reversos está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar o seu endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
- "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir das internet. O seu ficheiro .htaccess não está a funcionar corretamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir da Internet. O ficheiro .htaccess não está a funcionar correctamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"{header}\" não está configurado para igualar \"{expected}\". Isto é um potencial risco de segurança ou privacidade e recomendamos que o corrija.",
"The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"{seconds}\" segundos. Para uma segurança melhorada recomendados a ativação do HSTS como descrito nas nossas <a href=\"{docUrl}\" rel=\"noreferrer\">dicas de segurança</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Nós recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS, em vez do que está descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
@@ -152,8 +154,6 @@ OC.L10N.register(
"Expiration" : "Data de expiração",
"Expiration date" : "Data de expiração",
"Choose a password for the public link" : "Defina a palavra-passe para a hiperligação pública",
- "Sending ..." : "A Enviar...",
- "Email sent" : "Mensagem enviada",
"Resharing is not allowed" : "Não é permitido partilhar de novo",
"Share link" : "Compartilhar hiperligação",
"Link" : "Hiperligação",
@@ -162,6 +162,9 @@ OC.L10N.register(
"Allow editing" : "Permitir edição",
"Email link to person" : "Enviar a hiperligação para a pessoa",
"Send" : "Enviar",
+ "Sending ..." : "A Enviar...",
+ "Email sent" : "Mensagem enviada",
+ "Send link via email" : "Enviar hiperligação por correio eletrónico",
"Shared with you and the group {group} by {owner}" : "Partilhado consigo e com o grupo {group} por {owner}",
"Shared with you by {owner}" : "Partilhado consigo por {owner}",
"group" : "grupo",
@@ -248,7 +251,7 @@ OC.L10N.register(
"Line: %s" : "Linha: %s",
"Trace" : "Rasto",
"Security warning" : "Aviso de Segurança",
- "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "A pasta de dados do ownCloud e os respectivos ficheiros, estarão provavelmente acessíveis a partir da internet, pois o ficheiros .htaccess não funciona.",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "A pasta de dados do ownCloud e os respectivos ficheiros estão provavelmente acessíveis a partir da internet pois o ficheiro .htaccess não funciona.",
"For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Para obter informações de como configurar correctamente o servidor, veja em: <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentação</a>.",
"Create an <strong>admin account</strong>" : "Criar uma <strong>conta administrativa</strong>",
"Username" : "Nome de utilizador",
@@ -256,7 +259,7 @@ OC.L10N.register(
"Data folder" : "Pasta de dados",
"Configure the database" : "Configure a base de dados",
"Only %s is available." : "Só está disponível %s.",
- "Install and activate additional PHP modules to choose other database types." : "Instale e ative os módulos PHP adicionais para escolher outros tipos de base de dados.",
+ "Install and activate additional PHP modules to choose other database types." : "Instale e active módulos PHP adicionais para escolher outros tipos de base de dados.",
"For more details check out the documentation." : "Para mais detalhes consulte a documentação.",
"Database user" : "Utilizador da base de dados",
"Database password" : "Palavra-passe da base de dados",
@@ -305,6 +308,9 @@ OC.L10N.register(
"Start update" : "Iniciar atualização",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos de espera com instalações maiores, você pode em vez disso, executar o seguinte comando a partir do diretório de instalação:",
"Detailed logs" : "Registos detalhados",
+ "Update needed" : "Necessária atualização",
+ "Please use the command line updater because you have a big instance." : "Por favor utilize o actualizador disponível na linha de comandos pois a sua instância é grande.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Para obter ajuda, consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está actualmente em modo de manutenção, o que poderá demorar algum tempo.",
"This page will refresh itself when the %s instance is available again." : "Esta página irá ser recarregada novamente quando a instância %s ficar novamente disponível."
},
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index 0a6307a8fc7..d0565b36ebf 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Please select a file." : "Por favor, selecione um ficheiro.",
- "File is too big" : "O ficheiro é muito grande",
+ "Please select a file." : "Por favor seleccione um ficheiro.",
+ "File is too big" : "O ficheiro é demasiado grande",
"Invalid file provided" : "Ficheiro indicado inválido",
"No image or file provided" : "Não foi fornecido nenhum ficheiro ou imagem",
"Unknown filetype" : "Tipo de ficheiro desconhecido",
@@ -20,11 +20,12 @@
"Tag already exists" : "A etiqueta já existe",
"Error deleting tag(s)" : "Ocorreu um erro ao apagar etiqueta(s)",
"Error tagging" : "Erro ao etiquetar",
- "Error untagging" : "Erro ao desetiquetar",
+ "Error untagging" : "Erro ao remover etiqueta",
"Error favoriting" : "Erro a definir como favorito",
"Error unfavoriting" : "Erro a remover como favorito",
"Couldn't send mail to following users: %s " : "Não foi possível enviar a mensagem para os seguintes utilizadores: %s",
"Preparing update" : "A preparar atualização",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Por favor utilize o actualizador disponível na linha de comandos pois a actualização automática está inibida em config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: A verificar a tabela %s",
"Turned on maintenance mode" : "Ativado o modo de manutenção",
@@ -40,7 +41,7 @@
"Updated \"%s\" to %s" : "Atualizado \"%s\" para %s",
"Repair warning: " : "Aviso de reparação:",
"Repair error: " : "Corrija o erro:",
- "Set log level to debug" : "Definir o nível de log para debug",
+ "Set log level to debug" : "Definir depuração como o nível de log",
"Reset log level" : "Reiniciar nível de registo",
"Starting code integrity check" : "A iniciar verificação de integridade do código",
"Finished code integrity check" : "Terminada a verificação de integridade do código",
@@ -95,6 +96,7 @@
"Dec." : "Dez.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Existiram alguns problemas com a verificação de integridade do código. Mais informação…</a>",
"Settings" : "Definições",
+ "Problem loading page, reloading in 5 seconds" : "Problema a carregar a página, recarregando dentro de 5 segundos",
"Saving..." : "A guardar ...",
"Dismiss" : "Rejeitar",
"seconds ago" : "segundos atrás",
@@ -131,11 +133,11 @@
"No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Nenhuma memória cache foi configurada. Para melhorar o seu desempenho, por favor configure a memcache, se disponível. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>.",
"/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom não é legível pelo PHP, o que é altamente desencorajado por motivos de segurança. Pode ser encontrada mais informação na <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Neste momento está a executar PHP {version}. Aconselhamos actualizar a versão de PHP para tirar partido das <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">actualizações de desempenho e segurança fornecidas pelo PHP Group</a> assim que a sua distribuição as suporte.",
- "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos proxy headers reversos está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar o seu endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "A configuração dos headers do proxy reverso está incorreta, ou então está a aceder ao ownCloud através de um proxy de confiança. Se não está a aceder ao ownCloud através de um proxy de confiança, isto é um problema de segurança e poderá permitir a um invasor falsificar um endereço IP como visível para o ownCloud. Mais informação pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>.",
"Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached está configurada como cache distribuída, mas o módulo \"memcache\" PHP errado está instalado. \\OC\\Memcache\\Memcached apenas suporta \"memcached\" e não \"memcache\". Leia a <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki sobre ambos os módulos</a>.",
"Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Alguns ficheiros não passaram na verificação de integridade. Mais informação sobre este assunto pode ser encontrada na nossa <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentação</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lista de ficheiros inválidos…</a> / <a href=\"{rescanEndpoint}\">Reverificar…</a>)",
"Error occurred while checking server setup" : "Ocorreu um erro durante a verificação da configuração do servidor",
- "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir das internet. O seu ficheiro .htaccess não está a funcionar corretamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.",
+ "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "A sua pasta com os dados e os seus ficheiros estão provavelmente acessíveis a partir da Internet. O ficheiro .htaccess não está a funcionar correctamente. Sugerimos veementemente que configure o seu servidor web de maneira a que a pasta com os dados deixe de ficar acessível, ou mova a pasta com os dados para fora da raiz de documentos do servidor web.",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "O cabeçalho HTTP \"{header}\" não está configurado para igualar \"{expected}\". Isto é um potencial risco de segurança ou privacidade e recomendamos que o corrija.",
"The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para um mínimo de \"{seconds}\" segundos. Para uma segurança melhorada recomendados a ativação do HSTS como descrito nas nossas <a href=\"{docUrl}\" rel=\"noreferrer\">dicas de segurança</a>.",
"You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está a aceder a este site via HTTP. Nós recomendamos vivamente que configure o seu servidor para requerer a utilização de HTTPS, em vez do que está descrito nas nossas <a href=\"{docUrl}\">dicas de segurança</a>.",
@@ -150,8 +152,6 @@
"Expiration" : "Data de expiração",
"Expiration date" : "Data de expiração",
"Choose a password for the public link" : "Defina a palavra-passe para a hiperligação pública",
- "Sending ..." : "A Enviar...",
- "Email sent" : "Mensagem enviada",
"Resharing is not allowed" : "Não é permitido partilhar de novo",
"Share link" : "Compartilhar hiperligação",
"Link" : "Hiperligação",
@@ -160,6 +160,9 @@
"Allow editing" : "Permitir edição",
"Email link to person" : "Enviar a hiperligação para a pessoa",
"Send" : "Enviar",
+ "Sending ..." : "A Enviar...",
+ "Email sent" : "Mensagem enviada",
+ "Send link via email" : "Enviar hiperligação por correio eletrónico",
"Shared with you and the group {group} by {owner}" : "Partilhado consigo e com o grupo {group} por {owner}",
"Shared with you by {owner}" : "Partilhado consigo por {owner}",
"group" : "grupo",
@@ -246,7 +249,7 @@
"Line: %s" : "Linha: %s",
"Trace" : "Rasto",
"Security warning" : "Aviso de Segurança",
- "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "A pasta de dados do ownCloud e os respectivos ficheiros, estarão provavelmente acessíveis a partir da internet, pois o ficheiros .htaccess não funciona.",
+ "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "A pasta de dados do ownCloud e os respectivos ficheiros estão provavelmente acessíveis a partir da internet pois o ficheiro .htaccess não funciona.",
"For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Para obter informações de como configurar correctamente o servidor, veja em: <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentação</a>.",
"Create an <strong>admin account</strong>" : "Criar uma <strong>conta administrativa</strong>",
"Username" : "Nome de utilizador",
@@ -254,7 +257,7 @@
"Data folder" : "Pasta de dados",
"Configure the database" : "Configure a base de dados",
"Only %s is available." : "Só está disponível %s.",
- "Install and activate additional PHP modules to choose other database types." : "Instale e ative os módulos PHP adicionais para escolher outros tipos de base de dados.",
+ "Install and activate additional PHP modules to choose other database types." : "Instale e active módulos PHP adicionais para escolher outros tipos de base de dados.",
"For more details check out the documentation." : "Para mais detalhes consulte a documentação.",
"Database user" : "Utilizador da base de dados",
"Database password" : "Palavra-passe da base de dados",
@@ -303,6 +306,9 @@
"Start update" : "Iniciar atualização",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Para evitar tempos de espera com instalações maiores, você pode em vez disso, executar o seguinte comando a partir do diretório de instalação:",
"Detailed logs" : "Registos detalhados",
+ "Update needed" : "Necessária atualização",
+ "Please use the command line updater because you have a big instance." : "Por favor utilize o actualizador disponível na linha de comandos pois a sua instância é grande.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Para obter ajuda, consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Esta instância %s está actualmente em modo de manutenção, o que poderá demorar algum tempo.",
"This page will refresh itself when the %s instance is available again." : "Esta página irá ser recarregada novamente quando a instância %s ficar novamente disponível."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/core/l10n/ro.js b/core/l10n/ro.js
index b89c81e905e..7de876d6446 100644
--- a/core/l10n/ro.js
+++ b/core/l10n/ro.js
@@ -88,8 +88,6 @@ OC.L10N.register(
"Set expiration date" : "Specifică data expirării",
"Expiration" : "Expira",
"Expiration date" : "Data expirării",
- "Sending ..." : "Se expediază...",
- "Email sent" : "Mesajul a fost expediat",
"Resharing is not allowed" : "Repartajarea nu este permisă",
"Share link" : "Share link",
"Link" : "Legătură",
@@ -98,6 +96,8 @@ OC.L10N.register(
"Allow editing" : "Permite editarea",
"Email link to person" : "Expediază legătura prin poșta electronică",
"Send" : "Expediază",
+ "Sending ..." : "Se expediază...",
+ "Email sent" : "Mesajul a fost expediat",
"Shared with you and the group {group} by {owner}" : "Distribuie cu tine si grupul {group} de {owner}",
"Shared with you by {owner}" : "Distribuie cu tine de {owner}",
"group" : "grup",
diff --git a/core/l10n/ro.json b/core/l10n/ro.json
index 390c693821b..0493ca016fc 100644
--- a/core/l10n/ro.json
+++ b/core/l10n/ro.json
@@ -86,8 +86,6 @@
"Set expiration date" : "Specifică data expirării",
"Expiration" : "Expira",
"Expiration date" : "Data expirării",
- "Sending ..." : "Se expediază...",
- "Email sent" : "Mesajul a fost expediat",
"Resharing is not allowed" : "Repartajarea nu este permisă",
"Share link" : "Share link",
"Link" : "Legătură",
@@ -96,6 +94,8 @@
"Allow editing" : "Permite editarea",
"Email link to person" : "Expediază legătura prin poșta electronică",
"Send" : "Expediază",
+ "Sending ..." : "Se expediază...",
+ "Email sent" : "Mesajul a fost expediat",
"Shared with you and the group {group} by {owner}" : "Distribuie cu tine si grupul {group} de {owner}",
"Shared with you by {owner}" : "Distribuie cu tine de {owner}",
"group" : "grup",
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 4e6479d95a4..d52a9b6a4e3 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -144,8 +144,6 @@ OC.L10N.register(
"Expiration" : "Срок действия",
"Expiration date" : "Дата окончания",
"Choose a password for the public link" : "Укажите пароль для публичной ссылки",
- "Sending ..." : "Отправляется ...",
- "Email sent" : "Письмо отправлено",
"Resharing is not allowed" : "Повторное открытие доступа запрещено",
"Share link" : "Поделиться ссылкой",
"Link" : "Ссылка",
@@ -154,6 +152,8 @@ OC.L10N.register(
"Allow editing" : "Разрешить редактирование",
"Email link to person" : "Отправить ссылку по электронной почте",
"Send" : "Отправить",
+ "Sending ..." : "Отправляется ...",
+ "Email sent" : "Письмо отправлено",
"Shared with you and the group {group} by {owner}" : "{owner} поделился с вами и группой {group} ",
"Shared with you by {owner}" : "С вами поделился {owner} ",
"group" : "группа",
diff --git a/core/l10n/ru.json b/core/l10n/ru.json
index 7993d9c6bb6..36e5a2ab8a5 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -142,8 +142,6 @@
"Expiration" : "Срок действия",
"Expiration date" : "Дата окончания",
"Choose a password for the public link" : "Укажите пароль для публичной ссылки",
- "Sending ..." : "Отправляется ...",
- "Email sent" : "Письмо отправлено",
"Resharing is not allowed" : "Повторное открытие доступа запрещено",
"Share link" : "Поделиться ссылкой",
"Link" : "Ссылка",
@@ -152,6 +150,8 @@
"Allow editing" : "Разрешить редактирование",
"Email link to person" : "Отправить ссылку по электронной почте",
"Send" : "Отправить",
+ "Sending ..." : "Отправляется ...",
+ "Email sent" : "Письмо отправлено",
"Shared with you and the group {group} by {owner}" : "{owner} поделился с вами и группой {group} ",
"Shared with you by {owner}" : "С вами поделился {owner} ",
"group" : "группа",
diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js
index 78d4e3c0323..71eb52bead2 100644
--- a/core/l10n/sk_SK.js
+++ b/core/l10n/sk_SK.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"core",
{
+ "Please select a file." : "Prosím, vyberte súbor.",
"File is too big" : "Súbor je príliš veľký",
"Invalid file provided" : "Zadaný neplatný súbor",
"No image or file provided" : "Obrázok alebo súbor nebol zadaný",
@@ -25,6 +26,7 @@ OC.L10N.register(
"Error unfavoriting" : "Chyba pri odobratí z obľúbených",
"Couldn't send mail to following users: %s " : "Nebolo možné odoslať email týmto používateľom: %s ",
"Preparing update" : "Pripravuje sa aktualizácia",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Kontrola tabuľky %s",
"Turned on maintenance mode" : "Mód údržby je zapnutý",
"Turned off maintenance mode" : "Mód údržby je vypnutý",
"Maintenance mode is kept active" : "Režim údržby je stále aktívny",
@@ -38,6 +40,10 @@ OC.L10N.register(
"Updated \"%s\" to %s" : "Aktualizované \"%s\" na %s",
"Repair warning: " : "Oznámenie opravy:",
"Repair error: " : "Chyba opravy:",
+ "Set log level to debug" : "Nastaviť úroveň záznamu na ladenie",
+ "Reset log level" : "Obnoviť úroveň záznamu",
+ "Starting code integrity check" : "Začína kontrola integrity kódu",
+ "Finished code integrity check" : "Kontrola integrity kódu ukončená",
"%s (3rdparty)" : "%s (od tretej strany)",
"%s (incompatible)" : "%s (nekompatibilná)",
"Following apps have been disabled: %s" : "Nasledovné aplikácie boli zakázané: %s",
@@ -87,6 +93,7 @@ OC.L10N.register(
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Pri kontrole integrity kódu sa vyskytli chyby. Viac informácií…</a>",
"Settings" : "Nastavenia",
"Saving..." : "Ukladám...",
"Dismiss" : "Odmietnuť",
@@ -120,6 +127,9 @@ OC.L10N.register(
"Strong password" : "Silné heslo",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Server nemá funkčné pripojenie k internetu. Niektoré moduly ako napr. externé úložisko, oznámenie o dostupných aktualizáciách alebo inštalácia aplikácií tretích strán nebudú fungovať. Vzdialený prístup k súborom a odosielanie oznamovacích emailov tiež nemusí fungovať. Ak chcete využívať všetky funkcie, odporúčame povoliť tomuto serveru pripojenie k internetu.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "dev/urandom nie je prístupný na čítanie procesom PHP, čo z bezpečnostných dôvodov nie je vôbec odporúčané. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached je nakonfigurovaný ako distribuovaná vyrovnávacia pamäť, ale v PHP je nainštalovaný nesprávny modul - \"memcache\". \\OC\\Memcache\\Memcached podporuje len modul \"memcached\", \"memcache\" nie je podporovaný. Viac informácií nájdete na <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki stránke o oboch moduloch</a>.",
"Error occurred while checking server setup" : "Počas kontroly nastavenia serveru sa stala chyba",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Váš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.",
"Shared" : "Zdieľané",
@@ -133,8 +143,6 @@ OC.L10N.register(
"Expiration" : "Koniec platnosti",
"Expiration date" : "Dátum expirácie",
"Choose a password for the public link" : "Zadajte heslo pre tento verejný odkaz",
- "Sending ..." : "Odosielam ...",
- "Email sent" : "Email odoslaný",
"Resharing is not allowed" : "Zdieľanie už zdieľanej položky nie je povolené",
"Share link" : "Zdieľať linku",
"Link" : "Odkaz",
@@ -143,6 +151,8 @@ OC.L10N.register(
"Allow editing" : "Povoliť úpravy",
"Email link to person" : "Odoslať odkaz emailom",
"Send" : "Odoslať",
+ "Sending ..." : "Odosielam ...",
+ "Email sent" : "Email odoslaný",
"Shared with you and the group {group} by {owner}" : "Zdieľané s vami a so skupinou {group} používateľom {owner}",
"Shared with you by {owner}" : "Zdieľané s vami používateľom {owner}",
"group" : "skupina",
@@ -155,11 +165,19 @@ OC.L10N.register(
"change" : "zmeniť",
"delete" : "vymazať",
"access control" : "prístupové práva",
+ "Could not unshare" : "Nepodarilo sa zrušiť sprístupnenie",
"Share details could not be loaded for this item." : "Nebolo možné načítať údaje o zdieľaní tejto položky.",
+ "{sharee} (at {server})" : "{sharee} (na {server})",
"Share" : "Zdieľať",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Zdieľať s ľuďmi na iných serveroch ownClouds pomocou syntaxe používateľ@doména.com/owncloud",
+ "Share with users…" : "Sprístupniť používateľom...",
+ "Share with users, groups or remote users…" : "Sprístupniť používateľom, skupinám alebo vzdialeným používateľom...",
+ "Share with users or groups…" : "Sprístupniť používateľom alebo skupinám...",
+ "Share with users or remote users…" : "Sprístupniť používateľom alebo vzdialeným používateľom...",
+ "Error removing share" : "Chyba pri rušení sprístupnenia",
"Warning" : "Varovanie",
"Error while sending notification" : "Chyba pri posielaní oznámenia",
+ "invisible" : "neviditeľný",
"Delete" : "Zmazať",
"Rename" : "Premenovať",
"The object type is not specified." : "Nešpecifikovaný typ objektu.",
@@ -173,10 +191,13 @@ OC.L10N.register(
"sunny" : "slnečno",
"Hello {name}, the weather is {weather}" : "Dobrý deň {name}, počasie je {weather}",
"Hello {name}" : "Vitaj {name}",
+ "new" : "nový",
"_download %n file_::_download %n files_" : ["stiahnuť %n súbor","stiahnuť %n súbory","stiahnuť %n súborov"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Aktualizácie prebieha. V niektorých prostrediach môže opustenie tejto stránky spôsobiť prerušenie aktualizácie.",
+ "Updating to {version}" : "Aktualizuje sa na {version}",
"An error occurred." : "Vyskytla sa chyba.",
"Please reload the page." : "Obnovte prosím stránku.",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Aktualizácia neprebehla úspešne. Pre viac informácií <a href=\"{url}\">navštívte príspevok na našom fóre</a>, ktorý pokrýva tento problém.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Aktualizácia nebola úspešná. Problém nahláste <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud comunite</a>.",
"The update was successful. There were warnings." : "Aktualizácia bola úspešná. Vyskytli sa upozornenia.",
"The update was successful. Redirecting you to ownCloud now." : "Aktualizácia bola úspešná. Presmerovávam vás na prihlasovaciu stránku.",
@@ -237,9 +258,11 @@ OC.L10N.register(
"Search" : "Hľadať",
"Server side authentication failed!" : "Autentifikácia na serveri zlyhala!",
"Please contact your administrator." : "Kontaktujte prosím vášho administrátora.",
+ "An internal error occurred." : "Došlo k vnútornej chybe.",
"Please try again or contact your administrator." : "Skúste to znovu, alebo sa obráťte na vášho administrátora.",
"Log in" : "Prihlásiť sa",
"Wrong password. Reset it?" : "Chybné heslo. Chcete ho obnoviť?",
+ "Wrong password." : "Nesprávne heslo.",
"Stay logged in" : "Zostať prihlásený",
"Alternative Logins" : "Alternatívne prihlásenie",
"Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}",
@@ -261,6 +284,7 @@ OC.L10N.register(
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Pred vykonaním ďalšieho kroku sa presvedčte, že databáza, konfiguračný a dátový priečinok sú zazálohované.",
"Start update" : "Spustiť aktualizáciu",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Aby nedošlo k vypršaniu časového limitu vo väčších inštaláciách, môžete namiesto toho použiť nasledujúci príkaz z inštalačného priečinka:",
+ "Detailed logs" : "Podrobné záznamy",
"This %s instance is currently in maintenance mode, which may take a while." : "Táto %s inštancia je v súčasnej dobe v režime údržby. Počkajte prosím.",
"This page will refresh itself when the %s instance is available again." : "Táto stránka sa obnoví sama hneď ako bude %s inštancia znovu dostupná."
},
diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json
index e6caf67d804..7391f62e301 100644
--- a/core/l10n/sk_SK.json
+++ b/core/l10n/sk_SK.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Please select a file." : "Prosím, vyberte súbor.",
"File is too big" : "Súbor je príliš veľký",
"Invalid file provided" : "Zadaný neplatný súbor",
"No image or file provided" : "Obrázok alebo súbor nebol zadaný",
@@ -23,6 +24,7 @@
"Error unfavoriting" : "Chyba pri odobratí z obľúbených",
"Couldn't send mail to following users: %s " : "Nebolo možné odoslať email týmto používateľom: %s ",
"Preparing update" : "Pripravuje sa aktualizácia",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Kontrola tabuľky %s",
"Turned on maintenance mode" : "Mód údržby je zapnutý",
"Turned off maintenance mode" : "Mód údržby je vypnutý",
"Maintenance mode is kept active" : "Režim údržby je stále aktívny",
@@ -36,6 +38,10 @@
"Updated \"%s\" to %s" : "Aktualizované \"%s\" na %s",
"Repair warning: " : "Oznámenie opravy:",
"Repair error: " : "Chyba opravy:",
+ "Set log level to debug" : "Nastaviť úroveň záznamu na ladenie",
+ "Reset log level" : "Obnoviť úroveň záznamu",
+ "Starting code integrity check" : "Začína kontrola integrity kódu",
+ "Finished code integrity check" : "Kontrola integrity kódu ukončená",
"%s (3rdparty)" : "%s (od tretej strany)",
"%s (incompatible)" : "%s (nekompatibilná)",
"Following apps have been disabled: %s" : "Nasledovné aplikácie boli zakázané: %s",
@@ -85,6 +91,7 @@
"Oct." : "Okt.",
"Nov." : "Nov.",
"Dec." : "Dec.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Pri kontrole integrity kódu sa vyskytli chyby. Viac informácií…</a>",
"Settings" : "Nastavenia",
"Saving..." : "Ukladám...",
"Dismiss" : "Odmietnuť",
@@ -118,6 +125,9 @@
"Strong password" : "Silné heslo",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Váš webový server nie je zatiaľ správne nastavený, aby umožnil synchronizáciu súborov, pretože rozhranie WebDAV sa zdá byť nefunkčné.",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Server nemá funkčné pripojenie k internetu. Niektoré moduly ako napr. externé úložisko, oznámenie o dostupných aktualizáciách alebo inštalácia aplikácií tretích strán nebudú fungovať. Vzdialený prístup k súborom a odosielanie oznamovacích emailov tiež nemusí fungovať. Ak chcete využívať všetky funkcie, odporúčame povoliť tomuto serveru pripojenie k internetu.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "dev/urandom nie je prístupný na čítanie procesom PHP, čo z bezpečnostných dôvodov nie je vôbec odporúčané. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.",
+ "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Konfigurácia hlavičiek reverse proxy nie je správna alebo pristupujete k ownCloud z dôveryhodného proxy servera. Ak k ownCloud nepristupujete z dôveryhodného proxy servera, vzniká bezpečnostné riziko - IP adresa potenciálneho útočníka, ktorú vidí ownCloud, môže byť falošná. Viac informácií nájdete v našej <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentácii</a>.",
+ "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached je nakonfigurovaný ako distribuovaná vyrovnávacia pamäť, ale v PHP je nainštalovaný nesprávny modul - \"memcache\". \\OC\\Memcache\\Memcached podporuje len modul \"memcached\", \"memcache\" nie je podporovaný. Viac informácií nájdete na <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki stránke o oboch moduloch</a>.",
"Error occurred while checking server setup" : "Počas kontroly nastavenia serveru sa stala chyba",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Váš priečinok s dátami aj vaše súbory sú pravdepodobne prístupné z internetu. Súbor .htaccess nefunguje. Dôrazne odporúčame nakonfigurovať webový server tak, aby priečinok s dátami nebol naďalej prístupný alebo presunúť priečinok s dátami mimo priestoru, ktorý webový server sprístupňuje.",
"Shared" : "Zdieľané",
@@ -131,8 +141,6 @@
"Expiration" : "Koniec platnosti",
"Expiration date" : "Dátum expirácie",
"Choose a password for the public link" : "Zadajte heslo pre tento verejný odkaz",
- "Sending ..." : "Odosielam ...",
- "Email sent" : "Email odoslaný",
"Resharing is not allowed" : "Zdieľanie už zdieľanej položky nie je povolené",
"Share link" : "Zdieľať linku",
"Link" : "Odkaz",
@@ -141,6 +149,8 @@
"Allow editing" : "Povoliť úpravy",
"Email link to person" : "Odoslať odkaz emailom",
"Send" : "Odoslať",
+ "Sending ..." : "Odosielam ...",
+ "Email sent" : "Email odoslaný",
"Shared with you and the group {group} by {owner}" : "Zdieľané s vami a so skupinou {group} používateľom {owner}",
"Shared with you by {owner}" : "Zdieľané s vami používateľom {owner}",
"group" : "skupina",
@@ -153,11 +163,19 @@
"change" : "zmeniť",
"delete" : "vymazať",
"access control" : "prístupové práva",
+ "Could not unshare" : "Nepodarilo sa zrušiť sprístupnenie",
"Share details could not be loaded for this item." : "Nebolo možné načítať údaje o zdieľaní tejto položky.",
+ "{sharee} (at {server})" : "{sharee} (na {server})",
"Share" : "Zdieľať",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Zdieľať s ľuďmi na iných serveroch ownClouds pomocou syntaxe používateľ@doména.com/owncloud",
+ "Share with users…" : "Sprístupniť používateľom...",
+ "Share with users, groups or remote users…" : "Sprístupniť používateľom, skupinám alebo vzdialeným používateľom...",
+ "Share with users or groups…" : "Sprístupniť používateľom alebo skupinám...",
+ "Share with users or remote users…" : "Sprístupniť používateľom alebo vzdialeným používateľom...",
+ "Error removing share" : "Chyba pri rušení sprístupnenia",
"Warning" : "Varovanie",
"Error while sending notification" : "Chyba pri posielaní oznámenia",
+ "invisible" : "neviditeľný",
"Delete" : "Zmazať",
"Rename" : "Premenovať",
"The object type is not specified." : "Nešpecifikovaný typ objektu.",
@@ -171,10 +189,13 @@
"sunny" : "slnečno",
"Hello {name}, the weather is {weather}" : "Dobrý deň {name}, počasie je {weather}",
"Hello {name}" : "Vitaj {name}",
+ "new" : "nový",
"_download %n file_::_download %n files_" : ["stiahnuť %n súbor","stiahnuť %n súbory","stiahnuť %n súborov"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Aktualizácie prebieha. V niektorých prostrediach môže opustenie tejto stránky spôsobiť prerušenie aktualizácie.",
+ "Updating to {version}" : "Aktualizuje sa na {version}",
"An error occurred." : "Vyskytla sa chyba.",
"Please reload the page." : "Obnovte prosím stránku.",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Aktualizácia neprebehla úspešne. Pre viac informácií <a href=\"{url}\">navštívte príspevok na našom fóre</a>, ktorý pokrýva tento problém.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Aktualizácia nebola úspešná. Problém nahláste <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud comunite</a>.",
"The update was successful. There were warnings." : "Aktualizácia bola úspešná. Vyskytli sa upozornenia.",
"The update was successful. Redirecting you to ownCloud now." : "Aktualizácia bola úspešná. Presmerovávam vás na prihlasovaciu stránku.",
@@ -235,9 +256,11 @@
"Search" : "Hľadať",
"Server side authentication failed!" : "Autentifikácia na serveri zlyhala!",
"Please contact your administrator." : "Kontaktujte prosím vášho administrátora.",
+ "An internal error occurred." : "Došlo k vnútornej chybe.",
"Please try again or contact your administrator." : "Skúste to znovu, alebo sa obráťte na vášho administrátora.",
"Log in" : "Prihlásiť sa",
"Wrong password. Reset it?" : "Chybné heslo. Chcete ho obnoviť?",
+ "Wrong password." : "Nesprávne heslo.",
"Stay logged in" : "Zostať prihlásený",
"Alternative Logins" : "Alternatívne prihlásenie",
"Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}",
@@ -259,6 +282,7 @@
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Pred vykonaním ďalšieho kroku sa presvedčte, že databáza, konfiguračný a dátový priečinok sú zazálohované.",
"Start update" : "Spustiť aktualizáciu",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Aby nedošlo k vypršaniu časového limitu vo väčších inštaláciách, môžete namiesto toho použiť nasledujúci príkaz z inštalačného priečinka:",
+ "Detailed logs" : "Podrobné záznamy",
"This %s instance is currently in maintenance mode, which may take a while." : "Táto %s inštancia je v súčasnej dobe v režime údržby. Počkajte prosím.",
"This page will refresh itself when the %s instance is available again." : "Táto stránka sa obnoví sama hneď ako bude %s inštancia znovu dostupná."
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
diff --git a/core/l10n/sl.js b/core/l10n/sl.js
index 0af9907368e..247cd8baa58 100644
--- a/core/l10n/sl.js
+++ b/core/l10n/sl.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.",
"Couldn't reset password because the token is expired" : "Ni mogoče ponastaviti gesla, ker je žeton potekel.",
"Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Ni mogoče poslati elektronskega sporočila za ponastavitev gesla, ker ni navedenega elektronskega naslova. Stopite v stik s skrbnikom sistema.",
"%s password reset" : "Ponastavitev gesla %s",
"Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.",
"Error loading tags" : "Napaka nalaganja oznak",
@@ -26,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Napaka odstranjevanja oznake priljubljenosti",
"Couldn't send mail to following users: %s " : "Ni mogoče poslati sporočila za: %s",
"Preparing update" : "Pripravljanje posodobitve",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Posodobitev sistema je treba izvesti prek ukazne vrstice, ker je nastavitev samodejne posodobitve v config.php onemogočena.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Poteka preverjanje razpredelnice %s",
"Turned on maintenance mode" : "Vzdrževalni način je omogočen",
@@ -94,7 +96,9 @@ OC.L10N.register(
"Oct." : "okt",
"Nov." : "nov",
"Dec." : "dec",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Med preverjanjem celovitosti kode je prišlo do napak. Več podrobnosti …</a>",
"Settings" : "Nastavitve",
+ "Problem loading page, reloading in 5 seconds" : "Napaka nalaganja strani! Poskus ponovnega nalaganja bo izveden čez 5 sekund.",
"Saving..." : "Poteka shranjevanje ...",
"Dismiss" : "Opusti",
"seconds ago" : "pred nekaj sekundami",
@@ -126,6 +130,10 @@ OC.L10N.register(
"Good password" : "Dobro geslo",
"Strong password" : "Odlično geslo",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Spletni stražnik še ni ustrezno nastavljen in ne omogoča usklajevanja, saj je vmesnik WebDAV videti okvarjen.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Spletni strežnik ni ustrezno nastavljen za razreševanje \"{url}\". Več pdorobnosti je zapisanih v <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaciji</a>.",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Strežnik je brez vzpostavljene internetne povezave. To pomeni, da priklapljanje zunanjih diskov, opozorila za posodobitve in namestitve programske opreme iz drugih virov, niso mogoče. Za popolno delovanje OwnCloud je nujna delujoča internetna povezava.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Iz varnostnih razlogov je priporočljivo nastaviti dovoljenja ukaza /dev/urandom za branje prek PHP. Več podrobnosti je zavedenih v <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaciji<-a>",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Trenutno je zagnana različica PHP {version}. Priporočljivo je posodobiti sistem na najnovejšo različico in s tem namestiti <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">funkcijske in varnostne posodobitve delovanja, ki jih zagotavlja skupnost PHP</a>. Pakete je priporočljivo posodobiti takoj, ko so na voljo za nameščeno distribucijo.",
"Error occurred while checking server setup" : "Prišlo je do napake med preverjanjem nastavitev strežnika",
"Shared" : "V souporabi",
"Shared with {recipients}" : "V souporabi z {recipients}",
@@ -138,8 +146,6 @@ OC.L10N.register(
"Expiration" : "Datum preteka",
"Expiration date" : "Datum preteka",
"Choose a password for the public link" : "Izberite geslo za javno povezavo",
- "Sending ..." : "Pošiljanje ...",
- "Email sent" : "Elektronska pošta je poslana",
"Resharing is not allowed" : "Nadaljnja souporaba ni dovoljena",
"Share link" : "Povezava za prejem",
"Link" : "Povezava",
@@ -148,6 +154,9 @@ OC.L10N.register(
"Allow editing" : "Dovoli urejanje",
"Email link to person" : "Posreduj povezavo po elektronski pošti",
"Send" : "Pošlji",
+ "Sending ..." : "Pošiljanje ...",
+ "Email sent" : "Elektronska pošta je poslana",
+ "Send link via email" : "Pošlji povezavo prek elektronske pošte",
"Shared with you and the group {group} by {owner}" : "V souporabi z vami in skupino {group}. Lastnik je {owner}.",
"Shared with you by {owner}" : "V souporabi z vami. Lastnik je {owner}.",
"group" : "skupina",
@@ -163,12 +172,17 @@ OC.L10N.register(
"Could not unshare" : "Ni mogoče prekiniti souporabe",
"Share details could not be loaded for this item." : "Podrobnosti souporabe za te predmet ni mogoče naložiti.",
"No users or groups found for {search}" : "Ni najdenih uporabnikov ali skupin za {search}",
+ "No users found for {search}" : "Ni uporabnikov, skladnih z iskalnim nizom {search}",
+ "An error occurred. Please try again" : "Prišlo je do napake. Poskusite znova.",
"{sharee} (group)" : "{sharee} (skupina)",
"{sharee} (at {server})" : "{sharee} (na {server})",
"{sharee} (remote)" : "{sharee} (oddaljeno)",
"Share" : "Souporaba",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Souporaba z uporabniki, ki so na drugih oblakih ownCloud s povezavo uporabnik@domena.si/owncloud",
"Share with users…" : "Omogoči souporabo z ...",
+ "Share with users, groups or remote users…" : "Souporaba z uporabniki, skupinami ali zunanjimi uporabniki ...",
+ "Share with users or groups…" : "Souporaba z uporabniki ali skupinami ...",
+ "Share with users or remote users…" : "Souporaba z uporabniki ali oddaljenimi uporabniki ...",
"Error removing share" : "Napaka odstranjevanja souporabe",
"Warning" : "Opozorilo",
"Error while sending notification" : "Napaka med pošiljanjem obvestila",
@@ -192,8 +206,10 @@ OC.L10N.register(
"new" : "novo",
"_download %n file_::_download %n files_" : ["prejmi %n datoteko","prejmi %n datoteki","prejmi %n datoteke","prejmi %n datotek"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Trenutno se izvaja posodobitev sistema. Priporočljivo je počakati, saj se lahko opravilo, če stran zapustite, prekine.",
+ "Updating to {version}" : "Posodabljanje na različico {version}",
"An error occurred." : "Prišlo je do napake.",
"Please reload the page." : "Stran je treba ponovno naložiti",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Posodobitev je spodletela. Za več podrobnosti o napaki je <a href=\"{url}\">objavljenih na forumu</a>.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Posodobitev je spodletela uspela. Pošljite poročilo o napaki razvijalcem sistema <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud</a>.",
"The update was successful. There were warnings." : "Posodobitev je uspešno končana, vendar z nekaj opozorili.",
"The update was successful. Redirecting you to ownCloud now." : "Posodobitev je uspešno končana. Stran bo preusmerjena na oblak ownCloud.",
@@ -227,6 +243,7 @@ OC.L10N.register(
"Trace" : "Sledenje povezav",
"Security warning" : "Varnostno opozorilo",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Podatkovna mapa in datoteke so najverjetneje javno dostopni preko interneta, saj datoteka .htaccess ni ustrezno nastavljena.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Za več podrobnosti o pravilnem nastavljanju strežnika si oglejte <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentacijo</a>.",
"Create an <strong>admin account</strong>" : "Ustvari <strong>skrbniški račun</strong>",
"Username" : "Uporabniško ime",
"Storage & database" : "Shramba in podatkovna zbirka",
@@ -242,15 +259,19 @@ OC.L10N.register(
"Database host" : "Gostitelj podatkovne zbirke",
"Performance warning" : "Opozorilo učinkovitosti delovanja",
"SQLite will be used as database." : "Kot podatkovna zbirka bo uporabljena zbirka SQLite",
+ "For larger installations we recommend to choose a different database backend." : "Za večje namestitve je priporočljivo uporabiti drugo ozadnji program zbirke podatkov.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Uporaba SQLite ni priporočljiva iz varnostnih razlogov, še posebej če se sistem krajevno usklajuje z namizjem prek odjemalca.",
"Finish setup" : "Končaj nastavitev",
"Finishing …" : "Poteka zaključevanje opravila ...",
"Need help?" : "Ali potrebujete pomoč?",
"See the documentation" : "Preverite dokumentacijo",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Pozdravljeni,<br><br>uporabnik %s vam je omogočil souporabo <strong>%s</strong>.<br><a href=\"%s\">Oglejte si vsebino!</a><br><br>",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Program zahteva podporo JavaScript za pravilno delovanje. Med nastavitvami omogočite {linkstart}JavaScript{linkend} in osvežite spletno stran.",
"Log out" : "Odjava",
"Search" : "Poišči",
"Server side authentication failed!" : "Overitev s strežnika je spodletela!",
"Please contact your administrator." : "Stopite v stik s skrbnikom sistema.",
+ "An internal error occurred." : "Prišlo je do notranje napake.",
"Please try again or contact your administrator." : "Poskusite znova ali pa stopite v stik s skrbnikom sistema.",
"Log in" : "Prijava",
"Wrong password. Reset it?" : "Napačno geslo. Ali ga želite ponastaviti?",
@@ -276,6 +297,10 @@ OC.L10N.register(
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Pred nadaljevanjem se prepričajte se, da je ustvarjena varnostna kopija podatkovne zbirke, nastavitvenih datotek in podatkovne mape.",
"Start update" : "Začni posodobitev",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Za razreševanje časovnih zahtev večjih namestitev lahko uporabite ukaz iz namestitvene mape:",
+ "Detailed logs" : "Podrobni dnevniški zapisi",
+ "Update needed" : "Zahtevana je posodobitev",
+ "Please use the command line updater because you have a big instance." : "Posodobitev večjih namestitev je priporočljivo izvesti prek ukazne vrstice.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Za več podrobnosti si oglejte <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentacijo</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Strežnik %s je trenutno v načinu vzdrževanja, kar lahko traja.",
"This page will refresh itself when the %s instance is available again." : "Stran bo osvežena ko bo %s spet na voljo."
},
diff --git a/core/l10n/sl.json b/core/l10n/sl.json
index 5b1331d26d7..cf116d353f3 100644
--- a/core/l10n/sl.json
+++ b/core/l10n/sl.json
@@ -13,6 +13,7 @@
"Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.",
"Couldn't reset password because the token is expired" : "Ni mogoče ponastaviti gesla, ker je žeton potekel.",
"Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Ni mogoče poslati elektronskega sporočila za ponastavitev gesla, ker ni navedenega elektronskega naslova. Stopite v stik s skrbnikom sistema.",
"%s password reset" : "Ponastavitev gesla %s",
"Couldn't send reset email. Please contact your administrator." : "Ni mogoče nastaviti elektronskega naslova za ponastavitev. Stopite v stik s skrbnikom sistema.",
"Error loading tags" : "Napaka nalaganja oznak",
@@ -24,6 +25,7 @@
"Error unfavoriting" : "Napaka odstranjevanja oznake priljubljenosti",
"Couldn't send mail to following users: %s " : "Ni mogoče poslati sporočila za: %s",
"Preparing update" : "Pripravljanje posodobitve",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Posodobitev sistema je treba izvesti prek ukazne vrstice, ker je nastavitev samodejne posodobitve v config.php onemogočena.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Poteka preverjanje razpredelnice %s",
"Turned on maintenance mode" : "Vzdrževalni način je omogočen",
@@ -92,7 +94,9 @@
"Oct." : "okt",
"Nov." : "nov",
"Dec." : "dec",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Med preverjanjem celovitosti kode je prišlo do napak. Več podrobnosti …</a>",
"Settings" : "Nastavitve",
+ "Problem loading page, reloading in 5 seconds" : "Napaka nalaganja strani! Poskus ponovnega nalaganja bo izveden čez 5 sekund.",
"Saving..." : "Poteka shranjevanje ...",
"Dismiss" : "Opusti",
"seconds ago" : "pred nekaj sekundami",
@@ -124,6 +128,10 @@
"Good password" : "Dobro geslo",
"Strong password" : "Odlično geslo",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Spletni stražnik še ni ustrezno nastavljen in ne omogoča usklajevanja, saj je vmesnik WebDAV videti okvarjen.",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Spletni strežnik ni ustrezno nastavljen za razreševanje \"{url}\". Več pdorobnosti je zapisanih v <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaciji</a>.",
+ "This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Strežnik je brez vzpostavljene internetne povezave. To pomeni, da priklapljanje zunanjih diskov, opozorila za posodobitve in namestitve programske opreme iz drugih virov, niso mogoče. Za popolno delovanje OwnCloud je nujna delujoča internetna povezava.",
+ "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Iz varnostnih razlogov je priporočljivo nastaviti dovoljenja ukaza /dev/urandom za branje prek PHP. Več podrobnosti je zavedenih v <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentaciji<-a>",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Trenutno je zagnana različica PHP {version}. Priporočljivo je posodobiti sistem na najnovejšo različico in s tem namestiti <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">funkcijske in varnostne posodobitve delovanja, ki jih zagotavlja skupnost PHP</a>. Pakete je priporočljivo posodobiti takoj, ko so na voljo za nameščeno distribucijo.",
"Error occurred while checking server setup" : "Prišlo je do napake med preverjanjem nastavitev strežnika",
"Shared" : "V souporabi",
"Shared with {recipients}" : "V souporabi z {recipients}",
@@ -136,8 +144,6 @@
"Expiration" : "Datum preteka",
"Expiration date" : "Datum preteka",
"Choose a password for the public link" : "Izberite geslo za javno povezavo",
- "Sending ..." : "Pošiljanje ...",
- "Email sent" : "Elektronska pošta je poslana",
"Resharing is not allowed" : "Nadaljnja souporaba ni dovoljena",
"Share link" : "Povezava za prejem",
"Link" : "Povezava",
@@ -146,6 +152,9 @@
"Allow editing" : "Dovoli urejanje",
"Email link to person" : "Posreduj povezavo po elektronski pošti",
"Send" : "Pošlji",
+ "Sending ..." : "Pošiljanje ...",
+ "Email sent" : "Elektronska pošta je poslana",
+ "Send link via email" : "Pošlji povezavo prek elektronske pošte",
"Shared with you and the group {group} by {owner}" : "V souporabi z vami in skupino {group}. Lastnik je {owner}.",
"Shared with you by {owner}" : "V souporabi z vami. Lastnik je {owner}.",
"group" : "skupina",
@@ -161,12 +170,17 @@
"Could not unshare" : "Ni mogoče prekiniti souporabe",
"Share details could not be loaded for this item." : "Podrobnosti souporabe za te predmet ni mogoče naložiti.",
"No users or groups found for {search}" : "Ni najdenih uporabnikov ali skupin za {search}",
+ "No users found for {search}" : "Ni uporabnikov, skladnih z iskalnim nizom {search}",
+ "An error occurred. Please try again" : "Prišlo je do napake. Poskusite znova.",
"{sharee} (group)" : "{sharee} (skupina)",
"{sharee} (at {server})" : "{sharee} (na {server})",
"{sharee} (remote)" : "{sharee} (oddaljeno)",
"Share" : "Souporaba",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Souporaba z uporabniki, ki so na drugih oblakih ownCloud s povezavo uporabnik@domena.si/owncloud",
"Share with users…" : "Omogoči souporabo z ...",
+ "Share with users, groups or remote users…" : "Souporaba z uporabniki, skupinami ali zunanjimi uporabniki ...",
+ "Share with users or groups…" : "Souporaba z uporabniki ali skupinami ...",
+ "Share with users or remote users…" : "Souporaba z uporabniki ali oddaljenimi uporabniki ...",
"Error removing share" : "Napaka odstranjevanja souporabe",
"Warning" : "Opozorilo",
"Error while sending notification" : "Napaka med pošiljanjem obvestila",
@@ -190,8 +204,10 @@
"new" : "novo",
"_download %n file_::_download %n files_" : ["prejmi %n datoteko","prejmi %n datoteki","prejmi %n datoteke","prejmi %n datotek"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Trenutno se izvaja posodobitev sistema. Priporočljivo je počakati, saj se lahko opravilo, če stran zapustite, prekine.",
+ "Updating to {version}" : "Posodabljanje na različico {version}",
"An error occurred." : "Prišlo je do napake.",
"Please reload the page." : "Stran je treba ponovno naložiti",
+ "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Posodobitev je spodletela. Za več podrobnosti o napaki je <a href=\"{url}\">objavljenih na forumu</a>.",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "Posodobitev je spodletela uspela. Pošljite poročilo o napaki razvijalcem sistema <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud</a>.",
"The update was successful. There were warnings." : "Posodobitev je uspešno končana, vendar z nekaj opozorili.",
"The update was successful. Redirecting you to ownCloud now." : "Posodobitev je uspešno končana. Stran bo preusmerjena na oblak ownCloud.",
@@ -225,6 +241,7 @@
"Trace" : "Sledenje povezav",
"Security warning" : "Varnostno opozorilo",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Podatkovna mapa in datoteke so najverjetneje javno dostopni preko interneta, saj datoteka .htaccess ni ustrezno nastavljena.",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "Za več podrobnosti o pravilnem nastavljanju strežnika si oglejte <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentacijo</a>.",
"Create an <strong>admin account</strong>" : "Ustvari <strong>skrbniški račun</strong>",
"Username" : "Uporabniško ime",
"Storage & database" : "Shramba in podatkovna zbirka",
@@ -240,15 +257,19 @@
"Database host" : "Gostitelj podatkovne zbirke",
"Performance warning" : "Opozorilo učinkovitosti delovanja",
"SQLite will be used as database." : "Kot podatkovna zbirka bo uporabljena zbirka SQLite",
+ "For larger installations we recommend to choose a different database backend." : "Za večje namestitve je priporočljivo uporabiti drugo ozadnji program zbirke podatkov.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Uporaba SQLite ni priporočljiva iz varnostnih razlogov, še posebej če se sistem krajevno usklajuje z namizjem prek odjemalca.",
"Finish setup" : "Končaj nastavitev",
"Finishing …" : "Poteka zaključevanje opravila ...",
"Need help?" : "Ali potrebujete pomoč?",
"See the documentation" : "Preverite dokumentacijo",
"Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Pozdravljeni,<br><br>uporabnik %s vam je omogočil souporabo <strong>%s</strong>.<br><a href=\"%s\">Oglejte si vsebino!</a><br><br>",
+ "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Program zahteva podporo JavaScript za pravilno delovanje. Med nastavitvami omogočite {linkstart}JavaScript{linkend} in osvežite spletno stran.",
"Log out" : "Odjava",
"Search" : "Poišči",
"Server side authentication failed!" : "Overitev s strežnika je spodletela!",
"Please contact your administrator." : "Stopite v stik s skrbnikom sistema.",
+ "An internal error occurred." : "Prišlo je do notranje napake.",
"Please try again or contact your administrator." : "Poskusite znova ali pa stopite v stik s skrbnikom sistema.",
"Log in" : "Prijava",
"Wrong password. Reset it?" : "Napačno geslo. Ali ga želite ponastaviti?",
@@ -274,6 +295,10 @@
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Pred nadaljevanjem se prepričajte se, da je ustvarjena varnostna kopija podatkovne zbirke, nastavitvenih datotek in podatkovne mape.",
"Start update" : "Začni posodobitev",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Za razreševanje časovnih zahtev večjih namestitev lahko uporabite ukaz iz namestitvene mape:",
+ "Detailed logs" : "Podrobni dnevniški zapisi",
+ "Update needed" : "Zahtevana je posodobitev",
+ "Please use the command line updater because you have a big instance." : "Posodobitev večjih namestitev je priporočljivo izvesti prek ukazne vrstice.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Za več podrobnosti si oglejte <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentacijo</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Strežnik %s je trenutno v načinu vzdrževanja, kar lahko traja.",
"This page will refresh itself when the %s instance is available again." : "Stran bo osvežena ko bo %s spet na voljo."
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
diff --git a/core/l10n/sq.js b/core/l10n/sq.js
index 3990855bf12..4245d87f053 100644
--- a/core/l10n/sq.js
+++ b/core/l10n/sq.js
@@ -27,6 +27,7 @@ OC.L10N.register(
"Error unfavoriting" : "Gabim në heqjen nga të parapëlqyerat",
"Couldn't send mail to following users: %s " : "S’u dërgua dot e-mail përdoruesve vijues: %s ",
"Preparing update" : "Po përgatitet përditësimi",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Ju lutemi, përdorni përditësuesin e rreshtit të urdhrave, sepse përditësimi i vetvetishëm është i çaktivizuar te config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Po kontrollohet tabela %s",
"Turned on maintenance mode" : "Mënyra e mirëmbajtjes u aktivizua",
@@ -97,6 +98,7 @@ OC.L10N.register(
"Dec." : "Dhj.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Pati probleme me kontrollin e integritetit të kodit. Më tepër të dhëna…</a>",
"Settings" : "Rregullime",
+ "Problem loading page, reloading in 5 seconds" : "Gabim në ngarkimin e faqes, do të ringarkohet pas 5 sekondash",
"Saving..." : "Po ruhet …",
"Dismiss" : "Mos e merr parasysh",
"seconds ago" : "sekonda më parë",
@@ -152,8 +154,6 @@ OC.L10N.register(
"Expiration" : "Skadim",
"Expiration date" : "Datë skadimi",
"Choose a password for the public link" : "Zgjidhni një fjalëkalim për lidhjen publike",
- "Sending ..." : "Po dërgohet …",
- "Email sent" : "Email-i u dërgua",
"Resharing is not allowed" : "Nuk lejohen rindarjet",
"Share link" : "Lidhje ndarjeje",
"Link" : "Lidhje",
@@ -162,6 +162,9 @@ OC.L10N.register(
"Allow editing" : "Lejo përpunim",
"Email link to person" : "Dërgoja personit lidhjen me email",
"Send" : "Dërgoje",
+ "Sending ..." : "Po dërgohet …",
+ "Email sent" : "Email-i u dërgua",
+ "Send link via email" : "Dërgojeni lidhjen me email",
"Shared with you and the group {group} by {owner}" : "Ndarë me ju dhe me grupin {group} nga {owner}",
"Shared with you by {owner}" : "Ndarë me ju nga {owner}",
"group" : "grup",
@@ -304,6 +307,9 @@ OC.L10N.register(
"Start update" : "Fillo përditësimin",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Për të shmangur çaste bllokimi pune me instalime të mëdha, mundeni të ekzekutoni urdhrin vijues që nga drejtoria juaj e instalimit:",
"Detailed logs" : "Regjistrime të hollësishme",
+ "Update needed" : "Lyp përditësim",
+ "Please use the command line updater because you have a big instance." : "Ju lutemi, përdorni përditësuesin e rreshtit të urdhrave, sepse keni një instalim të madh.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Për ndihmë, shihni <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentimin</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Kjo instancë %s hëpërhë gjendet nën mënyrën mirëmbajtje, çka mund të zgjasë ca.",
"This page will refresh itself when the %s instance is available again." : "Kjo faqe do të rifreskohet vetiu, sapo instanca %s të jetë sërish gati."
},
diff --git a/core/l10n/sq.json b/core/l10n/sq.json
index af3dfaf2dcc..98cb66a90f0 100644
--- a/core/l10n/sq.json
+++ b/core/l10n/sq.json
@@ -25,6 +25,7 @@
"Error unfavoriting" : "Gabim në heqjen nga të parapëlqyerat",
"Couldn't send mail to following users: %s " : "S’u dërgua dot e-mail përdoruesve vijues: %s ",
"Preparing update" : "Po përgatitet përditësimi",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "Ju lutemi, përdorni përditësuesin e rreshtit të urdhrave, sepse përditësimi i vetvetishëm është i çaktivizuar te config.php.",
"[%d / %d]: %s" : "[%d / %d]: %s",
"[%d / %d]: Checking table %s" : "[%d / %d]: Po kontrollohet tabela %s",
"Turned on maintenance mode" : "Mënyra e mirëmbajtjes u aktivizua",
@@ -95,6 +96,7 @@
"Dec." : "Dhj.",
"<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Pati probleme me kontrollin e integritetit të kodit. Më tepër të dhëna…</a>",
"Settings" : "Rregullime",
+ "Problem loading page, reloading in 5 seconds" : "Gabim në ngarkimin e faqes, do të ringarkohet pas 5 sekondash",
"Saving..." : "Po ruhet …",
"Dismiss" : "Mos e merr parasysh",
"seconds ago" : "sekonda më parë",
@@ -150,8 +152,6 @@
"Expiration" : "Skadim",
"Expiration date" : "Datë skadimi",
"Choose a password for the public link" : "Zgjidhni një fjalëkalim për lidhjen publike",
- "Sending ..." : "Po dërgohet …",
- "Email sent" : "Email-i u dërgua",
"Resharing is not allowed" : "Nuk lejohen rindarjet",
"Share link" : "Lidhje ndarjeje",
"Link" : "Lidhje",
@@ -160,6 +160,9 @@
"Allow editing" : "Lejo përpunim",
"Email link to person" : "Dërgoja personit lidhjen me email",
"Send" : "Dërgoje",
+ "Sending ..." : "Po dërgohet …",
+ "Email sent" : "Email-i u dërgua",
+ "Send link via email" : "Dërgojeni lidhjen me email",
"Shared with you and the group {group} by {owner}" : "Ndarë me ju dhe me grupin {group} nga {owner}",
"Shared with you by {owner}" : "Ndarë me ju nga {owner}",
"group" : "grup",
@@ -302,6 +305,9 @@
"Start update" : "Fillo përditësimin",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Për të shmangur çaste bllokimi pune me instalime të mëdha, mundeni të ekzekutoni urdhrin vijues që nga drejtoria juaj e instalimit:",
"Detailed logs" : "Regjistrime të hollësishme",
+ "Update needed" : "Lyp përditësim",
+ "Please use the command line updater because you have a big instance." : "Ju lutemi, përdorni përditësuesin e rreshtit të urdhrave, sepse keni një instalim të madh.",
+ "For help, see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation</a>." : "Për ndihmë, shihni <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentimin</a>.",
"This %s instance is currently in maintenance mode, which may take a while." : "Kjo instancë %s hëpërhë gjendet nën mënyrën mirëmbajtje, çka mund të zgjasë ca.",
"This page will refresh itself when the %s instance is available again." : "Kjo faqe do të rifreskohet vetiu, sapo instanca %s të jetë sërish gati."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index 906cee0ab3a..566acba710d 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -125,8 +125,6 @@ OC.L10N.register(
"Expiration" : "Истиче",
"Expiration date" : "Датум истека",
"Choose a password for the public link" : "Одредите лозинку за јавну везу",
- "Sending ..." : "Шаљем...",
- "Email sent" : "Порука је послата",
"Resharing is not allowed" : "Поновно дељење није дозвољено",
"Share link" : "Веза дељења",
"Link" : "Веза",
@@ -135,6 +133,8 @@ OC.L10N.register(
"Allow editing" : "Дозволи уређивање",
"Email link to person" : "Пошаљи е-поштом",
"Send" : "Пошаљи",
+ "Sending ..." : "Шаљем...",
+ "Email sent" : "Порука је послата",
"Shared with you and the group {group} by {owner}" : "{owner} дели са вама и са групом {group}.",
"Shared with you by {owner}" : "{owner} дели са вама",
"group" : "група",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index 2b02d09b8ee..3089fac3896 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -123,8 +123,6 @@
"Expiration" : "Истиче",
"Expiration date" : "Датум истека",
"Choose a password for the public link" : "Одредите лозинку за јавну везу",
- "Sending ..." : "Шаљем...",
- "Email sent" : "Порука је послата",
"Resharing is not allowed" : "Поновно дељење није дозвољено",
"Share link" : "Веза дељења",
"Link" : "Веза",
@@ -133,6 +131,8 @@
"Allow editing" : "Дозволи уређивање",
"Email link to person" : "Пошаљи е-поштом",
"Send" : "Пошаљи",
+ "Sending ..." : "Шаљем...",
+ "Email sent" : "Порука је послата",
"Shared with you and the group {group} by {owner}" : "{owner} дели са вама и са групом {group}.",
"Shared with you by {owner}" : "{owner} дели са вама",
"group" : "група",
diff --git a/core/l10n/sr@latin.js b/core/l10n/sr@latin.js
index c2ef304038b..498b569b9ad 100644
--- a/core/l10n/sr@latin.js
+++ b/core/l10n/sr@latin.js
@@ -104,8 +104,6 @@ OC.L10N.register(
"Expiration" : "Isticanje",
"Expiration date" : "Datum isteka",
"Choose a password for the public link" : "Izaberite lozinku za javnu prečicu",
- "Sending ..." : "Slanje...",
- "Email sent" : "Email poslat",
"Resharing is not allowed" : "Dalje deljenje nije dozvoljeno",
"Share link" : "Podeli prečicu",
"Link" : "Prečica",
@@ -114,6 +112,8 @@ OC.L10N.register(
"Allow editing" : "Dozvoli uređivanje",
"Email link to person" : "Pošalji link e-mailom",
"Send" : "Pošalji",
+ "Sending ..." : "Slanje...",
+ "Email sent" : "Email poslat",
"Shared with you and the group {group} by {owner}" : "{owner} podelio sa Vama i grupom {group} ",
"Shared with you by {owner}" : "Sa vama podelio {owner}",
"group" : "grupa",
diff --git a/core/l10n/sr@latin.json b/core/l10n/sr@latin.json
index 262b98b3605..0062e4da477 100644
--- a/core/l10n/sr@latin.json
+++ b/core/l10n/sr@latin.json
@@ -102,8 +102,6 @@
"Expiration" : "Isticanje",
"Expiration date" : "Datum isteka",
"Choose a password for the public link" : "Izaberite lozinku za javnu prečicu",
- "Sending ..." : "Slanje...",
- "Email sent" : "Email poslat",
"Resharing is not allowed" : "Dalje deljenje nije dozvoljeno",
"Share link" : "Podeli prečicu",
"Link" : "Prečica",
@@ -112,6 +110,8 @@
"Allow editing" : "Dozvoli uređivanje",
"Email link to person" : "Pošalji link e-mailom",
"Send" : "Pošalji",
+ "Sending ..." : "Slanje...",
+ "Email sent" : "Email poslat",
"Shared with you and the group {group} by {owner}" : "{owner} podelio sa Vama i grupom {group} ",
"Shared with you by {owner}" : "Sa vama podelio {owner}",
"group" : "grupa",
diff --git a/core/l10n/sv.js b/core/l10n/sv.js
index 2666d77a499..01f8174e89a 100644
--- a/core/l10n/sv.js
+++ b/core/l10n/sv.js
@@ -152,8 +152,6 @@ OC.L10N.register(
"Expiration" : "Upphör",
"Expiration date" : "Utgångsdatum",
"Choose a password for the public link" : "Välj ett lösenord för den publika länken",
- "Sending ..." : "Skickar ...",
- "Email sent" : "E-post skickat",
"Resharing is not allowed" : "Dela vidare är inte tillåtet",
"Share link" : "Dela länk",
"Link" : "Länk",
@@ -162,6 +160,8 @@ OC.L10N.register(
"Allow editing" : "Tillåt redigering",
"Email link to person" : "E-posta länk till person",
"Send" : "Skicka",
+ "Sending ..." : "Skickar ...",
+ "Email sent" : "E-post skickat",
"Shared with you and the group {group} by {owner}" : "Delad med dig och gruppen {group} av {owner}",
"Shared with you by {owner}" : "Delad med dig av {owner}",
"group" : "Grupp",
diff --git a/core/l10n/sv.json b/core/l10n/sv.json
index 2eac41bf57c..7d197d9139f 100644
--- a/core/l10n/sv.json
+++ b/core/l10n/sv.json
@@ -150,8 +150,6 @@
"Expiration" : "Upphör",
"Expiration date" : "Utgångsdatum",
"Choose a password for the public link" : "Välj ett lösenord för den publika länken",
- "Sending ..." : "Skickar ...",
- "Email sent" : "E-post skickat",
"Resharing is not allowed" : "Dela vidare är inte tillåtet",
"Share link" : "Dela länk",
"Link" : "Länk",
@@ -160,6 +158,8 @@
"Allow editing" : "Tillåt redigering",
"Email link to person" : "E-posta länk till person",
"Send" : "Skicka",
+ "Sending ..." : "Skickar ...",
+ "Email sent" : "E-post skickat",
"Shared with you and the group {group} by {owner}" : "Delad med dig och gruppen {group} av {owner}",
"Shared with you by {owner}" : "Delad med dig av {owner}",
"group" : "Grupp",
diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js
index caf1ca920cb..a570642b4c9 100644
--- a/core/l10n/th_TH.js
+++ b/core/l10n/th_TH.js
@@ -27,11 +27,14 @@ OC.L10N.register(
"Error unfavoriting" : "เกิดข้อผิดพลาดขณะยกเลิกการเลือกที่ชื่นชอบ",
"Couldn't send mail to following users: %s " : "ไม่สามารถส่งอีเมลไปยังผู้ใช้: %s",
"Preparing update" : "เตรียมอัพเดท",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "กรุณาใช้คำสั่งการปรับปรุงเพราะการปรับปรุงอัตโนมัติถูกปิดใช้งานใน config.php",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: กำลังตรวจสอบตาราง %s",
"Turned on maintenance mode" : "เปิดโหมดการบำรุงรักษา",
"Turned off maintenance mode" : "ปิดโหมดการบำรุงรักษา",
"Maintenance mode is kept active" : "โหมดการบำรุงรักษาจะถูกเก็บไว้ใช้งาน",
"Updating database schema" : "กำลังอัพเดทฐานข้อมูล schema",
- "Updated database" : "ปรับปรุงฐานข้อมูล",
+ "Updated database" : "อัพเดทฐานข้อมูลเรียบร้อยแล้ว",
"Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "กำลังตรวจสอบว่าฐานข้อมูล schema สามารถอัพเดทได้หรือไม่ (นี้อาจใช้เวลานานขึ้นอยู่กับขนาดของฐานข้อมูล)",
"Checked database schema update" : "Schema อัพเดตของฐานข้อมูลถูกตรวจสอบ",
"Checking updates of apps" : "กำลังตรวจสอบการอัพเดทแอพพลิเคชัน",
@@ -127,6 +130,7 @@ OC.L10N.register(
"Strong password" : "รหัสผ่านระดับดีมาก",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "เว็บเซิร์ฟเวอร์ของคุณยังไม่ถูกติดตั้งอย่างถูกต้องเพื่ออนุญาตให้ประสานข้อมูลให้ตรงกัน เนื่องจากอินเตอร์เฟซ WebDAV อาจเสียหาย",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "เซิร์ฟเวอร์นี้ไม่มีการเชื่อมต่ออินเทอร์เน็ตซึ่งหมายความว่าบางส่วนของคุณสมบัติ เช่น การจัดเก็บข้อมูลภายนอก การแจ้งเตือนเกี่ยวกับการปรับปรุงหรือการติดตั้งแอพพลิเคชันของบุคคลที่สามจะไม่ทำงาน การเข้าถึงไฟล์จากระยะไกลและการส่งอีเมล์แจ้งเตือนอาจจะไม่ทำงาน เราขอแนะนำให้เปิดใช้งานการเชื่อมต่ออินเทอร์เน็ตสำหรับเซิร์ฟเวอร์นี้ถ้าคุณต้องการใช้งานคุณสมบัติทั้งหมด",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "ขณะนี้คุณกำลังใช้ PHP รุ่น {version} เราขอให้คุณอัพเดท <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> เพื่อเหตุผลด้านประสิทธิภาพและความปลอดภัยโดยกลุ่มของ PHP</a>",
"Error occurred while checking server setup" : "เกิดข้อผิดพลาดขณะที่ทำการตรวจสอบการติดตั้งเซิร์ฟเวอร์",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "ข้อมูลไดเรกทอรีและไฟล์ของคุณอาจจะสามารถเข้าถึงได้จากอินเทอร์เน็ต ขณะที่ htaccess ไฟล์ไม่ทำงาน เราขอแนะนำให้คุณกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณในทางที่ข้อมูลไดเรกทอรีไม่สามารถเข้าถึงได้หรือคุณย้ายข้อมูลไดเรกทอรีไปยังนอกเว็บเซิร์ฟเวอร์หรือเอกสาร",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" ไม่ได้กำหนดค่าส่วนหัว Http ให้เท่ากับ \"{expected}\" นี่คือระบบการรักษาความปลอดภัยที่มีศักยภาพหรือลดความเสี่ยงที่จะเกิดขึ้นเราขอแนะนำให้ปรับการตั้งค่านี้",
@@ -142,8 +146,6 @@ OC.L10N.register(
"Expiration" : "การหมดอายุ",
"Expiration date" : "วันที่หมดอายุ",
"Choose a password for the public link" : "เลือกรหัสผ่านสำหรับลิงค์สาธารณะ",
- "Sending ..." : "กำลังส่ง...",
- "Email sent" : "ส่งอีเมล์แล้ว",
"Resharing is not allowed" : "ไม่อนุญาตให้แชร์ข้อมูลที่ซ้ำกัน",
"Share link" : "แชร์ลิงค์",
"Link" : "ลิงค์",
@@ -152,10 +154,12 @@ OC.L10N.register(
"Allow editing" : "อนุญาตให้แก้ไข",
"Email link to person" : "ส่งลิงก์ให้ทางอีเมล",
"Send" : "ส่ง",
+ "Sending ..." : "กำลังส่ง...",
+ "Email sent" : "ส่งอีเมล์แล้ว",
"Shared with you and the group {group} by {owner}" : "ได้แชร์ให้กับคุณ และกลุ่ม {group} โดย {owner}",
"Shared with you by {owner}" : "ถูกแชร์ให้กับคุณโดย {owner}",
"group" : "กลุ่มผู้ใช้งาน",
- "remote" : "ระยะไกล",
+ "remote" : "รีโมท",
"notify by email" : "แจ้งเตือนทางอีเมล",
"Unshare" : "ยกเลิกการแชร์",
"can share" : "สามารถแชร์ได้",
@@ -166,8 +170,11 @@ OC.L10N.register(
"access control" : "ควบคุมการเข้าถึง",
"Could not unshare" : "ไม่สามารถยกเลิกการแชร์ได้",
"Share details could not be loaded for this item." : "รายละเอียดการแชร์ไม่สามารถโหลดสำหรับรายการนี้",
+ "{sharee} (remote)" : "{sharee} (รีโมท)",
"Share" : "แชร์",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud ",
+ "Share with users, groups or remote users…" : "แชร์กับผู้ใช้หรือกลุ่มหรือผู้ใช้โดยการรีโมท ...",
+ "Share with users or remote users…" : "แชร์กับผู้ใช้หรือผู้ใช้โดยการรีโมท ...",
"Error removing share" : "พบข้อผิดพลาดในรายการที่แชร์ออก",
"Warning" : "คำเตือน",
"Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน",
@@ -190,6 +197,7 @@ OC.L10N.register(
"Hello {name}" : "สวัสดี {name}",
"_download %n file_::_download %n files_" : ["ดาวน์โหลด %n ไฟล์"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "กำลังดำเนินการอัพเกรด หากออกจากหน้านี้ ณ เวลานี้อาจเกิดปัญหาในภายหลัง",
+ "Updating to {version}" : "กำลังอัพเดทเป็นรุ่น {version}",
"An error occurred." : "เกิดข้อผิดพลาด",
"Please reload the page." : "โปรดโหลดหน้าเว็บใหม่",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "การอัพเดทไม่เป็นผลสำเร็จ กรุณาแจ้งปัญหาที่เกิดขึ้นไปยัง <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">คอมมูนิตี้ผู้ใช้งาน ownCloud</a>",
@@ -215,7 +223,7 @@ OC.L10N.register(
"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "กรุณาติดต่อผู้ดูแลเซิร์ฟเวอร์ถ้าพบข้อผิดพลาดนี้หลายครั้ง กรุณาระบุรายละเอียดทางเทคนิคที่ด้านล่างในรายงานของคุณ",
"More details can be found in the server log." : "รายละเอียดเพิ่มเติมสามารถดูได้ที่บันทึกของระบบเซิร์ฟเวอร์",
"Technical details" : "รายละเอียดทางเทคนิค",
- "Remote Address: %s" : "ที่อยู่รีโมทระยะไกล: %s",
+ "Remote Address: %s" : "ที่อยู่รีโมท: %s",
"Request ID: %s" : "คำขอ ID: %s",
"Type: %s" : "ชนิด: %s",
"Code: %s" : "โค้ด: %s",
diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json
index 51a63c56a6c..7fafea0e35f 100644
--- a/core/l10n/th_TH.json
+++ b/core/l10n/th_TH.json
@@ -25,11 +25,14 @@
"Error unfavoriting" : "เกิดข้อผิดพลาดขณะยกเลิกการเลือกที่ชื่นชอบ",
"Couldn't send mail to following users: %s " : "ไม่สามารถส่งอีเมลไปยังผู้ใช้: %s",
"Preparing update" : "เตรียมอัพเดท",
+ "Please use the command line updater because automatic updating is disabled in the config.php." : "กรุณาใช้คำสั่งการปรับปรุงเพราะการปรับปรุงอัตโนมัติถูกปิดใช้งานใน config.php",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: กำลังตรวจสอบตาราง %s",
"Turned on maintenance mode" : "เปิดโหมดการบำรุงรักษา",
"Turned off maintenance mode" : "ปิดโหมดการบำรุงรักษา",
"Maintenance mode is kept active" : "โหมดการบำรุงรักษาจะถูกเก็บไว้ใช้งาน",
"Updating database schema" : "กำลังอัพเดทฐานข้อมูล schema",
- "Updated database" : "ปรับปรุงฐานข้อมูล",
+ "Updated database" : "อัพเดทฐานข้อมูลเรียบร้อยแล้ว",
"Checking whether the database schema can be updated (this can take a long time depending on the database size)" : "กำลังตรวจสอบว่าฐานข้อมูล schema สามารถอัพเดทได้หรือไม่ (นี้อาจใช้เวลานานขึ้นอยู่กับขนาดของฐานข้อมูล)",
"Checked database schema update" : "Schema อัพเดตของฐานข้อมูลถูกตรวจสอบ",
"Checking updates of apps" : "กำลังตรวจสอบการอัพเดทแอพพลิเคชัน",
@@ -125,6 +128,7 @@
"Strong password" : "รหัสผ่านระดับดีมาก",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "เว็บเซิร์ฟเวอร์ของคุณยังไม่ถูกติดตั้งอย่างถูกต้องเพื่ออนุญาตให้ประสานข้อมูลให้ตรงกัน เนื่องจากอินเตอร์เฟซ WebDAV อาจเสียหาย",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "เซิร์ฟเวอร์นี้ไม่มีการเชื่อมต่ออินเทอร์เน็ตซึ่งหมายความว่าบางส่วนของคุณสมบัติ เช่น การจัดเก็บข้อมูลภายนอก การแจ้งเตือนเกี่ยวกับการปรับปรุงหรือการติดตั้งแอพพลิเคชันของบุคคลที่สามจะไม่ทำงาน การเข้าถึงไฟล์จากระยะไกลและการส่งอีเมล์แจ้งเตือนอาจจะไม่ทำงาน เราขอแนะนำให้เปิดใช้งานการเชื่อมต่ออินเทอร์เน็ตสำหรับเซิร์ฟเวอร์นี้ถ้าคุณต้องการใช้งานคุณสมบัติทั้งหมด",
+ "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "ขณะนี้คุณกำลังใช้ PHP รุ่น {version} เราขอให้คุณอัพเดท <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> เพื่อเหตุผลด้านประสิทธิภาพและความปลอดภัยโดยกลุ่มของ PHP</a>",
"Error occurred while checking server setup" : "เกิดข้อผิดพลาดขณะที่ทำการตรวจสอบการติดตั้งเซิร์ฟเวอร์",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "ข้อมูลไดเรกทอรีและไฟล์ของคุณอาจจะสามารถเข้าถึงได้จากอินเทอร์เน็ต ขณะที่ htaccess ไฟล์ไม่ทำงาน เราขอแนะนำให้คุณกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณในทางที่ข้อมูลไดเรกทอรีไม่สามารถเข้าถึงได้หรือคุณย้ายข้อมูลไดเรกทอรีไปยังนอกเว็บเซิร์ฟเวอร์หรือเอกสาร",
"The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" ไม่ได้กำหนดค่าส่วนหัว Http ให้เท่ากับ \"{expected}\" นี่คือระบบการรักษาความปลอดภัยที่มีศักยภาพหรือลดความเสี่ยงที่จะเกิดขึ้นเราขอแนะนำให้ปรับการตั้งค่านี้",
@@ -140,8 +144,6 @@
"Expiration" : "การหมดอายุ",
"Expiration date" : "วันที่หมดอายุ",
"Choose a password for the public link" : "เลือกรหัสผ่านสำหรับลิงค์สาธารณะ",
- "Sending ..." : "กำลังส่ง...",
- "Email sent" : "ส่งอีเมล์แล้ว",
"Resharing is not allowed" : "ไม่อนุญาตให้แชร์ข้อมูลที่ซ้ำกัน",
"Share link" : "แชร์ลิงค์",
"Link" : "ลิงค์",
@@ -150,10 +152,12 @@
"Allow editing" : "อนุญาตให้แก้ไข",
"Email link to person" : "ส่งลิงก์ให้ทางอีเมล",
"Send" : "ส่ง",
+ "Sending ..." : "กำลังส่ง...",
+ "Email sent" : "ส่งอีเมล์แล้ว",
"Shared with you and the group {group} by {owner}" : "ได้แชร์ให้กับคุณ และกลุ่ม {group} โดย {owner}",
"Shared with you by {owner}" : "ถูกแชร์ให้กับคุณโดย {owner}",
"group" : "กลุ่มผู้ใช้งาน",
- "remote" : "ระยะไกล",
+ "remote" : "รีโมท",
"notify by email" : "แจ้งเตือนทางอีเมล",
"Unshare" : "ยกเลิกการแชร์",
"can share" : "สามารถแชร์ได้",
@@ -164,8 +168,11 @@
"access control" : "ควบคุมการเข้าถึง",
"Could not unshare" : "ไม่สามารถยกเลิกการแชร์ได้",
"Share details could not be loaded for this item." : "รายละเอียดการแชร์ไม่สามารถโหลดสำหรับรายการนี้",
+ "{sharee} (remote)" : "{sharee} (รีโมท)",
"Share" : "แชร์",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "แชร์กับคนใน ownClouds อื่นๆ ที่ใช้ไวยากรณ์ username@example.com/owncloud ",
+ "Share with users, groups or remote users…" : "แชร์กับผู้ใช้หรือกลุ่มหรือผู้ใช้โดยการรีโมท ...",
+ "Share with users or remote users…" : "แชร์กับผู้ใช้หรือผู้ใช้โดยการรีโมท ...",
"Error removing share" : "พบข้อผิดพลาดในรายการที่แชร์ออก",
"Warning" : "คำเตือน",
"Error while sending notification" : "เกิดข้อผิดพลาดขณะกำลังส่งการแจ้งเตือน",
@@ -188,6 +195,7 @@
"Hello {name}" : "สวัสดี {name}",
"_download %n file_::_download %n files_" : ["ดาวน์โหลด %n ไฟล์"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "กำลังดำเนินการอัพเกรด หากออกจากหน้านี้ ณ เวลานี้อาจเกิดปัญหาในภายหลัง",
+ "Updating to {version}" : "กำลังอัพเดทเป็นรุ่น {version}",
"An error occurred." : "เกิดข้อผิดพลาด",
"Please reload the page." : "โปรดโหลดหน้าเว็บใหม่",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." : "การอัพเดทไม่เป็นผลสำเร็จ กรุณาแจ้งปัญหาที่เกิดขึ้นไปยัง <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">คอมมูนิตี้ผู้ใช้งาน ownCloud</a>",
@@ -213,7 +221,7 @@
"Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "กรุณาติดต่อผู้ดูแลเซิร์ฟเวอร์ถ้าพบข้อผิดพลาดนี้หลายครั้ง กรุณาระบุรายละเอียดทางเทคนิคที่ด้านล่างในรายงานของคุณ",
"More details can be found in the server log." : "รายละเอียดเพิ่มเติมสามารถดูได้ที่บันทึกของระบบเซิร์ฟเวอร์",
"Technical details" : "รายละเอียดทางเทคนิค",
- "Remote Address: %s" : "ที่อยู่รีโมทระยะไกล: %s",
+ "Remote Address: %s" : "ที่อยู่รีโมท: %s",
"Request ID: %s" : "คำขอ ID: %s",
"Type: %s" : "ชนิด: %s",
"Code: %s" : "โค้ด: %s",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index 28e346e5f8d..5b56cf39d45 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -27,6 +27,8 @@ OC.L10N.register(
"Error unfavoriting" : "Beğeniden kaldırılırken hata",
"Couldn't send mail to following users: %s " : "Şu kullanıcılara posta gönderilemedi: %s",
"Preparing update" : "Güncelleme hazırlanıyor",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Tablo kontroi ediliyor %s",
"Turned on maintenance mode" : "Bakım kipi etkinleştirildi",
"Turned off maintenance mode" : "Bakım kipi kapatıldı",
"Maintenance mode is kept active" : "Bakım kipi etkin tutuldu",
@@ -142,8 +144,6 @@ OC.L10N.register(
"Expiration" : "Bitiş",
"Expiration date" : "Son kullanım tarihi",
"Choose a password for the public link" : "Herkese açık bağlantı için bir parola seçin",
- "Sending ..." : "Gönderiliyor...",
- "Email sent" : "E-posta gönderildi",
"Resharing is not allowed" : "Tekrar paylaşmaya izin verilmiyor",
"Share link" : "Paylaşma bağlantısı",
"Link" : "Bağlantı",
@@ -152,6 +152,8 @@ OC.L10N.register(
"Allow editing" : "Düzenlemeye izin ver",
"Email link to person" : "Bağlantıyı e-posta ile gönder",
"Send" : "Gönder",
+ "Sending ..." : "Gönderiliyor...",
+ "Email sent" : "E-posta gönderildi",
"Shared with you and the group {group} by {owner}" : "{owner} tarafından sizinle ve {group} ile paylaştırılmış",
"Shared with you by {owner}" : "{owner} tarafından sizinle paylaşıldı",
"group" : "grup",
@@ -167,8 +169,14 @@ OC.L10N.register(
"Could not unshare" : "Paylaşım kaldırılamadı",
"Share details could not be loaded for this item." : "Bu öge için paylaşma ayrıntıları yüklenemedi.",
"No users or groups found for {search}" : "{search} için kullanıcı veya grup bulunamadı",
+ "No users found for {search}" : "{search} için hiç bir kullanıcı bulunamadı",
+ "An error occurred. Please try again" : "Bir hata oluştu. Lütfen yeniden deneyin",
"Share" : "Paylaş",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş",
+ "Share with users…" : "Kullanıcılarla paylaş...",
+ "Share with users, groups or remote users…" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...",
+ "Share with users or groups…" : "Kullanıcı ve gruplarla paylaş...",
+ "Share with users or remote users…" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...",
"Error removing share" : "Paylaşım kaldırılırken hata",
"Warning" : "Uyarı",
"Error while sending notification" : "Bildirim gönderilirken hata",
@@ -189,8 +197,10 @@ OC.L10N.register(
"sunny" : "güneşli",
"Hello {name}, the weather is {weather}" : "Merhaba {name}, hava durumu {weather}",
"Hello {name}" : "Merhaba {name}",
+ "new" : "Yeni",
"_download %n file_::_download %n files_" : ["%n dosya indir","%n dosya indir"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Güncelleme yapılıyor, sayfadan ayrılmak bazı işlemleri kesebilir.",
+ "Updating to {version}" : "{version} sürümüne güncelleniyor",
"An error occurred." : "Bir hata oluştu",
"Please reload the page." : "Lütfen sayfayı yeniden yükleyin.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Güncelleme başarısız oldu. Daha fazla bilgi için bu sorunu kapsayan <a href=\"{url}\">forum gönderimize</a> bakın.",
@@ -254,6 +264,7 @@ OC.L10N.register(
"Search" : "Ara",
"Server side authentication failed!" : "Sunucu taraflı yetkilendirme başarısız!",
"Please contact your administrator." : "Lütfen sistem yöneticiniz ile iletişime geçin.",
+ "An internal error occurred." : "Dahili bir hata oluştu.",
"Please try again or contact your administrator." : "Lütfen yeniden deneyin veya yöneticinizle iletişim kurun.",
"Log in" : "Giriş yap",
"Wrong password. Reset it?" : "Hatalı parola. Sıfırlansın mı?",
@@ -280,6 +291,7 @@ OC.L10N.register(
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Devam etmeden önce lütfen veritabanının, yapılandırma ve veri klasörlerinin yedeklenmiş olduğundan emin olun.",
"Start update" : "Güncellemeyi başlat",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Daha büyük kurulumlarda zaman aşımlarının önüne geçmek için, kurulum dizininizden aşağıdaki komutu da çalıştırabilirsiniz:",
+ "Detailed logs" : "Ayrıntılı loglar",
"This %s instance is currently in maintenance mode, which may take a while." : "Bu %s örneği şu anda bakım kipinde, bu biraz zaman alabilir.",
"This page will refresh itself when the %s instance is available again." : "Bu sayfa, %s örneği tekrar kullanılabilir olduğunda kendini yenileyecektir."
},
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index e15ec8dc9f5..d268c1c4f63 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -25,6 +25,8 @@
"Error unfavoriting" : "Beğeniden kaldırılırken hata",
"Couldn't send mail to following users: %s " : "Şu kullanıcılara posta gönderilemedi: %s",
"Preparing update" : "Güncelleme hazırlanıyor",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: Tablo kontroi ediliyor %s",
"Turned on maintenance mode" : "Bakım kipi etkinleştirildi",
"Turned off maintenance mode" : "Bakım kipi kapatıldı",
"Maintenance mode is kept active" : "Bakım kipi etkin tutuldu",
@@ -140,8 +142,6 @@
"Expiration" : "Bitiş",
"Expiration date" : "Son kullanım tarihi",
"Choose a password for the public link" : "Herkese açık bağlantı için bir parola seçin",
- "Sending ..." : "Gönderiliyor...",
- "Email sent" : "E-posta gönderildi",
"Resharing is not allowed" : "Tekrar paylaşmaya izin verilmiyor",
"Share link" : "Paylaşma bağlantısı",
"Link" : "Bağlantı",
@@ -150,6 +150,8 @@
"Allow editing" : "Düzenlemeye izin ver",
"Email link to person" : "Bağlantıyı e-posta ile gönder",
"Send" : "Gönder",
+ "Sending ..." : "Gönderiliyor...",
+ "Email sent" : "E-posta gönderildi",
"Shared with you and the group {group} by {owner}" : "{owner} tarafından sizinle ve {group} ile paylaştırılmış",
"Shared with you by {owner}" : "{owner} tarafından sizinle paylaşıldı",
"group" : "grup",
@@ -165,8 +167,14 @@
"Could not unshare" : "Paylaşım kaldırılamadı",
"Share details could not be loaded for this item." : "Bu öge için paylaşma ayrıntıları yüklenemedi.",
"No users or groups found for {search}" : "{search} için kullanıcı veya grup bulunamadı",
+ "No users found for {search}" : "{search} için hiç bir kullanıcı bulunamadı",
+ "An error occurred. Please try again" : "Bir hata oluştu. Lütfen yeniden deneyin",
"Share" : "Paylaş",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "kullanıcı@example.com/owncloud şeklinde diğer ownCloud kullanan diğer kullanıcılarla paylaş",
+ "Share with users…" : "Kullanıcılarla paylaş...",
+ "Share with users, groups or remote users…" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...",
+ "Share with users or groups…" : "Kullanıcı ve gruplarla paylaş...",
+ "Share with users or remote users…" : "Kullanıcılar, gruplar veya uzak kullanıcılarla paylaş ...",
"Error removing share" : "Paylaşım kaldırılırken hata",
"Warning" : "Uyarı",
"Error while sending notification" : "Bildirim gönderilirken hata",
@@ -187,8 +195,10 @@
"sunny" : "güneşli",
"Hello {name}, the weather is {weather}" : "Merhaba {name}, hava durumu {weather}",
"Hello {name}" : "Merhaba {name}",
+ "new" : "Yeni",
"_download %n file_::_download %n files_" : ["%n dosya indir","%n dosya indir"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Güncelleme yapılıyor, sayfadan ayrılmak bazı işlemleri kesebilir.",
+ "Updating to {version}" : "{version} sürümüne güncelleniyor",
"An error occurred." : "Bir hata oluştu",
"Please reload the page." : "Lütfen sayfayı yeniden yükleyin.",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Güncelleme başarısız oldu. Daha fazla bilgi için bu sorunu kapsayan <a href=\"{url}\">forum gönderimize</a> bakın.",
@@ -252,6 +262,7 @@
"Search" : "Ara",
"Server side authentication failed!" : "Sunucu taraflı yetkilendirme başarısız!",
"Please contact your administrator." : "Lütfen sistem yöneticiniz ile iletişime geçin.",
+ "An internal error occurred." : "Dahili bir hata oluştu.",
"Please try again or contact your administrator." : "Lütfen yeniden deneyin veya yöneticinizle iletişim kurun.",
"Log in" : "Giriş yap",
"Wrong password. Reset it?" : "Hatalı parola. Sıfırlansın mı?",
@@ -278,6 +289,7 @@
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "Devam etmeden önce lütfen veritabanının, yapılandırma ve veri klasörlerinin yedeklenmiş olduğundan emin olun.",
"Start update" : "Güncellemeyi başlat",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "Daha büyük kurulumlarda zaman aşımlarının önüne geçmek için, kurulum dizininizden aşağıdaki komutu da çalıştırabilirsiniz:",
+ "Detailed logs" : "Ayrıntılı loglar",
"This %s instance is currently in maintenance mode, which may take a while." : "Bu %s örneği şu anda bakım kipinde, bu biraz zaman alabilir.",
"This page will refresh itself when the %s instance is available again." : "Bu sayfa, %s örneği tekrar kullanılabilir olduğunda kendini yenileyecektir."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
diff --git a/core/l10n/uk.js b/core/l10n/uk.js
index 591bf0d1761..0278766dfaa 100644
--- a/core/l10n/uk.js
+++ b/core/l10n/uk.js
@@ -137,8 +137,6 @@ OC.L10N.register(
"Expiration" : "Закінчення",
"Expiration date" : "Термін дії",
"Choose a password for the public link" : "Вкажіть пароль для публічного посилання",
- "Sending ..." : "Надсилання...",
- "Email sent" : "Лист надіслано",
"Resharing is not allowed" : "Пере-публікація не дозволяється",
"Share link" : "Поділитись посиланням",
"Link" : "Посилання",
@@ -147,6 +145,8 @@ OC.L10N.register(
"Allow editing" : "Дозволити редагування",
"Email link to person" : "Надіслати посилання електронною поштою",
"Send" : "Надіслати",
+ "Sending ..." : "Надсилання...",
+ "Email sent" : "Лист надіслано",
"Shared with you and the group {group} by {owner}" : " {owner} опублікував для Вас та для групи {group}",
"Shared with you by {owner}" : "{owner} опублікував для Вас",
"group" : "група",
diff --git a/core/l10n/uk.json b/core/l10n/uk.json
index 01d76c7aa74..81cc19a624e 100644
--- a/core/l10n/uk.json
+++ b/core/l10n/uk.json
@@ -135,8 +135,6 @@
"Expiration" : "Закінчення",
"Expiration date" : "Термін дії",
"Choose a password for the public link" : "Вкажіть пароль для публічного посилання",
- "Sending ..." : "Надсилання...",
- "Email sent" : "Лист надіслано",
"Resharing is not allowed" : "Пере-публікація не дозволяється",
"Share link" : "Поділитись посиланням",
"Link" : "Посилання",
@@ -145,6 +143,8 @@
"Allow editing" : "Дозволити редагування",
"Email link to person" : "Надіслати посилання електронною поштою",
"Send" : "Надіслати",
+ "Sending ..." : "Надсилання...",
+ "Email sent" : "Лист надіслано",
"Shared with you and the group {group} by {owner}" : " {owner} опублікував для Вас та для групи {group}",
"Shared with you by {owner}" : "{owner} опублікував для Вас",
"group" : "група",
diff --git a/core/l10n/ur_PK.js b/core/l10n/ur_PK.js
index 474f9b6a844..53f2a0d5469 100644
--- a/core/l10n/ur_PK.js
+++ b/core/l10n/ur_PK.js
@@ -56,14 +56,14 @@ OC.L10N.register(
"Set expiration date" : "تاریخ معیاد سیٹ کریں",
"Expiration date" : "تاریخ معیاد",
"Choose a password for the public link" : "عوامی لنک کے لئےپاس ورڈ منتخب کریں",
- "Sending ..." : "ارسال ہو رہا ھے",
- "Email sent" : "ارسال شدہ ای میل ",
"Resharing is not allowed" : "دوبارہ اشتراک کی اجازت نہیں",
"Share link" : "اشتراک لنک",
"Password protect" : "محفوظ پاسورڈ",
"Password" : "پاسورڈ",
"Email link to person" : "شحص کے لیے ای میل لنک",
"Send" : "بھجیں",
+ "Sending ..." : "ارسال ہو رہا ھے",
+ "Email sent" : "ارسال شدہ ای میل ",
"Shared with you and the group {group} by {owner}" : "آپ اور گروہ سے مشترق شدہ {گروہ } سے {مالک}",
"Shared with you by {owner}" : "اشتراک شدہ آپ سے{مالک}",
"group" : "مجموعہ",
diff --git a/core/l10n/ur_PK.json b/core/l10n/ur_PK.json
index 41c54450fbd..5a94bf34661 100644
--- a/core/l10n/ur_PK.json
+++ b/core/l10n/ur_PK.json
@@ -54,14 +54,14 @@
"Set expiration date" : "تاریخ معیاد سیٹ کریں",
"Expiration date" : "تاریخ معیاد",
"Choose a password for the public link" : "عوامی لنک کے لئےپاس ورڈ منتخب کریں",
- "Sending ..." : "ارسال ہو رہا ھے",
- "Email sent" : "ارسال شدہ ای میل ",
"Resharing is not allowed" : "دوبارہ اشتراک کی اجازت نہیں",
"Share link" : "اشتراک لنک",
"Password protect" : "محفوظ پاسورڈ",
"Password" : "پاسورڈ",
"Email link to person" : "شحص کے لیے ای میل لنک",
"Send" : "بھجیں",
+ "Sending ..." : "ارسال ہو رہا ھے",
+ "Email sent" : "ارسال شدہ ای میل ",
"Shared with you and the group {group} by {owner}" : "آپ اور گروہ سے مشترق شدہ {گروہ } سے {مالک}",
"Shared with you by {owner}" : "اشتراک شدہ آپ سے{مالک}",
"group" : "مجموعہ",
diff --git a/core/l10n/vi.js b/core/l10n/vi.js
index 91fa2ceb474..5fabd2e6940 100644
--- a/core/l10n/vi.js
+++ b/core/l10n/vi.js
@@ -80,14 +80,14 @@ OC.L10N.register(
"Error setting expiration date" : "Lỗi cấu hình ngày kết thúc",
"Set expiration date" : "Đặt ngày kết thúc",
"Expiration date" : "Ngày kết thúc",
- "Sending ..." : "Đang gởi ...",
- "Email sent" : "Email đã được gửi",
"Resharing is not allowed" : "Chia sẻ lại không được cho phép",
"Share link" : "Chia sẻ liên kết",
"Password protect" : "Mật khẩu bảo vệ",
"Password" : "Mật khẩu",
"Email link to person" : "Liên kết email tới cá nhân",
"Send" : "Gởi",
+ "Sending ..." : "Đang gởi ...",
+ "Email sent" : "Email đã được gửi",
"Shared with you and the group {group} by {owner}" : "Đã được chia sẽ với bạn và nhóm {group} bởi {owner}",
"Shared with you by {owner}" : "Đã được chia sẽ bởi {owner}",
"group" : "nhóm",
diff --git a/core/l10n/vi.json b/core/l10n/vi.json
index dd0a3a0fa9d..ca107dd661e 100644
--- a/core/l10n/vi.json
+++ b/core/l10n/vi.json
@@ -78,14 +78,14 @@
"Error setting expiration date" : "Lỗi cấu hình ngày kết thúc",
"Set expiration date" : "Đặt ngày kết thúc",
"Expiration date" : "Ngày kết thúc",
- "Sending ..." : "Đang gởi ...",
- "Email sent" : "Email đã được gửi",
"Resharing is not allowed" : "Chia sẻ lại không được cho phép",
"Share link" : "Chia sẻ liên kết",
"Password protect" : "Mật khẩu bảo vệ",
"Password" : "Mật khẩu",
"Email link to person" : "Liên kết email tới cá nhân",
"Send" : "Gởi",
+ "Sending ..." : "Đang gởi ...",
+ "Email sent" : "Email đã được gửi",
"Shared with you and the group {group} by {owner}" : "Đã được chia sẽ với bạn và nhóm {group} bởi {owner}",
"Shared with you by {owner}" : "Đã được chia sẽ bởi {owner}",
"group" : "nhóm",
diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js
index a5ea95ac82b..b95f25a2223 100644
--- a/core/l10n/zh_CN.js
+++ b/core/l10n/zh_CN.js
@@ -27,6 +27,8 @@ OC.L10N.register(
"Error unfavoriting" : "删除收藏时出错",
"Couldn't send mail to following users: %s " : "无法发送邮件到用户: %s ",
"Preparing update" : "正在准备更新",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: 检查数据表 %s",
"Turned on maintenance mode" : "启用维护模式",
"Turned off maintenance mode" : "关闭维护模式",
"Maintenance mode is kept active" : "维护模式已被启用",
@@ -126,6 +128,7 @@ OC.L10N.register(
"Good password" : "较强的密码",
"Strong password" : "强密码",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的web服务器未正确设置以解析 \"{url}\"。您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息。",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器上没有可用的因特网连接. 这意味着某些特性将无法工作,例如挂载外部存储器, 提醒更新或安装第三方应用等. 从远程访问文件和发送提醒电子邮件也可能无法工作. 如果你想要ownCloud的所有特性, 我们建议启用此服务器的因特网连接.",
"Error occurred while checking server setup" : "当检查服务器启动时出错",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
@@ -142,8 +145,6 @@ OC.L10N.register(
"Expiration" : "过期",
"Expiration date" : "过期日期",
"Choose a password for the public link" : "为共享链接设置密码",
- "Sending ..." : "正在发送...",
- "Email sent" : "邮件已发送",
"Resharing is not allowed" : "不允许二次共享",
"Share link" : "分享链接",
"Link" : "链接",
@@ -152,6 +153,8 @@ OC.L10N.register(
"Allow editing" : "允许编辑",
"Email link to person" : "发送链接到个人",
"Send" : "发送",
+ "Sending ..." : "正在发送...",
+ "Email sent" : "邮件已发送",
"Shared with you and the group {group} by {owner}" : "{owner} 共享给您及 {group} 组",
"Shared with you by {owner}" : "{owner} 与您共享",
"group" : "群组",
@@ -167,11 +170,17 @@ OC.L10N.register(
"Could not unshare" : "无法共享",
"Share details could not be loaded for this item." : "无法加载这个项目的分享详情",
"No users or groups found for {search}" : "{search} 条件下没有找到用户或用户组",
+ "No users found for {search}" : "没有找到 {search} 用户",
+ "An error occurred. Please try again" : "发生错误。请重试。",
"{sharee} (group)" : "{sharee} (组)",
"{sharee} (at {server})" : "{sharee} (位于 {server})",
"{sharee} (remote)" : "{sharee} (远程)",
"Share" : "分享",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户",
+ "Share with users…" : "与用户分享...",
+ "Share with users, groups or remote users…" : "与用户,组或远程用户分享...",
+ "Share with users or groups…" : "与用户或组分享...",
+ "Share with users or remote users…" : "与用户或远程用户分享...",
"Error removing share" : "移除分享时出错",
"Warning" : "警告",
"Error while sending notification" : "发送通知时出现错误",
@@ -196,6 +205,7 @@ OC.L10N.register(
"new" : "新建",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "升级正在进行,在某些环境中离开此网页可能中断该过程。",
+ "Updating to {version}" : "正在升级到 {version}",
"An error occurred." : "发生了一个错误",
"Please reload the page." : "请重新加载页面。",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功。有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
@@ -232,6 +242,7 @@ OC.L10N.register(
"Trace" : "追踪",
"Security warning" : "安全警告",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "您的数据目录和文件可能可以直接被互联网访问,因为 .htaccess 并未正常工作。",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "关于如何正确配置服务器,请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">此文档</a>.。",
"Create an <strong>admin account</strong>" : "创建<strong>管理员账号</strong>",
"Username" : "用户名",
"Storage & database" : "存储 & 数据库",
@@ -259,6 +270,7 @@ OC.L10N.register(
"Search" : "搜索",
"Server side authentication failed!" : "服务端验证失败!",
"Please contact your administrator." : "请联系你的管理员。",
+ "An internal error occurred." : "发生了内部错误。",
"Please try again or contact your administrator." : "请重试或联系管理员。",
"Log in" : "登录",
"Wrong password. Reset it?" : "密码错误。要重置么?",
@@ -285,6 +297,7 @@ OC.L10N.register(
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
"Start update" : "开始更新",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为进行避免较大的安装时超时,你可以在你的安装目录下运行下面的命令:",
+ "Detailed logs" : "详细日志",
"This %s instance is currently in maintenance mode, which may take a while." : "该 %s 实例当前处于维护模式,这将进行一些时间。",
"This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时这个页面将刷新。"
},
diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json
index 65067b172cd..ecc89844f17 100644
--- a/core/l10n/zh_CN.json
+++ b/core/l10n/zh_CN.json
@@ -25,6 +25,8 @@
"Error unfavoriting" : "删除收藏时出错",
"Couldn't send mail to following users: %s " : "无法发送邮件到用户: %s ",
"Preparing update" : "正在准备更新",
+ "[%d / %d]: %s" : "[%d / %d]: %s",
+ "[%d / %d]: Checking table %s" : "[%d / %d]: 检查数据表 %s",
"Turned on maintenance mode" : "启用维护模式",
"Turned off maintenance mode" : "关闭维护模式",
"Maintenance mode is kept active" : "维护模式已被启用",
@@ -124,6 +126,7 @@
"Good password" : "较强的密码",
"Strong password" : "强密码",
"Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
+ "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "您的web服务器未正确设置以解析 \"{url}\"。您可以在我们的<a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">文档</a>中找到更多可用信息。",
"This server has no working Internet connection. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "此服务器上没有可用的因特网连接. 这意味着某些特性将无法工作,例如挂载外部存储器, 提醒更新或安装第三方应用等. 从远程访问文件和发送提醒电子邮件也可能无法工作. 如果你想要ownCloud的所有特性, 我们建议启用此服务器的因特网连接.",
"Error occurred while checking server setup" : "当检查服务器启动时出错",
"Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. We strongly suggest that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "你的数据目录和你的文件可能从互联网被访问到。.htaccess 文件不工作。我们强烈建议你配置你的网页服务器,使数据目录不再可访问,或者将数据目录移动到网页服务器根文档目录之外。",
@@ -140,8 +143,6 @@
"Expiration" : "过期",
"Expiration date" : "过期日期",
"Choose a password for the public link" : "为共享链接设置密码",
- "Sending ..." : "正在发送...",
- "Email sent" : "邮件已发送",
"Resharing is not allowed" : "不允许二次共享",
"Share link" : "分享链接",
"Link" : "链接",
@@ -150,6 +151,8 @@
"Allow editing" : "允许编辑",
"Email link to person" : "发送链接到个人",
"Send" : "发送",
+ "Sending ..." : "正在发送...",
+ "Email sent" : "邮件已发送",
"Shared with you and the group {group} by {owner}" : "{owner} 共享给您及 {group} 组",
"Shared with you by {owner}" : "{owner} 与您共享",
"group" : "群组",
@@ -165,11 +168,17 @@
"Could not unshare" : "无法共享",
"Share details could not be loaded for this item." : "无法加载这个项目的分享详情",
"No users or groups found for {search}" : "{search} 条件下没有找到用户或用户组",
+ "No users found for {search}" : "没有找到 {search} 用户",
+ "An error occurred. Please try again" : "发生错误。请重试。",
"{sharee} (group)" : "{sharee} (组)",
"{sharee} (at {server})" : "{sharee} (位于 {server})",
"{sharee} (remote)" : "{sharee} (远程)",
"Share" : "分享",
"Share with people on other ownClouds using the syntax username@example.com/owncloud" : "使用语法 username@example.com/owncloud 分享给其他 ownCloud 上的用户",
+ "Share with users…" : "与用户分享...",
+ "Share with users, groups or remote users…" : "与用户,组或远程用户分享...",
+ "Share with users or groups…" : "与用户或组分享...",
+ "Share with users or remote users…" : "与用户或远程用户分享...",
"Error removing share" : "移除分享时出错",
"Warning" : "警告",
"Error while sending notification" : "发送通知时出现错误",
@@ -194,6 +203,7 @@
"new" : "新建",
"_download %n file_::_download %n files_" : ["下载 %n 个文件"],
"The upgrade is in progress, leaving this page might interrupt the process in some environments." : "升级正在进行,在某些环境中离开此网页可能中断该过程。",
+ "Updating to {version}" : "正在升级到 {version}",
"An error occurred." : "发生了一个错误",
"Please reload the page." : "请重新加载页面。",
"The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "更新不成功。有关此问题的更多信息请<a href=\"{url}\">查看我们的论坛帖子</a>。",
@@ -230,6 +240,7 @@
"Trace" : "追踪",
"Security warning" : "安全警告",
"Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "您的数据目录和文件可能可以直接被互联网访问,因为 .htaccess 并未正常工作。",
+ "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "关于如何正确配置服务器,请参见 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">此文档</a>.。",
"Create an <strong>admin account</strong>" : "创建<strong>管理员账号</strong>",
"Username" : "用户名",
"Storage & database" : "存储 & 数据库",
@@ -257,6 +268,7 @@
"Search" : "搜索",
"Server side authentication failed!" : "服务端验证失败!",
"Please contact your administrator." : "请联系你的管理员。",
+ "An internal error occurred." : "发生了内部错误。",
"Please try again or contact your administrator." : "请重试或联系管理员。",
"Log in" : "登录",
"Wrong password. Reset it?" : "密码错误。要重置么?",
@@ -283,6 +295,7 @@
"Please make sure that the database, the config folder and the data folder have been backed up before proceeding." : "在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。",
"Start update" : "开始更新",
"To avoid timeouts with larger installations, you can instead run the following command from your installation directory:" : "为进行避免较大的安装时超时,你可以在你的安装目录下运行下面的命令:",
+ "Detailed logs" : "详细日志",
"This %s instance is currently in maintenance mode, which may take a while." : "该 %s 实例当前处于维护模式,这将进行一些时间。",
"This page will refresh itself when the %s instance is available again." : "当实例 %s 再次可用时这个页面将刷新。"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/core/l10n/zh_HK.js b/core/l10n/zh_HK.js
index 1e03d908948..de0b4673318 100644
--- a/core/l10n/zh_HK.js
+++ b/core/l10n/zh_HK.js
@@ -34,12 +34,12 @@ OC.L10N.register(
"Error while unsharing" : "取消分享時發生錯誤",
"Set expiration date" : "設定分享期限",
"Expiration date" : "分享期限",
- "Sending ..." : "發送中...",
- "Email sent" : "郵件已傳",
"Share link" : "分享連結",
"Password protect" : "密碼保護",
"Password" : "密碼",
"Send" : "傳送",
+ "Sending ..." : "發送中...",
+ "Email sent" : "郵件已傳",
"Shared with you and the group {group} by {owner}" : "{owner}與你及群組的分享",
"Shared with you by {owner}" : "{owner}與你的分享",
"Unshare" : "取消分享",
diff --git a/core/l10n/zh_HK.json b/core/l10n/zh_HK.json
index cbb721c6b4b..78735e6045b 100644
--- a/core/l10n/zh_HK.json
+++ b/core/l10n/zh_HK.json
@@ -32,12 +32,12 @@
"Error while unsharing" : "取消分享時發生錯誤",
"Set expiration date" : "設定分享期限",
"Expiration date" : "分享期限",
- "Sending ..." : "發送中...",
- "Email sent" : "郵件已傳",
"Share link" : "分享連結",
"Password protect" : "密碼保護",
"Password" : "密碼",
"Send" : "傳送",
+ "Sending ..." : "發送中...",
+ "Email sent" : "郵件已傳",
"Shared with you and the group {group} by {owner}" : "{owner}與你及群組的分享",
"Shared with you by {owner}" : "{owner}與你的分享",
"Unshare" : "取消分享",
diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js
index a6020f3e5c1..154e868a49f 100644
--- a/core/l10n/zh_TW.js
+++ b/core/l10n/zh_TW.js
@@ -141,8 +141,6 @@ OC.L10N.register(
"Expiration" : "過期",
"Expiration date" : "到期日",
"Choose a password for the public link" : "為公開連結選一個密碼",
- "Sending ..." : "正在傳送…",
- "Email sent" : "Email 已寄出",
"Resharing is not allowed" : "不允許重新分享",
"Share link" : "分享連結",
"Link" : "連結",
@@ -151,6 +149,8 @@ OC.L10N.register(
"Allow editing" : "允許編輯",
"Email link to person" : "將連結 email 給別人",
"Send" : "寄出",
+ "Sending ..." : "正在傳送…",
+ "Email sent" : "Email 已寄出",
"Shared with you and the group {group} by {owner}" : "由 {owner} 分享給您和 {group}",
"Shared with you by {owner}" : "{owner} 已經和您分享",
"group" : "群組",
diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json
index 7c39a93771e..6548d7831af 100644
--- a/core/l10n/zh_TW.json
+++ b/core/l10n/zh_TW.json
@@ -139,8 +139,6 @@
"Expiration" : "過期",
"Expiration date" : "到期日",
"Choose a password for the public link" : "為公開連結選一個密碼",
- "Sending ..." : "正在傳送…",
- "Email sent" : "Email 已寄出",
"Resharing is not allowed" : "不允許重新分享",
"Share link" : "分享連結",
"Link" : "連結",
@@ -149,6 +147,8 @@
"Allow editing" : "允許編輯",
"Email link to person" : "將連結 email 給別人",
"Send" : "寄出",
+ "Sending ..." : "正在傳送…",
+ "Email sent" : "Email 已寄出",
"Shared with you and the group {group} by {owner}" : "由 {owner} 分享給您和 {group}",
"Shared with you by {owner}" : "{owner} 已經和您分享",
"group" : "群組",
diff --git a/core/register_command.php b/core/register_command.php
index 17bd573133a..0b1a019f993 100644
--- a/core/register_command.php
+++ b/core/register_command.php
@@ -32,7 +32,7 @@
/** @var $application Symfony\Component\Console\Application */
$application->add(new OC\Core\Command\Status);
$application->add(new OC\Core\Command\Check(\OC::$server->getConfig()));
-$infoParser = new \OC\App\InfoParser(\OC::$server->getHTTPHelper(), \OC::$server->getURLGenerator());
+$infoParser = new \OC\App\InfoParser(\OC::$server->getURLGenerator());
$application->add(new OC\Core\Command\App\CheckCode($infoParser));
$application->add(new OC\Core\Command\L10n\CreateJs());
$application->add(new \OC\Core\Command\Integrity\SignApp(
@@ -108,6 +108,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) {
);
$application->add(new OC\Core\Command\Encryption\ShowKeyStorageRoot($util));
+ $application->add(new OC\Core\Command\Maintenance\DataFingerprint(\OC::$server->getConfig(), new \OC\AppFramework\Utility\TimeFactory()));
$application->add(new OC\Core\Command\Maintenance\Mimetype\UpdateDB(\OC::$server->getMimeTypeDetector(), \OC::$server->getMimeTypeLoader()));
$application->add(new OC\Core\Command\Maintenance\Mimetype\UpdateJS(\OC::$server->getMimeTypeDetector()));
$application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig()));
diff --git a/core/routes.php b/core/routes.php
index 8981eb618f3..2b7a19f7d86 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -42,6 +42,8 @@ $application->registerRoutes($this, [
['name' => 'avatar#postCroppedAvatar', 'url' => '/avatar/cropped', 'verb' => 'POST'],
['name' => 'avatar#getTmpAvatar', 'url' => '/avatar/tmp', 'verb' => 'GET'],
['name' => 'avatar#postAvatar', 'url' => '/avatar/', 'verb' => 'POST'],
+ ['name' => 'login#showLoginForm', 'url' => '/login', 'verb' => 'GET'],
+ ['name' => 'login#logout', 'url' => '/logout', 'verb' => 'GET'],
]
]);
diff --git a/core/templates/403.php b/core/templates/403.php
index a19009c3546..7d07c72c873 100644
--- a/core/templates/403.php
+++ b/core/templates/403.php
@@ -1,4 +1,5 @@
<?php
+// @codeCoverageIgnoreStart
if(!isset($_)) {//also provide standalone error page
require_once '../../lib/base.php';
@@ -6,6 +7,7 @@ if(!isset($_)) {//also provide standalone error page
$tmpl->printPage();
exit;
}
+// @codeCoverageIgnoreEnd
?>
<ul>
<li class='error'>
diff --git a/core/templates/404.php b/core/templates/404.php
index 2b12b12cff7..a0d2f0160b7 100644
--- a/core/templates/404.php
+++ b/core/templates/404.php
@@ -1,6 +1,8 @@
<?php
/** @var $_ array */
/** @var $l OC_L10N */
+/** @var $theme OC_Theme */
+// @codeCoverageIgnoreStart
if(!isset($_)) {//also provide standalone error page
require_once '../../lib/base.php';
@@ -8,6 +10,7 @@ if(!isset($_)) {//also provide standalone error page
$tmpl->printPage();
exit;
}
+// @codeCoverageIgnoreEnd
?>
<?php if (isset($_['content'])): ?>
<?php print_unescaped($_['content']) ?>
diff --git a/core/templates/login.php b/core/templates/login.php
index 9934d4988d9..8405bac6890 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -9,7 +9,7 @@ script('core', [
?>
<!--[if IE 8]><style>input[type="checkbox"]{padding:0;}</style><![endif]-->
-<form method="post" name="login">
+<form method="post" name="login" action="<?php p(OC::$WEBROOT) ?>/">
<fieldset>
<?php if (!empty($_['redirect_url'])) {
print_unescaped('<input type="hidden" name="redirect_url" value="' . \OCP\Util::sanitizeHTML($_['redirect_url']) . '">');
@@ -41,7 +41,7 @@ script('core', [
<p class="grouptop">
<input type="text" name="user" id="user"
placeholder="<?php p($l->t('Username')); ?>"
- value="<?php p($_['username']); ?>"
+ value="<?php p($_['loginName']); ?>"
<?php p($_['user_autofocus'] ? 'autofocus' : ''); ?>
autocomplete="on" autocapitalize="off" autocorrect="off" required>
<label for="user" class="infield"><?php p($l->t('Username')); ?></label>
diff --git a/core/templates/update.use-cli.php b/core/templates/update.use-cli.php
new file mode 100644
index 00000000000..52d40cdea55
--- /dev/null
+++ b/core/templates/update.use-cli.php
@@ -0,0 +1,14 @@
+<div class="update" data-productname="<?php p($_['productName']) ?>" data-version="<?php p($_['version']) ?>">
+ <div class="updateOverview">
+ <h2 class="title"><?php p($l->t('Update needed')) ?></h2>
+ <div class="infogroup">
+ <?php if ($_['tooBig']) {
+ p($l->t('Please use the command line updater because you have a big instance.'));
+ } else {
+ p($l->t('Please use the command line updater because automatic updating is disabled in the config.php.'));
+ } ?><br><br>
+ <?php
+ print_unescaped($l->t('For help, see the <a target="_blank" rel="noreferrer" href="%s">documentation</a>.', [link_to_docs('admin-cli-upgrade')])); ?><br><br>
+ </div>
+ </div>
+</div>
diff --git a/core/vendor/.gitignore b/core/vendor/.gitignore
index 3560e8c8668..58a231c4bb4 100644
--- a/core/vendor/.gitignore
+++ b/core/vendor/.gitignore
@@ -36,7 +36,7 @@ moment/templates
# jquery
jquery/**
!jquery/.bower.json
-!jquery/jquery.*
+!jquery/dist/jquery.*
!jquery/MIT-LICENSE.txt
# jquery-ui
@@ -125,12 +125,14 @@ backbone/backbone-min*
# davclient.js
davclient.js/**
-!davclient.js/lib/*
+!davclient.js/lib
!davclient.js/LICENSE
# es6-promise
es6-promise/**
!es6-promise/LICENSE
+!es6-promise/dist
+es6-promise/dist/*
!es6-promise/dist/es6-promise.js
# base64
diff --git a/core/vendor/es6-promise/.bower.json b/core/vendor/es6-promise/.bower.json
deleted file mode 100644
index f8c28b04e53..00000000000
--- a/core/vendor/es6-promise/.bower.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "name": "es6-promise",
- "namespace": "Promise",
- "version": "2.3.0",
- "description": "A polyfill for ES6-style Promises, tracking rsvp",
- "authors": [
- "Stefan Penner <stefan.penner@gmail.com>"
- ],
- "main": "dist/es6-promise.js",
- "keywords": [
- "promise"
- ],
- "repository": {
- "type": "git",
- "url": "git://github.com/jakearchibald/ES6-Promises.git"
- },
- "bugs": {
- "url": "https://github.com/jakearchibald/ES6-Promises/issues"
- },
- "license": "MIT",
- "ignore": [
- "node_modules",
- "bower_components",
- "test",
- "tests",
- "vendor",
- "tasks"
- ],
- "homepage": "https://github.com/jakearchibald/es6-promise",
- "_release": "2.3.0",
- "_resolution": {
- "type": "version",
- "tag": "2.3.0",
- "commit": "fcbab11a1a981eb2290bfff89017cb764335a2a5"
- },
- "_source": "https://github.com/jakearchibald/es6-promise.git",
- "_target": "~2.3.0",
- "_originalSource": "https://github.com/jakearchibald/es6-promise.git",
- "_direct": true
-} \ No newline at end of file
diff --git a/core/vendor/es6-promise/.npmignore b/core/vendor/es6-promise/.npmignore
deleted file mode 100644
index 7a758111e9e..00000000000
--- a/core/vendor/es6-promise/.npmignore
+++ /dev/null
@@ -1,11 +0,0 @@
-/node_modules/
-/tmp
-/tasks
-/test
-/vendor
-/.jshintrc
-/.npmignore
-/.travis.yml
-/Gruntfile.js
-/component.json
-/index.html
diff --git a/core/vendor/es6-promise/.release.json b/core/vendor/es6-promise/.release.json
deleted file mode 100644
index dee8cbc5d92..00000000000
--- a/core/vendor/es6-promise/.release.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "non-interactive": true,
- "dry-run": false,
- "verbose": false,
- "force": false,
- "pkgFiles": ["package.json", "bower.json"],
- "increment": "patch",
- "commitMessage": "Release %s",
- "tagName": "%s",
- "tagAnnotation": "Release %s",
- "buildCommand": "npm run-script build-all",
- "distRepo": "git@github.com:components/rsvp.js.git",
- "distStageDir": "tmp/stage",
- "distBase": "dist",
- "distFiles": ["**/*", "../package.json", "../bower.json"],
- "publish": false
-}
diff --git a/core/vendor/es6-promise/.spmignore b/core/vendor/es6-promise/.spmignore
deleted file mode 100644
index 7a758111e9e..00000000000
--- a/core/vendor/es6-promise/.spmignore
+++ /dev/null
@@ -1,11 +0,0 @@
-/node_modules/
-/tmp
-/tasks
-/test
-/vendor
-/.jshintrc
-/.npmignore
-/.travis.yml
-/Gruntfile.js
-/component.json
-/index.html
diff --git a/core/vendor/jquery-migrate/.bower.json b/core/vendor/jquery-migrate/.bower.json
index 35e7bf5f43f..19fcdbf9b33 100644
--- a/core/vendor/jquery-migrate/.bower.json
+++ b/core/vendor/jquery-migrate/.bower.json
@@ -1,15 +1,15 @@
{
"name": "jquery-migrate",
- "version": "1.2.1",
+ "version": "1.4.0",
+ "main": "jquery-migrate.js",
"homepage": "https://github.com/appleboy/jquery-migrate",
- "_release": "1.2.1",
+ "_release": "1.4.0",
"_resolution": {
"type": "version",
- "tag": "1.2.1",
- "commit": "65f37b60ae3d305efbe1e85909e14c60d524d12a"
+ "tag": "1.4.0",
+ "commit": "d70e5a532864fdc2263f0d15030ef84671fc5807"
},
- "_source": "git://github.com/appleboy/jquery-migrate.git",
- "_target": "~1.2.1",
- "_originalSource": "jquery-migrate",
- "_direct": true
+ "_source": "https://github.com/appleboy/jquery-migrate.git",
+ "_target": "~1.4.0",
+ "_originalSource": "jquery-migrate"
} \ No newline at end of file
diff --git a/core/vendor/jquery-migrate/component.json b/core/vendor/jquery-migrate/component.json
deleted file mode 100644
index 11efdc01650..00000000000
--- a/core/vendor/jquery-migrate/component.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "name" : "jquery-migrate",
- "version" : "1.2.1"
-}
diff --git a/core/vendor/jquery-migrate/jquery-migrate.js b/core/vendor/jquery-migrate/jquery-migrate.js
index dbe8cbd4d8c..e3538e9c8a3 100644
--- a/core/vendor/jquery-migrate/jquery-migrate.js
+++ b/core/vendor/jquery-migrate/jquery-migrate.js
@@ -1,521 +1,717 @@
-/*!
- * jQuery Migrate - v1.2.1 - 2013-05-08
- * https://github.com/jquery/jquery-migrate
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
- */
-(function( jQuery, window, undefined ) {
-// See http://bugs.jquery.com/ticket/13335
-// "use strict";
-
-
-var warnedAbout = {};
-
-// List of warnings already given; public read only
-jQuery.migrateWarnings = [];
-
-// Set to true to prevent console output; migrateWarnings still maintained
-// jQuery.migrateMute = false;
-
-// Show a message on the console so devs know we're active
-if ( !jQuery.migrateMute && window.console && window.console.log ) {
- window.console.log("JQMIGRATE: Logging is active");
-}
-
-// Set to false to disable traces that appear with warnings
-if ( jQuery.migrateTrace === undefined ) {
- jQuery.migrateTrace = true;
-}
-
-// Forget any warnings we've already given; public
-jQuery.migrateReset = function() {
- warnedAbout = {};
- jQuery.migrateWarnings.length = 0;
-};
-
-function migrateWarn( msg) {
- var console = window.console;
- if ( !warnedAbout[ msg ] ) {
- warnedAbout[ msg ] = true;
- jQuery.migrateWarnings.push( msg );
- if ( console && console.warn && !jQuery.migrateMute ) {
- console.warn( "JQMIGRATE: " + msg );
- if ( jQuery.migrateTrace && console.trace ) {
- console.trace();
- }
- }
- }
-}
-
-function migrateWarnProp( obj, prop, value, msg ) {
- if ( Object.defineProperty ) {
- // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
- // allow property to be overwritten in case some other plugin wants it
- try {
- Object.defineProperty( obj, prop, {
- configurable: true,
- enumerable: true,
- get: function() {
- migrateWarn( msg );
- return value;
- },
- set: function( newValue ) {
- migrateWarn( msg );
- value = newValue;
- }
- });
- return;
- } catch( err ) {
- // IE8 is a dope about Object.defineProperty, can't warn there
- }
- }
-
- // Non-ES5 (or broken) browser; just set the property
- jQuery._definePropertyBroken = true;
- obj[ prop ] = value;
-}
-
-if ( document.compatMode === "BackCompat" ) {
- // jQuery has never supported or tested Quirks Mode
- migrateWarn( "jQuery is not compatible with Quirks Mode" );
-}
-
-
-var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
- oldAttr = jQuery.attr,
- valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
- function() { return null; },
- valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
- function() { return undefined; },
- rnoType = /^(?:input|button)$/i,
- rnoAttrNodeType = /^[238]$/,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- ruseDefault = /^(?:checked|selected)$/i;
-
-// jQuery.attrFn
-migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
-
-jQuery.attr = function( elem, name, value, pass ) {
- var lowerName = name.toLowerCase(),
- nType = elem && elem.nodeType;
-
- if ( pass ) {
- // Since pass is used internally, we only warn for new jQuery
- // versions where there isn't a pass arg in the formal params
- if ( oldAttr.length < 4 ) {
- migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
- }
- if ( elem && !rnoAttrNodeType.test( nType ) &&
- (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
- return jQuery( elem )[ name ]( value );
- }
- }
-
- // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
- // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
- if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
- migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
- }
-
- // Restore boolHook for boolean property/attribute synchronization
- if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
- jQuery.attrHooks[ lowerName ] = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" &&
- ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
- };
-
- // Warn only for attributes that can remain distinct from their properties post-1.9
- if ( ruseDefault.test( lowerName ) ) {
- migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
- }
- }
-
- return oldAttr.call( jQuery, elem, name, value );
-};
-
-// attrHooks: value
-jQuery.attrHooks.value = {
- get: function( elem, name ) {
- var nodeName = ( elem.nodeName || "" ).toLowerCase();
- if ( nodeName === "button" ) {
- return valueAttrGet.apply( this, arguments );
- }
- if ( nodeName !== "input" && nodeName !== "option" ) {
- migrateWarn("jQuery.fn.attr('value') no longer gets properties");
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value ) {
- var nodeName = ( elem.nodeName || "" ).toLowerCase();
- if ( nodeName === "button" ) {
- return valueAttrSet.apply( this, arguments );
- }
- if ( nodeName !== "input" && nodeName !== "option" ) {
- migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
-};
-
-
-var matched, browser,
- oldInit = jQuery.fn.init,
- oldParseJSON = jQuery.parseJSON,
- // Note: XSS check is done below after string is trimmed
- rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
-
-// $(html) "looks like html" rule change
-jQuery.fn.init = function( selector, context, rootjQuery ) {
- var match;
-
- if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
- (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
- // This is an HTML string according to the "old" rules; is it still?
- if ( selector.charAt( 0 ) !== "<" ) {
- migrateWarn("$(html) HTML strings must start with '<' character");
- }
- if ( match[ 3 ] ) {
- migrateWarn("$(html) HTML text after last tag is ignored");
- }
- // Consistently reject any HTML-like string starting with a hash (#9521)
- // Note that this may break jQuery 1.6.x code that otherwise would work.
- if ( match[ 0 ].charAt( 0 ) === "#" ) {
- migrateWarn("HTML string cannot start with a '#' character");
- jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
- }
- // Now process using loose rules; let pre-1.8 play too
- if ( context && context.context ) {
- // jQuery object as context; parseHTML expects a DOM object
- context = context.context;
- }
- if ( jQuery.parseHTML ) {
- return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
- context, rootjQuery );
- }
- }
- return oldInit.apply( this, arguments );
-};
-jQuery.fn.init.prototype = jQuery.fn;
-
-// Let $.parseJSON(falsy_value) return null
-jQuery.parseJSON = function( json ) {
- if ( !json && json !== null ) {
- migrateWarn("jQuery.parseJSON requires a valid JSON string");
- return null;
- }
- return oldParseJSON.apply( this, arguments );
-};
-
-jQuery.uaMatch = function( ua ) {
- ua = ua.toLowerCase();
-
- var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
- /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
- /(msie) ([\w.]+)/.exec( ua ) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
- [];
-
- return {
- browser: match[ 1 ] || "",
- version: match[ 2 ] || "0"
- };
-};
-
-// Don't clobber any existing jQuery.browser in case it's different
-if ( !jQuery.browser ) {
- matched = jQuery.uaMatch( navigator.userAgent );
- browser = {};
-
- if ( matched.browser ) {
- browser[ matched.browser ] = true;
- browser.version = matched.version;
- }
-
- // Chrome is Webkit, but Webkit is also Safari.
- if ( browser.chrome ) {
- browser.webkit = true;
- } else if ( browser.webkit ) {
- browser.safari = true;
- }
-
- jQuery.browser = browser;
-}
-
-// Warn if the code tries to get jQuery.browser
-migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
-
-jQuery.sub = function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- migrateWarn( "jQuery.sub() is deprecated" );
- return jQuerySub;
-};
-
-
-// Ensure that $.ajax gets the new parseJSON defined in core.js
-jQuery.ajaxSetup({
- converters: {
- "text json": jQuery.parseJSON
- }
-});
-
-
-var oldFnData = jQuery.fn.data;
-
-jQuery.fn.data = function( name ) {
- var ret, evt,
- elem = this[0];
-
- // Handles 1.7 which has this behavior and 1.8 which doesn't
- if ( elem && name === "events" && arguments.length === 1 ) {
- ret = jQuery.data( elem, name );
- evt = jQuery._data( elem, name );
- if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
- migrateWarn("Use of jQuery.fn.data('events') is deprecated");
- return evt;
- }
- }
- return oldFnData.apply( this, arguments );
-};
-
-
-var rscriptType = /\/(java|ecma)script/i,
- oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
-
-jQuery.fn.andSelf = function() {
- migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
- return oldSelf.apply( this, arguments );
-};
-
-// Since jQuery.clean is used internally on older versions, we only shim if it's missing
-if ( !jQuery.clean ) {
- jQuery.clean = function( elems, context, fragment, scripts ) {
- // Set context per 1.8 logic
- context = context || document;
- context = !context.nodeType && context[0] || context;
- context = context.ownerDocument || context;
-
- migrateWarn("jQuery.clean() is deprecated");
-
- var i, elem, handleScript, jsTags,
- ret = [];
-
- jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
-
- // Complex logic lifted directly from jQuery 1.8
- if ( fragment ) {
- // Special handling of each script element
- handleScript = function( elem ) {
- // Check if we consider it executable
- if ( !elem.type || rscriptType.test( elem.type ) ) {
- // Detach the script and store it in the scripts array (if provided) or the fragment
- // Return truthy to indicate that it has been handled
- return scripts ?
- scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
- fragment.appendChild( elem );
- }
- };
-
- for ( i = 0; (elem = ret[i]) != null; i++ ) {
- // Check if we're done after handling an executable script
- if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
- // Append to fragment and handle embedded scripts
- fragment.appendChild( elem );
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
- jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
- // Splice the scripts into ret after their former ancestor and advance our index beyond them
- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
- i += jsTags.length;
- }
- }
- }
- }
-
- return ret;
- };
-}
-
-var eventAdd = jQuery.event.add,
- eventRemove = jQuery.event.remove,
- eventTrigger = jQuery.event.trigger,
- oldToggle = jQuery.fn.toggle,
- oldLive = jQuery.fn.live,
- oldDie = jQuery.fn.die,
- ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
- rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
- rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
- hoverHack = function( events ) {
- if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
- return events;
- }
- if ( rhoverHack.test( events ) ) {
- migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
- }
- return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
-
-// Event props removed in 1.9, put them back if needed; no practical way to warn them
-if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
- jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
-}
-
-// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
-if ( jQuery.event.dispatch ) {
- migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
-}
-
-// Support for 'hover' pseudo-event and ajax event warnings
-jQuery.event.add = function( elem, types, handler, data, selector ){
- if ( elem !== document && rajaxEvent.test( types ) ) {
- migrateWarn( "AJAX events should be attached to document: " + types );
- }
- eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
-};
-jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
- eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
-};
-
-jQuery.fn.error = function() {
- var args = Array.prototype.slice.call( arguments, 0);
- migrateWarn("jQuery.fn.error() is deprecated");
- args.splice( 0, 0, "error" );
- if ( arguments.length ) {
- return this.bind.apply( this, args );
- }
- // error event should not bubble to window, although it does pre-1.7
- this.triggerHandler.apply( this, args );
- return this;
-};
-
-jQuery.fn.toggle = function( fn, fn2 ) {
-
- // Don't mess with animation or css toggles
- if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
- return oldToggle.apply( this, arguments );
- }
- migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
-
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
-};
-
-jQuery.fn.live = function( types, data, fn ) {
- migrateWarn("jQuery.fn.live() is deprecated");
- if ( oldLive ) {
- return oldLive.apply( this, arguments );
- }
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
-};
-
-jQuery.fn.die = function( types, fn ) {
- migrateWarn("jQuery.fn.die() is deprecated");
- if ( oldDie ) {
- return oldDie.apply( this, arguments );
- }
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
-};
-
-// Turn global events into document-triggered events
-jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
- if ( !elem && !rajaxEvent.test( event ) ) {
- migrateWarn( "Global events are undocumented and deprecated" );
- }
- return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
-};
-jQuery.each( ajaxEvents.split("|"),
- function( _, name ) {
- jQuery.event.special[ name ] = {
- setup: function() {
- var elem = this;
-
- // The document needs no shimming; must be !== for oldIE
- if ( elem !== document ) {
- jQuery.event.add( document, name + "." + jQuery.guid, function() {
- jQuery.event.trigger( name, null, elem, true );
- });
- jQuery._data( this, name, jQuery.guid++ );
- }
- return false;
- },
- teardown: function() {
- if ( this !== document ) {
- jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
- }
- return false;
- }
- };
- }
-);
-
-
-})( jQuery, window );
+/*!
+ * jQuery Migrate - v1.4.0 - 2016-02-26
+ * Copyright jQuery Foundation and other contributors
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+jQuery.migrateVersion = "1.4.0";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( window.console && window.console.log ) {
+ window.console.log( "JQMIGRATE: Migrate is installed" +
+ ( jQuery.migrateMute ? "" : " with logging active" ) +
+ ", version " + jQuery.migrateVersion );
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+ jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+ warnedAbout = {};
+ jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+ var console = window.console;
+ if ( !warnedAbout[ msg ] ) {
+ warnedAbout[ msg ] = true;
+ jQuery.migrateWarnings.push( msg );
+ if ( console && console.warn && !jQuery.migrateMute ) {
+ console.warn( "JQMIGRATE: " + msg );
+ if ( jQuery.migrateTrace && console.trace ) {
+ console.trace();
+ }
+ }
+ }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+ if ( Object.defineProperty ) {
+ // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+ // allow property to be overwritten in case some other plugin wants it
+ try {
+ Object.defineProperty( obj, prop, {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ migrateWarn( msg );
+ return value;
+ },
+ set: function( newValue ) {
+ migrateWarn( msg );
+ value = newValue;
+ }
+ });
+ return;
+ } catch( err ) {
+ // IE8 is a dope about Object.defineProperty, can't warn there
+ }
+ }
+
+ // Non-ES5 (or broken) browser; just set the property
+ jQuery._definePropertyBroken = true;
+ obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+ // jQuery has never supported or tested Quirks Mode
+ migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+ oldAttr = jQuery.attr,
+ valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+ function() { return null; },
+ valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+ function() { return undefined; },
+ rnoType = /^(?:input|button)$/i,
+ rnoAttrNodeType = /^[238]$/,
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+ ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+ var lowerName = name.toLowerCase(),
+ nType = elem && elem.nodeType;
+
+ if ( pass ) {
+ // Since pass is used internally, we only warn for new jQuery
+ // versions where there isn't a pass arg in the formal params
+ if ( oldAttr.length < 4 ) {
+ migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+ }
+ if ( elem && !rnoAttrNodeType.test( nType ) &&
+ (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+ return jQuery( elem )[ name ]( value );
+ }
+ }
+
+ // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+ // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+ if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+ migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+ }
+
+ // Restore boolHook for boolean property/attribute synchronization
+ if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+ jQuery.attrHooks[ lowerName ] = {
+ get: function( elem, name ) {
+ // Align boolean attributes with corresponding properties
+ // Fall back to attribute presence where some booleans are not supported
+ var attrNode,
+ property = jQuery.prop( elem, name );
+ return property === true || typeof property !== "boolean" &&
+ ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+ name.toLowerCase() :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ var propName;
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ // value is true since we know at this point it's type boolean and not false
+ // Set boolean attributes to the same name and set the DOM property
+ propName = jQuery.propFix[ name ] || name;
+ if ( propName in elem ) {
+ // Only set the IDL specifically if it already exists on the element
+ elem[ propName ] = true;
+ }
+
+ elem.setAttribute( name, name.toLowerCase() );
+ }
+ return name;
+ }
+ };
+
+ // Warn only for attributes that can remain distinct from their properties post-1.9
+ if ( ruseDefault.test( lowerName ) ) {
+ migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
+ }
+ }
+
+ return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+ get: function( elem, name ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "button" ) {
+ return valueAttrGet.apply( this, arguments );
+ }
+ if ( nodeName !== "input" && nodeName !== "option" ) {
+ migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+ }
+ return name in elem ?
+ elem.value :
+ null;
+ },
+ set: function( elem, value ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "button" ) {
+ return valueAttrSet.apply( this, arguments );
+ }
+ if ( nodeName !== "input" && nodeName !== "option" ) {
+ migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+ }
+ // Does not return so that setAttribute is also used
+ elem.value = value;
+ }
+};
+
+
+var matched, browser,
+ oldInit = jQuery.fn.init,
+ oldParseJSON = jQuery.parseJSON,
+ rspaceAngle = /^\s*</,
+ rattrHash = /\[\s*\w+\s*[~|^$*]?=\s*(?![\s'"])[^#\]]*#/,
+ // Note: XSS check is done below after string is trimmed
+ rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+ var match, ret;
+
+ if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
+ (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
+ // This is an HTML string according to the "old" rules; is it still?
+ if ( !rspaceAngle.test( selector ) ) {
+ migrateWarn("$(html) HTML strings must start with '<' character");
+ }
+ if ( match[ 3 ] ) {
+ migrateWarn("$(html) HTML text after last tag is ignored");
+ }
+
+ // Consistently reject any HTML-like string starting with a hash (#9521)
+ // Note that this may break jQuery 1.6.x code that otherwise would work.
+ if ( match[ 0 ].charAt( 0 ) === "#" ) {
+ migrateWarn("HTML string cannot start with a '#' character");
+ jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
+ }
+ // Now process using loose rules; let pre-1.8 play too
+ if ( context && context.context ) {
+ // jQuery object as context; parseHTML expects a DOM object
+ context = context.context;
+ }
+ if ( jQuery.parseHTML ) {
+ return oldInit.call( this,
+ jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
+ context || document, true ), context, rootjQuery );
+ }
+ }
+
+ if ( selector === "#" ) {
+
+ // jQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
+ migrateWarn( "jQuery( '#' ) is not a valid selector" );
+ selector = [];
+
+ } else if ( rattrHash.test( selector ) ) {
+
+ // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
+ // Note that this doesn't actually fix the selector due to potential false positives
+ migrateWarn( "Attribute selectors with '#' must be quoted: '" + selector + "'" );
+ }
+
+ ret = oldInit.apply( this, arguments );
+
+ // Fill in selector and context properties so .live() works
+ if ( selector && selector.selector !== undefined ) {
+ // A jQuery object, copy its properties
+ ret.selector = selector.selector;
+ ret.context = selector.context;
+
+ } else {
+ ret.selector = typeof selector === "string" ? selector : "";
+ if ( selector ) {
+ ret.context = selector.nodeType? selector : context || document;
+ }
+ }
+
+ return ret;
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+ if ( !json ) {
+ migrateWarn("jQuery.parseJSON requires a valid JSON string");
+ return null;
+ }
+ return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+ /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+ /(msie) ([\w.]+)/.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+ matched = jQuery.uaMatch( navigator.userAgent );
+ browser = {};
+
+ if ( matched.browser ) {
+ browser[ matched.browser ] = true;
+ browser.version = matched.version;
+ }
+
+ // Chrome is Webkit, but Webkit is also Safari.
+ if ( browser.chrome ) {
+ browser.webkit = true;
+ } else if ( browser.webkit ) {
+ browser.safari = true;
+ }
+
+ jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+// jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
+jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
+migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
+migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
+
+jQuery.sub = function() {
+ function jQuerySub( selector, context ) {
+ return new jQuerySub.fn.init( selector, context );
+ }
+ jQuery.extend( true, jQuerySub, this );
+ jQuerySub.superclass = this;
+ jQuerySub.fn = jQuerySub.prototype = this();
+ jQuerySub.fn.constructor = jQuerySub;
+ jQuerySub.sub = this.sub;
+ jQuerySub.fn.init = function init( selector, context ) {
+ var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+ return instance instanceof jQuerySub ?
+ instance :
+ jQuerySub( instance );
+ };
+ jQuerySub.fn.init.prototype = jQuerySub.fn;
+ var rootjQuerySub = jQuerySub(document);
+ migrateWarn( "jQuery.sub() is deprecated" );
+ return jQuerySub;
+};
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
+ return this.length;
+};
+
+
+var internalSwapCall = false;
+
+// If this version of jQuery has .swap(), don't false-alarm on internal uses
+if ( jQuery.swap ) {
+ jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
+ var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
+
+ if ( oldHook ) {
+ jQuery.cssHooks[ name ].get = function() {
+ var ret;
+
+ internalSwapCall = true;
+ ret = oldHook.apply( this, arguments );
+ internalSwapCall = false;
+ return ret;
+ };
+ }
+ });
+}
+
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ if ( !internalSwapCall ) {
+ migrateWarn( "jQuery.swap() is undocumented and deprecated" );
+ }
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+ converters: {
+ "text json": jQuery.parseJSON
+ }
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+ var ret, evt,
+ elem = this[0];
+
+ // Handles 1.7 which has this behavior and 1.8 which doesn't
+ if ( elem && name === "events" && arguments.length === 1 ) {
+ ret = jQuery.data( elem, name );
+ evt = jQuery._data( elem, name );
+ if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+ migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+ return evt;
+ }
+ }
+ return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i;
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+ jQuery.clean = function( elems, context, fragment, scripts ) {
+ // Set context per 1.8 logic
+ context = context || document;
+ context = !context.nodeType && context[0] || context;
+ context = context.ownerDocument || context;
+
+ migrateWarn("jQuery.clean() is deprecated");
+
+ var i, elem, handleScript, jsTags,
+ ret = [];
+
+ jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+ // Complex logic lifted directly from jQuery 1.8
+ if ( fragment ) {
+ // Special handling of each script element
+ handleScript = function( elem ) {
+ // Check if we consider it executable
+ if ( !elem.type || rscriptType.test( elem.type ) ) {
+ // Detach the script and store it in the scripts array (if provided) or the fragment
+ // Return truthy to indicate that it has been handled
+ return scripts ?
+ scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+ fragment.appendChild( elem );
+ }
+ };
+
+ for ( i = 0; (elem = ret[i]) != null; i++ ) {
+ // Check if we're done after handling an executable script
+ if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+ // Append to fragment and handle embedded scripts
+ fragment.appendChild( elem );
+ if ( typeof elem.getElementsByTagName !== "undefined" ) {
+ // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+ jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+ // Splice the scripts into ret after their former ancestor and advance our index beyond them
+ ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+ i += jsTags.length;
+ }
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var eventAdd = jQuery.event.add,
+ eventRemove = jQuery.event.remove,
+ eventTrigger = jQuery.event.trigger,
+ oldToggle = jQuery.fn.toggle,
+ oldLive = jQuery.fn.live,
+ oldDie = jQuery.fn.die,
+ oldLoad = jQuery.fn.load,
+ ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+ rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+ rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+ hoverHack = function( events ) {
+ if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+ return events;
+ }
+ if ( rhoverHack.test( events ) ) {
+ migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+ }
+ return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+ };
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+ jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+ migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+ if ( elem !== document && rajaxEvent.test( types ) ) {
+ migrateWarn( "AJAX events should be attached to document: " + types );
+ }
+ eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+ eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
+
+ jQuery.fn[ name ] = function() {
+ var args = Array.prototype.slice.call( arguments, 0 );
+
+ // If this is an ajax load() the first arg should be the string URL;
+ // technically this could also be the "Anything" arg of the event .load()
+ // which just goes to show why this dumb signature has been deprecated!
+ // jQuery custom builds that exclude the Ajax module justifiably die here.
+ if ( name === "load" && typeof args[ 0 ] === "string" ) {
+ return oldLoad.apply( this, args );
+ }
+
+ migrateWarn( "jQuery.fn." + name + "() is deprecated" );
+
+ args.splice( 0, 0, name );
+ if ( arguments.length ) {
+ return this.bind.apply( this, args );
+ }
+
+ // Use .triggerHandler here because:
+ // - load and unload events don't need to bubble, only applied to window or image
+ // - error event should not bubble to window, although it does pre-1.7
+ // See http://bugs.jquery.com/ticket/11820
+ this.triggerHandler.apply( this, args );
+ return this;
+ };
+
+});
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+ // Don't mess with animation or css toggles
+ if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+ return oldToggle.apply( this, arguments );
+ }
+ migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ guid = fn.guid || jQuery.guid++,
+ i = 0,
+ toggler = function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ };
+
+ // link all the functions, so any of them can unbind this click handler
+ toggler.guid = guid;
+ while ( i < args.length ) {
+ args[ i++ ].guid = guid;
+ }
+
+ return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+ migrateWarn("jQuery.fn.live() is deprecated");
+ if ( oldLive ) {
+ return oldLive.apply( this, arguments );
+ }
+ jQuery( this.context ).on( types, this.selector, data, fn );
+ return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+ migrateWarn("jQuery.fn.die() is deprecated");
+ if ( oldDie ) {
+ return oldDie.apply( this, arguments );
+ }
+ jQuery( this.context ).off( types, this.selector || "**", fn );
+ return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
+ if ( !elem && !rajaxEvent.test( event ) ) {
+ migrateWarn( "Global events are undocumented and deprecated" );
+ }
+ return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
+};
+jQuery.each( ajaxEvents.split("|"),
+ function( _, name ) {
+ jQuery.event.special[ name ] = {
+ setup: function() {
+ var elem = this;
+
+ // The document needs no shimming; must be !== for oldIE
+ if ( elem !== document ) {
+ jQuery.event.add( document, name + "." + jQuery.guid, function() {
+ jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
+ });
+ jQuery._data( this, name, jQuery.guid++ );
+ }
+ return false;
+ },
+ teardown: function() {
+ if ( this !== document ) {
+ jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+ }
+ return false;
+ }
+ };
+ }
+);
+
+jQuery.event.special.ready = {
+ setup: function() {
+ if ( this === document ) {
+ migrateWarn( "'ready' event is deprecated" );
+ }
+ }
+};
+
+var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
+ oldFind = jQuery.fn.find;
+
+jQuery.fn.andSelf = function() {
+ migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+ return oldSelf.apply( this, arguments );
+};
+
+jQuery.fn.find = function( selector ) {
+ var ret = oldFind.apply( this, arguments );
+ ret.context = this.context;
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+};
+
+
+// jQuery 1.6 did not support Callbacks, do not warn there
+if ( jQuery.Callbacks ) {
+
+ var oldDeferred = jQuery.Deferred,
+ tuples = [
+ // action, add listener, callbacks, .then handlers, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"),
+ jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"),
+ jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory"),
+ jQuery.Callbacks("memory") ]
+ ];
+
+ jQuery.Deferred = function( func ) {
+ var deferred = oldDeferred(),
+ promise = deferred.promise();
+
+ deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ migrateWarn( "deferred.pipe() is deprecated" );
+
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this === promise ? newDefer.promise() : this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+
+ };
+
+ deferred.isResolved = function() {
+ migrateWarn( "deferred.isResolved is deprecated" );
+ return deferred.state() === "resolved";
+ };
+
+ deferred.isRejected = function() {
+ migrateWarn( "deferred.isRejected is deprecated" );
+ return deferred.state() === "rejected";
+ };
+
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ return deferred;
+ };
+
+}
+
+})( jQuery, window );
diff --git a/core/vendor/jquery-migrate/jquery-migrate.min.js b/core/vendor/jquery-migrate/jquery-migrate.min.js
index 8b7ec47a2d6..dbb8a5a507b 100644
--- a/core/vendor/jquery-migrate/jquery-migrate.min.js
+++ b/core/vendor/jquery-migrate/jquery-migrate.min.js
@@ -1,2 +1,2 @@
-/*! jQuery Migrate v1.2.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */
-jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){var r=t.console;i[n]||(i[n]=!0,e.migrateWarnings.push(n),r&&r.warn&&!e.migrateMute&&(r.warn("JQMIGRATE: "+n),e.migrateTrace&&r.trace&&r.trace()))}function a(t,a,i,o){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(o),i},set:function(e){r(o),i=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=i}var i={};e.migrateWarnings=[],!e.migrateMute&&t.console&&t.console.log&&t.console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){i={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var o=e("<input/>",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",o||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,i,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(o?a in o:e.isFunction(e.fn[a])))?e(t)[a](i):("type"===a&&i!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,i=e.prop(t,r);return i===!0||"boolean"!=typeof i&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,i))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^([^<]*)(<[\w\W]+>)([^>]*)$/;e.fn.init=function(t,n,a){var i;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(i=y.exec(e.trim(t)))&&i[0]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),i[3]&&r("$(html) HTML text after last tag is ignored"),"#"===i[0].charAt(0)&&(r("HTML string cannot start with a '#' character"),e.error("JQMIGRATE: Invalid selector string (XSS)")),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(i[2],n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,i,o=this[0];return!o||"events"!==t||1!==arguments.length||(a=e.data(o,t),i=e._data(o,t),a!==n&&a!==i||i===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),i)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,i,o){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),i)for(c=function(e){return!e.type||j.test(e.type)?o?o.push(e.parentNode?e.parentNode.removeChild(e):e):i.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(i.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,T=e.fn.live,M=e.fn.die,S="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",C=RegExp("\\b(?:"+S+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,i){e!==document&&C.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,i)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,i=t.guid||e.guid++,o=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%o;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=i;a.length>o;)a[o++].guid=i;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),T?T.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),M?M.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||C.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(S.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); \ No newline at end of file
+/*! jQuery Migrate v1.4.0 | (c) jQuery Foundation and other contributors | jquery.org/license */
+"undefined"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(a,b,c){function d(c){var d=b.console;f[c]||(f[c]=!0,a.migrateWarnings.push(c),d&&d.warn&&!a.migrateMute&&(d.warn("JQMIGRATE: "+c),a.migrateTrace&&d.trace&&d.trace()))}function e(b,c,e,f){if(Object.defineProperty)try{return void Object.defineProperty(b,c,{configurable:!0,enumerable:!0,get:function(){return d(f),e},set:function(a){d(f),e=a}})}catch(g){}a._definePropertyBroken=!0,b[c]=e}a.migrateVersion="1.4.0";var f={};a.migrateWarnings=[],b.console&&b.console.log&&b.console.log("JQMIGRATE: Migrate is installed"+(a.migrateMute?"":" with logging active")+", version "+a.migrateVersion),a.migrateTrace===c&&(a.migrateTrace=!0),a.migrateReset=function(){f={},a.migrateWarnings.length=0},"BackCompat"===document.compatMode&&d("jQuery is not compatible with Quirks Mode");var g=a("<input/>",{size:1}).attr("size")&&a.attrFn,h=a.attr,i=a.attrHooks.value&&a.attrHooks.value.get||function(){return null},j=a.attrHooks.value&&a.attrHooks.value.set||function(){return c},k=/^(?:input|button)$/i,l=/^[238]$/,m=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,n=/^(?:checked|selected)$/i;e(a,"attrFn",g||{},"jQuery.attrFn is deprecated"),a.attr=function(b,e,f,i){var j=e.toLowerCase(),o=b&&b.nodeType;return i&&(h.length<4&&d("jQuery.fn.attr( props, pass ) is deprecated"),b&&!l.test(o)&&(g?e in g:a.isFunction(a.fn[e])))?a(b)[e](f):("type"===e&&f!==c&&k.test(b.nodeName)&&b.parentNode&&d("Can't change the 'type' of an input or button in IE 6/7/8"),!a.attrHooks[j]&&m.test(j)&&(a.attrHooks[j]={get:function(b,d){var e,f=a.prop(b,d);return f===!0||"boolean"!=typeof f&&(e=b.getAttributeNode(d))&&e.nodeValue!==!1?d.toLowerCase():c},set:function(b,c,d){var e;return c===!1?a.removeAttr(b,d):(e=a.propFix[d]||d,e in b&&(b[e]=!0),b.setAttribute(d,d.toLowerCase())),d}},n.test(j)&&d("jQuery.fn.attr('"+j+"') might use property instead of attribute")),h.call(a,b,e,f))},a.attrHooks.value={get:function(a,b){var c=(a.nodeName||"").toLowerCase();return"button"===c?i.apply(this,arguments):("input"!==c&&"option"!==c&&d("jQuery.fn.attr('value') no longer gets properties"),b in a?a.value:null)},set:function(a,b){var c=(a.nodeName||"").toLowerCase();return"button"===c?j.apply(this,arguments):("input"!==c&&"option"!==c&&d("jQuery.fn.attr('value', val) no longer sets properties"),void(a.value=b))}};var o,p,q=a.fn.init,r=a.parseJSON,s=/^\s*</,t=/\[\s*\w+\s*[~|^$*]?=\s*(?![\s'"])[^#\]]*#/,u=/^([^<]*)(<[\w\W]+>)([^>]*)$/;a.fn.init=function(b,e,f){var g,h;return b&&"string"==typeof b&&!a.isPlainObject(e)&&(g=u.exec(a.trim(b)))&&g[0]&&(s.test(b)||d("$(html) HTML strings must start with '<' character"),g[3]&&d("$(html) HTML text after last tag is ignored"),"#"===g[0].charAt(0)&&(d("HTML string cannot start with a '#' character"),a.error("JQMIGRATE: Invalid selector string (XSS)")),e&&e.context&&(e=e.context),a.parseHTML)?q.call(this,a.parseHTML(g[2],e&&e.ownerDocument||e||document,!0),e,f):("#"===b?(d("jQuery( '#' ) is not a valid selector"),b=[]):t.test(b)&&d("Attribute selectors with '#' must be quoted: '"+b+"'"),h=q.apply(this,arguments),b&&b.selector!==c?(h.selector=b.selector,h.context=b.context):(h.selector="string"==typeof b?b:"",b&&(h.context=b.nodeType?b:e||document)),h)},a.fn.init.prototype=a.fn,a.parseJSON=function(a){return a?r.apply(this,arguments):(d("jQuery.parseJSON requires a valid JSON string"),null)},a.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a.browser||(o=a.uaMatch(navigator.userAgent),p={},o.browser&&(p[o.browser]=!0,p.version=o.version),p.chrome?p.webkit=!0:p.webkit&&(p.safari=!0),a.browser=p),e(a,"browser",a.browser,"jQuery.browser is deprecated"),a.boxModel=a.support.boxModel="CSS1Compat"===document.compatMode,e(a,"boxModel",a.boxModel,"jQuery.boxModel is deprecated"),e(a.support,"boxModel",a.support.boxModel,"jQuery.support.boxModel is deprecated"),a.sub=function(){function b(a,c){return new b.fn.init(a,c)}a.extend(!0,b,this),b.superclass=this,b.fn=b.prototype=this(),b.fn.constructor=b,b.sub=this.sub,b.fn.init=function(d,e){var f=a.fn.init.call(this,d,e,c);return f instanceof b?f:b(f)},b.fn.init.prototype=b.fn;var c=b(document);return d("jQuery.sub() is deprecated"),b},a.fn.size=function(){return d("jQuery.fn.size() is deprecated; use the .length property"),this.length};var v=!1;a.swap&&a.each(["height","width","reliableMarginRight"],function(b,c){var d=a.cssHooks[c]&&a.cssHooks[c].get;d&&(a.cssHooks[c].get=function(){var a;return v=!0,a=d.apply(this,arguments),v=!1,a})}),a.swap=function(a,b,c,e){var f,g,h={};v||d("jQuery.swap() is undocumented and deprecated");for(g in b)h[g]=a.style[g],a.style[g]=b[g];f=c.apply(a,e||[]);for(g in b)a.style[g]=h[g];return f},a.ajaxSetup({converters:{"text json":a.parseJSON}});var w=a.fn.data;a.fn.data=function(b){var e,f,g=this[0];return!g||"events"!==b||1!==arguments.length||(e=a.data(g,b),f=a._data(g,b),e!==c&&e!==f||f===c)?w.apply(this,arguments):(d("Use of jQuery.fn.data('events') is deprecated"),f)};var x=/\/(java|ecma)script/i;a.clean||(a.clean=function(b,c,e,f){c=c||document,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,d("jQuery.clean() is deprecated");var g,h,i,j,k=[];if(a.merge(k,a.buildFragment(b,c).childNodes),e)for(i=function(a){return!a.type||x.test(a.type)?f?f.push(a.parentNode?a.parentNode.removeChild(a):a):e.appendChild(a):void 0},g=0;null!=(h=k[g]);g++)a.nodeName(h,"script")&&i(h)||(e.appendChild(h),"undefined"!=typeof h.getElementsByTagName&&(j=a.grep(a.merge([],h.getElementsByTagName("script")),i),k.splice.apply(k,[g+1,0].concat(j)),g+=j.length));return k});var y=a.event.add,z=a.event.remove,A=a.event.trigger,B=a.fn.toggle,C=a.fn.live,D=a.fn.die,E=a.fn.load,F="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",G=new RegExp("\\b(?:"+F+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,I=function(b){return"string"!=typeof b||a.event.special.hover?b:(H.test(b)&&d("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),b&&b.replace(H,"mouseenter$1 mouseleave$1"))};a.event.props&&"attrChange"!==a.event.props[0]&&a.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),a.event.dispatch&&e(a.event,"handle",a.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),a.event.add=function(a,b,c,e,f){a!==document&&G.test(b)&&d("AJAX events should be attached to document: "+b),y.call(this,a,I(b||""),c,e,f)},a.event.remove=function(a,b,c,d,e){z.call(this,a,I(b)||"",c,d,e)},a.each(["load","unload","error"],function(b,c){a.fn[c]=function(){var a=Array.prototype.slice.call(arguments,0);return"load"===c&&"string"==typeof a[0]?E.apply(this,a):(d("jQuery.fn."+c+"() is deprecated"),a.splice(0,0,c),arguments.length?this.bind.apply(this,a):(this.triggerHandler.apply(this,a),this))}}),a.fn.toggle=function(b,c){if(!a.isFunction(b)||!a.isFunction(c))return B.apply(this,arguments);d("jQuery.fn.toggle(handler, handler...) is deprecated");var e=arguments,f=b.guid||a.guid++,g=0,h=function(c){var d=(a._data(this,"lastToggle"+b.guid)||0)%g;return a._data(this,"lastToggle"+b.guid,d+1),c.preventDefault(),e[d].apply(this,arguments)||!1};for(h.guid=f;g<e.length;)e[g++].guid=f;return this.click(h)},a.fn.live=function(b,c,e){return d("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(a(this.context).on(b,this.selector,c,e),this)},a.fn.die=function(b,c){return d("jQuery.fn.die() is deprecated"),D?D.apply(this,arguments):(a(this.context).off(b,this.selector||"**",c),this)},a.event.trigger=function(a,b,c,e){return c||G.test(a)||d("Global events are undocumented and deprecated"),A.call(this,a,b,c||document,e)},a.each(F.split("|"),function(b,c){a.event.special[c]={setup:function(){var b=this;return b!==document&&(a.event.add(document,c+"."+a.guid,function(){a.event.trigger(c,Array.prototype.slice.call(arguments,1),b,!0)}),a._data(this,c,a.guid++)),!1},teardown:function(){return this!==document&&a.event.remove(document,c+"."+a._data(this,c)),!1}}}),a.event.special.ready={setup:function(){this===document&&d("'ready' event is deprecated")}};var J=a.fn.andSelf||a.fn.addBack,K=a.fn.find;if(a.fn.andSelf=function(){return d("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),J.apply(this,arguments)},a.fn.find=function(a){var b=K.apply(this,arguments);return b.context=this.context,b.selector=this.selector?this.selector+" "+a:a,b},a.Callbacks){var L=a.Deferred,M=[["resolve","done",a.Callbacks("once memory"),a.Callbacks("once memory"),"resolved"],["reject","fail",a.Callbacks("once memory"),a.Callbacks("once memory"),"rejected"],["notify","progress",a.Callbacks("memory"),a.Callbacks("memory")]];a.Deferred=function(b){var c=L(),e=c.promise();return c.pipe=e.pipe=function(){var b=arguments;return d("deferred.pipe() is deprecated"),a.Deferred(function(d){a.each(M,function(f,g){var h=a.isFunction(b[f])&&b[f];c[g[1]](function(){var b=h&&h.apply(this,arguments);b&&a.isFunction(b.promise)?b.promise().done(d.resolve).fail(d.reject).progress(d.notify):d[g[0]+"With"](this===e?d.promise():this,h?[b]:arguments)})}),b=null}).promise()},c.isResolved=function(){return d("deferred.isResolved is deprecated"),"resolved"===c.state()},c.isRejected=function(){return d("deferred.isRejected is deprecated"),"rejected"===c.state()},b&&b.call(c,c),c}}}(jQuery,window); \ No newline at end of file
diff --git a/core/vendor/jquery/.bower.json b/core/vendor/jquery/.bower.json
index 72b99da7090..015b3496cdb 100644
--- a/core/vendor/jquery/.bower.json
+++ b/core/vendor/jquery/.bower.json
@@ -1,21 +1,38 @@
{
"name": "jquery",
- "version": "1.10.2",
- "description": "jQuery component",
+ "version": "2.1.4",
+ "main": "dist/jquery.js",
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "build",
+ "dist/cdn",
+ "speed",
+ "test",
+ "*.md",
+ "AUTHORS.txt",
+ "Gruntfile.js",
+ "package.json"
+ ],
+ "devDependencies": {
+ "sizzle": "2.1.1-jquery.2.1.2",
+ "requirejs": "2.1.10",
+ "qunit": "1.14.0",
+ "sinon": "1.8.1"
+ },
"keywords": [
"jquery",
- "component"
+ "javascript",
+ "library"
],
- "main": "jquery.js",
- "license": "MIT",
- "homepage": "https://github.com/jquery/jquery",
- "_release": "1.10.2",
+ "homepage": "https://github.com/jquery/jquery-dist",
+ "_release": "2.1.4",
"_resolution": {
"type": "version",
- "tag": "1.10.2",
- "commit": "16b079b164d62bd807c612806842a13bf9b04d17"
+ "tag": "2.1.4",
+ "commit": "7751e69b615c6eca6f783a81e292a55725af6b85"
},
- "_source": "git://github.com/jquery/jquery.git",
- "_target": "~1.10.0",
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": "~2.1.0",
"_originalSource": "jquery"
} \ No newline at end of file
diff --git a/core/vendor/jquery/MIT-LICENSE.txt b/core/vendor/jquery/MIT-LICENSE.txt
index 957f26d3e3b..cdd31b5c710 100644
--- a/core/vendor/jquery/MIT-LICENSE.txt
+++ b/core/vendor/jquery/MIT-LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright 2013 jQuery Foundation and other contributors
+Copyright 2014 jQuery Foundation and other contributors
http://jquery.com/
Permission is hereby granted, free of charge, to any person obtaining
diff --git a/core/vendor/jquery/jquery.js b/core/vendor/jquery/dist/jquery.js
index c5c648255c1..eed17778c68 100644
--- a/core/vendor/jquery/jquery.js
+++ b/core/vendor/jquery/dist/jquery.js
@@ -1,91 +1,85 @@
/*!
- * jQuery JavaScript Library v1.10.2
+ * jQuery JavaScript Library v2.1.4
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
- * Date: 2013-07-03T13:48Z
+ * Date: 2015-04-28T16:01Z
*/
-(function( window, undefined ) {
-// Can't do this because several apps including ASP.NET trace
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
-// Support: Firefox 18+
-//"use strict";
-var
- // The deferred used on DOM ready
- readyList,
+//
- // A central reference to the root jQuery(document)
- rootjQuery,
+var arr = [];
- // Support: IE<10
- // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
- core_strundefined = typeof undefined,
+var slice = arr.slice;
- // Use the correct document accordingly with window argument (sandbox)
- location = window.location,
- document = window.document,
- docElem = document.documentElement,
+var concat = arr.concat;
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
+var push = arr.push;
- // Map over the $ in case of overwrite
- _$ = window.$,
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
- // [[Class]] -> type pairs
- class2type = {},
+var hasOwn = class2type.hasOwnProperty;
- // List of deleted data cache ids, so we can reuse them
- core_deletedIds = [],
+var support = {};
- core_version = "1.10.2",
- // Save a reference to some core methods
- core_concat = core_deletedIds.concat,
- core_push = core_deletedIds.push,
- core_slice = core_deletedIds.slice,
- core_indexOf = core_deletedIds.indexOf,
- core_toString = class2type.toString,
- core_hasOwn = class2type.hasOwnProperty,
- core_trim = core_version.trim,
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.4",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
},
- // Used for matching numbers
- core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
-
- // Used for splitting on whitespace
- core_rnotwhite = /\S+/g,
-
- // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
- // A simple way to check for HTML strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- // Strict HTML recognition (#11290: must start with <)
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
-
// Matches dashed string for camelizing
rmsPrefix = /^-ms-/,
rdashAlpha = /-([\da-z])/gi,
@@ -93,134 +87,13 @@ var
// Used by jQuery.camelCase as callback to replace()
fcamelCase = function( all, letter ) {
return letter.toUpperCase();
- },
-
- // The ready event handler
- completed = function( event ) {
-
- // readyState === "complete" is good enough for us to call the dom ready in oldIE
- if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
- detach();
- jQuery.ready();
- }
- },
- // Clean-up method for dom ready events
- detach = function() {
- if ( document.addEventListener ) {
- document.removeEventListener( "DOMContentLoaded", completed, false );
- window.removeEventListener( "load", completed, false );
-
- } else {
- document.detachEvent( "onreadystatechange", completed );
- window.detachEvent( "onload", completed );
- }
};
jQuery.fn = jQuery.prototype = {
// The current version of jQuery being used
- jquery: core_version,
+ jquery: version,
constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem;
-
- // HANDLE: $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
-
- // scripts is true for back-compat
- jQuery.merge( this, jQuery.parseHTML(
- match[1],
- context && context.nodeType ? context.ownerDocument || context : document,
- true
- ) );
-
- // HANDLE: $(html, props)
- if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
- for ( match in context ) {
- // Properties of context are called as methods if possible
- if ( jQuery.isFunction( this[ match ] ) ) {
- this[ match ]( context[ match ] );
-
- // ...and otherwise set as attributes
- } else {
- this.attr( match, context[ match ] );
- }
- }
- }
-
- return this;
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(DOMElement)
- } else if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
// Start with an empty selector
selector: "",
@@ -229,19 +102,19 @@ jQuery.fn = jQuery.prototype = {
length: 0,
toArray: function() {
- return core_slice.call( this );
+ return slice.call( this );
},
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function( num ) {
- return num == null ?
+ return num != null ?
- // Return a 'clean' array
- this.toArray() :
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
+ // Return all the elements in a clean array
+ slice.call( this );
},
// Take an array of elements and push it onto the stack
@@ -266,15 +139,14 @@ jQuery.fn = jQuery.prototype = {
return jQuery.each( this, callback, args );
},
- ready: function( fn ) {
- // Add the callback
- jQuery.ready.promise().done( fn );
-
- return this;
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
},
slice: function() {
- return this.pushStack( core_slice.apply( this, arguments ) );
+ return this.pushStack( slice.apply( this, arguments ) );
},
first: function() {
@@ -291,28 +163,19 @@ jQuery.fn = jQuery.prototype = {
return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
},
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
end: function() {
return this.prevObject || this.constructor(null);
},
// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
- push: core_push,
- sort: [].sort,
- splice: [].splice
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
};
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
jQuery.extend = jQuery.fn.extend = function() {
- var src, copyIsArray, copy, name, options, clone,
+ var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
@@ -321,9 +184,10 @@ jQuery.extend = jQuery.fn.extend = function() {
// Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
}
// Handle case when target is a string or something (possible in deep copy)
@@ -331,10 +195,10 @@ jQuery.extend = jQuery.fn.extend = function() {
target = {};
}
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
target = this;
- --i;
+ i--;
}
for ( ; i < length; i++ ) {
@@ -377,131 +241,52 @@ jQuery.extend = jQuery.fn.extend = function() {
jQuery.extend({
// Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
-
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
+ // Assume jQuery is ready without the ready module
+ isReady: true,
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
+ error: function( msg ) {
+ throw new Error( msg );
},
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger("ready").off("ready");
- }
- },
+ noop: function() {},
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
},
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
+ isArray: Array.isArray,
isWindow: function( obj ) {
- /* jshint eqeqeq: false */
- return obj != null && obj == obj.window;
+ return obj != null && obj === obj.window;
},
isNumeric: function( obj ) {
- return !isNaN( parseFloat(obj) ) && isFinite( obj );
- },
-
- type: function( obj ) {
- if ( obj == null ) {
- return String( obj );
- }
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ core_toString.call(obj) ] || "object" :
- typeof obj;
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
},
isPlainObject: function( obj ) {
- var key;
-
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !core_hasOwn.call(obj, "constructor") &&
- !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
return false;
}
- // Support: IE<9
- // Handle iteration over inherited properties before own properties.
- if ( jQuery.support.ownLast ) {
- for ( key in obj ) {
- return core_hasOwn.call( obj, key );
- }
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
- for ( key in obj ) {}
-
- return key === undefined || core_hasOwn.call( obj, key );
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
},
isEmptyObject: function( obj ) {
@@ -512,109 +297,41 @@ jQuery.extend({
return true;
},
- error: function( msg ) {
- throw new Error( msg );
- },
-
- // data: string of html
- // context (optional): If specified, the fragment will be created in this context, defaults to document
- // keepScripts (optional): If true, will include scripts passed in the html string
- parseHTML: function( data, context, keepScripts ) {
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- if ( typeof context === "boolean" ) {
- keepScripts = context;
- context = false;
- }
- context = context || document;
-
- var parsed = rsingleTag.exec( data ),
- scripts = !keepScripts && [];
-
- // Single tag
- if ( parsed ) {
- return [ context.createElement( parsed[1] ) ];
- }
-
- parsed = jQuery.buildFragment( [ data ], context, scripts );
- if ( scripts ) {
- jQuery( scripts ).remove();
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
}
- return jQuery.merge( [], parsed.childNodes );
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
},
- parseJSON: function( data ) {
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- if ( data === null ) {
- return data;
- }
-
- if ( typeof data === "string" ) {
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- if ( data ) {
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return ( new Function( "return " + data ) )();
- }
- }
- }
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
- jQuery.error( "Invalid JSON: " + data );
- },
+ code = jQuery.trim( code );
- // Cross-browser xml parsing
- parseXML: function( data ) {
- var xml, tmp;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
}
- } catch( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && jQuery.trim( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
}
},
// Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
// Microsoft forgot to hump their vendor prefix (#9572)
camelCase: function( string ) {
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
@@ -674,20 +391,12 @@ jQuery.extend({
return obj;
},
- // Use native String.trim function wherever possible
- trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
- function( text ) {
- return text == null ?
- "" :
- core_trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
- },
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
// results is for internal usage only
makeArray: function( arr, results ) {
@@ -700,7 +409,7 @@ jQuery.extend({
[ arr ] : arr
);
} else {
- core_push.call( ret, arr );
+ push.call( ret, arr );
}
}
@@ -708,40 +417,16 @@ jQuery.extend({
},
inArray: function( elem, arr, i ) {
- var len;
-
- if ( arr ) {
- if ( core_indexOf ) {
- return core_indexOf.call( arr, elem, i );
- }
-
- len = arr.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in arr && arr[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
},
merge: function( first, second ) {
- var l = second.length,
- i = first.length,
- j = 0;
+ var len = +second.length,
+ j = 0,
+ i = first.length;
- if ( typeof l === "number" ) {
- for ( ; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
}
first.length = i;
@@ -749,23 +434,23 @@ jQuery.extend({
return first;
},
- grep: function( elems, callback, inv ) {
- var retVal,
- ret = [],
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
i = 0,
- length = elems.length;
- inv = !!inv;
+ length = elems.length,
+ callbackExpect = !invert;
// Go through the array, only saving the items
// that pass the validator function
for ( ; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
}
}
- return ret;
+ return matches;
},
// arg is for internal usage only
@@ -776,13 +461,13 @@ jQuery.extend({
isArray = isArraylike( elems ),
ret = [];
- // Go through the array, translating each of the items to their
+ // Go through the array, translating each of the items to their new values
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
- ret[ ret.length ] = value;
+ ret.push( value );
}
}
@@ -792,13 +477,13 @@ jQuery.extend({
value = callback( elems[ i ], i, arg );
if ( value != null ) {
- ret[ ret.length ] = value;
+ ret.push( value );
}
}
}
// Flatten any nested arrays
- return core_concat.apply( [], ret );
+ return concat.apply( [], ret );
},
// A global GUID counter for objects
@@ -807,7 +492,7 @@ jQuery.extend({
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
- var args, proxy, tmp;
+ var tmp, args, proxy;
if ( typeof context === "string" ) {
tmp = fn[ context ];
@@ -822,9 +507,9 @@ jQuery.extend({
}
// Simulated bind
- args = core_slice.call( arguments, 2 );
+ args = slice.call( arguments, 2 );
proxy = function() {
- return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
};
// Set the guid of unique handler to the same of original handler, so it can be removed
@@ -833,158 +518,28 @@ jQuery.extend({
return proxy;
},
- // Multifunctional method to get and set values of a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
- var i = 0,
- length = elems.length,
- bulk = key == null;
-
- // Sets many values
- if ( jQuery.type( key ) === "object" ) {
- chainable = true;
- for ( i in key ) {
- jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
- }
-
- // Sets one value
- } else if ( value !== undefined ) {
- chainable = true;
-
- if ( !jQuery.isFunction( value ) ) {
- raw = true;
- }
-
- if ( bulk ) {
- // Bulk operations run against the entire set
- if ( raw ) {
- fn.call( elems, value );
- fn = null;
+ now: Date.now,
- // ...except when executing function values
- } else {
- bulk = fn;
- fn = function( elem, key, value ) {
- return bulk.call( jQuery( elem ), value );
- };
- }
- }
-
- if ( fn ) {
- for ( ; i < length; i++ ) {
- fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
- }
- }
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- length ? fn( elems[0], key ) : emptyGet;
- },
-
- now: function() {
- return ( new Date() ).getTime();
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations.
- // Note: this method belongs to the css module but it's needed here for the support module.
- // If support gets modularized, this method should be moved back to the css module.
- swap: function( elem, options, callback, args ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.apply( elem, args || [] );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
- }
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
});
-jQuery.ready.promise = function( obj ) {
- if ( !readyList ) {
-
- readyList = jQuery.Deferred();
-
- // Catch cases where $(document).ready() is called after the browser event has already occurred.
- // we once tried to use readyState "interactive" here, but it caused issues like the one
- // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- setTimeout( jQuery.ready );
-
- // Standards-based browsers support DOMContentLoaded
- } else if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed, false );
-
- // If IE event model is used
- } else {
- // Ensure firing before onload, maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", completed );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", completed );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var top = false;
-
- try {
- top = window.frameElement == null && document.documentElement;
- } catch(e) {}
-
- if ( top && top.doScroll ) {
- (function doScrollCheck() {
- if ( !jQuery.isReady ) {
-
- try {
- // Use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- top.doScroll("left");
- } catch(e) {
- return setTimeout( doScrollCheck, 50 );
- }
-
- // detach all dom ready events
- detach();
-
- // and execute any waiting functions
- jQuery.ready();
- }
- })();
- }
- }
- }
- return readyList.promise( obj );
-};
-
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
function isArraylike( obj ) {
- var length = obj.length,
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = "length" in obj && obj.length,
type = jQuery.type( obj );
- if ( jQuery.isWindow( obj ) ) {
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
return false;
}
@@ -992,34 +547,33 @@ function isArraylike( obj ) {
return true;
}
- return type === "array" || type !== "function" &&
- ( length === 0 ||
- typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
+var Sizzle =
/*!
- * Sizzle CSS Selector Engine v1.10.2
+ * Sizzle CSS Selector Engine v2.2.0-pre
* http://sizzlejs.com/
*
- * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
* http://jquery.org/license
*
- * Date: 2013-07-03
+ * Date: 2014-12-16
*/
-(function( window, undefined ) {
+(function( window ) {
var i,
support,
- cachedruns,
Expr,
getText,
isXML,
+ tokenize,
compile,
+ select,
outermostContext,
sortInput,
+ hasDuplicate,
// Local document vars
setDocument,
@@ -1032,24 +586,21 @@ var i,
contains,
// Instance-specific data
- expando = "sizzle" + -(new Date()),
+ expando = "sizzle" + 1 * new Date(),
preferredDoc = window.document,
dirruns = 0,
done = 0,
classCache = createCache(),
tokenCache = createCache(),
compilerCache = createCache(),
- hasDuplicate = false,
sortOrder = function( a, b ) {
if ( a === b ) {
hasDuplicate = true;
- return 0;
}
return 0;
},
// General-purpose constants
- strundefined = typeof undefined,
MAX_NEGATIVE = 1 << 31,
// Instance methods
@@ -1059,12 +610,13 @@ var i,
push_native = arr.push,
push = arr.push,
slice = arr.slice,
- // Use a stripped-down indexOf if we can't use a native one
- indexOf = arr.indexOf || function( elem ) {
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
var i = 0,
- len = this.length;
+ len = list.length;
for ( ; i < len; i++ ) {
- if ( this[i] === elem ) {
+ if ( list[i] === elem ) {
return i;
}
}
@@ -1085,26 +637,32 @@ var i,
// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
identifier = characterEncoding.replace( "w", "w#" ),
- // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
- attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
- "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
- // Prefer arguments quoted,
- // then not containing pseudos/brackets,
- // then attribute selectors/non-parenthetical expressions,
- // then anything else
- // These preferences are here to reduce the number of selectors
- // needing tokenize in the PSEUDO preFilter
- pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
- rsibling = new RegExp( whitespace + "*[+~]" ),
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
rpseudo = new RegExp( pseudos ),
ridentifier = new RegExp( "^" + identifier + "$" ),
@@ -1125,14 +683,15 @@ var i,
whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
},
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
rnative = /^[^{]+\{\s*\[native \w/,
// Easily-parseable/retrievable ID or TAG or CLASS selectors
rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
- rinputs = /^(?:input|select|textarea|button)$/i,
- rheader = /^h\d$/i,
-
+ rsibling = /[+~]/,
rescape = /'|\\/g,
// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
@@ -1140,15 +699,23 @@ var i,
funescape = function( _, escaped, escapedWhitespace ) {
var high = "0x" + escaped - 0x10000;
// NaN means non-codepoint
- // Support: Firefox
+ // Support: Firefox<24
// Workaround erroneous numeric interpretation of +"0x"
return high !== high || escapedWhitespace ?
escaped :
- // BMP codepoint
high < 0 ?
+ // BMP codepoint
String.fromCharCode( high + 0x10000 ) :
// Supplemental Plane codepoint (surrogate pair)
String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
};
// Optimize for push.apply( _, NodeList )
@@ -1191,25 +758,24 @@ function Sizzle( selector, context, results, seed ) {
context = context || document;
results = results || [];
+ nodeType = context.nodeType;
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
- if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
- return [];
+ return results;
}
- if ( documentIsHTML && !seed ) {
+ if ( !seed && documentIsHTML ) {
- // Shortcuts
- if ( (match = rquickExpr.exec( selector )) ) {
+ // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
// Speed-up: Sizzle("#ID")
if ( (m = match[1]) ) {
if ( nodeType === 9 ) {
elem = context.getElementById( m );
// Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
+ // nodes that are no longer in the document (jQuery #6963)
if ( elem && elem.parentNode ) {
// Handle the case where IE, Opera, and Webkit return items
// by name instead of ID
@@ -1235,7 +801,7 @@ function Sizzle( selector, context, results, seed ) {
return results;
// Speed-up: Sizzle(".CLASS")
- } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ } else if ( (m = match[3]) && support.getElementsByClassName ) {
push.apply( results, context.getElementsByClassName( m ) );
return results;
}
@@ -1245,7 +811,7 @@ function Sizzle( selector, context, results, seed ) {
if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
nid = old = expando;
newContext = context;
- newSelector = nodeType === 9 && selector;
+ newSelector = nodeType !== 1 && selector;
// qSA works strangely on Element-rooted queries
// We can work around this by specifying an extra ID on the root
@@ -1265,7 +831,7 @@ function Sizzle( selector, context, results, seed ) {
while ( i-- ) {
groups[i] = nid + toSelector( groups[i] );
}
- newContext = rsibling.test( selector ) && context.parentNode || context;
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
newSelector = groups.join(",");
}
@@ -1300,11 +866,11 @@ function createCache() {
function cache( key, value ) {
// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
- if ( keys.push( key += " " ) > Expr.cacheLength ) {
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
// Only keep the most recent entries
delete cache[ keys.shift() ];
}
- return (cache[ key ] = value);
+ return (cache[ key + " " ] = value);
}
return cache;
}
@@ -1427,8 +993,21 @@ function createPositionalPseudo( fn ) {
}
/**
- * Detect xml
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
* @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
// documentElement is verified for cases where it doesn't yet exist
@@ -1437,17 +1016,14 @@ isXML = Sizzle.isXML = function( elem ) {
return documentElement ? documentElement.nodeName !== "HTML" : false;
};
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
/**
* Sets document-related variables once based on the current document
* @param {Element|Object} [doc] An element or document object to use to set the document
* @returns {Object} Returns the current document
*/
setDocument = Sizzle.setDocument = function( node ) {
- var doc = node ? node.ownerDocument || node : preferredDoc,
- parent = doc.defaultView;
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
// If no document and documentElement is available, return
if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
@@ -1457,25 +1033,31 @@ setDocument = Sizzle.setDocument = function( node ) {
// Set our document
document = doc;
docElem = doc.documentElement;
-
- // Support tests
- documentIsHTML = !isXML( doc );
+ parent = doc.defaultView;
// Support: IE>8
// If iframe document is assigned to "document" variable and if iframe has been reloaded,
// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
// IE6-8 do not support the defaultView property so parent will be undefined
- if ( parent && parent.attachEvent && parent !== parent.top ) {
- parent.attachEvent( "onbeforeunload", function() {
- setDocument();
- });
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
}
+ /* Support tests
+ ---------------------------------------------------------------------- */
+ documentIsHTML = !isXML( doc );
+
/* Attributes
---------------------------------------------------------------------- */
// Support: IE<8
- // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
support.attributes = assert(function( div ) {
div.className = "i";
return !div.getAttribute("className");
@@ -1490,17 +1072,8 @@ setDocument = Sizzle.setDocument = function( node ) {
return !div.getElementsByTagName("*").length;
});
- // Check if getElementsByClassName can be trusted
- support.getElementsByClassName = assert(function( div ) {
- div.innerHTML = "<div class='a'></div><div class='a i'></div>";
-
- // Support: Safari<4
- // Catch class over-caching
- div.firstChild.className = "i";
- // Support: Opera<10
- // Catch gEBCN failure to find non-leading classes
- return div.getElementsByClassName("i").length === 2;
- });
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
// Support: IE<10
// Check if getElementById returns elements by name
@@ -1514,11 +1087,11 @@ setDocument = Sizzle.setDocument = function( node ) {
// ID find and filter
if ( support.getById ) {
Expr.find["ID"] = function( id, context ) {
- if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
var m = context.getElementById( id );
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
+ return m && m.parentNode ? [ m ] : [];
}
};
Expr.filter["ID"] = function( id ) {
@@ -1535,7 +1108,7 @@ setDocument = Sizzle.setDocument = function( node ) {
Expr.filter["ID"] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
- var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
return node && node.value === attrId;
};
};
@@ -1544,14 +1117,20 @@ setDocument = Sizzle.setDocument = function( node ) {
// Tag
Expr.find["TAG"] = support.getElementsByTagName ?
function( tag, context ) {
- if ( typeof context.getElementsByTagName !== strundefined ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
}
} :
+
function( tag, context ) {
var elem,
tmp = [],
i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
results = context.getElementsByTagName( tag );
// Filter out possible comments
@@ -1569,7 +1148,7 @@ setDocument = Sizzle.setDocument = function( node ) {
// Class
Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
- if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ if ( documentIsHTML ) {
return context.getElementsByClassName( className );
}
};
@@ -1598,7 +1177,17 @@ setDocument = Sizzle.setDocument = function( node ) {
// setting a boolean content attribute,
// since its presence should be enough
// http://bugs.jquery.com/ticket/12359
- div.innerHTML = "<select><option selected=''></option></select>";
+ docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\f]' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
// Support: IE8
// Boolean attributes and "value" are not treated correctly
@@ -1606,27 +1195,37 @@ setDocument = Sizzle.setDocument = function( node ) {
rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
}
+ // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
// Webkit/Opera - :checked should return selected option elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
// IE8 throws error here and will not see later tests
if ( !div.querySelectorAll(":checked").length ) {
rbuggyQSA.push(":checked");
}
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
});
assert(function( div ) {
-
- // Support: Opera 10-12/IE8
- // ^= $= *= and empty values
- // Should not select anything
// Support: Windows 8 Native Apps
- // The type attribute is restricted during .innerHTML assignment
+ // The type and name attributes are restricted during .innerHTML assignment
var input = doc.createElement("input");
input.setAttribute( "type", "hidden" );
- div.appendChild( input ).setAttribute( "t", "" );
+ div.appendChild( input ).setAttribute( "name", "D" );
- if ( div.querySelectorAll("[t^='']").length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
}
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
@@ -1641,7 +1240,8 @@ setDocument = Sizzle.setDocument = function( node ) {
});
}
- if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
docElem.mozMatchesSelector ||
docElem.oMatchesSelector ||
docElem.msMatchesSelector) )) ) {
@@ -1663,11 +1263,12 @@ setDocument = Sizzle.setDocument = function( node ) {
/* Contains
---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
// Element contains another
// Purposefully does not implement inclusive descendent
// As in, an element does not contain itself
- contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+ contains = hasCompare || rnative.test( docElem.contains ) ?
function( a, b ) {
var adown = a.nodeType === 9 ? a.documentElement : a,
bup = b && b.parentNode;
@@ -1692,7 +1293,7 @@ setDocument = Sizzle.setDocument = function( node ) {
---------------------------------------------------------------------- */
// Document order sorting
- sortOrder = docElem.compareDocumentPosition ?
+ sortOrder = hasCompare ?
function( a, b ) {
// Flag for duplicate removal
@@ -1701,34 +1302,46 @@ setDocument = Sizzle.setDocument = function( node ) {
return 0;
}
- var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
-
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
if ( compare ) {
- // Disconnected nodes
- if ( compare & 1 ||
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+ return compare;
+ }
- // Choose the first element that is related to our preferred document
- if ( a === doc || contains(preferredDoc, a) ) {
- return -1;
- }
- if ( b === doc || contains(preferredDoc, b) ) {
- return 1;
- }
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
- // Maintain original order
- return sortInput ?
- ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
- 0;
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
}
- return compare & 4 ? -1 : 1;
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
}
- // Not directly comparable, sort on existence of method
- return a.compareDocumentPosition ? -1 : 1;
+ return compare & 4 ? -1 : 1;
} :
function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
var cur,
i = 0,
aup = a.parentNode,
@@ -1736,19 +1349,14 @@ setDocument = Sizzle.setDocument = function( node ) {
ap = [ a ],
bp = [ b ];
- // Exit early if the nodes are identical
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
// Parentless nodes are either documents or disconnected
- } else if ( !aup || !bup ) {
+ if ( !aup || !bup ) {
return a === doc ? -1 :
b === doc ? 1 :
aup ? -1 :
bup ? 1 :
sortInput ?
- ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
0;
// If the nodes are siblings, we can do a quick check
@@ -1811,10 +1419,10 @@ Sizzle.matchesSelector = function( elem, expr ) {
elem.document && elem.document.nodeType !== 11 ) {
return ret;
}
- } catch(e) {}
+ } catch (e) {}
}
- return Sizzle( expr, document, null, [elem] ).length > 0;
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
};
Sizzle.contains = function( context, elem ) {
@@ -1837,13 +1445,13 @@ Sizzle.attr = function( elem, name ) {
fn( elem, name, !documentIsHTML ) :
undefined;
- return val === undefined ?
+ return val !== undefined ?
+ val :
support.attributes || !documentIsHTML ?
elem.getAttribute( name ) :
(val = elem.getAttributeNode(name)) && val.specified ?
val.value :
- null :
- val;
+ null;
};
Sizzle.error = function( msg ) {
@@ -1876,6 +1484,10 @@ Sizzle.uniqueSort = function( results ) {
}
}
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
return results;
};
@@ -1891,13 +1503,13 @@ getText = Sizzle.getText = function( elem ) {
if ( !nodeType ) {
// If no nodeType, this is expected to be an array
- for ( ; (node = elem[i]); i++ ) {
+ while ( (node = elem[i++]) ) {
// Do not traverse comment nodes
ret += getText( node );
}
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// Use textContent for elements
- // innerText usage removed for consistency of new lines (see #11153)
+ // innerText usage removed for consistency of new lines (jQuery #11153)
if ( typeof elem.textContent === "string" ) {
return elem.textContent;
} else {
@@ -1939,7 +1551,7 @@ Expr = Sizzle.selectors = {
match[1] = match[1].replace( runescape, funescape );
// Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
if ( match[2] === "~=" ) {
match[3] = " " + match[3] + " ";
@@ -1982,15 +1594,15 @@ Expr = Sizzle.selectors = {
"PSEUDO": function( match ) {
var excess,
- unquoted = !match[5] && match[2];
+ unquoted = !match[6] && match[2];
if ( matchExpr["CHILD"].test( match[0] ) ) {
return null;
}
// Accept quoted arguments as-is
- if ( match[3] && match[4] !== undefined ) {
- match[2] = match[4];
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
// Strip excess characters from unquoted arguments
} else if ( unquoted && rpseudo.test( unquoted ) &&
@@ -2026,7 +1638,7 @@ Expr = Sizzle.selectors = {
return pattern ||
(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
classCache( className, function( elem ) {
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
});
},
@@ -2048,7 +1660,7 @@ Expr = Sizzle.selectors = {
operator === "^=" ? check && result.indexOf( check ) === 0 :
operator === "*=" ? check && result.indexOf( check ) > -1 :
operator === "$=" ? check && result.slice( -check.length ) === check :
- operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
false;
};
@@ -2168,7 +1780,7 @@ Expr = Sizzle.selectors = {
matched = fn( seed, argument ),
i = matched.length;
while ( i-- ) {
- idx = indexOf.call( seed, matched[i] );
+ idx = indexOf( seed, matched[i] );
seed[ idx ] = !( matches[ idx ] = matched[i] );
}
}) :
@@ -2207,6 +1819,8 @@ Expr = Sizzle.selectors = {
function( elem, context, xml ) {
input[0] = elem;
matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
return !results.pop();
};
}),
@@ -2218,6 +1832,7 @@ Expr = Sizzle.selectors = {
}),
"contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
return function( elem ) {
return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
};
@@ -2294,12 +1909,11 @@ Expr = Sizzle.selectors = {
// Contents
"empty": function( elem ) {
// http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
- // not comment, processing instructions, or others
- // Thanks to Diego Perini for the nodeName shortcut
- // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+ if ( elem.nodeType < 6 ) {
return false;
}
}
@@ -2326,11 +1940,12 @@ Expr = Sizzle.selectors = {
"text": function( elem ) {
var attr;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
return elem.nodeName.toLowerCase() === "input" &&
elem.type === "text" &&
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
},
// Position-in-collection
@@ -2395,7 +2010,7 @@ function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();
-function tokenize( selector, parseOnly ) {
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
var matched, match, tokens, type,
soFar, groups, preFilters,
cached = tokenCache[ selector + " " ];
@@ -2416,7 +2031,7 @@ function tokenize( selector, parseOnly ) {
// Don't consume trailing commas as valid
soFar = soFar.slice( match[0].length ) || soFar;
}
- groups.push( tokens = [] );
+ groups.push( (tokens = []) );
}
matched = false;
@@ -2460,7 +2075,7 @@ function tokenize( selector, parseOnly ) {
Sizzle.error( selector ) :
// Cache the tokens
tokenCache( selector, groups ).slice( 0 );
-}
+};
function toSelector( tokens ) {
var i = 0,
@@ -2489,8 +2104,8 @@ function addCombinator( matcher, combinator, base ) {
// Check against all ancestor/preceding elements
function( elem, context, xml ) {
- var data, cache, outerCache,
- dirkey = dirruns + " " + doneName;
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
if ( xml ) {
@@ -2505,14 +2120,17 @@ function addCombinator( matcher, combinator, base ) {
while ( (elem = elem[ dir ]) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
outerCache = elem[ expando ] || (elem[ expando ] = {});
- if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
- if ( (data = cache[1]) === true || data === cachedruns ) {
- return data === true;
- }
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
} else {
- cache = outerCache[ dir ] = [ dirkey ];
- cache[1] = matcher( elem, context, xml ) || cachedruns;
- if ( cache[1] === true ) {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
return true;
}
}
@@ -2536,6 +2154,15 @@ function elementMatcher( matchers ) {
matchers[0];
}
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
function condense( unmatched, map, filter, context, xml ) {
var elem,
newUnmatched = [],
@@ -2627,7 +2254,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
i = matcherOut.length;
while ( i-- ) {
if ( (elem = matcherOut[i]) &&
- (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
seed[temp] = !(results[temp] = elem);
}
@@ -2662,13 +2289,16 @@ function matcherFromTokens( tokens ) {
return elem === checkContext;
}, implicitRelative, true ),
matchAnyContext = addCombinator( function( elem ) {
- return indexOf.call( checkContext, elem ) > -1;
+ return indexOf( checkContext, elem ) > -1;
}, implicitRelative, true ),
matchers = [ function( elem, context, xml ) {
- return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
(checkContext = context).nodeType ?
matchContext( elem, context, xml ) :
matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
} ];
for ( ; i < len; i++ ) {
@@ -2706,31 +2336,30 @@ function matcherFromTokens( tokens ) {
}
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
- // A counter to specify which element is currently being matched
- var matcherCachedRuns = 0,
- bySet = setMatchers.length > 0,
+ var bySet = setMatchers.length > 0,
byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, expandContext ) {
+ superMatcher = function( seed, context, xml, results, outermost ) {
var elem, j, matcher,
- setMatched = [],
matchedCount = 0,
i = "0",
unmatched = seed && [],
- outermost = expandContext != null,
+ setMatched = [],
contextBackup = outermostContext,
- // We must always have either seed elements or context
- elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
// Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
if ( outermost ) {
outermostContext = context !== document && context;
- cachedruns = matcherCachedRuns;
}
// Add elements passing elementMatchers directly to results
// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
- for ( ; (elem = elems[i]) != null; i++ ) {
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
if ( byElement && elem ) {
j = 0;
while ( (matcher = elementMatchers[j++]) ) {
@@ -2741,7 +2370,6 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
}
if ( outermost ) {
dirruns = dirrunsUnique;
- cachedruns = ++matcherCachedRuns;
}
}
@@ -2806,7 +2434,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
superMatcher;
}
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
var i,
setMatchers = [],
elementMatchers = [],
@@ -2814,12 +2442,12 @@ compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
if ( !cached ) {
// Generate a function of recursive functions that can be used to check each element
- if ( !group ) {
- group = tokenize( selector );
+ if ( !match ) {
+ match = tokenize( selector );
}
- i = group.length;
+ i = match.length;
while ( i-- ) {
- cached = matcherFromTokens( group[i] );
+ cached = matcherFromTokens( match[i] );
if ( cached[ expando ] ) {
setMatchers.push( cached );
} else {
@@ -2829,91 +2457,100 @@ compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
// Cache the compiled function
cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
}
return cached;
};
-function multipleContexts( selector, contexts, results ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results );
- }
- return results;
-}
-
-function select( selector, context, results, seed ) {
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
var i, tokens, token, type, find,
- match = tokenize( selector );
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
- if ( !seed ) {
- // Try to minimize operations if there is only one group
- if ( match.length === 1 ) {
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
- // Take a shortcut and set the context if the root selector is an ID
- tokens = match[0] = match[0].slice( 0 );
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- support.getById && context.nodeType === 9 && documentIsHTML &&
- Expr.relative[ tokens[1].type ] ) {
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
- if ( !context ) {
- return results;
- }
- selector = selector.slice( tokens.shift().value.length );
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
}
- // Fetch a seed set for right-to-left matching
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
- while ( i-- ) {
- token = tokens[i];
+ selector = selector.slice( tokens.shift().value.length );
+ }
- // Abort if we hit a combinator
- if ( Expr.relative[ (type = token.type) ] ) {
- break;
- }
- if ( (find = Expr.find[ type ]) ) {
- // Search, expanding context for leading sibling combinators
- if ( (seed = find(
- token.matches[0].replace( runescape, funescape ),
- rsibling.test( tokens[0].type ) && context.parentNode || context
- )) ) {
-
- // If seed is empty or no tokens remain, we can return early
- tokens.splice( i, 1 );
- selector = seed.length && toSelector( tokens );
- if ( !selector ) {
- push.apply( results, seed );
- return results;
- }
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
- break;
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
}
+
+ break;
}
}
}
}
- // Compile and execute a filtering function
+ // Compile and execute a filtering function if one is not provided
// Provide `match` to avoid retokenization if we modified the selector above
- compile( selector, match )(
+ ( compiled || compile( selector, match ) )(
seed,
context,
!documentIsHTML,
results,
- rsibling.test( selector )
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
);
return results;
-}
+};
// One-time assignments
// Sort stability
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-// Support: Chrome<14
+// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = hasDuplicate;
+support.detectDuplicates = !!hasDuplicate;
// Initialize against the default document
setDocument();
@@ -2961,13 +2598,20 @@ if ( !assert(function( div ) {
addHandle( booleans, function( elem, name, isXML ) {
var val;
if ( !isXML ) {
- return (val = elem.getAttributeNode( name )) && val.specified ?
- val.value :
- elem[ name ] === true ? name.toLowerCase() : null;
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
}
});
}
+return Sizzle;
+
+})( window );
+
+
+
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.pseudos;
@@ -2977,14 +2621,421 @@ jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
-})( window );
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
// String to Object options format cache
var optionsCache = {};
// Convert String-formatted options into Object-formatted ones and store in cache
function createOptions( options ) {
var object = optionsCache[ options ] = {};
- jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
object[ flag ] = true;
});
return object;
@@ -3020,18 +3071,18 @@ jQuery.Callbacks = function( options ) {
( optionsCache[ options ] || createOptions( options ) ) :
jQuery.extend( {}, options );
- var // Flag to know if list is currently firing
- firing,
- // Last fire value (for non-forgettable lists)
+ var // Last fire value (for non-forgettable lists)
memory,
// Flag to know if list was already fired
fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
// End of the loop when firing
firingLength,
// Index of currently firing callback (modified by remove if needed)
firingIndex,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
// Actual callback list
list = [],
// Stack of fire calls for repeatable lists
@@ -3101,7 +3152,7 @@ jQuery.Callbacks = function( options ) {
if ( list ) {
jQuery.each( arguments, function( _, arg ) {
var index;
- while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
list.splice( index, 1 );
// Handle firing indexes
if ( firing ) {
@@ -3175,6 +3226,8 @@ jQuery.Callbacks = function( options ) {
return self;
};
+
+
jQuery.extend({
Deferred: function( func ) {
@@ -3197,8 +3250,7 @@ jQuery.extend({
var fns = arguments;
return jQuery.Deferred(function( newDefer ) {
jQuery.each( tuples, function( i, tuple ) {
- var action = tuple[ 0 ],
- fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
// deferred[ done | fail | progress ] for forwarding actions to newDefer
deferred[ tuple[1] ](function() {
var returned = fn && fn.apply( this, arguments );
@@ -3208,7 +3260,7 @@ jQuery.extend({
.fail( newDefer.reject )
.progress( newDefer.notify );
} else {
- newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
}
});
});
@@ -3267,7 +3319,7 @@ jQuery.extend({
// Deferred helper
when: function( subordinate /* , ..., subordinateN */ ) {
var i = 0,
- resolveValues = core_slice.call( arguments ),
+ resolveValues = slice.call( arguments ),
length = resolveValues.length,
// the count of uncompleted subordinates
@@ -3280,8 +3332,8 @@ jQuery.extend({
updateFunc = function( i, contexts, values ) {
return function( value ) {
contexts[ i ] = this;
- values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
- if( values === progressValues ) {
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
deferred.notifyWith( contexts, values );
} else if ( !( --remaining ) ) {
deferred.resolveWith( contexts, values );
@@ -3291,7 +3343,7 @@ jQuery.extend({
progressValues, progressContexts, resolveContexts;
- // add listeners to Deferred subordinates; treat others as resolved
+ // Add listeners to Deferred subordinates; treat others as resolved
if ( length > 1 ) {
progressValues = new Array( length );
progressContexts = new Array( length );
@@ -3308,7 +3360,7 @@ jQuery.extend({
}
}
- // if we're not waiting on anything, resolve the master
+ // If we're not waiting on anything, resolve the master
if ( !remaining ) {
deferred.resolveWith( resolveContexts, resolveValues );
}
@@ -3316,509 +3368,440 @@ jQuery.extend({
return deferred.promise();
}
});
-jQuery.support = (function( support ) {
- var all, a, input, select, fragment, opt, eventName, isSupported, i,
- div = document.createElement("div");
- // Setup
- div.setAttribute( "className", "t" );
- div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+// The deferred used on DOM ready
+var readyList;
- // Finish early in limited (non-browser) environments
- all = div.getElementsByTagName("*") || [];
- a = div.getElementsByTagName("a")[ 0 ];
- if ( !a || !a.style || !all.length ) {
- return support;
- }
-
- // First batch of tests
- select = document.createElement("select");
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName("input")[ 0 ];
-
- a.style.cssText = "top:1px;float:left;opacity:.5";
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- support.getSetAttribute = div.className !== "t";
-
- // IE strips leading whitespace when .innerHTML is used
- support.leadingWhitespace = div.firstChild.nodeType === 3;
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- support.tbody = !div.getElementsByTagName("tbody").length;
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- support.htmlSerialize = !!div.getElementsByTagName("link").length;
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- support.style = /top/.test( a.getAttribute("style") );
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- support.hrefNormalized = a.getAttribute("href") === "/a";
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- support.opacity = /^0.5/.test( a.style.opacity );
+ return this;
+};
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- support.cssFloat = !!a.style.cssFloat;
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
- // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
- support.checkOn = !!input.value;
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- support.optSelected = opt.selected;
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
- // Tests for enctype support on a form (#6743)
- support.enctype = !!document.createElement("form").enctype;
+ // Handle when the DOM is ready
+ ready: function( wait ) {
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>";
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
- // Will be defined later
- support.inlineBlockNeedsLayout = false;
- support.shrinkWrapBlocks = false;
- support.pixelPosition = false;
- support.deleteExpando = true;
- support.noCloneEvent = true;
- support.reliableMarginRight = true;
- support.boxSizingReliable = true;
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
- // Support: IE<9
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
}
+});
- // Check if we can trust getAttribute("value")
- input = document.createElement("input");
- input.setAttribute( "value", "" );
- support.input = input.getAttribute( "value" ) === "";
-
- // Check if an input maintains its value after becoming a radio
- input.value = "t";
- input.setAttribute( "type", "radio" );
- support.radioValue = input.value === "t";
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
- // #11217 - WebKit loses check when the name is after the checked attribute
- input.setAttribute( "checked", "t" );
- input.setAttribute( "name", "t" );
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
- fragment = document.createDocumentFragment();
- fragment.appendChild( input );
+ readyList = jQuery.Deferred();
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // We once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+ } else {
- // Support: IE<9
- // Opera does not clone events (and typeof div.attachEvent === undefined).
- // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
- if ( div.attachEvent ) {
- div.attachEvent( "onclick", function() {
- support.noCloneEvent = false;
- });
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
- div.cloneNode( true ).click();
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
}
+ return readyList.promise( obj );
+};
- // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
- // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
- for ( i in { submit: true, change: true, focusin: true }) {
- div.setAttribute( eventName = "on" + i, "t" );
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
- support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
- }
- div.style.backgroundClip = "content-box";
- div.cloneNode( true ).style.backgroundClip = "";
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
- // Support: IE<9
- // Iteration over object's inherited properties before its own.
- for ( i in jQuery( support ) ) {
- break;
- }
- support.ownLast = i !== "0";
- // Run tests that need a body at doc ready
- jQuery(function() {
- var container, marginDiv, tds,
- divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
- body = document.getElementsByTagName("body")[0];
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
- if ( !body ) {
- // Return for frameset docs that don't have a body
- return;
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
}
- container = document.createElement("div");
- container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
- body.appendChild( container ).appendChild( div );
-
- // Support: IE8
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
- tds = div.getElementsByTagName("td");
- tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Support: IE8
- // Check if empty table cells still have offsetWidth/Height
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
- // Check box-sizing and margin behavior.
- div.innerHTML = "";
- div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
- // Workaround failing boxSizing test due to offsetWidth returning wrong value
- // with some non-1 values of body zoom, ticket #13543
- jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
- support.boxSizing = div.offsetWidth === 4;
- });
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
- // Use window.getComputedStyle because jsdom on node.js will break without it.
- if ( window.getComputedStyle ) {
- support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
- support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. (#3333)
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- marginDiv = div.appendChild( document.createElement("div") );
- marginDiv.style.cssText = div.style.cssText = divReset;
- marginDiv.style.marginRight = marginDiv.style.width = "0";
- div.style.width = "1px";
-
- support.reliableMarginRight =
- !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
- }
-
- if ( typeof div.style.zoom !== core_strundefined ) {
- // Support: IE<8
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- div.innerHTML = "";
- div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
- // Support: IE6
- // Check if elements with layout shrink-wrap their children
- div.style.display = "block";
- div.innerHTML = "<div></div>";
- div.firstChild.style.width = "5px";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
- if ( support.inlineBlockNeedsLayout ) {
- // Prevent IE 6 from affecting layout for positioned elements #11048
- // Prevent IE from shrinking the body in IE 7 mode #12869
- // Support: IE<8
- body.style.zoom = 1;
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
}
}
- body.removeChild( container );
-
- // Null elements to avoid leaks in IE
- container = div = tds = marginDiv = null;
- });
-
- // Null elements to avoid leaks in IE
- all = select = fragment = opt = a = input = null;
-
- return support;
-})({});
-
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
- rmultiDash = /([A-Z])/g;
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ){
- if ( !jQuery.acceptData( elem ) ) {
- return;
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
}
- var ret, thisCache,
- internalKey = jQuery.expando,
+ return chainable ?
+ elems :
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
- return;
- }
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
- } else {
- id = internalKey;
+function Data() {
+ // Support: Android<4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
}
- }
-
- if ( !cache[ id ] ) {
- // Avoid exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
- }
+ });
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
+ this.expando = jQuery.expando + Data.uid++;
+}
- thisCache = cache[ id ];
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
}
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( typeof name === "string" ) {
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
- // First Try to find as-is property data
- ret = thisCache[ name ];
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
- // Test for null|undefined property data
- if ( ret == null ) {
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
+ // Support: Android<4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
}
- } else {
- ret = thisCache;
- }
-
- return ret;
-}
-function internalRemoveData( elem, name, pvt ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i,
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
- if ( thisCache ) {
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
- // try the string as a key before any manipulation
- if ( name in thisCache ) {
- name = [ name ];
- } else {
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split(" ");
- }
- }
- } else {
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
// If "name" is an array of keys...
// When data is initially created, via ("key", "val") signature,
// keys will be converted to camelCase.
// Since there is no way to tell _how_ a key was added, remove
// both plain key and camelCase key. #12786
// This will only penalize the array argument path.
- name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
}
i = name.length;
while ( i-- ) {
- delete thisCache[ name[i] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
- return;
+ delete cache[ name[ i ] ];
}
}
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
}
+};
+var data_priv = new Data();
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
+var data_user = new Data();
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
- }
- // Destroy the cache
- if ( isNode ) {
- jQuery.cleanData( [ elem ], true );
- // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
- /* jshint eqeqeq: false */
- } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
- /* jshint eqeqeq: true */
- delete cache[ id ];
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
- // When all else fails, null
- } else {
- cache[ id ] = null;
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
}
+ return data;
}
jQuery.extend({
- cache: {},
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "applet": true,
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
- },
-
hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
},
data: function( elem, name, data ) {
- return internalData( elem, name, data );
+ return data_user.access( elem, name, data );
},
removeData: function( elem, name ) {
- return internalRemoveData( elem, name );
+ data_user.remove( elem, name );
},
- // For internal use only.
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
_data: function( elem, name, data ) {
- return internalData( elem, name, data, true );
+ return data_priv.access( elem, name, data );
},
_removeData: function( elem, name ) {
- return internalRemoveData( elem, name, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- // Do not set data on non-element because it will not be cleared (#8335).
- if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
- return false;
- }
-
- var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- // nodes accept data unless otherwise specified; rejection can be conditional
- return !noData || noData !== true && elem.getAttribute("classid") === noData;
+ data_priv.remove( elem, name );
}
});
jQuery.fn.extend({
data: function( key, value ) {
- var attrs, name,
- data = null,
- i = 0,
- elem = this[0];
-
- // Special expections of .data basically thwart jQuery.access,
- // so implement the relevant behavior ourselves
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
// Gets all values
if ( key === undefined ) {
if ( this.length ) {
- data = jQuery.data( elem );
+ data = data_user.get( elem );
- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attrs = elem.attributes;
- for ( ; i < attrs.length; i++ ) {
- name = attrs[i].name;
-
- if ( name.indexOf("data-") === 0 ) {
- name = jQuery.camelCase( name.slice(5) );
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
- dataAttr( elem, name, data[ name ] );
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
}
}
- jQuery._data( elem, "parsedAttrs", true );
+ data_priv.set( elem, "hasDataAttrs", true );
}
}
@@ -3828,88 +3811,86 @@ jQuery.fn.extend({
// Sets multiple values
if ( typeof key === "object" ) {
return this.each(function() {
- jQuery.data( this, key );
+ data_user.set( this, key );
});
}
- return arguments.length > 1 ?
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
- // Sets one value
+ // Set the data...
this.each(function() {
- jQuery.data( this, key, value );
- }) :
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
- // Gets one value
- // Try to fetch any internally stored data first
- elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
},
removeData: function( key ) {
return this.each(function() {
- jQuery.removeData( this, key );
+ data_user.remove( this, key );
});
}
});
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
- var name;
- for ( name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
jQuery.extend({
queue: function( elem, type, data ) {
var queue;
if ( elem ) {
type = ( type || "fx" ) + "queue";
- queue = jQuery._data( elem, type );
+ queue = data_priv.get( elem, type );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
- if ( !queue || jQuery.isArray(data) ) {
- queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
} else {
queue.push( data );
}
@@ -3943,7 +3924,7 @@ jQuery.extend({
queue.unshift( "inprogress" );
}
- // clear up the last queue stop function
+ // Clear up the last queue stop function
delete hooks.stop;
fn.call( elem, next, hooks );
}
@@ -3953,13 +3934,12 @@ jQuery.extend({
}
},
- // not intended for public consumption - generates a queueHooks object, or returns the current one
+ // Not public - generate a queueHooks object, or return the current one
_queueHooks: function( elem, type ) {
var key = type + "queueHooks";
- return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
empty: jQuery.Callbacks("once memory").add(function() {
- jQuery._removeData( elem, type + "queue" );
- jQuery._removeData( elem, key );
+ data_priv.remove( elem, [ type + "queue", key ] );
})
});
}
@@ -3984,7 +3964,7 @@ jQuery.fn.extend({
this.each(function() {
var queue = jQuery.queue( this, type, data );
- // ensure a hooks for this queue
+ // Ensure a hooks for this queue
jQuery._queueHooks( this, type );
if ( type === "fx" && queue[0] !== "inprogress" ) {
@@ -3997,19 +3977,6 @@ jQuery.fn.extend({
jQuery.dequeue( this, type );
});
},
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function() {
- clearTimeout( timeout );
- };
- });
- },
clearQueue: function( type ) {
return this.queue( type || "fx", [] );
},
@@ -4033,8 +4000,8 @@ jQuery.fn.extend({
}
type = type || "fx";
- while( i-- ) {
- tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
if ( tmp && tmp.empty ) {
count++;
tmp.empty.add( resolve );
@@ -4044,668 +4011,55 @@ jQuery.fn.extend({
return defer.promise( obj );
}
});
-var nodeHook, boolHook,
- rclass = /[\t\r\n\f]/g,
- rreturn = /\r/g,
- rfocusable = /^(?:input|select|textarea|button|object)$/i,
- rclickable = /^(?:a|area)$/i,
- ruseDefault = /^(?:checked|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute,
- getSetInput = jQuery.support.input;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classes, elem, cur, clazz, j,
- i = 0,
- len = this.length,
- proceed = typeof value === "string" && value;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call( this, j, this.className ) );
- });
- }
-
- if ( proceed ) {
- // The disjunction here is for better compressibility (see removeClass)
- classes = ( value || "" ).match( core_rnotwhite ) || [];
-
- for ( ; i < len; i++ ) {
- elem = this[ i ];
- cur = elem.nodeType === 1 && ( elem.className ?
- ( " " + elem.className + " " ).replace( rclass, " " ) :
- " "
- );
-
- if ( cur ) {
- j = 0;
- while ( (clazz = classes[j++]) ) {
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
- cur += clazz + " ";
- }
- }
- elem.className = jQuery.trim( cur );
-
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classes, elem, cur, clazz, j,
- i = 0,
- len = this.length,
- proceed = arguments.length === 0 || typeof value === "string" && value;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call( this, j, this.className ) );
- });
- }
- if ( proceed ) {
- classes = ( value || "" ).match( core_rnotwhite ) || [];
-
- for ( ; i < len; i++ ) {
- elem = this[ i ];
- // This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 && ( elem.className ?
- ( " " + elem.className + " " ).replace( rclass, " " ) :
- ""
- );
-
- if ( cur ) {
- j = 0;
- while ( (clazz = classes[j++]) ) {
- // Remove *all* instances
- while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
- cur = cur.replace( " " + clazz + " ", " " );
- }
- }
- elem.className = value ? jQuery.trim( cur ) : "";
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value;
-
- if ( typeof stateVal === "boolean" && type === "string" ) {
- return stateVal ? this.addClass( value ) : this.removeClass( value );
- }
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- classNames = value.match( core_rnotwhite ) || [];
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space separated list
- if ( self.hasClass( className ) ) {
- self.removeClass( className );
- } else {
- self.addClass( className );
- }
- }
-
- // Toggle whole class name
- } else if ( type === core_strundefined || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // If the element has a class name or if we're passed "false",
- // then remove the whole classname (if there was one, the above saved it).
- // Otherwise bring back whatever was previously saved (if anything),
- // falling back to the empty string if nothing was stored.
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var ret, hooks, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, jQuery( this ).val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // Use proper attribute retrieval(#6932, #12072)
- var val = jQuery.find.attr( elem, "value" );
- return val != null ?
- val :
- elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value, option,
- options = elem.options,
- index = elem.selectedIndex,
- one = elem.type === "select-one" || index < 0,
- values = one ? null : [],
- max = one ? index + 1 : options.length,
- i = index < 0 ?
- max :
- one ? index : 0;
-
- // Loop through all the selected options
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // oldIE doesn't update selected after form reset (#2551)
- if ( ( option.selected || i === index ) &&
- // Don't return options that are disabled or in a disabled optgroup
- ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
- ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var optionSet, option,
- options = elem.options,
- values = jQuery.makeArray( value ),
- i = options.length;
-
- while ( i-- ) {
- option = options[ i ];
- if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
- optionSet = true;
- }
- }
-
- // force browsers to behave consistently when non-matching value is set
- if ( !optionSet ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attr: function( elem, name, value ) {
- var hooks, ret,
- nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === core_strundefined ) {
- return jQuery.prop( elem, name, value );
- }
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] ||
- ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
-
- } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- ret = jQuery.find.attr( elem, name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret == null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, value ) {
- var name, propName,
- i = 0,
- attrNames = value && value.match( core_rnotwhite );
-
- if ( attrNames && elem.nodeType === 1 ) {
- while ( (name = attrNames[i++]) ) {
- propName = jQuery.propFix[ name ] || name;
-
- // Boolean attributes get special treatment (#10870)
- if ( jQuery.expr.match.bool.test( name ) ) {
- // Set corresponding property to false
- if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
- elem[ propName ] = false;
- // Support: IE<9
- // Also clear defaultChecked/defaultSelected (if appropriate)
- } else {
- elem[ jQuery.camelCase( "default-" + name ) ] =
- elem[ propName ] = false;
- }
-
- // See #9699 for explanation of this approach (setting first, then removal)
- } else {
- jQuery.attr( elem, name, "" );
- }
-
- elem.removeAttribute( getSetAttribute ? name : propName );
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to default in case type is set after value during creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- }
- },
-
- propFix: {
- "for": "htmlFor",
- "class": "className"
- },
-
- prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
- ret :
- ( elem[ name ] = value );
-
- } else {
- return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
- ret :
- elem[ name ];
- }
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- // Use proper attribute retrieval(#12072)
- var tabindex = jQuery.find.attr( elem, "tabindex" );
-
- return tabindex ?
- parseInt( tabindex, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- -1;
- }
- }
- }
-});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
-// Hooks for boolean attributes
-boolHook = {
- set: function( elem, value, name ) {
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
- // IE<8 needs the *property* name
- elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
- // Use defaultChecked and defaultSelected for oldIE
- } else {
- elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
- }
-
- return name;
- }
-};
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
- var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
-
- jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
- function( elem, name, isXML ) {
- var fn = jQuery.expr.attrHandle[ name ],
- ret = isXML ?
- undefined :
- /* jshint eqeqeq: false */
- (jQuery.expr.attrHandle[ name ] = undefined) !=
- getter( elem, name, isXML ) ?
-
- name.toLowerCase() :
- null;
- jQuery.expr.attrHandle[ name ] = fn;
- return ret;
- } :
- function( elem, name, isXML ) {
- return isXML ?
- undefined :
- elem[ jQuery.camelCase( "default-" + name ) ] ?
- name.toLowerCase() :
- null;
- };
-});
-
-// fix oldIE attroperties
-if ( !getSetInput || !getSetAttribute ) {
- jQuery.attrHooks.value = {
- set: function( elem, value, name ) {
- if ( jQuery.nodeName( elem, "input" ) ) {
- // Does not return so that setAttribute is also used
- elem.defaultValue = value;
- } else {
- // Use nodeHook if defined (#1954); otherwise setAttribute is fine
- return nodeHook && nodeHook.set( elem, value, name );
- }
- }
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
};
-}
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = {
- set: function( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- elem.setAttributeNode(
- (ret = elem.ownerDocument.createAttribute( name ))
- );
- }
+var rcheckableType = (/^(?:checkbox|radio)$/i);
- ret.value = value += "";
- // Break association with cloned elements by also using setAttribute (#9646)
- return name === "value" || value === elem.getAttribute( name ) ?
- value :
- undefined;
- }
- };
- jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
- // Some attributes are constructed with empty-string values when not defined
- function( elem, name, isXML ) {
- var ret;
- return isXML ?
- undefined :
- (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
- ret.value :
- null;
- };
- jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret = elem.getAttributeNode( name );
- return ret && ret.specified ?
- ret.value :
- undefined;
- },
- set: nodeHook.set
- };
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- set: function( elem, value, name ) {
- nodeHook.set( elem, value === "" ? false : value, name );
- }
- };
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- };
- });
-}
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+ // Support: Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
-// Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !jQuery.support.hrefNormalized ) {
- // href/src property should get the full normalized URL (#10299/#12915)
- jQuery.each([ "href", "src" ], function( i, name ) {
- jQuery.propHooks[ name ] = {
- get: function( elem ) {
- return elem.getAttribute( name, 4 );
- }
- };
- });
-}
+ div.appendChild( input );
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Note: IE uppercases css property names, but if we were to .toLowerCase()
- // .cssText, that would destroy case senstitivity in URL's, like in "background"
- return elem.style.cssText || undefined;
- },
- set: function( elem, value ) {
- return ( elem.style.cssText = value + "" );
- }
- };
-}
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = {
- get: function( elem ) {
- var parent = elem.parentNode;
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
- if ( parent ) {
- parent.selectedIndex;
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- };
-}
-jQuery.each([
- "tabIndex",
- "readOnly",
- "maxLength",
- "cellSpacing",
- "cellPadding",
- "rowSpan",
- "colSpan",
- "useMap",
- "frameBorder",
- "contentEditable"
-], function() {
- jQuery.propFix[ this.toLowerCase() ] = this;
-});
+support.focusinBubbles = "onfocusin" in window;
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-// Radios and checkboxes getter/setter
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
- }
- }
- };
- if ( !jQuery.support.checkOn ) {
- jQuery.valHooks[ this ].get = function( elem ) {
- // Support: Webkit
- // "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- };
- }
-});
-var rformElems = /^(?:input|select|textarea)$/i,
+var
rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
@@ -4732,10 +4086,11 @@ jQuery.event = {
global: {},
add: function( elem, types, handler, data, selector ) {
- var tmp, events, t, handleObjIn,
- special, eventHandle, handleObj,
- handlers, type, namespaces, origType,
- elemData = jQuery._data( elem );
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
// Don't attach events to noData or text/comment nodes (but allow plain objects)
if ( !elemData ) {
@@ -4762,16 +4117,13 @@ jQuery.event = {
eventHandle = elemData.handle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
- return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
};
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
}
// Handle multiple events separated by a space
- types = ( types || "" ).match( core_rnotwhite ) || [""];
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[t] ) || [];
@@ -4809,14 +4161,10 @@ jQuery.event = {
handlers = events[ type ] = [];
handlers.delegateCount = 0;
- // Only use addEventListener/attachEvent if the special events handler returns false
+ // Only use addEventListener if the special events handler returns false
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
if ( elem.addEventListener ) {
elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
}
}
}
@@ -4840,24 +4188,22 @@ jQuery.event = {
jQuery.event.global[ type ] = true;
}
- // Nullify elem to prevent memory leaks in IE
- elem = null;
},
// Detach an event or set of events from an element
remove: function( elem, types, handler, selector, mappedTypes ) {
- var j, handleObj, tmp,
- origCount, t, events,
- special, handlers, type,
- namespaces, origType,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
if ( !elemData || !(events = elemData.events) ) {
return;
}
// Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( core_rnotwhite ) || [""];
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[t] ) || [];
@@ -4911,19 +4257,16 @@ jQuery.event = {
// Remove the expando if it's no longer used
if ( jQuery.isEmptyObject( events ) ) {
delete elemData.handle;
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery._removeData( elem, "events" );
+ data_priv.remove( elem, "events" );
}
},
trigger: function( event, data, elem, onlyHandlers ) {
- var handle, ontype, cur,
- bubbleType, special, tmp, i,
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
eventPath = [ elem || document ],
- type = core_hasOwn.call( event, "type" ) ? event.type : event,
- namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
cur = tmp = elem = elem || document;
@@ -5002,15 +4345,18 @@ jQuery.event = {
special.bindType || type;
// jQuery handler
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
}
// Native handler
handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
- event.preventDefault();
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
}
}
event.type = type;
@@ -5022,9 +4368,8 @@ jQuery.event = {
jQuery.acceptData( elem ) ) {
// Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
// Don't do default actions on window, that's where global variables be (#6170)
- if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
// Don't re-trigger an onFOO event when we call its FOO() method
tmp = elem[ ontype ];
@@ -5035,12 +4380,7 @@ jQuery.event = {
// Prevent re-triggering of the same event, since we already bubbled it above
jQuery.event.triggered = type;
- try {
- elem[ type ]();
- } catch ( e ) {
- // IE<9 dies on focus/blur to hidden element (#1486,#12518)
- // only reproducible on winXP IE8 native, not IE9 in IE8 mode
- }
+ elem[ type ]();
jQuery.event.triggered = undefined;
if ( tmp ) {
@@ -5058,10 +4398,10 @@ jQuery.event = {
// Make a writable jQuery.Event from the native event object
event = jQuery.event.fix( event );
- var i, ret, handleObj, matched, j,
+ var i, j, ret, matched, handleObj,
handlerQueue = [],
- args = core_slice.call( arguments ),
- handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5084,8 +4424,8 @@ jQuery.event = {
j = 0;
while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
- // Triggered event must either 1) have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
event.handleObj = handleObj;
@@ -5113,7 +4453,7 @@ jQuery.event = {
},
handlers: function( event, handlers ) {
- var sel, handleObj, matches, i,
+ var i, matches, sel, handleObj,
handlerQueue = [],
delegateCount = handlers.delegateCount,
cur = event.target;
@@ -5123,13 +4463,10 @@ jQuery.event = {
// Avoid non-left-click bubbling in Firefox (#3861)
if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
- /* jshint eqeqeq: false */
- for ( ; cur != this; cur = cur.parentNode || this ) {
- /* jshint eqeqeq: true */
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
- // Don't check non-elements (#13208)
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+ if ( cur.disabled !== true || event.type !== "click" ) {
matches = [];
for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ];
@@ -5161,52 +4498,6 @@ jQuery.event = {
return handlerQueue;
},
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop, copy,
- type = event.type,
- originalEvent = event,
- fixHook = this.fixHooks[ type ];
-
- if ( !fixHook ) {
- this.fixHooks[ type ] = fixHook =
- rmouseEvent.test( type ) ? this.mouseHooks :
- rkeyEvent.test( type ) ? this.keyHooks :
- {};
- }
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = new jQuery.Event( originalEvent );
-
- i = copy.length;
- while ( i-- ) {
- prop = copy[ i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Support: IE<9
- // Fix target property (#1925)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Support: Chrome 23+, Safari?
- // Target should not be a text node (#504, #13143)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // Support: IE<9
- // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
- event.metaKey = !!event.metaKey;
-
- return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
- },
-
// Includes some event props shared by KeyEvent and MouseEvent
props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
@@ -5226,11 +4517,10 @@ jQuery.event = {
},
mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
filter: function( event, original ) {
- var body, eventDoc, doc,
- button = original.button,
- fromElement = original.fromElement;
+ var eventDoc, doc, body,
+ button = original.button;
// Calculate pageX/Y if missing and clientX/Y available
if ( event.pageX == null && original.clientX != null ) {
@@ -5242,11 +4532,6 @@ jQuery.event = {
event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
}
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
// Add which for click: 1 === left; 2 === middle; 3 === right
// Note: button is not normalized, so don't use it
if ( !event.which && button !== undefined ) {
@@ -5257,6 +4542,48 @@ jQuery.event = {
}
},
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
special: {
load: {
// Prevent triggered image.load events from bubbling to window.load
@@ -5266,14 +4593,8 @@ jQuery.event = {
// Fire native event if possible so blur/focus sequence is correct
trigger: function() {
if ( this !== safeActiveElement() && this.focus ) {
- try {
- this.focus();
- return false;
- } catch ( e ) {
- // Support: IE<9
- // If we error on focus to hidden element (#1486, #12518),
- // let .trigger() run the handlers
- }
+ this.focus();
+ return false;
}
},
delegateType: "focusin"
@@ -5290,7 +4611,7 @@ jQuery.event = {
click: {
// For checkbox, fire native event so checked state will be right
trigger: function() {
- if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
this.click();
return false;
}
@@ -5305,8 +4626,9 @@ jQuery.event = {
beforeunload: {
postDispatch: function( event ) {
- // Even when returnValue equals to undefined Firefox will still show alert
- if ( event.result !== undefined ) {
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
event.originalEvent.returnValue = event.result;
}
}
@@ -5337,26 +4659,11 @@ jQuery.event = {
}
};
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- var name = "on" + type;
-
- if ( elem.detachEvent ) {
-
- // #8545, #7054, preventing memory leaks for custom events in IE6-8
- // detachEvent needed property on element, by name of that event, to properly expose it to GC
- if ( typeof elem[ name ] === core_strundefined ) {
- elem[ name ] = null;
- }
-
- elem.detachEvent( name, handle );
- }
- };
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
jQuery.Event = function( src, props ) {
// Allow instantiation without the 'new' keyword
@@ -5371,8 +4678,12 @@ jQuery.Event = function( src, props ) {
// Events bubbling up the document may have been marked as prevented
// by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
// Event type
} else {
@@ -5402,46 +4713,40 @@ jQuery.Event.prototype = {
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue;
- if ( !e ) {
- return;
- }
- // If preventDefault exists, run it on the original event
- if ( e.preventDefault ) {
+ if ( e && e.preventDefault ) {
e.preventDefault();
-
- // Support: IE
- // Otherwise set the returnValue property of the original event to false
- } else {
- e.returnValue = false;
}
},
stopPropagation: function() {
var e = this.originalEvent;
this.isPropagationStopped = returnTrue;
- if ( !e ) {
- return;
- }
- // If stopPropagation exists, run it on the original event
- if ( e.stopPropagation ) {
+
+ if ( e && e.stopPropagation ) {
e.stopPropagation();
}
-
- // Support: IE
- // Set the cancelBubble property of the original event to true
- e.cancelBubble = true;
},
stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
this.stopPropagation();
}
};
// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
jQuery.each({
mouseenter: "mouseover",
- mouseleave: "mouseout"
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
}, function( orig, fix ) {
jQuery.event.special[ orig ] = {
delegateType: fix,
@@ -5465,131 +4770,36 @@ jQuery.each({
};
});
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !jQuery._data( form, "submitBubbles" ) ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- event._submit_bubble = true;
- });
- jQuery._data( form, "submitBubbles", true );
- }
- });
- // return undefined since we don't need an event listener
- },
-
- postDispatch: function( event ) {
- // If form was submitted by the user, bubble the event up the tree
- if ( event._submit_bubble ) {
- delete event._submit_bubble;
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- }
- },
-
- teardown: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
- jQuery.event.special.change = {
-
- setup: function() {
-
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- });
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._just_changed && !event.isTrigger ) {
- this._just_changed = false;
- }
- // Allow triggered, simulated change events (#11500)
- jQuery.event.simulate( "change", this, event, true );
- });
- }
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- });
- jQuery._data( elem, "changeBubbles", true );
- }
- });
- },
-
- handle: function( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown: function() {
- jQuery.event.remove( this, "._change" );
-
- return !rformElems.test( this.nodeName );
- }
- };
-}
-
+// Support: Firefox, Chrome, Safari
// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
+if ( !support.focusinBubbles ) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function( event ) {
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
};
jQuery.event.special[ fix ] = {
setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
}
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
},
teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
}
}
};
@@ -5599,7 +4809,7 @@ if ( !jQuery.support.focusinBubbles ) {
jQuery.fn.extend({
on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var type, origFn;
+ var origFn, type;
// Types can be a map of types/handlers
if ( typeof types === "object" ) {
@@ -5698,348 +4908,309 @@ jQuery.fn.extend({
}
}
});
-var isSimple = /^.[^:#\[\.,]*$/,
- rparentsprev = /^(?:parents|prev(?:Until|All))/,
- rneedsContext = jQuery.expr.match.needsContext,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-jQuery.fn.extend({
- find: function( selector ) {
- var i,
- ret = [],
- self = this,
- len = self.length;
- if ( typeof selector !== "string" ) {
- return this.pushStack( jQuery( selector ).filter(function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- }) );
- }
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
- for ( i = 0; i < len; i++ ) {
- jQuery.find( selector, self[ i ], ret );
- }
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
- // Needed because $( selector, context ) becomes $( context ).find( selector )
- ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
- ret.selector = this.selector ? this.selector + " " + selector : selector;
- return ret;
- },
+ // Support: IE9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
- has: function( target ) {
- var i,
- targets = jQuery( target, this ),
- len = targets.length;
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
- return this.filter(function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
+ _default: [ 0, "", "" ]
+ };
- not: function( selector ) {
- return this.pushStack( winnow(this, selector || [], true) );
- },
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector || [], false) );
- },
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
- is: function( selector ) {
- return !!winnow(
- this,
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- typeof selector === "string" && rneedsContext.test( selector ) ?
- jQuery( selector ) :
- selector || [],
- false
- ).length;
- },
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- ret = [],
- pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
- for ( ; i < l; i++ ) {
- for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
- // Always skip document fragments
- if ( cur.nodeType < 11 && (pos ?
- pos.index(cur) > -1 :
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
- // Don't pass non-elements to Sizzle
- cur.nodeType === 1 &&
- jQuery.find.matchesSelector(cur, selectors)) ) {
+ return elem;
+}
- cur = ret.push( cur );
- break;
- }
- }
- }
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
- return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
- },
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
- }
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
- return this.pushStack( jQuery.unique(all) );
- },
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter(selector)
- );
+ data_user.set( dest, udataCur );
}
-});
+}
-function sibling( cur, dir ) {
- do {
- cur = cur[ dir ];
- } while ( cur && cur.nodeType !== 1 );
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
- return cur;
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
}
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.merge( [], elem.childNodes );
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
}
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until );
+}
- if ( name.slice( -5 ) !== "Until" ) {
- selector = until;
- }
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
- if ( this.length > 1 ) {
- // Remove duplicates
- if ( !guaranteedUnique[ name ] ) {
- ret = jQuery.unique( ret );
- }
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
- // Reverse order for parents* and prev-derivatives
- if ( rparentsprev.test( name ) ) {
- ret = ret.reverse();
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
}
}
- return this.pushStack( ret );
- };
-});
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
-jQuery.extend({
- filter: function( expr, elems, not ) {
- var elem = elems[ 0 ];
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
- if ( not ) {
- expr = ":not(" + expr + ")";
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
}
- return elems.length === 1 && elem.nodeType === 1 ?
- jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
- jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- }));
+ // Return the cloned set
+ return clone;
},
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
- sibling: function( n, elem ) {
- var r = [];
+ if ( elem || elem === 0 ) {
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
- return r;
- }
-});
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep( elements, function( elem, i ) {
- /* jshint -W018 */
- return !!qualifier.call( elem, i, elem ) !== not;
- });
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
- }
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
- if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function( elem ) {
- return ( elem === qualifier ) !== not;
- });
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
- }
+ // Support: QtWebKit, PhantomJS
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
- if ( typeof qualifier === "string" ) {
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, elements, not );
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
}
- qualifier = jQuery.filter( qualifier, elements );
- }
+ // Remove wrapper from fragment
+ fragment.textContent = "";
- return jQuery.grep( elements, function( elem ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
- });
-}
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
- "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
- rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
- rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
- rtagName = /<([\w:]+)/,
- rtbody = /<tbody/i,
- rhtml = /<|&#?\w+;/,
- rnoInnerhtml = /<(?:script|style|link)/i,
- manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /^$|\/(?:java|ecma)script/i,
- rscriptTypeMasked = /^true\/(.*)/,
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
- // We have to close these tags to support XHTML (#13200)
- wrapMap = {
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
- legend: [ 1, "<fieldset>", "</fieldset>" ],
- area: [ 1, "<map>", "</map>" ],
- param: [ 1, "<object>", "</object>" ],
- thead: [ 1, "<table>", "</table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+ contains = jQuery.contains( elem.ownerDocument, elem );
- // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
- // unless wrapped in a div with non-breaking characters in front of it.
- _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
},
- safeFragment = createSafeFragment( document ),
- fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
jQuery.fn.extend({
text: function( value ) {
- return jQuery.access( this, function( value ) {
+ return access( this, function( value ) {
return value === undefined ?
jQuery.text( this ) :
- this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
}, null, value, arguments.length );
},
@@ -6077,14 +5248,12 @@ jQuery.fn.extend({
});
},
- // keepData is for internal use only--do not document
- remove: function( selector, keepData ) {
+ remove: function( selector, keepData /* Internal Use Only */ ) {
var elem,
elems = selector ? jQuery.filter( selector, this ) : this,
i = 0;
for ( ; (elem = elems[i]) != null; i++ ) {
-
if ( !keepData && elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem ) );
}
@@ -6105,20 +5274,13 @@ jQuery.fn.extend({
i = 0;
for ( ; (elem = this[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- }
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
- // If this is a select, ensure that it displays empty (#12336)
- // Support: IE<9
- if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
- elem.options.length = 0;
+ // Remove any remaining nodes
+ elem.textContent = "";
}
}
@@ -6129,35 +5291,32 @@ jQuery.fn.extend({
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
- return this.map( function () {
+ return this.map(function() {
return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
});
},
html: function( value ) {
- return jQuery.access( this, function( value ) {
- var elem = this[0] || {},
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
i = 0,
l = this.length;
- if ( value === undefined ) {
- return elem.nodeType === 1 ?
- elem.innerHTML.replace( rinlinejQuery, "" ) :
- undefined;
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
}
// See if we can take a shortcut and just use innerHTML
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
- ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
- !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
value = value.replace( rxhtmlTag, "<$1></$2>" );
try {
- for (; i < l; i++ ) {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
// Remove element nodes and prevent memory leaks
- elem = this[i] || {};
if ( elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem, false ) );
elem.innerHTML = value;
@@ -6167,7 +5326,7 @@ jQuery.fn.extend({
elem = 0;
// If using innerHTML throws an exception, use the fallback method
- } catch(e) {}
+ } catch( e ) {}
}
if ( elem ) {
@@ -6177,64 +5336,55 @@ jQuery.fn.extend({
},
replaceWith: function() {
- var
- // Snapshot the DOM in case .domManip sweeps something relevant into its fragment
- args = jQuery.map( this, function( elem ) {
- return [ elem.nextSibling, elem.parentNode ];
- }),
- i = 0;
+ var arg = arguments[ 0 ];
// Make the changes, replacing each context element with the new content
this.domManip( arguments, function( elem ) {
- var next = args[ i++ ],
- parent = args[ i++ ];
+ arg = this.parentNode;
- if ( parent ) {
- // Don't use the snapshot next if it has moved (#13810)
- if ( next && next.parentNode !== parent ) {
- next = this.nextSibling;
- }
- jQuery( this ).remove();
- parent.insertBefore( elem, next );
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
}
- // Allow new content to include elements from the context set
- }, true );
+ });
// Force removal if there was no new content (e.g., from empty arguments)
- return i ? this : this.remove();
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
},
detach: function( selector ) {
return this.remove( selector, true );
},
- domManip: function( args, callback, allowIntersection ) {
+ domManip: function( args, callback ) {
// Flatten any nested arrays
- args = core_concat.apply( [], args );
+ args = concat.apply( [], args );
- var first, node, hasScripts,
- scripts, doc, fragment,
+ var fragment, first, scripts, hasScripts, node, doc,
i = 0,
l = this.length,
set = this,
iNoClone = l - 1,
- value = args[0],
+ value = args[ 0 ],
isFunction = jQuery.isFunction( value );
// We can't cloneNode fragments that contain checked, in WebKit
- if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
return this.each(function( index ) {
var self = set.eq( index );
if ( isFunction ) {
- args[0] = value.call( this, index, self.html() );
+ args[ 0 ] = value.call( this, index, self.html() );
}
- self.domManip( args, callback, allowIntersection );
+ self.domManip( args, callback );
});
}
if ( l ) {
- fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
first = fragment.firstChild;
if ( fragment.childNodes.length === 1 ) {
@@ -6255,11 +5405,13 @@ jQuery.fn.extend({
// Keep references to cloned scripts for later restoration
if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
jQuery.merge( scripts, getAll( node, "script" ) );
}
}
- callback.call( this[i], node, i );
+ callback.call( this[ i ], node, i );
}
if ( hasScripts ) {
@@ -6272,20 +5424,19 @@ jQuery.fn.extend({
for ( i = 0; i < hasScripts; i++ ) {
node = scripts[ i ];
if ( rscriptType.test( node.type || "" ) &&
- !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
if ( node.src ) {
- // Hope ajax is available...
- jQuery._evalUrl( node.src );
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
} else {
- jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
}
}
}
}
-
- // Fix #11809: Avoid leaking memory
- fragment = first = null;
}
}
@@ -6293,136 +5444,6 @@ jQuery.fn.extend({
}
});
-// Support: IE<8
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
- return jQuery.nodeName( elem, "table" ) &&
- jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
-
- elem.getElementsByTagName("tbody")[0] ||
- elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
- elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
- elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
- return elem;
-}
-function restoreScript( elem ) {
- var match = rscriptTypeMasked.exec( elem.type );
- if ( match ) {
- elem.type = match[1];
- } else {
- elem.removeAttribute("type");
- }
- return elem;
-}
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
- var elem,
- i = 0;
- for ( ; (elem = elems[i]) != null; i++ ) {
- jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
- }
-}
-
-function cloneCopyEvent( src, dest ) {
-
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
-}
-
-function fixCloneNodeIssues( src, dest ) {
- var nodeName, e, data;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- // IE6-8 copies events bound via attachEvent when using cloneNode.
- if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
- data = jQuery._data( dest );
-
- for ( e in data.events ) {
- jQuery.removeEvent( dest, e, data.handle );
- }
-
- // Event data gets referenced instead of copied if the expando gets copied too
- dest.removeAttribute( jQuery.expando );
- }
-
- // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
- if ( nodeName === "script" && dest.text !== src.text ) {
- disableScript( dest ).text = src.text;
- restoreScript( dest );
-
- // IE6-10 improperly clones children of object elements using classid.
- // IE10 throws NoModificationAllowedError if parent is null, #12132.
- } else if ( nodeName === "object" ) {
- if ( dest.parentNode ) {
- dest.outerHTML = src.outerHTML;
- }
-
- // This path appears unavoidable for IE9. When cloning an object
- // element in IE9, the outerHTML strategy above is not sufficient.
- // If the src has innerHTML and the destination does not,
- // copy the src.innerHTML into the dest.innerHTML. #10324
- if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
- dest.innerHTML = src.innerHTML;
- }
-
- } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
-
- dest.defaultChecked = dest.checked = src.checked;
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.defaultSelected = dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-}
-
jQuery.each({
appendTo: "append",
prependTo: "prepend",
@@ -6432,397 +5453,305 @@ jQuery.each({
}, function( name, original ) {
jQuery.fn[ name ] = function( selector ) {
var elems,
- i = 0,
ret = [],
insert = jQuery( selector ),
- last = insert.length - 1;
+ last = insert.length - 1,
+ i = 0;
for ( ; i <= last; i++ ) {
- elems = i === last ? this : this.clone(true);
- jQuery( insert[i] )[ original ]( elems );
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
- // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
- core_push.apply( ret, elems.get() );
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
}
return this.pushStack( ret );
};
});
-function getAll( context, tag ) {
- var elems, elem,
- i = 0,
- found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
- typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
- undefined;
-
- if ( !found ) {
- for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
- if ( !tag || jQuery.nodeName( elem, tag ) ) {
- found.push( elem );
- } else {
- jQuery.merge( found, getAll( elem, tag ) );
- }
- }
- }
-
- return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
- jQuery.merge( [ context ], found ) :
- found;
-}
-
-// Used in buildFragment, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
- if ( manipulation_rcheckableType.test( elem.type ) ) {
- elem.defaultChecked = elem.checked;
- }
-}
-
-jQuery.extend({
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var destElements, node, clone, i, srcElements,
- inPage = jQuery.contains( elem.ownerDocument, elem );
- if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
- clone = elem.cloneNode( true );
+var iframe,
+ elemdisplay = {};
- // IE<=8 does not properly clone detached, unknown element nodes
- } else {
- fragmentDiv.innerHTML = elem.outerHTML;
- fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
- }
-
- if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
- (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-
- // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
- destElements = getAll( clone );
- srcElements = getAll( elem );
-
- // Fix all IE cloning issues
- for ( i = 0; (node = srcElements[i]) != null; ++i ) {
- // Ensure that the destination node is not null; Fixes #9587
- if ( destElements[i] ) {
- fixCloneNodeIssues( node, destElements[i] );
- }
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- if ( deepDataAndEvents ) {
- srcElements = srcElements || getAll( elem );
- destElements = destElements || getAll( clone );
-
- for ( i = 0; (node = srcElements[i]) != null; i++ ) {
- cloneCopyEvent( node, destElements[i] );
- }
- } else {
- cloneCopyEvent( elem, clone );
- }
- }
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
- // Preserve script evaluation history
- destElements = getAll( clone, "script" );
- if ( destElements.length > 0 ) {
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
- }
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
- destElements = srcElements = node = null;
+ // Use of this method is a temporary fix (more like optimization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
- // Return the cloned set
- return clone;
- },
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
- buildFragment: function( elems, context, scripts, selection ) {
- var j, elem, contains,
- tmp, tag, tbody, wrap,
- l = elems.length,
+ return display;
+}
- // Ensure a safe fragment
- safe = createSafeFragment( context ),
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
- nodes = [],
- i = 0;
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
- for ( ; i < l; i++ ) {
- elem = elems[ i ];
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
- if ( elem || elem === 0 ) {
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
- // Add nodes directly
- if ( jQuery.type( elem ) === "object" ) {
- jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
- // Convert non-html into a text node
- } else if ( !rhtml.test( elem ) ) {
- nodes.push( context.createTextNode( elem ) );
+ // Support: IE
+ doc.write();
+ doc.close();
- // Convert html into DOM nodes
- } else {
- tmp = tmp || safe.appendChild( context.createElement("div") );
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
- // Deserialize a standard representation
- tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
- tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+ return display;
+}
+var rmargin = (/^margin/);
- // Descend through wrappers to the right content
- j = wrap[0];
- while ( j-- ) {
- tmp = tmp.lastChild;
- }
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
- // Manually add leading whitespace removed by IE
- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
- }
+var getStyles = function( elem ) {
+ // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ if ( elem.ownerDocument.defaultView.opener ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ }
- // Remove IE's autoinserted <tbody> from table fragments
- if ( !jQuery.support.tbody ) {
+ return window.getComputedStyle( elem, null );
+ };
- // String was a <table>, *may* have spurious <tbody>
- elem = tag === "table" && !rtbody.test( elem ) ?
- tmp.firstChild :
- // String was a bare <thead> or <tfoot>
- wrap[1] === "<table>" && !rtbody.test( elem ) ?
- tmp :
- 0;
- j = elem && elem.childNodes.length;
- while ( j-- ) {
- if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
- elem.removeChild( tbody );
- }
- }
- }
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
- jQuery.merge( nodes, tmp.childNodes );
+ computed = computed || getStyles( elem );
- // Fix #12392 for WebKit and IE > 9
- tmp.textContent = "";
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') (#12537)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
- // Fix #12392 for oldIE
- while ( tmp.firstChild ) {
- tmp.removeChild( tmp.firstChild );
- }
+ if ( computed ) {
- // Remember the top-level container for proper cleanup
- tmp = safe.lastChild;
- }
- }
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
}
- // Fix #11356: Clear elements from fragment
- if ( tmp ) {
- safe.removeChild( tmp );
- }
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
- // Reset defaultChecked for any radios and checkboxes
- // about to be appended to the DOM in IE 6/7 (#8060)
- if ( !jQuery.support.appendChecked ) {
- jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
- }
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
- i = 0;
- while ( (elem = nodes[ i++ ]) ) {
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
- // #4087 - If origin and destination elements are the same, and this is
- // that element, do not do anything
- if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
- continue;
- }
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
- contains = jQuery.contains( elem.ownerDocument, elem );
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
- // Append to fragment
- tmp = getAll( safe.appendChild( elem ), "script" );
- // Preserve script evaluation history
- if ( contains ) {
- setGlobalEval( tmp );
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
}
- // Capture executables
- if ( scripts ) {
- j = 0;
- while ( (elem = tmp[ j++ ]) ) {
- if ( rscriptType.test( elem.type || "" ) ) {
- scripts.push( elem );
- }
- }
- }
+ // Hook needed; redefine it so that the support test is not executed again.
+ return (this.get = hookFn).apply( this, arguments );
}
+ };
+}
- tmp = null;
-
- return safe;
- },
-
- cleanData: function( elems, /* internal */ acceptData ) {
- var elem, type, id, data,
- i = 0,
- internalKey = jQuery.expando,
- cache = jQuery.cache,
- deleteExpando = jQuery.support.deleteExpando,
- special = jQuery.event.special;
-
- for ( ; (elem = elems[i]) != null; i++ ) {
-
- if ( acceptData || jQuery.acceptData( elem ) ) {
-
- id = elem[ internalKey ];
- data = id && cache[ id ];
- if ( data ) {
- if ( data.events ) {
- for ( type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
- }
+ if ( !div.style ) {
+ return;
+ }
- // Remove cache only if it was not already removed by jQuery.event.remove
- if ( cache[ id ] ) {
+ // Support: IE9-11+
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
- delete cache[ id ];
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( deleteExpando ) {
- delete elem[ internalKey ];
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
- } else if ( typeof elem.removeAttribute !== core_strundefined ) {
- elem.removeAttribute( internalKey );
+ docElem.removeChild( container );
+ }
- } else {
- elem[ internalKey ] = null;
- }
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
- core_deletedIds.push( id );
- }
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
}
- }
- }
- },
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+ div.removeChild( marginDiv );
- _evalUrl: function( url ) {
- return jQuery.ajax({
- url: url,
- type: "GET",
- dataType: "script",
- async: false,
- global: false,
- "throws": true
+ return ret;
+ }
});
}
-});
-jQuery.fn.extend({
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
+})();
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
- if ( contents.length ) {
- contents.wrapAll( html );
+ ret = callback.apply( elem, args || [] );
- } else {
- self.append( html );
- }
- });
- },
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
+ return ret;
+};
- return this.each(function(i) {
- jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
- });
- },
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- }
-});
-var iframe, getStyles, curCSS,
- ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity\s*=\s*([^)]*)/,
- rposition = /^(top|right|bottom|left)$/,
- // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
- // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+var
+ // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
- rmargin = /^margin/,
- rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
- rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
- rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
- elemdisplay = { BODY: "block" },
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
- letterSpacing: 0,
- fontWeight: 400
+ letterSpacing: "0",
+ fontWeight: "400"
},
- cssExpand = [ "Top", "Right", "Bottom", "Left" ],
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
-// return a css property mapped to a potentially vendor prefixed property
+// Return a css property mapped to a potentially vendor prefixed property
function vendorPropName( style, name ) {
- // shortcut for names that are not vendor prefixed
+ // Shortcut for names that are not vendor prefixed
if ( name in style ) {
return name;
}
- // check for vendor prefixed names
- var capName = name.charAt(0).toUpperCase() + name.slice(1),
+ // Check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
origName = name,
i = cssPrefixes.length;
@@ -6836,11 +5765,95 @@ function vendorPropName( style, name ) {
return origName;
}
-function isHidden( elem, el ) {
- // isHidden might be called from jQuery#filter function;
- // in that case, element will be second argument
- elem = el || elem;
- return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // Both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // At this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // At this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // At this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // Some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // Use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
}
function showHide( elements, show ) {
@@ -6855,7 +5868,7 @@ function showHide( elements, show ) {
continue;
}
- values[ index ] = jQuery._data( elem, "olddisplay" );
+ values[ index ] = data_priv.get( elem, "olddisplay" );
display = elem.style.display;
if ( show ) {
// Reset the inline display of this element to learn if it is
@@ -6868,16 +5881,13 @@ function showHide( elements, show ) {
// in a stylesheet to whatever the default browser style is
// for such an element
if ( elem.style.display === "" && isHidden( elem ) ) {
- values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
}
} else {
+ hidden = isHidden( elem );
- if ( !values[ index ] ) {
- hidden = isHidden( elem );
-
- if ( display && display !== "none" || !hidden ) {
- jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
- }
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
}
}
}
@@ -6897,57 +5907,15 @@ function showHide( elements, show ) {
return elements;
}
-jQuery.fn.extend({
- css: function( name, value ) {
- return jQuery.access( this, function( elem, name, value ) {
- var len, styles,
- map = {},
- i = 0;
-
- if ( jQuery.isArray( name ) ) {
- styles = getStyles( elem );
- len = name.length;
-
- for ( ; i < len; i++ ) {
- map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
- }
-
- return map;
- }
-
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
- },
- show: function() {
- return showHide( this, true );
- },
- hide: function() {
- return showHide( this );
- },
- toggle: function( state ) {
- if ( typeof state === "boolean" ) {
- return state ? this.show() : this.hide();
- }
-
- return this.each(function() {
- if ( isHidden( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- });
- }
-});
-
jQuery.extend({
+
// Add in style property hooks for overriding the default
// behavior of getting and setting a style property
cssHooks: {
opacity: {
get: function( elem, computed ) {
if ( computed ) {
+
// We should always get a number back from opacity
var ret = curCSS( elem, "opacity" );
return ret === "" ? "1" : ret;
@@ -6960,6 +5928,8 @@ jQuery.extend({
cssNumber: {
"columnCount": true,
"fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
"fontWeight": true,
"lineHeight": true,
"opacity": true,
@@ -6973,12 +5943,12 @@ jQuery.extend({
// Add in properties whose names you wish to fix before
// setting or getting the value
cssProps: {
- // normalize float css property
- "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+ "float": "cssFloat"
},
// Get and set the style property on a DOM Node
style: function( elem, name, value, extra ) {
+
// Don't set styles on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
return;
@@ -6991,45 +5961,39 @@ jQuery.extend({
name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
- // gets hook for the prefixed version
- // followed by the unprefixed version
+ // Gets hook for the prefixed version, then unprefixed version
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
// Check if we're setting a value
if ( value !== undefined ) {
type = typeof value;
- // convert relative number strings (+= or -=) to relative numbers. #7345
+ // Convert "+=" or "-=" to relative numbers (#7345)
if ( type === "string" && (ret = rrelNum.exec( value )) ) {
value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
// Fixes bug #9237
type = "number";
}
- // Make sure that NaN and null values aren't set. See: #7116
- if ( value == null || type === "number" && isNaN( value ) ) {
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
return;
}
- // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ // If a number, add 'px' to the (except for certain CSS properties)
if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
value += "px";
}
- // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
- // but it would mean to define eight (for every problematic property) identical functions
- if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+ // Support: IE9-11+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
style[ name ] = "inherit";
}
// If a hook was provided, use that value, otherwise just set the specified value
if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-
- // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
- // Fixes bug #5509
- try {
- style[ name ] = value;
- } catch(e) {}
+ style[ name ] = value;
}
} else {
@@ -7044,14 +6008,13 @@ jQuery.extend({
},
css: function( elem, name, extra, styles ) {
- var num, val, hooks,
+ var val, num, hooks,
origName = jQuery.camelCase( name );
// Make sure that we're working with the right name
name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
- // gets hook for the prefixed version
- // followed by the unprefixed version
+ // Try prefixed name followed by the unprefixed name
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
// If a hook was provided get the computed value from there
@@ -7064,12 +6027,12 @@ jQuery.extend({
val = curCSS( elem, name, styles );
}
- //convert "normal" to computed value
+ // Convert "normal" to computed value
if ( val === "normal" && name in cssNormalTransform ) {
val = cssNormalTransform[ name ];
}
- // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ // Make numeric if forced or a qualifier was provided and val looks numeric
if ( extra === "" || extra ) {
num = parseFloat( val );
return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
@@ -7078,479 +6041,1441 @@ jQuery.extend({
}
});
-// NOTE: we've included the "window" in window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
- getStyles = function( elem ) {
- return window.getComputedStyle( elem, null );
- };
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
- curCSS = function( elem, name, _computed ) {
- var width, minWidth, maxWidth,
- computed = _computed || getStyles( elem ),
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
- // getPropertyValue is only needed for .css('filter') in IE9, see #12537
- ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
- style = elem.style;
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
if ( computed ) {
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
- ret = jQuery.style( elem, name );
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
}
- // A tribute to the "awesome hack by Dean Edwards"
- // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
- // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
- // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
- if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
- // Remember the original values
- width = style.width;
- minWidth = style.minWidth;
- maxWidth = style.maxWidth;
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
- // Put in the new values to get a computed value out
- style.minWidth = style.maxWidth = style.width = ret;
- ret = computed.width;
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
- // Revert the changed values
- style.width = width;
- style.minWidth = minWidth;
- style.maxWidth = maxWidth;
+ return map;
}
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
}
- return ret;
- };
-} else if ( document.documentElement.currentStyle ) {
- getStyles = function( elem ) {
- return elem.currentStyle;
- };
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
- curCSS = function( elem, name, _computed ) {
- var left, rs, rsLeft,
- computed = _computed || getStyles( elem ),
- ret = computed ? computed[ name ] : undefined,
- style = elem.style;
- // Avoid setting ret to empty string here
- // so we don't default to auto
- if ( ret == null && style && style[ name ] ) {
- ret = style[ name ];
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
}
+ this.now = ( this.end - this.start ) * eased + this.start;
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- // but not position css attributes, as those are proportional to the parent element instead
- // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
- if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
- // Remember the original values
- left = style.left;
- rs = elem.runtimeStyle;
- rsLeft = rs && rs.left;
+Tween.prototype.init.prototype = Tween.prototype;
- // Put in the new values to get a computed value out
- if ( rsLeft ) {
- rs.left = elem.currentStyle.left;
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
}
- style.left = name === "fontSize" ? "1em" : ret;
- ret = style.pixelLeft + "px";
- // Revert the changed values
- style.left = left;
- if ( rsLeft ) {
- rs.left = rsLeft;
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
}
}
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur(),
+ // break the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
- return ret === "" ? "auto" : ret;
+ return tween;
+ } ]
};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
}
-function setPositiveNumber( elem, value, subtract ) {
- var matches = rnumsplit.exec( value );
- return matches ?
- // Guard against undefined "subtract", e.g., when used as in cssHooks
- Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
- value;
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
}
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
- var i = extra === ( isBorderBox ? "border" : "content" ) ?
- // If we already have the right measurement, avoid augmentation
- 4 :
- // Otherwise initialize for horizontal or vertical properties
- name === "width" ? 1 : 0,
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
- val = 0;
+ // We're done with this property
+ return tween;
+ }
+ }
+}
- for ( ; i < 4; i += 2 ) {
- // both box models exclude margin, so add it if we want it
- if ( extra === "margin" ) {
- val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // Handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
}
+ hooks.unqueued++;
- if ( isBorderBox ) {
- // border-box includes padding, so remove it if we want content
- if ( extra === "content" ) {
- val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ anim.always(function() {
+ // Ensure the complete handler is called before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // Height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
}
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
- // at this point, extra isn't border nor margin, so remove border
- if ( extra !== "margin" ) {
- val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
}
} else {
- // at this point, extra isn't content, so add padding
- val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
- // at this point, extra isn't content nor padding, so add border
- if ( extra !== "padding" ) {
- val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ // Store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
}
}
- }
- return val;
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
}
-function getWidthOrHeight( elem, name, extra ) {
-
- // Start with offset property, which is equivalent to the border-box value
- var valueIsBorderBox = true,
- val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- styles = getStyles( elem ),
- isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
- // some non-html elements return undefined for offsetWidth, so check for null/undefined
- // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
- // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
- if ( val <= 0 || val == null ) {
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name, styles );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ];
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
}
- // Computed unit is not pixels. Stop here and return.
- if ( rnumnonpx.test(val) ) {
- return val;
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
}
- // we need the check for style in case a browser which returns unreliable values
- // for getComputedStyle silently falls back to the reliable elem.style
- valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
}
-
- // use the active box-sizing model to add/subtract irrelevant styles
- return ( val +
- augmentWidthOrHeight(
- elem,
- name,
- extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox,
- styles
- )
- ) + "px";
}
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
- var doc = document,
- display = elemdisplay[ nodeName ];
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // Support: Android 2.3
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
- if ( !display ) {
- display = actualDisplay( nodeName, doc );
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
- // If the simple way fails, read from inside an iframe
- if ( display === "none" || !display ) {
- // Use the already-created iframe if possible
- iframe = ( iframe ||
- jQuery("<iframe frameborder='0' width='0' height='0'/>")
- .css( "cssText", "display:block !important" )
- ).appendTo( doc.documentElement );
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
- // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
- doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
- doc.write("<!doctype html><html><body>");
- doc.close();
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
- display = actualDisplay( nodeName, doc );
- iframe.detach();
+ // Resolve when we played the last frame; otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
}
+ }
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
}
- return display;
-}
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
-// Called ONLY from within css_defaultDisplay
-function actualDisplay( name, doc ) {
- var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
- display = jQuery.css( elem[0], "display" );
- elem.remove();
- return display;
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
}
-jQuery.each([ "height", "width" ], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
- // certain elements can have dimension info if we invisibly show them
- // however, it must have a current display style that would benefit from this
- return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
- jQuery.swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, name, extra );
- }) :
- getWidthOrHeight( elem, name, extra );
- }
- },
+jQuery.Animation = jQuery.extend( Animation, {
- set: function( elem, value, extra ) {
- var styles = extra && getStyles( elem );
- return setPositiveNumber( elem, value, extra ?
- augmentWidthOrHeight(
- elem,
- name,
- extra,
- jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- styles
- ) : 0
- );
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
}
- };
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
});
-if ( !jQuery.support.opacity ) {
- jQuery.cssHooks.opacity = {
- get: function( elem, computed ) {
- // IE uses filters for opacity
- return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
- ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
- computed ? "1" : "";
- },
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
- set: function( elem, value ) {
- var style = elem.style,
- currentStyle = elem.currentStyle,
- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
- filter = currentStyle && currentStyle.filter || style.filter || "";
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- style.zoom = 1;
+ // Show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
- // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
- // if value === "", then remove inline opacity #12685
- if ( ( value >= 1 || value === "" ) &&
- jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
- style.removeAttribute ) {
+ // Animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
- // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
- // if "filter:" is present at all, clearType is disabled, we want to avoid this
- // style.removeAttribute is IE Only, but so apparently is this code path...
- style.removeAttribute( "filter" );
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
- // if there is no filter style applied in a css rule or unset inline opacity, we are done
- if ( value === "" || currentStyle && !currentStyle.filter ) {
- return;
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
}
}
- // otherwise, set new filter values
- style.filter = ralpha.test( filter ) ?
- filter.replace( ralpha, opacity ) :
- filter + " " + opacity;
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
}
- };
-}
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
- if ( !jQuery.support.reliableMarginRight ) {
- jQuery.cssHooks.marginRight = {
- get: function( elem, computed ) {
- if ( computed ) {
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // Work around by temporarily setting element display to inline-block
- return jQuery.swap( elem, { "display": "inline-block" },
- curCSS, [ elem, "marginRight" ] );
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // Look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
}
}
- };
- }
- // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
- // getComputedStyle returns percent when specified for top/left/bottom/right
- // rather than make the css module depend on the offset module, we just check for it here
- if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
- jQuery.each( [ "top", "left" ], function( i, prop ) {
- jQuery.cssHooks[ prop ] = {
- get: function( elem, computed ) {
- if ( computed ) {
- computed = curCSS( elem, prop );
- // if curCSS returns percentage, fallback to offset
- return rnumnonpx.test( computed ) ?
- jQuery( elem ).position()[ prop ] + "px" :
- computed;
- }
+ // Look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
}
- };
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
});
}
-
});
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.hidden = function( elem ) {
- // Support: Opera <= 12.12
- // Opera reports offsetWidths and offsetHeights less than zero on some elements
- return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
- (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
};
+});
- jQuery.expr.filters.visible = function( elem ) {
- return !jQuery.expr.filters.hidden( elem );
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
};
-}
+});
-// These hooks are used by animate to expand properties
-jQuery.each({
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i = 0,
- expanded = {},
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
- // assumes a single number if not a string
- parts = typeof value === "string" ? value.split(" ") : [ value ];
+ fxNow = jQuery.now();
- for ( ; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS<=5.1, Android<=4.2+
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE<=11+
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: Android<=2.3
+ // Options inside disabled selects are incorrectly marked as disabled
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<=11+
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
}
- return expanded;
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
}
- };
+ },
- if ( !rmargin.test( prefix ) ) {
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
}
});
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
jQuery.fn.extend({
- serialize: function() {
- return jQuery.param( this.serializeArray() );
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
},
- serializeArray: function() {
- return this.map(function(){
- // Can add propHook for "elements" to filter or add form elements
- var elements = jQuery.prop( this, "elements" );
- return elements ? jQuery.makeArray( elements ) : this;
- })
- .filter(function(){
- var type = this.type;
- // Use .is(":disabled") so that fieldset[disabled] works
- return this.name && !jQuery( this ).is( ":disabled" ) &&
- rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
- ( this.checked || !manipulation_rcheckableType.test( type ) );
- })
- .map(function( i, elem ){
- var val = jQuery( this ).val();
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val ){
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }).get();
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
}
});
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
- var prefix,
- s = [],
- add = function( key, value ) {
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
}
+});
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // Toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
});
+ },
- } else {
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
}
+
+ return false;
}
+});
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
-};
-function buildParams( prefix, obj, traditional, add ) {
- var name;
- if ( jQuery.isArray( obj ) ) {
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
- // Treat each array item as a scalar.
- add( prefix, v );
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // Handle most common string cases
+ ret.replace(rreturn, "") :
+ // Handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
} else {
- // Item is non-scalar (array or object), encode its numeric index.
- buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
}
});
+ }
+});
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
- // Serialize object item.
- for ( name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
}
+ }
+});
- } else {
- // Serialize scalar item.
- add( prefix, obj );
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
}
-}
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
@@ -7583,24 +7508,52 @@ jQuery.fn.extend({
return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
}
});
-var
- // Document location
- ajaxLocParts,
- ajaxLocation,
- ajax_nonce = jQuery.now(),
- ajax_rquery = /\?/,
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
rhash = /#.*$/,
rts = /([?&])_=[^&]*/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
// #7653, #8125, #8152: local protocol detection
rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
- rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
- // Keep a copy of the old load method
- _load = jQuery.fn.load,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
/* Prefilters
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
@@ -7621,22 +7574,13 @@ var
transports = {},
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = "*/".concat("*");
+ allTypes = "*/".concat( "*" ),
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
- ajaxLocation = location.href;
-} catch( e ) {
- // Use the href attribute of an A element
- // since IE will modify it given document.location
- ajaxLocation = document.createElement( "a" );
- ajaxLocation.href = "";
- ajaxLocation = ajaxLocation.href;
-}
+ // Document location
+ ajaxLocation = window.location.href,
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+ // Segment location into parts
+ ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -7651,7 +7595,7 @@ function addToPrefiltersOrTransports( structure ) {
var dataType,
i = 0,
- dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
if ( jQuery.isFunction( func ) ) {
// For each dataType in the dataTypeExpression
@@ -7681,7 +7625,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
inspected[ dataType ] = true;
jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
- if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
options.dataTypes.unshift( dataTypeOrTransport );
inspect( dataTypeOrTransport );
return false;
@@ -7699,7 +7643,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
- var deep, key,
+ var key, deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
for ( key in src ) {
@@ -7714,69 +7658,156 @@ function ajaxExtend( target, src ) {
return target;
}
-jQuery.fn.load = function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
}
- var selector, response, type,
- self = this,
- off = url.indexOf(" ");
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
- if ( off >= 0 ) {
- selector = url.slice( off, url.length );
- url = url.slice( 0, off );
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
}
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
- // We assume that it's the callback
- callback = params;
- params = undefined;
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
- // Otherwise, build a param string
- } else if ( params && typeof params === "object" ) {
- type = "POST";
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
}
- // If we have elements to modify, make the request
- if ( self.length > 0 ) {
- jQuery.ajax({
- url: url,
+ current = dataTypes.shift();
- // if "type" variable is undefined, then "GET" method will be used
- type: type,
- dataType: "html",
- data: params
- }).done(function( responseText ) {
+ // Convert to each sequential dataType
+ while ( current ) {
- // Save response for use in complete callback
- response = arguments;
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
- self.html( selector ?
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
- // If a selector was specified, locate the right elements in a dummy div
- // Exclude scripts to avoid IE 'Permission Denied' errors
- jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+ prev = current;
+ current = dataTypes.shift();
- // Otherwise use the full result
- responseText );
+ if ( current ) {
- }).complete( callback && function( jqXHR, status ) {
- self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
- });
- }
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
- return this;
-};
+ current = prev;
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
- jQuery.fn[ type ] = function( fn ){
- return this.on( type, fn );
- };
-});
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
jQuery.extend({
@@ -7882,23 +7913,20 @@ jQuery.extend({
// Force options to be an object
options = options || {};
- var // Cross-domain detection vars
- parts,
- // Loop variable
- i,
+ var transport,
// URL without anti-cache param
cacheURL,
- // Response headers as string
+ // Response headers
responseHeadersString,
+ responseHeaders,
// timeout handle
timeoutTimer,
-
+ // Cross-domain detection vars
+ parts,
// To know if global events are to be dispatched
fireGlobals,
-
- transport,
- // Response headers
- responseHeaders,
+ // Loop variable
+ i,
// Create the final options object
s = jQuery.ajaxSetup( {}, options ),
// Callbacks context
@@ -7995,16 +8023,17 @@ jQuery.extend({
jqXHR.error = jqXHR.fail;
// Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+ // Add protocol if not provided (prefilters might expect it)
// Handle falsy url in the settings object (#10093: consistency with old signature)
// We also use the url parameter if available
- s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
// Alias method option to type as per ticket #12004
s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
// A cross-domain request is in order when we have a protocol:host:port mismatch
if ( s.crossDomain == null ) {
@@ -8030,7 +8059,8 @@ jQuery.extend({
}
// We can fire global events as of now if asked to
- fireGlobals = s.global;
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+ fireGlobals = jQuery.event && s.global;
// Watch for a new set of requests
if ( fireGlobals && jQuery.active++ === 0 ) {
@@ -8052,7 +8082,7 @@ jQuery.extend({
// If data is available, append data to url
if ( s.data ) {
- cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
// #9682: remove data so that it's not used in an eventual retry
delete s.data;
}
@@ -8062,10 +8092,10 @@ jQuery.extend({
s.url = rts.test( cacheURL ) ?
// If there is already a '_' parameter, set its value
- cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
// Otherwise add one to the end
- cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
}
}
@@ -8103,7 +8133,7 @@ jQuery.extend({
return jqXHR.abort();
}
- // aborting is no longer a cancellation
+ // Aborting is no longer a cancellation
strAbort = "abort";
// Install callbacks on deferreds
@@ -8215,8 +8245,7 @@ jQuery.extend({
isSuccess = !error;
}
} else {
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
+ // Extract error from statusText and normalize for non-aborts
error = statusText;
if ( status || !statusText ) {
statusText = "error";
@@ -8272,7 +8301,7 @@ jQuery.extend({
jQuery.each( [ "get", "post" ], function( i, method ) {
jQuery[ method ] = function( url, data, callback, type ) {
- // shift arguments if data argument was omitted
+ // Shift arguments if data argument was omitted
if ( jQuery.isFunction( data ) ) {
type = type || callback;
callback = data;
@@ -8289,155 +8318,336 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
};
});
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
- var firstDataType, ct, finalDataType, type,
- contents = s.contents,
- dataTypes = s.dataTypes;
- // Remove auto dataType and get content-type in the process
- while( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
}
- }
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
}
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
}
- }
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
- finalDataType = type;
- break;
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
}
- if ( !firstDataType ) {
- firstDataType = type;
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
}
- }
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
+ }).end();
}
+});
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
}
- return responses[ finalDataType ];
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
}
}
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
- var conv2, current, conv, tmp, prev,
- converters = {},
- // Work with a copy of dataTypes in case we need to modify it for conversion
- dataTypes = s.dataTypes.slice();
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
- // Create converters map with lowercased keys
- if ( dataTypes[ 1 ] ) {
- for ( conv in s.converters ) {
- converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
}
}
- current = dataTypes.shift();
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
- // Convert to each sequential dataType
- while ( current ) {
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
- if ( s.responseFields[ current ] ) {
- jqXHR[ s.responseFields[ current ] ] = response;
- }
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
- // Apply the dataFilter if provided
- if ( !prev && isSuccess && s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+ window.attachEvent( "onunload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
}
+ });
+}
- prev = current;
- current = dataTypes.shift();
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
- if ( current ) {
+jQuery.ajaxTransport(function( options ) {
+ var callback;
- // There's only work to do if current dataType is non-auto
- if ( current === "*" ) {
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
- current = prev;
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
- // Convert response if prev dataType is non-auto and differs from current
- } else if ( prev !== "*" && prev !== current ) {
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
- // Seek a direct converter
- conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
- // If none found, seek a pair
- if ( !conv ) {
- for ( conv2 in converters ) {
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
- // If conv2 outputs current
- tmp = conv2.split( " " );
- if ( tmp[ 1 ] === current ) {
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
- // If prev can be converted to accepted input
- conv = converters[ prev + " " + tmp[ 0 ] ] ||
- converters[ "* " + tmp[ 0 ] ];
- if ( conv ) {
- // Condense equivalence converters
- if ( conv === true ) {
- conv = converters[ conv2 ];
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
- // Otherwise, insert the intermediate dataType
- } else if ( converters[ conv2 ] !== true ) {
- current = tmp[ 0 ];
- dataTypes.unshift( tmp[ 1 ] );
- }
- break;
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
}
}
- }
- }
+ };
+ };
- // Apply converter (if not an equivalence)
- if ( conv !== true ) {
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
- // Unless errors are allowed to bubble, catch and return them
- if ( conv && s[ "throws" ] ) {
- response = conv( response );
- } else {
- try {
- response = conv( response );
- } catch ( e ) {
- return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
- }
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
}
}
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
}
- }
+ };
}
+});
+
+
+
- return { state: "success", data: response };
-}
// Install script dataType
jQuery.ajaxSetup({
accepts: {
@@ -8454,76 +8664,51 @@ jQuery.ajaxSetup({
}
});
-// Handle cache's special case and global
+// Handle cache's special case and crossDomain
jQuery.ajaxPrefilter( "script", function( s ) {
if ( s.cache === undefined ) {
s.cache = false;
}
if ( s.crossDomain ) {
s.type = "GET";
- s.global = false;
}
});
// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
+jQuery.ajaxTransport( "script", function( s ) {
// This transport only deals with cross domain requests
if ( s.crossDomain ) {
-
- var script,
- head = document.head || jQuery("head")[0] || document.documentElement;
-
+ var script, callback;
return {
-
- send: function( _, callback ) {
-
- script = document.createElement("script");
-
- script.async = true;
-
- if ( s.scriptCharset ) {
- script.charset = s.scriptCharset;
- }
-
- script.src = s.url;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function( _, isAbort ) {
-
- if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
- // Handle memory leak in IE
- script.onload = script.onreadystatechange = null;
-
- // Remove the script
- if ( script.parentNode ) {
- script.parentNode.removeChild( script );
- }
-
- // Dereference the script
- script = null;
-
- // Callback if not abort
- if ( !isAbort ) {
- callback( 200, "success" );
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
}
}
- };
-
- // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
- // Use native DOM manipulation to avoid our domManip AJAX trickery
- head.insertBefore( script, head.firstChild );
+ );
+ document.head.appendChild( script[ 0 ] );
},
-
abort: function() {
- if ( script ) {
- script.onload( undefined, true );
+ if ( callback ) {
+ callback();
}
}
};
}
});
+
+
+
+
var oldCallbacks = [],
rjsonp = /(=)\?(?=&|$)|\?\?/;
@@ -8531,7 +8716,7 @@ var oldCallbacks = [],
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
this[ callback ] = true;
return callback;
}
@@ -8558,7 +8743,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
if ( jsonProp ) {
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
} else if ( s.jsonp !== false ) {
- s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
}
// Use data converter to retrieve json after script execution
@@ -8604,1004 +8789,160 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
return "script";
}
});
-var xhrCallbacks, xhrSupported,
- xhrId = 0,
- // #5280: Internet Explorer will keep connections alive if we don't abort on unload
- xhrOnUnloadAbort = window.ActiveXObject && function() {
- // Abort all pending requests
- var key;
- for ( key in xhrCallbacks ) {
- xhrCallbacks[ key ]( undefined, true );
- }
- };
-
-// Functions to create xhrs
-function createStandardXHR() {
- try {
- return new window.XMLHttpRequest();
- } catch( e ) {}
-}
-
-function createActiveXHR() {
- try {
- return new window.ActiveXObject("Microsoft.XMLHTTP");
- } catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
- /* Microsoft failed to properly
- * implement the XMLHttpRequest in IE7 (can't request local files),
- * so we use the ActiveXObject when it is available
- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
- * we need a fallback.
- */
- function() {
- return !this.isLocal && createStandardXHR() || createActiveXHR();
- } :
- // For all other browsers, use the standard XMLHttpRequest object
- createStandardXHR;
-
-// Determine support properties
-xhrSupported = jQuery.ajaxSettings.xhr();
-jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = jQuery.support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
- jQuery.ajaxTransport(function( s ) {
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( !s.crossDomain || jQuery.support.cors ) {
-
- var callback;
-
- return {
- send: function( headers, complete ) {
-
- // Get a new xhr
- var handle, i,
- xhr = s.xhr();
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if ( s.username ) {
- xhr.open( s.type, s.url, s.async, s.username, s.password );
- } else {
- xhr.open( s.type, s.url, s.async );
- }
-
- // Apply custom fields if provided
- if ( s.xhrFields ) {
- for ( i in s.xhrFields ) {
- xhr[ i ] = s.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( s.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( s.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !s.crossDomain && !headers["X-Requested-With"] ) {
- headers["X-Requested-With"] = "XMLHttpRequest";
- }
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
- } catch( err ) {}
-
- // Do send the request
- // This may raise an exception which is actually
- // handled in jQuery.ajax (so no try/catch here)
- xhr.send( ( s.hasContent && s.data ) || null );
-
- // Listener
- callback = function( _, isAbort ) {
- var status, responseHeaders, statusText, responses;
-
- // Firefox throws exceptions when accessing properties
- // of an xhr when a network error occurred
- // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
- try {
-
- // Was never called and is aborted or complete
- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
- // Only called once
- callback = undefined;
-
- // Do not keep as active anymore
- if ( handle ) {
- xhr.onreadystatechange = jQuery.noop;
- if ( xhrOnUnloadAbort ) {
- delete xhrCallbacks[ handle ];
- }
- }
-
- // If it's an abort
- if ( isAbort ) {
- // Abort it manually if needed
- if ( xhr.readyState !== 4 ) {
- xhr.abort();
- }
- } else {
- responses = {};
- status = xhr.status;
- responseHeaders = xhr.getAllResponseHeaders();
-
- // When requesting binary data, IE6-9 will throw an exception
- // on any attempt to access responseText (#11426)
- if ( typeof xhr.responseText === "string" ) {
- responses.text = xhr.responseText;
- }
-
- // Firefox throws an exception when accessing
- // statusText for faulty cross-domain requests
- try {
- statusText = xhr.statusText;
- } catch( e ) {
- // We normalize with Webkit giving an empty statusText
- statusText = "";
- }
-
- // Filter status for non standard behaviors
-
- // If the request is local and we have data: assume a success
- // (success with no data won't get notified, that's the best we
- // can do given current implementations)
- if ( !status && s.isLocal && !s.crossDomain ) {
- status = responses.text ? 200 : 404;
- // IE - #1450: sometimes returns 1223 when it should be 204
- } else if ( status === 1223 ) {
- status = 204;
- }
- }
- }
- } catch( firefoxAccessException ) {
- if ( !isAbort ) {
- complete( -1, firefoxAccessException );
- }
- }
-
- // Call complete if needed
- if ( responses ) {
- complete( status, statusText, responses, responseHeaders );
- }
- };
-
- if ( !s.async ) {
- // if we're in sync mode we fire the callback
- callback();
- } else if ( xhr.readyState === 4 ) {
- // (IE6 & IE7) if it's in cache and has been
- // retrieved directly we need to fire the callback
- setTimeout( callback );
- } else {
- handle = ++xhrId;
- if ( xhrOnUnloadAbort ) {
- // Create the active xhrs callbacks list if needed
- // and attach the unload handler
- if ( !xhrCallbacks ) {
- xhrCallbacks = {};
- jQuery( window ).unload( xhrOnUnloadAbort );
- }
- // Add to list of active xhrs callbacks
- xhrCallbacks[ handle ] = callback;
- }
- xhr.onreadystatechange = callback;
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback( undefined, true );
- }
- }
- };
- }
- });
-}
-var fxNow, timerId,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
- rrun = /queueHooks$/,
- animationPrefilters = [ defaultPrefilter ],
- tweeners = {
- "*": [function( prop, value ) {
- var tween = this.createTween( prop, value ),
- target = tween.cur(),
- parts = rfxnum.exec( value ),
- unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
- // Starting value computation is required for potential unit mismatches
- start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
- rfxnum.exec( jQuery.css( tween.elem, prop ) ),
- scale = 1,
- maxIterations = 20;
- if ( start && start[ 3 ] !== unit ) {
- // Trust units reported by jQuery.css
- unit = unit || start[ 3 ];
-
- // Make sure we update the tween properties later on
- parts = parts || [];
-
- // Iteratively approximate from a nonzero starting point
- start = +target || 1;
- do {
- // If previous iteration zeroed out, double until we get *something*
- // Use a string for doubling factor so we don't accidentally see scale as unchanged below
- scale = scale || ".5";
- // Adjust and apply
- start = start / scale;
- jQuery.style( tween.elem, prop, start + unit );
-
- // Update scale, tolerating zero or NaN from tween.cur()
- // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
- } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
- }
-
- // Update tween properties
- if ( parts ) {
- start = tween.start = +start || +target || 0;
- tween.unit = unit;
- // If a +=/-= token was provided, we're doing a relative animation
- tween.end = parts[ 1 ] ?
- start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
- +parts[ 2 ];
- }
-
- return tween;
- }]
- };
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- setTimeout(function() {
- fxNow = undefined;
- });
- return ( fxNow = jQuery.now() );
-}
-
-function createTween( value, prop, animation ) {
- var tween,
- collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
- index = 0,
- length = collection.length;
- for ( ; index < length; index++ ) {
- if ( (tween = collection[ index ].call( animation, prop, value )) ) {
-
- // we're done with this property
- return tween;
- }
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
}
-}
-
-function Animation( elem, properties, options ) {
- var result,
- stopped,
- index = 0,
- length = animationPrefilters.length,
- deferred = jQuery.Deferred().always( function() {
- // don't match elem in the :animated selector
- delete tick.elem;
- }),
- tick = function() {
- if ( stopped ) {
- return false;
- }
- var currentTime = fxNow || createFxNow(),
- remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
- // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
- temp = remaining / animation.duration || 0,
- percent = 1 - temp,
- index = 0,
- length = animation.tweens.length;
-
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( percent );
- }
-
- deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
- if ( percent < 1 && length ) {
- return remaining;
- } else {
- deferred.resolveWith( elem, [ animation ] );
- return false;
- }
- },
- animation = deferred.promise({
- elem: elem,
- props: jQuery.extend( {}, properties ),
- opts: jQuery.extend( true, { specialEasing: {} }, options ),
- originalProperties: properties,
- originalOptions: options,
- startTime: fxNow || createFxNow(),
- duration: options.duration,
- tweens: [],
- createTween: function( prop, end ) {
- var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
- animation.tweens.push( tween );
- return tween;
- },
- stop: function( gotoEnd ) {
- var index = 0,
- // if we are going to the end, we want to run all the tweens
- // otherwise we skip this part
- length = gotoEnd ? animation.tweens.length : 0;
- if ( stopped ) {
- return this;
- }
- stopped = true;
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( 1 );
- }
-
- // resolve when we played the last frame
- // otherwise, reject
- if ( gotoEnd ) {
- deferred.resolveWith( elem, [ animation, gotoEnd ] );
- } else {
- deferred.rejectWith( elem, [ animation, gotoEnd ] );
- }
- return this;
- }
- }),
- props = animation.props;
-
- propFilter( props, animation.opts.specialEasing );
-
- for ( ; index < length ; index++ ) {
- result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
- if ( result ) {
- return result;
- }
- }
-
- jQuery.map( props, createTween, animation );
-
- if ( jQuery.isFunction( animation.opts.start ) ) {
- animation.opts.start.call( elem, animation );
- }
-
- jQuery.fx.timer(
- jQuery.extend( tick, {
- elem: elem,
- anim: animation,
- queue: animation.opts.queue
- })
- );
-
- // attach callbacks from options
- return animation.progress( animation.opts.progress )
- .done( animation.opts.done, animation.opts.complete )
- .fail( animation.opts.fail )
- .always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
- var index, name, easing, value, hooks;
-
- // camelCase, specialEasing and expand cssHook pass
- for ( index in props ) {
- name = jQuery.camelCase( index );
- easing = specialEasing[ name ];
- value = props[ index ];
- if ( jQuery.isArray( value ) ) {
- easing = value[ 1 ];
- value = props[ index ] = value[ 0 ];
- }
-
- if ( index !== name ) {
- props[ name ] = value;
- delete props[ index ];
- }
-
- hooks = jQuery.cssHooks[ name ];
- if ( hooks && "expand" in hooks ) {
- value = hooks.expand( value );
- delete props[ name ];
-
- // not quite $.extend, this wont overwrite keys already present.
- // also - reusing 'index' from above because we have the correct "name"
- for ( index in value ) {
- if ( !( index in props ) ) {
- props[ index ] = value[ index ];
- specialEasing[ index ] = easing;
- }
- }
- } else {
- specialEasing[ name ] = easing;
- }
- }
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
- tweener: function( props, callback ) {
- if ( jQuery.isFunction( props ) ) {
- callback = props;
- props = [ "*" ];
- } else {
- props = props.split(" ");
- }
-
- var prop,
- index = 0,
- length = props.length;
-
- for ( ; index < length ; index++ ) {
- prop = props[ index ];
- tweeners[ prop ] = tweeners[ prop ] || [];
- tweeners[ prop ].unshift( callback );
- }
- },
-
- prefilter: function( callback, prepend ) {
- if ( prepend ) {
- animationPrefilters.unshift( callback );
- } else {
- animationPrefilters.push( callback );
- }
- }
-});
-
-function defaultPrefilter( elem, props, opts ) {
- /* jshint validthis: true */
- var prop, value, toggle, tween, hooks, oldfire,
- anim = this,
- orig = {},
- style = elem.style,
- hidden = elem.nodeType && isHidden( elem ),
- dataShow = jQuery._data( elem, "fxshow" );
-
- // handle queue: false promises
- if ( !opts.queue ) {
- hooks = jQuery._queueHooks( elem, "fx" );
- if ( hooks.unqueued == null ) {
- hooks.unqueued = 0;
- oldfire = hooks.empty.fire;
- hooks.empty.fire = function() {
- if ( !hooks.unqueued ) {
- oldfire();
- }
- };
- }
- hooks.unqueued++;
-
- anim.always(function() {
- // doing this makes sure that the complete handler will be called
- // before this completes
- anim.always(function() {
- hooks.unqueued--;
- if ( !jQuery.queue( elem, "fx" ).length ) {
- hooks.empty.fire();
- }
- });
- });
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
}
+ context = context || document;
- // height/width overflow pass
- if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE does not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
- if ( jQuery.css( elem, "display" ) === "inline" &&
- jQuery.css( elem, "float" ) === "none" ) {
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
- style.display = "inline-block";
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
- } else {
- style.zoom = 1;
- }
- }
- }
-
- if ( opts.overflow ) {
- style.overflow = "hidden";
- if ( !jQuery.support.shrinkWrapBlocks ) {
- anim.always(function() {
- style.overflow = opts.overflow[ 0 ];
- style.overflowX = opts.overflow[ 1 ];
- style.overflowY = opts.overflow[ 2 ];
- });
- }
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
}
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
- // show/hide pass
- for ( prop in props ) {
- value = props[ prop ];
- if ( rfxtypes.exec( value ) ) {
- delete props[ prop ];
- toggle = toggle || value === "toggle";
- if ( value === ( hidden ? "hide" : "show" ) ) {
- continue;
- }
- orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
- }
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
}
- if ( !jQuery.isEmptyObject( orig ) ) {
- if ( dataShow ) {
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
- }
- } else {
- dataShow = jQuery._data( elem, "fxshow", {} );
- }
-
- // store state if its toggle - enables .stop().toggle() to "reverse"
- if ( toggle ) {
- dataShow.hidden = !hidden;
- }
- if ( hidden ) {
- jQuery( elem ).show();
- } else {
- anim.done(function() {
- jQuery( elem ).hide();
- });
- }
- anim.done(function() {
- var prop;
- jQuery._removeData( elem, "fxshow" );
- for ( prop in orig ) {
- jQuery.style( elem, prop, orig[ prop ] );
- }
- });
- for ( prop in orig ) {
- tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-
- if ( !( prop in dataShow ) ) {
- dataShow[ prop ] = tween.start;
- if ( hidden ) {
- tween.end = tween.start;
- tween.start = prop === "width" || prop === "height" ? 1 : 0;
- }
- }
- }
- }
-}
-
-function Tween( elem, options, prop, end, easing ) {
- return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
- constructor: Tween,
- init: function( elem, options, prop, end, easing, unit ) {
- this.elem = elem;
- this.prop = prop;
- this.easing = easing || "swing";
- this.options = options;
- this.start = this.now = this.cur();
- this.end = end;
- this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
- },
- cur: function() {
- var hooks = Tween.propHooks[ this.prop ];
-
- return hooks && hooks.get ?
- hooks.get( this ) :
- Tween.propHooks._default.get( this );
- },
- run: function( percent ) {
- var eased,
- hooks = Tween.propHooks[ this.prop ];
-
- if ( this.options.duration ) {
- this.pos = eased = jQuery.easing[ this.easing ](
- percent, this.options.duration * percent, 0, 1, this.options.duration
- );
- } else {
- this.pos = eased = percent;
- }
- this.now = ( this.end - this.start ) * eased + this.start;
-
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- if ( hooks && hooks.set ) {
- hooks.set( this );
- } else {
- Tween.propHooks._default.set( this );
- }
- return this;
- }
+ return jQuery.merge( [], parsed.childNodes );
};
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
- _default: {
- get: function( tween ) {
- var result;
- if ( tween.elem[ tween.prop ] != null &&
- (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
- return tween.elem[ tween.prop ];
- }
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
- // passing an empty string as a 3rd parameter to .css will automatically
- // attempt a parseFloat and fallback to a string if the parse fails
- // so, simple values such as "10px" are parsed to Float.
- // complex values such as "rotate(1rad)" are returned as is.
- result = jQuery.css( tween.elem, tween.prop, "" );
- // Empty strings, null, undefined and "auto" are converted to 0.
- return !result || result === "auto" ? 0 : result;
- },
- set: function( tween ) {
- // use step hook for back compat - use cssHook if its there - use .style if its
- // available and use plain properties where available
- if ( jQuery.fx.step[ tween.prop ] ) {
- jQuery.fx.step[ tween.prop ]( tween );
- } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
- jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
- } else {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
}
-};
-// Support: IE <=9
-// Panic based approach to setting things on disconnected nodes
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
- set: function( tween ) {
- if ( tween.elem.nodeType && tween.elem.parentNode ) {
- tween.elem[ tween.prop ] = tween.now;
- }
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
}
-};
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
- var cssFn = jQuery.fn[ name ];
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return speed == null || typeof speed === "boolean" ?
- cssFn.apply( this, arguments ) :
- this.animate( genFx( name, true ), speed, easing, callback );
- };
-});
-
-jQuery.fn.extend({
- fadeTo: function( speed, to, easing, callback ) {
-
- // show any hidden elements after setting opacity to 0
- return this.filter( isHidden ).css( "opacity", 0 ).show()
-
- // animate to the value specified
- .end().animate({ opacity: to }, speed, easing, callback );
- },
- animate: function( prop, speed, easing, callback ) {
- var empty = jQuery.isEmptyObject( prop ),
- optall = jQuery.speed( speed, easing, callback ),
- doAnimation = function() {
- // Operate on a copy of prop so per-property easing won't be lost
- var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
- // Empty animations, or finishing resolves immediately
- if ( empty || jQuery._data( this, "finish" ) ) {
- anim.stop( true );
- }
- };
- doAnimation.finish = doAnimation;
-
- return empty || optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
- stop: function( type, clearQueue, gotoEnd ) {
- var stopQueue = function( hooks ) {
- var stop = hooks.stop;
- delete hooks.stop;
- stop( gotoEnd );
- };
-
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each(function() {
- var dequeue = true,
- index = type != null && type + "queueHooks",
- timers = jQuery.timers,
- data = jQuery._data( this );
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
- if ( index ) {
- if ( data[ index ] && data[ index ].stop ) {
- stopQueue( data[ index ] );
- }
- } else {
- for ( index in data ) {
- if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
- stopQueue( data[ index ] );
- }
- }
- }
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
- timers[ index ].anim.stop( gotoEnd );
- dequeue = false;
- timers.splice( index, 1 );
- }
- }
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
- // start the next in the queue if the last step wasn't forced
- // timers currently will call their complete callbacks, which will dequeue
- // but only if they were gotoEnd
- if ( dequeue || !gotoEnd ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- finish: function( type ) {
- if ( type !== false ) {
- type = type || "fx";
- }
- return this.each(function() {
- var index,
- data = jQuery._data( this ),
- queue = data[ type + "queue" ],
- hooks = data[ type + "queueHooks" ],
- timers = jQuery.timers,
- length = queue ? queue.length : 0;
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
- // enable finishing flag on private data
- data.finish = true;
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
- // empty the queue first
- jQuery.queue( this, type, [] );
+ // Save response for use in complete callback
+ response = arguments;
- if ( hooks && hooks.stop ) {
- hooks.stop.call( this, true );
- }
+ self.html( selector ?
- // look for any active animations, and finish them
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
- timers[ index ].anim.stop( true );
- timers.splice( index, 1 );
- }
- }
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
- // look for any animations in the old queue and finish them
- for ( index = 0; index < length; index++ ) {
- if ( queue[ index ] && queue[ index ].finish ) {
- queue[ index ].finish.call( this );
- }
- }
+ // Otherwise use the full result
+ responseText );
- // turn off finishing flag
- delete data.finish;
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
});
}
-});
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
- var which,
- attrs = { height: type },
- i = 0;
+ return this;
+};
- // if we include width, step value is 1 to do all cssExpand values,
- // if we don't include width, step value is 2 to skip over Left and Right
- includeWidth = includeWidth? 1 : 0;
- for( ; i < 4 ; i += 2 - includeWidth ) {
- which = cssExpand[ i ];
- attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
- }
- if ( includeWidth ) {
- attrs.opacity = attrs.width = type;
- }
- return attrs;
-}
-// Generate shortcuts for custom animations
-jQuery.each({
- slideDown: genFx("show"),
- slideUp: genFx("hide"),
- slideToggle: genFx("toggle"),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
};
});
-jQuery.speed = function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
- };
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
- // normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function() {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- }
- };
-
- return opt;
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
};
-jQuery.easing = {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return 0.5 - Math.cos( p*Math.PI ) / 2;
- }
-};
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
- var timer,
- timers = jQuery.timers,
- i = 0;
- fxNow = jQuery.now();
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
- if ( timer() && jQuery.timers.push( timer ) ) {
- jQuery.fx.start();
- }
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.start = function() {
- if ( !timerId ) {
- timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
- }
-};
-
-jQuery.fx.stop = function() {
- clearInterval( timerId );
- timerId = null;
-};
-
-jQuery.fx.speeds = {
- slow: 600,
- fast: 200,
- // Default speed
- _default: 400
-};
+var docElem = window.document.documentElement;
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep(jQuery.timers, function( fn ) {
- return elem === fn.elem;
- }).length;
- };
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
}
-jQuery.fn.offset = function( options ) {
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- var docElem, win,
- box = { top: 0, left: 0 },
- elem = this[ 0 ],
- doc = elem && elem.ownerDocument;
-
- if ( !doc ) {
- return;
- }
-
- docElem = doc.documentElement;
-
- // Make sure it's not a disconnected DOM node
- if ( !jQuery.contains( docElem, elem ) ) {
- return box;
- }
-
- // If we don't have gBCR, just use 0,0 rather than error
- // BlackBerry 5, iOS 3 (original iPhone)
- if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
- box = elem.getBoundingClientRect();
- }
- win = getWindow( doc );
- return {
- top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
- left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
- };
-};
jQuery.offset = {
-
setOffset: function( elem, options, i ) {
- var position = jQuery.css( elem, "position" );
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
- // set position first, in-case top/left are set even on static elem
+ // Set position first, in-case top/left are set even on static elem
if ( position === "static" ) {
elem.style.position = "relative";
}
- var curElem = jQuery( elem ),
- curOffset = curElem.offset(),
- curCSSTop = jQuery.css( elem, "top" ),
- curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
- props = {}, curPosition = {}, curTop, curLeft;
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
if ( calculatePosition ) {
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;
+
} else {
curTop = parseFloat( curCSSTop ) || 0;
curLeft = parseFloat( curCSSLeft ) || 0;
@@ -9620,14 +8961,50 @@ jQuery.offset = {
if ( "using" in options ) {
options.using.call( elem, props );
+
} else {
curElem.css( props );
}
}
};
-
jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // Support: BlackBerry 5, iOS 3 (original iPhone)
+ // If we don't have gBCR, just use 0,0 rather than error
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
position: function() {
if ( !this[ 0 ] ) {
@@ -9635,13 +9012,14 @@ jQuery.fn.extend({
}
var offsetParent, offset,
- parentOffset = { top: 0, left: 0 },
- elem = this[ 0 ];
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
- // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
if ( jQuery.css( elem, "position" ) === "fixed" ) {
- // we assume that getBoundingClientRect is available when computed position is fixed
+ // Assume getBoundingClientRect is there when computed position is fixed
offset = elem.getBoundingClientRect();
+
} else {
// Get *real* offsetParent
offsetParent = this.offsetParent();
@@ -9653,49 +9031,46 @@ jQuery.fn.extend({
}
// Add offsetParent borders
- parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
}
// Subtract parent offsets and element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
};
},
offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent || docElem;
- while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
offsetParent = offsetParent.offsetParent;
}
+
return offsetParent || docElem;
});
}
});
-
// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
- var top = /Y/.test( prop );
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
jQuery.fn[ method ] = function( val ) {
- return jQuery.access( this, function( elem, method, val ) {
+ return access( this, function( elem, method, val ) {
var win = getWindow( elem );
if ( val === undefined ) {
- return win ? (prop in win) ? win[ prop ] :
- win.document.documentElement[ method ] :
- elem[ method ];
+ return win ? win[ prop ] : elem[ method ];
}
if ( win ) {
win.scrollTo(
- !top ? val : jQuery( win ).scrollLeft(),
- top ? val : jQuery( win ).scrollTop()
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
);
} else {
@@ -9705,22 +9080,36 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
};
});
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ?
- elem :
- elem.nodeType === 9 ?
- elem.defaultView || elem.parentWindow :
- false;
-}
+// Support: Safari<7+, Chrome<37+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
- // margin is only for outerHeight, outerWidth
+ // Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
- return jQuery.access( this, function( elem, type, value ) {
+ return access( this, function( elem, type, value ) {
var doc;
if ( jQuery.isWindow( elem ) ) {
@@ -9734,8 +9123,8 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
if ( elem.nodeType === 9 ) {
doc = elem.documentElement;
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
- // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
return Math.max(
elem.body[ "scroll" + name ], doc[ "scroll" + name ],
elem.body[ "offset" + name ], doc[ "offset" + name ],
@@ -9753,8 +9142,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
};
});
});
-// Limit scope pollution from any deprecated API
-// (function() {
+
// The number of elements contained in the matched element set
jQuery.fn.size = function() {
@@ -9763,27 +9151,60 @@ jQuery.fn.size = function() {
jQuery.fn.andSelf = jQuery.fn.addBack;
-// })();
-if ( typeof module === "object" && module && typeof module.exports === "object" ) {
- // Expose jQuery as module.exports in loaders that implement the Node
- // module pattern (including browserify). Do not create the global, since
- // the user will be storing it themselves locally, and globals are frowned
- // upon in the Node module world.
- module.exports = jQuery;
-} else {
- // Otherwise expose jQuery to the global object as usual
- window.jQuery = window.$ = jQuery;
- // Register as a named AMD module, since jQuery can be concatenated with other
- // files that may use define, but not via a proper concatenation script that
- // understands anonymous AMD modules. A named AMD is safest and most robust
- // way to register. Lowercase jquery is used because AMD module names are
- // derived from file names, and jQuery is normally delivered in a lowercase
- // file name. Do this after creating the global so that if an AMD module wants
- // to call noConflict to hide this version of jQuery, it will work.
- if ( typeof define === "function" && define.amd ) {
- define( "jquery", [], function () { return jQuery; } );
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
}
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
}
-})( window );
+
+
+
+return jQuery;
+
+}));
diff --git a/core/vendor/jquery/dist/jquery.min.js b/core/vendor/jquery/dist/jquery.min.js
new file mode 100644
index 00000000000..fad9ab1237c
--- /dev/null
+++ b/core/vendor/jquery/dist/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
+return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
+void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
+//# sourceMappingURL=jquery.min.map \ No newline at end of file
diff --git a/core/vendor/jquery/dist/jquery.min.map b/core/vendor/jquery/dist/jquery.min.map
new file mode 100644
index 00000000000..95fc122fa75
--- /dev/null
+++ b/core/vendor/jquery/dist/jquery.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"jquery.min.js","sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","options","name","src","copy","copyIsArray","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","nodeType","isEmptyObject","globalEval","code","script","indirect","eval","trim","createElement","text","head","appendChild","parentNode","removeChild","camelCase","string","nodeName","toLowerCase","value","isArraylike","makeArray","results","Object","inArray","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","pop","push_native","list","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","childNodes","e","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","div","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","truncate","sibling","n","targets","l","closest","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","memory","fired","firing","firingStart","firingLength","firingIndex","stack","once","fire","data","stopOnFalse","disable","remove","lock","locked","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","triggerHandler","off","completed","removeEventListener","readyState","setTimeout","access","chainable","emptyGet","raw","bulk","acceptData","owner","Data","defineProperty","uid","accepts","descriptor","unlock","defineProperties","set","prop","stored","camel","hasData","discard","data_priv","data_user","rbrace","rmultiDash","dataAttr","parseJSON","removeData","_data","_removeData","camelKey","queue","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","cssExpand","isHidden","el","css","rcheckableType","fragment","createDocumentFragment","checkClone","cloneNode","noCloneChecked","strundefined","focusinBubbles","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","event","types","handleObjIn","eventHandle","events","t","handleObj","special","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","trigger","onlyHandlers","bubbleType","ontype","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","props","fixHooks","keyHooks","original","which","charCode","keyCode","mouseHooks","eventDoc","body","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","originalEvent","fixHook","load","blur","click","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","timeStamp","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","relatedTarget","attaches","on","one","origFn","rxhtmlTag","rtagName","rhtml","rnoInnerhtml","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","option","thead","col","tr","td","optgroup","tbody","tfoot","colgroup","caption","th","manipulationTarget","content","disableScript","restoreScript","setGlobalEval","refElements","cloneCopyEvent","dest","pdataOld","pdataCur","udataOld","udataCur","getAll","fixInput","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","buildFragment","scripts","selection","wrap","nodes","createTextNode","cleanData","append","domManip","prepend","insertBefore","before","after","keepData","html","replaceWith","replaceChild","detach","hasScripts","iNoClone","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","actualDisplay","style","display","getDefaultComputedStyle","defaultDisplay","write","close","rmargin","rnumnonpx","getStyles","opener","getComputedStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","addGetHookIf","conditionFn","hookFn","pixelPositionVal","boxSizingReliableVal","container","backgroundClip","clearCloneStyle","cssText","computePixelPositionAndBoxSizingReliable","divStyle","pixelPosition","boxSizingReliable","reliableMarginRight","marginDiv","marginRight","swap","rdisplayswap","rnumsplit","rrelNum","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","vendorPropName","capName","origName","setPositiveNumber","subtract","max","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","offsetWidth","offsetHeight","showHide","show","hidden","cssHooks","opacity","cssNumber","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","zoom","cssProps","float","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","unit","propHooks","run","percent","eased","duration","step","tween","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","*","createTween","scale","maxIterations","createFxNow","genFx","includeWidth","height","animation","collection","opts","oldfire","checkDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","Animation","properties","stopped","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","optDisabled","radioValue","nodeHook","boolHook","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","rfocusable","removeProp","for","class","notxml","hasAttribute","rclass","addClass","classes","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","rreturn","valHooks","optionSet","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","nonce","rquery","JSON","parse","parseXML","DOMParser","parseFromString","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","transports","allTypes","ajaxLocation","ajaxLocParts","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","ct","finalDataType","firstDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","processData","async","contentType","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","fireGlobals","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","status","abort","statusText","finalText","success","method","crossDomain","param","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","firstElementChild","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serialize","serializeArray","xhr","XMLHttpRequest","xhrId","xhrCallbacks","xhrSuccessStatus",1223,"xhrSupported","cors","open","username","xhrFields","onload","onerror","responseText","text script","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","left","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAcC,SAAUA,EAAQC,GAEK,gBAAXC,SAAiD,gBAAnBA,QAAOC,QAQhDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,KAAM,IAAIE,OAAO,2CAElB,OAAOL,GAASI,IAGlBJ,EAASD,IAIS,mBAAXO,QAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAQnE,GAAIC,MAEAC,EAAQD,EAAIC,MAEZC,EAASF,EAAIE,OAEbC,EAAOH,EAAIG,KAEXC,EAAUJ,EAAII,QAEdC,KAEAC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,KAMHf,EAAWG,EAAOH,SAElBgB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAG5B,MAAO,IAAIF,GAAOG,GAAGC,KAAMH,EAAUC,IAKtCG,EAAQ,qCAGRC,EAAY,QACZC,EAAa,eAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,cAGhBX,GAAOG,GAAKH,EAAOY,WAElBC,OAAQd,EAERe,YAAad,EAGbC,SAAU,GAGVc,OAAQ,EAERC,QAAS,WACR,MAAO1B,GAAM2B,KAAM9B,OAKpB+B,IAAK,SAAUC,GACd,MAAc,OAAPA,EAGE,EAANA,EAAUhC,KAAMgC,EAAMhC,KAAK4B,QAAW5B,KAAMgC,GAG9C7B,EAAM2B,KAAM9B,OAKdiC,UAAW,SAAUC,GAGpB,GAAIC,GAAMtB,EAAOuB,MAAOpC,KAAK2B,cAAeO,EAO5C,OAJAC,GAAIE,WAAarC,KACjBmC,EAAIpB,QAAUf,KAAKe,QAGZoB,GAMRG,KAAM,SAAUC,EAAUC,GACzB,MAAO3B,GAAOyB,KAAMtC,KAAMuC,EAAUC,IAGrCC,IAAK,SAAUF,GACd,MAAOvC,MAAKiC,UAAWpB,EAAO4B,IAAIzC,KAAM,SAAU0C,EAAMC,GACvD,MAAOJ,GAAST,KAAMY,EAAMC,EAAGD,OAIjCvC,MAAO,WACN,MAAOH,MAAKiC,UAAW9B,EAAMyC,MAAO5C,KAAM6C,aAG3CC,MAAO,WACN,MAAO9C,MAAK+C,GAAI,IAGjBC,KAAM,WACL,MAAOhD,MAAK+C,GAAI,KAGjBA,GAAI,SAAUJ,GACb,GAAIM,GAAMjD,KAAK4B,OACdsB,GAAKP,GAAU,EAAJA,EAAQM,EAAM,EAC1B,OAAOjD,MAAKiC,UAAWiB,GAAK,GAASD,EAAJC,GAAYlD,KAAKkD,SAGnDC,IAAK,WACJ,MAAOnD,MAAKqC,YAAcrC,KAAK2B,YAAY,OAK5CtB,KAAMA,EACN+C,KAAMlD,EAAIkD,KACVC,OAAQnD,EAAImD,QAGbxC,EAAOyC,OAASzC,EAAOG,GAAGsC,OAAS,WAClC,GAAIC,GAASC,EAAMC,EAAKC,EAAMC,EAAaC,EAC1CC,EAAShB,UAAU,OACnBF,EAAI,EACJf,EAASiB,UAAUjB,OACnBkC,GAAO,CAsBR,KAnBuB,iBAAXD,KACXC,EAAOD,EAGPA,EAAShB,UAAWF,OACpBA,KAIsB,gBAAXkB,IAAwBhD,EAAOkD,WAAWF,KACrDA,MAIIlB,IAAMf,IACViC,EAAS7D,KACT2C,KAGWf,EAAJe,EAAYA,IAEnB,GAAmC,OAA7BY,EAAUV,UAAWF,IAE1B,IAAMa,IAAQD,GACbE,EAAMI,EAAQL,GACdE,EAAOH,EAASC,GAGXK,IAAWH,IAKXI,GAAQJ,IAAU7C,EAAOmD,cAAcN,KAAUC,EAAc9C,EAAOoD,QAAQP,MAC7EC,GACJA,GAAc,EACdC,EAAQH,GAAO5C,EAAOoD,QAAQR,GAAOA,MAGrCG,EAAQH,GAAO5C,EAAOmD,cAAcP,GAAOA,KAI5CI,EAAQL,GAAS3C,EAAOyC,OAAQQ,EAAMF,EAAOF,IAGzBQ,SAATR,IACXG,EAAQL,GAASE,GAOrB,OAAOG,IAGRhD,EAAOyC,QAENa,QAAS,UAAavD,EAAUwD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,KAAM,IAAI3E,OAAO2E,IAGlBC,KAAM,aAENX,WAAY,SAAUY,GACrB,MAA4B,aAArB9D,EAAO+D,KAAKD,IAGpBV,QAASY,MAAMZ,QAEfa,SAAU,SAAUH,GACnB,MAAc,OAAPA,GAAeA,IAAQA,EAAI5E,QAGnCgF,UAAW,SAAUJ,GAKpB,OAAQ9D,EAAOoD,QAASU,IAAUA,EAAMK,WAAYL,GAAQ,GAAM,GAGnEX,cAAe,SAAUW,GAKxB,MAA4B,WAAvB9D,EAAO+D,KAAMD,IAAsBA,EAAIM,UAAYpE,EAAOiE,SAAUH,IACjE,EAGHA,EAAIhD,cACNlB,EAAOqB,KAAM6C,EAAIhD,YAAYF,UAAW,kBACnC,GAKD,GAGRyD,cAAe,SAAUP,GACxB,GAAInB,EACJ,KAAMA,IAAQmB,GACb,OAAO,CAER,QAAO,GAGRC,KAAM,SAAUD,GACf,MAAY,OAAPA,EACGA,EAAM,GAGQ,gBAARA,IAAmC,kBAARA,GACxCpE,EAAYC,EAASsB,KAAK6C,KAAU,eAC7BA,IAITQ,WAAY,SAAUC,GACrB,GAAIC,GACHC,EAAWC,IAEZH,GAAOvE,EAAO2E,KAAMJ,GAEfA,IAIgC,IAA/BA,EAAK9E,QAAQ,eACjB+E,EAASzF,EAAS6F,cAAc,UAChCJ,EAAOK,KAAON,EACdxF,EAAS+F,KAAKC,YAAaP,GAASQ,WAAWC,YAAaT,IAI5DC,EAAUF,KAQbW,UAAW,SAAUC,GACpB,MAAOA,GAAO1B,QAASnD,EAAW,OAAQmD,QAASlD,EAAYC,IAGhE4E,SAAU,SAAUvD,EAAMc,GACzB,MAAOd,GAAKuD,UAAYvD,EAAKuD,SAASC,gBAAkB1C,EAAK0C,eAI9D5D,KAAM,SAAUqC,EAAKpC,EAAUC,GAC9B,GAAI2D,GACHxD,EAAI,EACJf,EAAS+C,EAAI/C,OACbqC,EAAUmC,EAAazB,EAExB,IAAKnC,GACJ,GAAKyB,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAwD,EAAQ5D,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7B2D,KAAU,EACd,UAIF,KAAMxD,IAAKgC,GAGV,GAFAwB,EAAQ5D,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7B2D,KAAU,EACd,UAOH,IAAKlC,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAwD,EAAQ5D,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCwD,KAAU,EACd,UAIF,KAAMxD,IAAKgC,GAGV,GAFAwB,EAAQ5D,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCwD,KAAU,EACd,KAMJ,OAAOxB,IAIRa,KAAM,SAAUE,GACf,MAAe,OAARA,EACN,IACEA,EAAO,IAAKpB,QAASpD,EAAO,KAIhCmF,UAAW,SAAUnG,EAAKoG,GACzB,GAAInE,GAAMmE,KAaV,OAXY,OAAPpG,IACCkG,EAAaG,OAAOrG,IACxBW,EAAOuB,MAAOD,EACE,gBAARjC,IACLA,GAAQA,GAGXG,EAAKyB,KAAMK,EAAKjC,IAIXiC,GAGRqE,QAAS,SAAU9D,EAAMxC,EAAKyC,GAC7B,MAAc,OAAPzC,EAAc,GAAKI,EAAQwB,KAAM5B,EAAKwC,EAAMC,IAGpDP,MAAO,SAAUU,EAAO2D,GAKvB,IAJA,GAAIxD,IAAOwD,EAAO7E,OACjBsB,EAAI,EACJP,EAAIG,EAAMlB,OAECqB,EAAJC,EAASA,IAChBJ,EAAOH,KAAQ8D,EAAQvD,EAKxB,OAFAJ,GAAMlB,OAASe,EAERG,GAGR4D,KAAM,SAAUxE,EAAOK,EAAUoE,GAShC,IARA,GAAIC,GACHC,KACAlE,EAAI,EACJf,EAASM,EAAMN,OACfkF,GAAkBH,EAIP/E,EAAJe,EAAYA,IACnBiE,GAAmBrE,EAAUL,EAAOS,GAAKA,GACpCiE,IAAoBE,GACxBD,EAAQxG,KAAM6B,EAAOS,GAIvB,OAAOkE,IAIRpE,IAAK,SAAUP,EAAOK,EAAUwE,GAC/B,GAAIZ,GACHxD,EAAI,EACJf,EAASM,EAAMN,OACfqC,EAAUmC,EAAalE,GACvBC,IAGD,IAAK8B,EACJ,KAAYrC,EAAJe,EAAYA,IACnBwD,EAAQ5D,EAAUL,EAAOS,GAAKA,EAAGoE,GAEnB,MAATZ,GACJhE,EAAI9B,KAAM8F,OAMZ,KAAMxD,IAAKT,GACViE,EAAQ5D,EAAUL,EAAOS,GAAKA,EAAGoE,GAEnB,MAATZ,GACJhE,EAAI9B,KAAM8F,EAMb,OAAO/F,GAAOwC,SAAWT,IAI1B6E,KAAM,EAINC,MAAO,SAAUjG,EAAID,GACpB,GAAImG,GAAK1E,EAAMyE,CAUf,OARwB,gBAAZlG,KACXmG,EAAMlG,EAAID,GACVA,EAAUC,EACVA,EAAKkG,GAKArG,EAAOkD,WAAY/C,IAKzBwB,EAAOrC,EAAM2B,KAAMe,UAAW,GAC9BoE,EAAQ,WACP,MAAOjG,GAAG4B,MAAO7B,GAAWf,KAAMwC,EAAKpC,OAAQD,EAAM2B,KAAMe,cAI5DoE,EAAMD,KAAOhG,EAAGgG,KAAOhG,EAAGgG,MAAQnG,EAAOmG,OAElCC,GAZC/C,QAeTiD,IAAKC,KAAKD,IAIVxG,QAASA,IAIVE,EAAOyB,KAAK,gEAAgE+E,MAAM,KAAM,SAAS1E,EAAGa,GACnGjD,EAAY,WAAaiD,EAAO,KAAQA,EAAK0C,eAG9C,SAASE,GAAazB,GAMrB,GAAI/C,GAAS,UAAY+C,IAAOA,EAAI/C,OACnCgD,EAAO/D,EAAO+D,KAAMD,EAErB,OAAc,aAATC,GAAuB/D,EAAOiE,SAAUH,IACrC,EAGc,IAAjBA,EAAIM,UAAkBrD,GACnB,EAGQ,UAATgD,GAA+B,IAAXhD,GACR,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAO+C,GAEhE,GAAI2C,GAWJ,SAAWvH,GAEX,GAAI4C,GACHhC,EACA4G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACApI,EACAqI,EACAC,EACAC,EACAC,EACAvB,EACAwB,EAGAlE,EAAU,SAAW,EAAI,GAAIiD,MAC7BkB,EAAevI,EAAOH,SACtB2I,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVhB,GAAe,GAET,GAIRiB,EAAe,GAAK,GAGpBvI,KAAcC,eACdR,KACA+I,EAAM/I,EAAI+I,IACVC,EAAchJ,EAAIG,KAClBA,EAAOH,EAAIG,KACXF,EAAQD,EAAIC,MAGZG,EAAU,SAAU6I,EAAMzG,GAGzB,IAFA,GAAIC,GAAI,EACPM,EAAMkG,EAAKvH,OACAqB,EAAJN,EAASA,IAChB,GAAKwG,EAAKxG,KAAOD,EAChB,MAAOC,EAGT,OAAO,IAGRyG,EAAW,6HAKXC,EAAa,sBAEbC,EAAoB,mCAKpBC,EAAaD,EAAkBhF,QAAS,IAAK,MAG7CkF,EAAa,MAAQH,EAAa,KAAOC,EAAoB,OAASD,EAErE,gBAAkBA,EAElB,2DAA6DE,EAAa,OAASF,EACnF,OAEDI,EAAU,KAAOH,EAAoB,wFAKPE,EAAa,eAM3CE,EAAc,GAAIC,QAAQN,EAAa,IAAK,KAC5CnI,EAAQ,GAAIyI,QAAQ,IAAMN,EAAa,8BAAgCA,EAAa,KAAM,KAE1FO,EAAS,GAAID,QAAQ,IAAMN,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,GAAIF,QAAQ,IAAMN,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FS,EAAmB,GAAIH,QAAQ,IAAMN,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FU,EAAU,GAAIJ,QAAQF,GACtBO,EAAc,GAAIL,QAAQ,IAAMJ,EAAa,KAE7CU,GACCC,GAAM,GAAIP,QAAQ,MAAQL,EAAoB,KAC9Ca,MAAS,GAAIR,QAAQ,QAAUL,EAAoB,KACnDc,IAAO,GAAIT,QAAQ,KAAOL,EAAkBhF,QAAS,IAAK,MAAS,KACnE+F,KAAQ,GAAIV,QAAQ,IAAMH,GAC1Bc,OAAU,GAAIX,QAAQ,IAAMF,GAC5Bc,MAAS,GAAIZ,QAAQ,yDAA2DN,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAQ,GAAIb,QAAQ,OAASP,EAAW,KAAM,KAG9CqB,aAAgB,GAAId,QAAQ,IAAMN,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OACXC,GAAU,QAGVC,GAAY,GAAIrB,QAAQ,qBAAuBN,EAAa,MAAQA,EAAa,OAAQ,MACzF4B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACO,EAAPE,EAECC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAO5DG,GAAgB,WACfxD,IAIF,KACC3H,EAAKuC,MACH1C,EAAMC,EAAM2B,KAAMwG,EAAamD,YAChCnD,EAAamD,YAIdvL,EAAKoI,EAAamD,WAAW7J,QAASqD,SACrC,MAAQyG,IACTrL,GAASuC,MAAO1C,EAAI0B,OAGnB,SAAUiC,EAAQ8H,GACjBzC,EAAYtG,MAAOiB,EAAQ1D,EAAM2B,KAAK6J,KAKvC,SAAU9H,EAAQ8H,GACjB,GAAIzI,GAAIW,EAAOjC,OACde,EAAI,CAEL,OAASkB,EAAOX,KAAOyI,EAAIhJ,MAC3BkB,EAAOjC,OAASsB,EAAI,IAKvB,QAASoE,IAAQxG,EAAUC,EAASuF,EAASsF,GAC5C,GAAIC,GAAOnJ,EAAMoJ,EAAG7G,EAEnBtC,EAAGoJ,EAAQC,EAAKC,EAAKC,EAAYC,CAUlC,KAROpL,EAAUA,EAAQqL,eAAiBrL,EAAUuH,KAAmB1I,GACtEoI,EAAajH,GAGdA,EAAUA,GAAWnB,EACrB0G,EAAUA,MACVrB,EAAWlE,EAAQkE,SAEM,gBAAbnE,KAA0BA,GACxB,IAAbmE,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAOqB,EAGR,KAAMsF,GAAQ1D,EAAiB,CAG9B,GAAkB,KAAbjD,IAAoB4G,EAAQhB,EAAWwB,KAAMvL,IAEjD,GAAMgL,EAAID,EAAM,IACf,GAAkB,IAAb5G,EAAiB,CAIrB,GAHAvC,EAAO3B,EAAQuL,eAAgBR,IAG1BpJ,IAAQA,EAAKmD,WAQjB,MAAOS,EALP,IAAK5D,EAAK6J,KAAOT,EAEhB,MADAxF,GAAQjG,KAAMqC,GACP4D,MAOT,IAAKvF,EAAQqL,gBAAkB1J,EAAO3B,EAAQqL,cAAcE,eAAgBR,KAC3EzD,EAAUtH,EAAS2B,IAAUA,EAAK6J,KAAOT,EAEzC,MADAxF,GAAQjG,KAAMqC,GACP4D,MAKH,CAAA,GAAKuF,EAAM,GAEjB,MADAxL,GAAKuC,MAAO0D,EAASvF,EAAQyL,qBAAsB1L,IAC5CwF,CAGD,KAAMwF,EAAID,EAAM,KAAOlL,EAAQ8L,uBAErC,MADApM,GAAKuC,MAAO0D,EAASvF,EAAQ0L,uBAAwBX,IAC9CxF,EAKT,GAAK3F,EAAQ+L,OAASvE,IAAcA,EAAUwE,KAAM7L,IAAc,CASjE,GARAmL,EAAMD,EAAM7H,EACZ+H,EAAanL,EACboL,EAA2B,IAAblH,GAAkBnE,EAMd,IAAbmE,GAAqD,WAAnClE,EAAQkF,SAASC,cAA6B,CACpE6F,EAASrE,EAAU5G,IAEbkL,EAAMjL,EAAQ6L,aAAa,OAChCX,EAAMD,EAAI1H,QAASyG,GAAS,QAE5BhK,EAAQ8L,aAAc,KAAMZ,GAE7BA,EAAM,QAAUA,EAAM,MAEtBtJ,EAAIoJ,EAAOnK,MACX,OAAQe,IACPoJ,EAAOpJ,GAAKsJ,EAAMa,GAAYf,EAAOpJ,GAEtCuJ,GAAapB,GAAS6B,KAAM7L,IAAciM,GAAahM,EAAQ8E,aAAgB9E,EAC/EoL,EAAcJ,EAAOiB,KAAK,KAG3B,GAAKb,EACJ,IAIC,MAHA9L,GAAKuC,MAAO0D,EACX4F,EAAWe,iBAAkBd,IAEvB7F,EACN,MAAM4G,IACN,QACKlB,GACLjL,EAAQoM,gBAAgB,QAQ7B,MAAOvF,GAAQ9G,EAASwD,QAASpD,EAAO,MAAQH,EAASuF,EAASsF,GASnE,QAASlD,MACR,GAAI0E,KAEJ,SAASC,GAAOC,EAAKnH,GAMpB,MAJKiH,GAAK/M,KAAMiN,EAAM,KAAQ/F,EAAKgG,mBAE3BF,GAAOD,EAAKI,SAEZH,EAAOC,EAAM,KAAQnH,EAE9B,MAAOkH,GAOR,QAASI,IAAczM,GAEtB,MADAA,GAAImD,IAAY,EACTnD,EAOR,QAAS0M,IAAQ1M,GAChB,GAAI2M,GAAM/N,EAAS6F,cAAc,MAEjC,KACC,QAASzE,EAAI2M,GACZ,MAAOjC,GACR,OAAO,EACN,QAEIiC,EAAI9H,YACR8H,EAAI9H,WAAWC,YAAa6H,GAG7BA,EAAM,MASR,QAASC,IAAWC,EAAOC,GAC1B,GAAI5N,GAAM2N,EAAMxG,MAAM,KACrB1E,EAAIkL,EAAMjM,MAEX,OAAQe,IACP4E,EAAKwG,WAAY7N,EAAIyC,IAAOmL,EAU9B,QAASE,IAAclF,EAAGC,GACzB,GAAIkF,GAAMlF,GAAKD,EACdoF,EAAOD,GAAsB,IAAfnF,EAAE7D,UAAiC,IAAf8D,EAAE9D,YAChC8D,EAAEoF,aAAenF,KACjBF,EAAEqF,aAAenF,EAGtB,IAAKkF,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQlF,EACZ,MAAO,EAKV,OAAOD,GAAI,EAAI,GAOhB,QAASuF,IAAmBzJ,GAC3B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAKuD,SAASC,aACzB,OAAgB,UAAT1C,GAAoBd,EAAKkC,OAASA,GAQ3C,QAAS0J,IAAoB1J,GAC5B,MAAO,UAAUlC,GAChB,GAAIc,GAAOd,EAAKuD,SAASC,aACzB,QAAiB,UAAT1C,GAA6B,WAATA,IAAsBd,EAAKkC,OAASA,GAQlE,QAAS2J,IAAwBvN,GAChC,MAAOyM,IAAa,SAAUe,GAE7B,MADAA,IAAYA,EACLf,GAAa,SAAU7B,EAAM/E,GACnC,GAAI3D,GACHuL,EAAezN,KAAQ4K,EAAKhK,OAAQ4M,GACpC7L,EAAI8L,EAAa7M,MAGlB,OAAQe,IACFiJ,EAAO1I,EAAIuL,EAAa9L,MAC5BiJ,EAAK1I,KAAO2D,EAAQ3D,GAAK0I,EAAK1I,SAYnC,QAAS6J,IAAahM,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQyL,sBAAwCzL,EAI1EJ,EAAU2G,GAAO3G,WAOjB8G,EAAQH,GAAOG,MAAQ,SAAU/E,GAGhC,GAAIgM,GAAkBhM,IAASA,EAAK0J,eAAiB1J,GAAMgM,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgBzI,UAAsB,GAQhE+B,EAAcV,GAAOU,YAAc,SAAU2G,GAC5C,GAAIC,GAAYC,EACfC,EAAMH,EAAOA,EAAKvC,eAAiBuC,EAAOrG,CAG3C,OAAKwG,KAAQlP,GAA6B,IAAjBkP,EAAI7J,UAAmB6J,EAAIJ,iBAKpD9O,EAAWkP,EACX7G,EAAU6G,EAAIJ,gBACdG,EAASC,EAAIC,YAMRF,GAAUA,IAAWA,EAAOG,MAE3BH,EAAOI,iBACXJ,EAAOI,iBAAkB,SAAUzD,IAAe,GACvCqD,EAAOK,aAClBL,EAAOK,YAAa,WAAY1D,KAMlCtD,GAAkBT,EAAOqH,GAQzBnO,EAAQ6I,WAAakE,GAAO,SAAUC,GAErC,MADAA,GAAIwB,UAAY,KACRxB,EAAIf,aAAa,eAO1BjM,EAAQ6L,qBAAuBkB,GAAO,SAAUC,GAE/C,MADAA,GAAI/H,YAAakJ,EAAIM,cAAc,MAC3BzB,EAAInB,qBAAqB,KAAK5K,SAIvCjB,EAAQ8L,uBAAyB7B,EAAQ+B,KAAMmC,EAAIrC,wBAMnD9L,EAAQ0O,QAAU3B,GAAO,SAAUC,GAElC,MADA1F,GAAQrC,YAAa+H,GAAMpB,GAAKpI,GACxB2K,EAAIQ,oBAAsBR,EAAIQ,kBAAmBnL,GAAUvC,SAI/DjB,EAAQ0O,SACZ9H,EAAKgI,KAAS,GAAI,SAAUhD,EAAIxL,GAC/B,GAAuC,mBAA3BA,GAAQuL,gBAAkCpE,EAAiB,CACtE,GAAI4D,GAAI/K,EAAQuL,eAAgBC,EAGhC,OAAOT,IAAKA,EAAEjG,YAAeiG,QAG/BvE,EAAKiI,OAAW,GAAI,SAAUjD,GAC7B,GAAIkD,GAASlD,EAAGjI,QAAS0G,GAAWC,GACpC,OAAO,UAAUvI,GAChB,MAAOA,GAAKkK,aAAa,QAAU6C,YAM9BlI,GAAKgI,KAAS,GAErBhI,EAAKiI,OAAW,GAAK,SAAUjD,GAC9B,GAAIkD,GAASlD,EAAGjI,QAAS0G,GAAWC,GACpC,OAAO,UAAUvI,GAChB,GAAIiM,GAAwC,mBAA1BjM,GAAKgN,kBAAoChN,EAAKgN,iBAAiB,KACjF,OAAOf,IAAQA,EAAKxI,QAAUsJ,KAMjClI,EAAKgI,KAAU,IAAI5O,EAAQ6L,qBAC1B,SAAUmD,EAAK5O,GACd,MAA6C,mBAAjCA,GAAQyL,qBACZzL,EAAQyL,qBAAsBmD,GAG1BhP,EAAQ+L,IACZ3L,EAAQkM,iBAAkB0C,GAD3B,QAKR,SAAUA,EAAK5O,GACd,GAAI2B,GACHwE,KACAvE,EAAI,EAEJ2D,EAAUvF,EAAQyL,qBAAsBmD,EAGzC,IAAa,MAARA,EAAc,CAClB,MAASjN,EAAO4D,EAAQ3D,KACA,IAAlBD,EAAKuC,UACTiC,EAAI7G,KAAMqC,EAIZ,OAAOwE,GAER,MAAOZ,IAITiB,EAAKgI,KAAY,MAAI5O,EAAQ8L,wBAA0B,SAAU0C,EAAWpO,GAC3E,MAAKmH,GACGnH,EAAQ0L,uBAAwB0C,GADxC,QAWD/G,KAOAD,MAEMxH,EAAQ+L,IAAM9B,EAAQ+B,KAAMmC,EAAI7B,qBAGrCS,GAAO,SAAUC,GAMhB1F,EAAQrC,YAAa+H,GAAMiC,UAAY,UAAYzL,EAAU,qBAC3CA,EAAU,iEAOvBwJ,EAAIV,iBAAiB,wBAAwBrL,QACjDuG,EAAU9H,KAAM,SAAWgJ,EAAa,gBAKnCsE,EAAIV,iBAAiB,cAAcrL,QACxCuG,EAAU9H,KAAM,MAAQgJ,EAAa,aAAeD,EAAW,KAI1DuE,EAAIV,iBAAkB,QAAU9I,EAAU,MAAOvC,QACtDuG,EAAU9H,KAAK,MAMVsN,EAAIV,iBAAiB,YAAYrL,QACtCuG,EAAU9H,KAAK,YAMVsN,EAAIV,iBAAkB,KAAO9I,EAAU,MAAOvC,QACnDuG,EAAU9H,KAAK,cAIjBqN,GAAO,SAAUC,GAGhB,GAAIkC,GAAQf,EAAIrJ,cAAc,QAC9BoK,GAAMhD,aAAc,OAAQ,UAC5Bc,EAAI/H,YAAaiK,GAAQhD,aAAc,OAAQ,KAI1Cc,EAAIV,iBAAiB,YAAYrL,QACrCuG,EAAU9H,KAAM,OAASgJ,EAAa,eAKjCsE,EAAIV,iBAAiB,YAAYrL,QACtCuG,EAAU9H,KAAM,WAAY,aAI7BsN,EAAIV,iBAAiB,QACrB9E,EAAU9H,KAAK,YAIXM,EAAQmP,gBAAkBlF,EAAQ+B,KAAO9F,EAAUoB,EAAQpB,SAChEoB,EAAQ8H,uBACR9H,EAAQ+H,oBACR/H,EAAQgI,kBACRhI,EAAQiI,qBAERxC,GAAO,SAAUC,GAGhBhN,EAAQwP,kBAAoBtJ,EAAQ/E,KAAM6L,EAAK,OAI/C9G,EAAQ/E,KAAM6L,EAAK,aACnBvF,EAAc/H,KAAM,KAAMoJ,KAI5BtB,EAAYA,EAAUvG,QAAU,GAAI+H,QAAQxB,EAAU6E,KAAK,MAC3D5E,EAAgBA,EAAcxG,QAAU,GAAI+H,QAAQvB,EAAc4E,KAAK,MAIvE4B,EAAahE,EAAQ+B,KAAM1E,EAAQmI,yBAKnC/H,EAAWuG,GAAchE,EAAQ+B,KAAM1E,EAAQI,UAC9C,SAAUS,EAAGC,GACZ,GAAIsH,GAAuB,IAAfvH,EAAE7D,SAAiB6D,EAAE4F,gBAAkB5F,EAClDwH,EAAMvH,GAAKA,EAAElD,UACd,OAAOiD,KAAMwH,MAAWA,GAAwB,IAAjBA,EAAIrL,YAClCoL,EAAMhI,SACLgI,EAAMhI,SAAUiI,GAChBxH,EAAEsH,yBAA8D,GAAnCtH,EAAEsH,wBAAyBE,MAG3D,SAAUxH,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAElD,WACd,GAAKkD,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAY+F,EACZ,SAAU9F,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAIR,IAAIwI,IAAWzH,EAAEsH,yBAA2BrH,EAAEqH,uBAC9C,OAAKG,GACGA,GAIRA,GAAYzH,EAAEsD,eAAiBtD,MAAUC,EAAEqD,eAAiBrD,GAC3DD,EAAEsH,wBAAyBrH,GAG3B,EAGc,EAAVwH,IACF5P,EAAQ6P,cAAgBzH,EAAEqH,wBAAyBtH,KAAQyH,EAGxDzH,IAAMgG,GAAOhG,EAAEsD,gBAAkB9D,GAAgBD,EAASC,EAAcQ,GACrE,GAEHC,IAAM+F,GAAO/F,EAAEqD,gBAAkB9D,GAAgBD,EAASC,EAAcS,GACrE,EAIDjB,EACJxH,EAASwH,EAAWgB,GAAMxI,EAASwH,EAAWiB,GAChD,EAGe,EAAVwH,EAAc,GAAK,IAE3B,SAAUzH,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAGR,IAAIkG,GACHtL,EAAI,EACJ8N,EAAM3H,EAAEjD,WACRyK,EAAMvH,EAAElD,WACR6K,GAAO5H,GACP6H,GAAO5H,EAGR,KAAM0H,IAAQH,EACb,MAAOxH,KAAMgG,EAAM,GAClB/F,IAAM+F,EAAM,EACZ2B,EAAM,GACNH,EAAM,EACNxI,EACExH,EAASwH,EAAWgB,GAAMxI,EAASwH,EAAWiB,GAChD,CAGK,IAAK0H,IAAQH,EACnB,MAAOtC,IAAclF,EAAGC,EAIzBkF,GAAMnF,CACN,OAASmF,EAAMA,EAAIpI,WAClB6K,EAAGE,QAAS3C,EAEbA,GAAMlF,CACN,OAASkF,EAAMA,EAAIpI,WAClB8K,EAAGC,QAAS3C,EAIb,OAAQyC,EAAG/N,KAAOgO,EAAGhO,GACpBA,GAGD,OAAOA,GAENqL,GAAc0C,EAAG/N,GAAIgO,EAAGhO,IAGxB+N,EAAG/N,KAAO2F,EAAe,GACzBqI,EAAGhO,KAAO2F,EAAe,EACzB,GAGKwG,GA1WClP,GA6WT0H,GAAOT,QAAU,SAAUgK,EAAMC,GAChC,MAAOxJ,IAAQuJ,EAAM,KAAM,KAAMC,IAGlCxJ,GAAOwI,gBAAkB,SAAUpN,EAAMmO,GASxC,IAPOnO,EAAK0J,eAAiB1J,KAAW9C,GACvCoI,EAAatF,GAIdmO,EAAOA,EAAKvM,QAASwF,EAAkB,aAElCnJ,EAAQmP,kBAAmB5H,GAC5BE,GAAkBA,EAAcuE,KAAMkE,IACtC1I,GAAkBA,EAAUwE,KAAMkE,IAErC,IACC,GAAI1O,GAAM0E,EAAQ/E,KAAMY,EAAMmO,EAG9B,IAAK1O,GAAOxB,EAAQwP,mBAGlBzN,EAAK9C,UAAuC,KAA3B8C,EAAK9C,SAASqF,SAChC,MAAO9C,GAEP,MAAOuJ,IAGV,MAAOpE,IAAQuJ,EAAMjR,EAAU,MAAQ8C,IAASd,OAAS,GAG1D0F,GAAOe,SAAW,SAAUtH,EAAS2B,GAKpC,OAHO3B,EAAQqL,eAAiBrL,KAAcnB,GAC7CoI,EAAajH,GAEPsH,EAAUtH,EAAS2B,IAG3B4E,GAAOyJ,KAAO,SAAUrO,EAAMc,IAEtBd,EAAK0J,eAAiB1J,KAAW9C,GACvCoI,EAAatF,EAGd,IAAI1B,GAAKuG,EAAKwG,WAAYvK,EAAK0C,eAE9B8K,EAAMhQ,GAAMP,EAAOqB,KAAMyF,EAAKwG,WAAYvK,EAAK0C,eAC9ClF,EAAI0B,EAAMc,GAAO0E,GACjBhE,MAEF,OAAeA,UAAR8M,EACNA,EACArQ,EAAQ6I,aAAetB,EACtBxF,EAAKkK,aAAcpJ,IAClBwN,EAAMtO,EAAKgN,iBAAiBlM,KAAUwN,EAAIC,UAC1CD,EAAI7K,MACJ,MAGJmB,GAAO9C,MAAQ,SAAUC,GACxB,KAAM,IAAI3E,OAAO,0CAA4C2E,IAO9D6C,GAAO4J,WAAa,SAAU5K,GAC7B,GAAI5D,GACHyO,KACAjO,EAAI,EACJP,EAAI,CAOL,IAJAoF,GAAgBpH,EAAQyQ,iBACxBtJ,GAAanH,EAAQ0Q,YAAc/K,EAAQnG,MAAO,GAClDmG,EAAQlD,KAAMyF,GAETd,EAAe,CACnB,MAASrF,EAAO4D,EAAQ3D,KAClBD,IAAS4D,EAAS3D,KACtBO,EAAIiO,EAAW9Q,KAAMsC,GAGvB,OAAQO,IACPoD,EAAQjD,OAAQ8N,EAAYjO,GAAK,GAQnC,MAFA4E,GAAY,KAELxB,GAORkB,EAAUF,GAAOE,QAAU,SAAU9E,GACpC,GAAIiM,GACHxM,EAAM,GACNQ,EAAI,EACJsC,EAAWvC,EAAKuC,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBvC,GAAK4O,YAChB,MAAO5O,GAAK4O,WAGZ,KAAM5O,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAK0L,YAC/CjM,GAAOqF,EAAS9E,OAGZ,IAAkB,IAAbuC,GAA+B,IAAbA,EAC7B,MAAOvC,GAAK8O,cAhBZ,OAAS7C,EAAOjM,EAAKC,KAEpBR,GAAOqF,EAASmH,EAkBlB,OAAOxM,IAGRoF,EAAOD,GAAOmK,WAGblE,YAAa,GAEbmE,aAAcjE,GAEd5B,MAAO5B,EAEP8D,cAEAwB,QAEAoC,UACCC,KAAOC,IAAK,aAAc/O,OAAO,GACjCgP,KAAOD,IAAK,cACZE,KAAOF,IAAK,kBAAmB/O,OAAO,GACtCkP,KAAOH,IAAK,oBAGbI,WACC5H,KAAQ,SAAUwB,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGvH,QAAS0G,GAAWC,IAGxCY,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAKvH,QAAS0G,GAAWC,IAExD,OAAbY,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAM1L,MAAO,EAAG,IAGxBoK,MAAS,SAAUsB,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAG3F,cAEY,QAA3B2F,EAAM,GAAG1L,MAAO,EAAG,IAEjB0L,EAAM,IACXvE,GAAO9C,MAAOqH,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBvE,GAAO9C,MAAOqH,EAAM,IAGdA,GAGRvB,OAAU,SAAUuB,GACnB,GAAIqG,GACHC,GAAYtG,EAAM,IAAMA,EAAM,EAE/B,OAAK5B,GAAiB,MAAE0C,KAAMd,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxBsG,GAAYpI,EAAQ4C,KAAMwF,KAEpCD,EAASxK,EAAUyK,GAAU,MAE7BD,EAASC,EAAS7R,QAAS,IAAK6R,EAASvQ,OAASsQ,GAAWC,EAASvQ,UAGvEiK,EAAM,GAAKA,EAAM,GAAG1L,MAAO,EAAG+R,GAC9BrG,EAAM,GAAKsG,EAAShS,MAAO,EAAG+R,IAIxBrG,EAAM1L,MAAO,EAAG,MAIzBqP,QAECpF,IAAO,SAAUgI,GAChB,GAAInM,GAAWmM,EAAiB9N,QAAS0G,GAAWC,IAAY/E,aAChE,OAA4B,MAArBkM,EACN,WAAa,OAAO,GACpB,SAAU1P,GACT,MAAOA,GAAKuD,UAAYvD,EAAKuD,SAASC,gBAAkBD,IAI3DkE,MAAS,SAAUgF,GAClB,GAAIkD,GAAU5J,EAAY0G,EAAY,IAEtC,OAAOkD,KACLA,EAAU,GAAI1I,QAAQ,MAAQN,EAAa,IAAM8F,EAAY,IAAM9F,EAAa,SACjFZ,EAAY0G,EAAW,SAAUzM,GAChC,MAAO2P,GAAQ1F,KAAgC,gBAAnBjK,GAAKyM,WAA0BzM,EAAKyM,WAA0C,mBAAtBzM,GAAKkK,cAAgClK,EAAKkK,aAAa,UAAY,OAI1JvC,KAAQ,SAAU7G,EAAM8O,EAAUC,GACjC,MAAO,UAAU7P,GAChB,GAAI8P,GAASlL,GAAOyJ,KAAMrO,EAAMc,EAEhC,OAAe,OAAVgP,EACgB,OAAbF,EAEFA,GAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOlS,QAASiS,GAChC,OAAbD,EAAoBC,GAASC,EAAOlS,QAASiS,GAAU,GAC1C,OAAbD,EAAoBC,GAASC,EAAOrS,OAAQoS,EAAM3Q,UAAa2Q,EAClD,OAAbD,GAAsB,IAAME,EAAOlO,QAASoF,EAAa,KAAQ,KAAMpJ,QAASiS,GAAU,GAC7E,OAAbD,EAAoBE,IAAWD,GAASC,EAAOrS,MAAO,EAAGoS,EAAM3Q,OAAS,KAAQ2Q,EAAQ,KACxF,IAZO,IAgBVhI,MAAS,SAAU3F,EAAM6N,EAAMjE,EAAU1L,EAAOE,GAC/C,GAAI0P,GAAgC,QAAvB9N,EAAKzE,MAAO,EAAG,GAC3BwS,EAA+B,SAArB/N,EAAKzE,MAAO,IACtByS,EAAkB,YAATH,CAEV,OAAiB,KAAV3P,GAAwB,IAATE,EAGrB,SAAUN,GACT,QAASA,EAAKmD,YAGf,SAAUnD,EAAM3B,EAAS8R,GACxB,GAAIxF,GAAOyF,EAAYnE,EAAMT,EAAM6E,EAAWC,EAC7CnB,EAAMa,IAAWC,EAAU,cAAgB,kBAC3C9D,EAASnM,EAAKmD,WACdrC,EAAOoP,GAAUlQ,EAAKuD,SAASC,cAC/B+M,GAAYJ,IAAQD,CAErB,IAAK/D,EAAS,CAGb,GAAK6D,EAAS,CACb,MAAQb,EAAM,CACblD,EAAOjM,CACP,OAASiM,EAAOA,EAAMkD,GACrB,GAAKe,EAASjE,EAAK1I,SAASC,gBAAkB1C,EAAyB,IAAlBmL,EAAK1J,SACzD,OAAO,CAIT+N,GAAQnB,EAAe,SAATjN,IAAoBoO,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUL,EAAU9D,EAAO0C,WAAa1C,EAAOqE,WAG1CP,GAAWM,EAAW,CAE1BH,EAAajE,EAAQ1K,KAAc0K,EAAQ1K,OAC3CkJ,EAAQyF,EAAYlO,OACpBmO,EAAY1F,EAAM,KAAO9E,GAAW8E,EAAM,GAC1Ca,EAAOb,EAAM,KAAO9E,GAAW8E,EAAM,GACrCsB,EAAOoE,GAAalE,EAAOpD,WAAYsH,EAEvC,OAASpE,IAASoE,GAAapE,GAAQA,EAAMkD,KAG3C3D,EAAO6E,EAAY,IAAMC,EAAM/J,MAGhC,GAAuB,IAAlB0F,EAAK1J,YAAoBiJ,GAAQS,IAASjM,EAAO,CACrDoQ,EAAYlO,IAAW2D,EAASwK,EAAW7E,EAC3C,YAKI,IAAK+E,IAAa5F,GAAS3K,EAAMyB,KAAczB,EAAMyB,QAAkBS,KAAWyI,EAAM,KAAO9E,EACrG2F,EAAOb,EAAM,OAKb,OAASsB,IAASoE,GAAapE,GAAQA,EAAMkD,KAC3C3D,EAAO6E,EAAY,IAAMC,EAAM/J,MAEhC,IAAO2J,EAASjE,EAAK1I,SAASC,gBAAkB1C,EAAyB,IAAlBmL,EAAK1J,aAAsBiJ,IAE5E+E,KACHtE,EAAMxK,KAAcwK,EAAMxK,QAAkBS,IAAW2D,EAAS2F,IAG7DS,IAASjM,GACb,KAQJ,OADAwL,IAAQlL,EACDkL,IAASpL,GAAWoL,EAAOpL,IAAU,GAAKoL,EAAOpL,GAAS,KAKrEwH,OAAU,SAAU6I,EAAQ3E,GAK3B,GAAIhM,GACHxB,EAAKuG,EAAKkC,QAAS0J,IAAY5L,EAAK6L,WAAYD,EAAOjN,gBACtDoB,GAAO9C,MAAO,uBAAyB2O,EAKzC,OAAKnS,GAAImD,GACDnD,EAAIwN,GAIPxN,EAAGY,OAAS,GAChBY,GAAS2Q,EAAQA,EAAQ,GAAI3E,GACtBjH,EAAK6L,WAAW1S,eAAgByS,EAAOjN,eAC7CuH,GAAa,SAAU7B,EAAM/E,GAC5B,GAAIwM,GACHC,EAAUtS,EAAI4K,EAAM4C,GACpB7L,EAAI2Q,EAAQ1R,MACb,OAAQe,IACP0Q,EAAM/S,EAASsL,EAAM0H,EAAQ3Q,IAC7BiJ,EAAMyH,KAAWxM,EAASwM,GAAQC,EAAQ3Q,MAG5C,SAAUD,GACT,MAAO1B,GAAI0B,EAAM,EAAGF,KAIhBxB,IAITyI,SAEC8J,IAAO9F,GAAa,SAAU3M,GAI7B,GAAI+O,MACHvJ,KACAkN,EAAU7L,EAAS7G,EAASwD,QAASpD,EAAO,MAE7C,OAAOsS,GAASrP,GACfsJ,GAAa,SAAU7B,EAAM/E,EAAS9F,EAAS8R,GAC9C,GAAInQ,GACH+Q,EAAYD,EAAS5H,EAAM,KAAMiH,MACjClQ,EAAIiJ,EAAKhK,MAGV,OAAQe,KACDD,EAAO+Q,EAAU9Q,MACtBiJ,EAAKjJ,KAAOkE,EAAQlE,GAAKD,MAI5B,SAAUA,EAAM3B,EAAS8R,GAKxB,MAJAhD,GAAM,GAAKnN,EACX8Q,EAAS3D,EAAO,KAAMgD,EAAKvM,GAE3BuJ,EAAM,GAAK,MACHvJ,EAAQ2C,SAInByK,IAAOjG,GAAa,SAAU3M,GAC7B,MAAO,UAAU4B,GAChB,MAAO4E,IAAQxG,EAAU4B,GAAOd,OAAS,KAI3CyG,SAAYoF,GAAa,SAAU/H,GAElC,MADAA,GAAOA,EAAKpB,QAAS0G,GAAWC,IACzB,SAAUvI,GAChB,OAASA,EAAK4O,aAAe5O,EAAKiR,WAAanM,EAAS9E,IAASpC,QAASoF,GAAS,MAWrFkO,KAAQnG,GAAc,SAAUmG,GAM/B,MAJM5J,GAAY2C,KAAKiH,GAAQ,KAC9BtM,GAAO9C,MAAO,qBAAuBoP,GAEtCA,EAAOA,EAAKtP,QAAS0G,GAAWC,IAAY/E,cACrC,SAAUxD,GAChB,GAAImR,EACJ,GACC,IAAMA,EAAW3L,EAChBxF,EAAKkR,KACLlR,EAAKkK,aAAa,aAAelK,EAAKkK,aAAa,QAGnD,MADAiH,GAAWA,EAAS3N,cACb2N,IAAaD,GAA2C,IAAnCC,EAASvT,QAASsT,EAAO,YAE5ClR,EAAOA,EAAKmD,aAAiC,IAAlBnD,EAAKuC,SAC3C,QAAO,KAKTpB,OAAU,SAAUnB,GACnB,GAAIoR,GAAO/T,EAAOgU,UAAYhU,EAAOgU,SAASD,IAC9C,OAAOA,IAAQA,EAAK3T,MAAO,KAAQuC,EAAK6J,IAGzCyH,KAAQ,SAAUtR,GACjB,MAAOA,KAASuF,GAGjBgM,MAAS,SAAUvR,GAClB,MAAOA,KAAS9C,EAASsU,iBAAmBtU,EAASuU,UAAYvU,EAASuU,gBAAkBzR,EAAKkC,MAAQlC,EAAK0R,OAAS1R,EAAK2R,WAI7HC,QAAW,SAAU5R,GACpB,MAAOA,GAAK6R,YAAa,GAG1BA,SAAY,SAAU7R,GACrB,MAAOA,GAAK6R,YAAa,GAG1BC,QAAW,SAAU9R,GAGpB,GAAIuD,GAAWvD,EAAKuD,SAASC,aAC7B,OAAqB,UAAbD,KAA0BvD,EAAK8R,SAA0B,WAAbvO,KAA2BvD,EAAK+R,UAGrFA,SAAY,SAAU/R,GAOrB,MAJKA,GAAKmD,YACTnD,EAAKmD,WAAW6O,cAGVhS,EAAK+R,YAAa,GAI1BE,MAAS,SAAUjS,GAKlB,IAAMA,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAK0L,YAC/C,GAAK1L,EAAKuC,SAAW,EACpB,OAAO,CAGT,QAAO,GAGR4J,OAAU,SAAUnM,GACnB,OAAQ6E,EAAKkC,QAAe,MAAG/G,IAIhCkS,OAAU,SAAUlS,GACnB,MAAOiI,GAAQgC,KAAMjK,EAAKuD,WAG3B4J,MAAS,SAAUnN,GAClB,MAAOgI,GAAQiC,KAAMjK,EAAKuD,WAG3B4O,OAAU,SAAUnS,GACnB,GAAIc,GAAOd,EAAKuD,SAASC,aACzB,OAAgB,UAAT1C,GAAkC,WAAdd,EAAKkC,MAA8B,WAATpB,GAGtDkC,KAAQ,SAAUhD,GACjB,GAAIqO,EACJ,OAAuC,UAAhCrO,EAAKuD,SAASC,eACN,SAAdxD,EAAKkC,OAImC,OAArCmM,EAAOrO,EAAKkK,aAAa,UAA2C,SAAvBmE,EAAK7K,gBAIvDpD,MAASyL,GAAuB,WAC/B,OAAS,KAGVvL,KAAQuL,GAAuB,SAAUE,EAAc7M,GACtD,OAASA,EAAS,KAGnBmB,GAAMwL,GAAuB,SAAUE,EAAc7M,EAAQ4M,GAC5D,OAAoB,EAAXA,EAAeA,EAAW5M,EAAS4M,KAG7CsG,KAAQvG,GAAuB,SAAUE,EAAc7M,GAEtD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB8L,EAAapO,KAAMsC,EAEpB,OAAO8L,KAGRsG,IAAOxG,GAAuB,SAAUE,EAAc7M,GAErD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB8L,EAAapO,KAAMsC,EAEpB,OAAO8L,KAGRuG,GAAMzG,GAAuB,SAAUE,EAAc7M,EAAQ4M,GAE5D,IADA,GAAI7L,GAAe,EAAX6L,EAAeA,EAAW5M,EAAS4M,IACjC7L,GAAK,GACd8L,EAAapO,KAAMsC,EAEpB,OAAO8L,KAGRwG,GAAM1G,GAAuB,SAAUE,EAAc7M,EAAQ4M,GAE5D,IADA,GAAI7L,GAAe,EAAX6L,EAAeA,EAAW5M,EAAS4M,IACjC7L,EAAIf,GACb6M,EAAapO,KAAMsC,EAEpB,OAAO8L,OAKVlH,EAAKkC,QAAa,IAAIlC,EAAKkC,QAAY,EAGvC,KAAM9G,KAAOuS,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E/N,EAAKkC,QAAS9G,GAAM0L,GAAmB1L,EAExC,KAAMA,KAAO4S,QAAQ,EAAMC,OAAO,GACjCjO,EAAKkC,QAAS9G,GAAM2L,GAAoB3L,EAIzC,SAASyQ,OACTA,GAAW3R,UAAY8F,EAAKkO,QAAUlO,EAAKkC,QAC3ClC,EAAK6L,WAAa,GAAIA,IAEtB1L,EAAWJ,GAAOI,SAAW,SAAU5G,EAAU4U,GAChD,GAAIpC,GAASzH,EAAO8J,EAAQ/Q,EAC3BgR,EAAO7J,EAAQ8J,EACfC,EAASnN,EAAY7H,EAAW,IAEjC,IAAKgV,EACJ,MAAOJ,GAAY,EAAII,EAAO3V,MAAO,EAGtCyV,GAAQ9U,EACRiL,KACA8J,EAAatO,EAAK0K,SAElB,OAAQ2D,EAAQ,GAGTtC,IAAYzH,EAAQjC,EAAOyC,KAAMuJ,OACjC/J,IAEJ+J,EAAQA,EAAMzV,MAAO0L,EAAM,GAAGjK,SAAYgU,GAE3C7J,EAAO1L,KAAOsV,OAGfrC,GAAU,GAGJzH,EAAQhC,EAAawC,KAAMuJ,MAChCtC,EAAUzH,EAAM2B,QAChBmI,EAAOtV,MACN8F,MAAOmN,EAEP1O,KAAMiH,EAAM,GAAGvH,QAASpD,EAAO,OAEhC0U,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI9B,KAAMgD,IAAQ2C,GAAKiI,SACZ3D,EAAQ5B,EAAWrF,GAAOyH,KAAMuJ,KAAcC,EAAYjR,MAC9DiH,EAAQgK,EAAYjR,GAAQiH,MAC7ByH,EAAUzH,EAAM2B,QAChBmI,EAAOtV,MACN8F,MAAOmN,EACP1O,KAAMA,EACNiC,QAASgF,IAEV+J,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI/B,KAAM0R,EACL,MAOF,MAAOoC,GACNE,EAAMhU,OACNgU,EACCtO,GAAO9C,MAAO1D,GAEd6H,EAAY7H,EAAUiL,GAAS5L,MAAO,GAGzC,SAAS2M,IAAY6I,GAIpB,IAHA,GAAIhT,GAAI,EACPM,EAAM0S,EAAO/T,OACbd,EAAW,GACAmC,EAAJN,EAASA,IAChB7B,GAAY6U,EAAOhT,GAAGwD,KAEvB,OAAOrF,GAGR,QAASiV,IAAevC,EAASwC,EAAYC,GAC5C,GAAIpE,GAAMmE,EAAWnE,IACpBqE,EAAmBD,GAAgB,eAARpE,EAC3BsE,EAAW3N,GAEZ,OAAOwN,GAAWlT,MAEjB,SAAUJ,EAAM3B,EAAS8R,GACxB,MAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKuC,UAAkBiR,EAC3B,MAAO1C,GAAS9Q,EAAM3B,EAAS8R,IAMlC,SAAUnQ,EAAM3B,EAAS8R,GACxB,GAAIuD,GAAUtD,EACbuD,GAAa9N,EAAS4N,EAGvB,IAAKtD,GACJ,MAASnQ,EAAOA,EAAMmP,GACrB,IAAuB,IAAlBnP,EAAKuC,UAAkBiR,IACtB1C,EAAS9Q,EAAM3B,EAAS8R,GAC5B,OAAO,MAKV,OAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKuC,UAAkBiR,EAAmB,CAE9C,GADApD,EAAapQ,EAAMyB,KAAczB,EAAMyB,QACjCiS,EAAWtD,EAAYjB,KAC5BuE,EAAU,KAAQ7N,GAAW6N,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHAtD,EAAYjB,GAAQwE,EAGdA,EAAU,GAAM7C,EAAS9Q,EAAM3B,EAAS8R,GAC7C,OAAO,IASf,QAASyD,IAAgBC,GACxB,MAAOA,GAAS3U,OAAS,EACxB,SAAUc,EAAM3B,EAAS8R,GACxB,GAAIlQ,GAAI4T,EAAS3U,MACjB,OAAQe,IACP,IAAM4T,EAAS5T,GAAID,EAAM3B,EAAS8R,GACjC,OAAO,CAGT,QAAO,GAER0D,EAAS,GAGX,QAASC,IAAkB1V,EAAU2V,EAAUnQ,GAG9C,IAFA,GAAI3D,GAAI,EACPM,EAAMwT,EAAS7U,OACJqB,EAAJN,EAASA,IAChB2E,GAAQxG,EAAU2V,EAAS9T,GAAI2D,EAEhC,OAAOA,GAGR,QAASoQ,IAAUjD,EAAWhR,EAAK+M,EAAQzO,EAAS8R,GAOnD,IANA,GAAInQ,GACHiU,KACAhU,EAAI,EACJM,EAAMwQ,EAAU7R,OAChBgV,EAAgB,MAAPnU,EAEEQ,EAAJN,EAASA,KACVD,EAAO+Q,EAAU9Q,OAChB6M,GAAUA,EAAQ9M,EAAM3B,EAAS8R,MACtC8D,EAAatW,KAAMqC,GACdkU,GACJnU,EAAIpC,KAAMsC,GAMd,OAAOgU,GAGR,QAASE,IAAY5E,EAAWnR,EAAU0S,EAASsD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAY3S,KAC/B2S,EAAaD,GAAYC,IAErBC,IAAeA,EAAY5S,KAC/B4S,EAAaF,GAAYE,EAAYC,IAE/BvJ,GAAa,SAAU7B,EAAMtF,EAASvF,EAAS8R,GACrD,GAAIoE,GAAMtU,EAAGD,EACZwU,KACAC,KACAC,EAAc9Q,EAAQ1E,OAGtBM,EAAQ0J,GAAQ4K,GAAkB1V,GAAY,IAAKC,EAAQkE,UAAalE,GAAYA,MAGpFsW,GAAYpF,IAAerG,GAAS9K,EAEnCoB,EADAwU,GAAUxU,EAAOgV,EAAQjF,EAAWlR,EAAS8R,GAG9CyE,EAAa9D,EAEZuD,IAAgBnL,EAAOqG,EAAYmF,GAAeN,MAMjDxQ,EACD+Q,CAQF,IALK7D,GACJA,EAAS6D,EAAWC,EAAYvW,EAAS8R,GAIrCiE,EAAa,CACjBG,EAAOP,GAAUY,EAAYH,GAC7BL,EAAYG,KAAUlW,EAAS8R,GAG/BlQ,EAAIsU,EAAKrV,MACT,OAAQe,KACDD,EAAOuU,EAAKtU,MACjB2U,EAAYH,EAAQxU,MAAS0U,EAAWF,EAAQxU,IAAOD,IAK1D,GAAKkJ,GACJ,GAAKmL,GAAc9E,EAAY,CAC9B,GAAK8E,EAAa,CAEjBE,KACAtU,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,KAEvBsU,EAAK5W,KAAOgX,EAAU1U,GAAKD,EAG7BqU,GAAY,KAAOO,KAAkBL,EAAMpE,GAI5ClQ,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,MACtBsU,EAAOF,EAAazW,EAASsL,EAAMlJ,GAASwU,EAAOvU,IAAM,KAE1DiJ,EAAKqL,KAAU3Q,EAAQ2Q,GAAQvU,SAOlC4U,GAAaZ,GACZY,IAAehR,EACdgR,EAAWjU,OAAQ+T,EAAaE,EAAW1V,QAC3C0V,GAEGP,EACJA,EAAY,KAAMzQ,EAASgR,EAAYzE,GAEvCxS,EAAKuC,MAAO0D,EAASgR,KAMzB,QAASC,IAAmB5B,GAwB3B,IAvBA,GAAI6B,GAAchE,EAAStQ,EAC1BD,EAAM0S,EAAO/T,OACb6V,EAAkBlQ,EAAKoK,SAAUgE,EAAO,GAAG/Q,MAC3C8S,EAAmBD,GAAmBlQ,EAAKoK,SAAS,KACpDhP,EAAI8U,EAAkB,EAAI,EAG1BE,EAAe5B,GAAe,SAAUrT,GACvC,MAAOA,KAAS8U,GACdE,GAAkB,GACrBE,EAAkB7B,GAAe,SAAUrT,GAC1C,MAAOpC,GAASkX,EAAc9U,GAAS,IACrCgV,GAAkB,GACrBnB,GAAa,SAAU7T,EAAM3B,EAAS8R,GACrC,GAAI1Q,IAASsV,IAAqB5E,GAAO9R,IAAY8G,MACnD2P,EAAezW,GAASkE,SACxB0S,EAAcjV,EAAM3B,EAAS8R,GAC7B+E,EAAiBlV,EAAM3B,EAAS8R,GAGlC,OADA2E,GAAe,KACRrV,IAGGc,EAAJN,EAASA,IAChB,GAAM6Q,EAAUjM,EAAKoK,SAAUgE,EAAOhT,GAAGiC,MACxC2R,GAAaR,GAAcO,GAAgBC,GAAY/C,QACjD,CAIN,GAHAA,EAAUjM,EAAKiI,OAAQmG,EAAOhT,GAAGiC,MAAOhC,MAAO,KAAM+S,EAAOhT,GAAGkE,SAG1D2M,EAASrP,GAAY,CAGzB,IADAjB,IAAMP,EACMM,EAAJC,EAASA,IAChB,GAAKqE,EAAKoK,SAAUgE,EAAOzS,GAAG0B,MAC7B,KAGF,OAAOiS,IACNlU,EAAI,GAAK2T,GAAgBC,GACzB5T,EAAI,GAAKmK,GAER6I,EAAOxV,MAAO,EAAGwC,EAAI,GAAIvC,QAAS+F,MAAgC,MAAzBwP,EAAQhT,EAAI,GAAIiC,KAAe,IAAM,MAC7EN,QAASpD,EAAO,MAClBsS,EACItQ,EAAJP,GAAS4U,GAAmB5B,EAAOxV,MAAOwC,EAAGO,IACzCD,EAAJC,GAAWqU,GAAoB5B,EAASA,EAAOxV,MAAO+C,IAClDD,EAAJC,GAAW4J,GAAY6I,IAGzBY,EAASlW,KAAMmT,GAIjB,MAAO8C,IAAgBC,GAGxB,QAASsB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYnW,OAAS,EAChCqW,EAAYH,EAAgBlW,OAAS,EACrCsW,EAAe,SAAUtM,EAAM7K,EAAS8R,EAAKvM,EAAS6R,GACrD,GAAIzV,GAAMQ,EAAGsQ,EACZ4E,EAAe,EACfzV,EAAI,IACJ8Q,EAAY7H,MACZyM,KACAC,EAAgBzQ,EAEhB3F,EAAQ0J,GAAQqM,GAAa1Q,EAAKgI,KAAU,IAAG,IAAK4I,GAEpDI,EAAiBhQ,GAA4B,MAAjB+P,EAAwB,EAAIlU,KAAKC,UAAY,GACzEpB,EAAMf,EAAMN,MAUb,KARKuW,IACJtQ,EAAmB9G,IAAYnB,GAAYmB,GAOpC4B,IAAMM,GAA4B,OAApBP,EAAOR,EAAMS,IAAaA,IAAM,CACrD,GAAKsV,GAAavV,EAAO,CACxBQ,EAAI,CACJ,OAASsQ,EAAUsE,EAAgB5U,KAClC,GAAKsQ,EAAS9Q,EAAM3B,EAAS8R,GAAQ,CACpCvM,EAAQjG,KAAMqC,EACd,OAGGyV,IACJ5P,EAAUgQ,GAKPP,KAEEtV,GAAQ8Q,GAAW9Q,IACxB0V,IAIIxM,GACJ6H,EAAUpT,KAAMqC,IAOnB,GADA0V,GAAgBzV,EACXqV,GAASrV,IAAMyV,EAAe,CAClClV,EAAI,CACJ,OAASsQ,EAAUuE,EAAY7U,KAC9BsQ,EAASC,EAAW4E,EAAYtX,EAAS8R,EAG1C,IAAKjH,EAAO,CAEX,GAAKwM,EAAe,EACnB,MAAQzV,IACA8Q,EAAU9Q,IAAM0V,EAAW1V,KACjC0V,EAAW1V,GAAKsG,EAAInH,KAAMwE,GAM7B+R,GAAa3B,GAAU2B,GAIxBhY,EAAKuC,MAAO0D,EAAS+R,GAGhBF,IAAcvM,GAAQyM,EAAWzW,OAAS,GAC5CwW,EAAeL,EAAYnW,OAAW,GAExC0F,GAAO4J,WAAY5K,GAUrB,MALK6R,KACJ5P,EAAUgQ,EACV1Q,EAAmByQ,GAGb7E,EAGT,OAAOuE,GACNvK,GAAcyK,GACdA,EA+KF,MA5KAvQ,GAAUL,GAAOK,QAAU,SAAU7G,EAAU+K,GAC9C,GAAIlJ,GACHoV,KACAD,KACAhC,EAASlN,EAAe9H,EAAW,IAEpC,KAAMgV,EAAS,CAERjK,IACLA,EAAQnE,EAAU5G,IAEnB6B,EAAIkJ,EAAMjK,MACV,OAAQe,IACPmT,EAASyB,GAAmB1L,EAAMlJ,IAC7BmT,EAAQ3R,GACZ4T,EAAY1X,KAAMyV,GAElBgC,EAAgBzX,KAAMyV,EAKxBA,GAASlN,EAAe9H,EAAU+W,GAA0BC,EAAiBC,IAG7EjC,EAAOhV,SAAWA,EAEnB,MAAOgV,IAYRlO,EAASN,GAAOM,OAAS,SAAU9G,EAAUC,EAASuF,EAASsF,GAC9D,GAAIjJ,GAAGgT,EAAQ6C,EAAO5T,EAAM2K,EAC3BkJ,EAA+B,kBAAb3X,IAA2BA,EAC7C+K,GAASD,GAAQlE,EAAW5G,EAAW2X,EAAS3X,UAAYA,EAK7D,IAHAwF,EAAUA,MAGY,IAAjBuF,EAAMjK,OAAe,CAIzB,GADA+T,EAAS9J,EAAM,GAAKA,EAAM,GAAG1L,MAAO,GAC/BwV,EAAO/T,OAAS,GAAkC,QAA5B4W,EAAQ7C,EAAO,IAAI/Q,MAC5CjE,EAAQ0O,SAAgC,IAArBtO,EAAQkE,UAAkBiD,GAC7CX,EAAKoK,SAAUgE,EAAO,GAAG/Q,MAAS,CAGnC,GADA7D,GAAYwG,EAAKgI,KAAS,GAAGiJ,EAAM3R,QAAQ,GAAGvC,QAAQ0G,GAAWC,IAAYlK,QAAkB,IACzFA,EACL,MAAOuF,EAGImS,KACX1X,EAAUA,EAAQ8E,YAGnB/E,EAAWA,EAASX,MAAOwV,EAAOnI,QAAQrH,MAAMvE,QAIjDe,EAAIsH,EAAwB,aAAE0C,KAAM7L,GAAa,EAAI6U,EAAO/T,MAC5D,OAAQe,IAAM,CAIb,GAHA6V,EAAQ7C,EAAOhT,GAGV4E,EAAKoK,SAAW/M,EAAO4T,EAAM5T,MACjC,KAED,KAAM2K,EAAOhI,EAAKgI,KAAM3K,MAEjBgH,EAAO2D,EACZiJ,EAAM3R,QAAQ,GAAGvC,QAAS0G,GAAWC,IACrCH,GAAS6B,KAAMgJ,EAAO,GAAG/Q,OAAUmI,GAAahM,EAAQ8E,aAAgB9E,IACpE,CAKJ,GAFA4U,EAAOtS,OAAQV,EAAG,GAClB7B,EAAW8K,EAAKhK,QAAUkL,GAAY6I,IAChC7U,EAEL,MADAT,GAAKuC,MAAO0D,EAASsF,GACdtF,CAGR,SAeJ,OAPEmS,GAAY9Q,EAAS7G,EAAU+K,IAChCD,EACA7K,GACCmH,EACD5B,EACAwE,GAAS6B,KAAM7L,IAAciM,GAAahM,EAAQ8E,aAAgB9E,GAE5DuF,GAMR3F,EAAQ0Q,WAAalN,EAAQkD,MAAM,IAAIjE,KAAMyF,GAAYmE,KAAK,MAAQ7I,EAItExD,EAAQyQ,mBAAqBrJ,EAG7BC,IAIArH,EAAQ6P,aAAe9C,GAAO,SAAUgL,GAEvC,MAAuE,GAAhEA,EAAKtI,wBAAyBxQ,EAAS6F,cAAc,UAMvDiI,GAAO,SAAUC,GAEtB,MADAA,GAAIiC,UAAY,mBAC+B,MAAxCjC,EAAI4D,WAAW3E,aAAa,WAEnCgB,GAAW,yBAA0B,SAAUlL,EAAMc,EAAMiE,GAC1D,MAAMA,GAAN,OACQ/E,EAAKkK,aAAcpJ,EAA6B,SAAvBA,EAAK0C,cAA2B,EAAI,KAOjEvF,EAAQ6I,YAAekE,GAAO,SAAUC,GAG7C,MAFAA,GAAIiC,UAAY,WAChBjC,EAAI4D,WAAW1E,aAAc,QAAS,IACY,KAA3Cc,EAAI4D,WAAW3E,aAAc,YAEpCgB,GAAW,QAAS,SAAUlL,EAAMc,EAAMiE,GACzC,MAAMA,IAAyC,UAAhC/E,EAAKuD,SAASC,cAA7B,OACQxD,EAAKiW,eAOTjL,GAAO,SAAUC,GACtB,MAAuC,OAAhCA,EAAIf,aAAa,eAExBgB,GAAWxE,EAAU,SAAU1G,EAAMc,EAAMiE,GAC1C,GAAIuJ,EACJ,OAAMvJ,GAAN,OACQ/E,EAAMc,MAAW,EAAOA,EAAK0C,eACjC8K,EAAMtO,EAAKgN,iBAAkBlM,KAAWwN,EAAIC,UAC7CD,EAAI7K,MACL,OAKGmB,IAEHvH,EAIJc,GAAO0O,KAAOjI,EACdzG,EAAOgQ,KAAOvJ,EAAOmK,UACrB5Q,EAAOgQ,KAAK,KAAOhQ,EAAOgQ,KAAKpH,QAC/B5I,EAAO+X,OAAStR,EAAO4J,WACvBrQ,EAAO6E,KAAO4B,EAAOE,QACrB3G,EAAOgY,SAAWvR,EAAOG,MACzB5G,EAAOwH,SAAWf,EAAOe,QAIzB,IAAIyQ,GAAgBjY,EAAOgQ,KAAKhF,MAAMpB,aAElCsO,EAAa,6BAIbC,EAAY,gBAGhB,SAASC,GAAQnI,EAAUoI,EAAW3F,GACrC,GAAK1S,EAAOkD,WAAYmV,GACvB,MAAOrY,GAAO6F,KAAMoK,EAAU,SAAUpO,EAAMC,GAE7C,QAASuW,EAAUpX,KAAMY,EAAMC,EAAGD,KAAW6Q,GAK/C,IAAK2F,EAAUjU,SACd,MAAOpE,GAAO6F,KAAMoK,EAAU,SAAUpO,GACvC,MAASA,KAASwW,IAAgB3F,GAKpC,IAA0B,gBAAd2F,GAAyB,CACpC,GAAKF,EAAUrM,KAAMuM,GACpB,MAAOrY,GAAO2O,OAAQ0J,EAAWpI,EAAUyC,EAG5C2F,GAAYrY,EAAO2O,OAAQ0J,EAAWpI,GAGvC,MAAOjQ,GAAO6F,KAAMoK,EAAU,SAAUpO,GACvC,MAASpC,GAAQwB,KAAMoX,EAAWxW,IAAU,IAAQ6Q,IAItD1S,EAAO2O,OAAS,SAAUqB,EAAM3O,EAAOqR,GACtC,GAAI7Q,GAAOR,EAAO,EAMlB,OAJKqR,KACJ1C,EAAO,QAAUA,EAAO,KAGD,IAAjB3O,EAAMN,QAAkC,IAAlBc,EAAKuC,SACjCpE,EAAO0O,KAAKO,gBAAiBpN,EAAMmO,IAAWnO,MAC9C7B,EAAO0O,KAAK1I,QAASgK,EAAMhQ,EAAO6F,KAAMxE,EAAO,SAAUQ,GACxD,MAAyB,KAAlBA,EAAKuC,aAIfpE,EAAOG,GAAGsC,QACTiM,KAAM,SAAUzO,GACf,GAAI6B,GACHM,EAAMjD,KAAK4B,OACXO,KACAgX,EAAOnZ,IAER,IAAyB,gBAAbc,GACX,MAAOd,MAAKiC,UAAWpB,EAAQC,GAAW0O,OAAO,WAChD,IAAM7M,EAAI,EAAOM,EAAJN,EAASA,IACrB,GAAK9B,EAAOwH,SAAU8Q,EAAMxW,GAAK3C,MAChC,OAAO,IAMX,KAAM2C,EAAI,EAAOM,EAAJN,EAASA,IACrB9B,EAAO0O,KAAMzO,EAAUqY,EAAMxW,GAAKR,EAMnC,OAFAA,GAAMnC,KAAKiC,UAAWgB,EAAM,EAAIpC,EAAO+X,OAAQzW,GAAQA,GACvDA,EAAIrB,SAAWd,KAAKc,SAAWd,KAAKc,SAAW,IAAMA,EAAWA,EACzDqB,GAERqN,OAAQ,SAAU1O,GACjB,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDyS,IAAK,SAAUzS,GACd,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDsY,GAAI,SAAUtY,GACb,QAASmY,EACRjZ,KAIoB,gBAAbc,IAAyBgY,EAAcnM,KAAM7L,GACnDD,EAAQC,GACRA,OACD,GACCc,SASJ,IAAIyX,GAKHxO,EAAa,sCAEb5J,EAAOJ,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,GAC3C,GAAI8K,GAAOnJ,CAGX,KAAM5B,EACL,MAAOd,KAIR,IAAyB,gBAAbc,GAAwB,CAUnC,GAPC+K,EAFoB,MAAhB/K,EAAS,IAAkD,MAApCA,EAAUA,EAASc,OAAS,IAAed,EAASc,QAAU,GAE/E,KAAMd,EAAU,MAGlB+J,EAAWwB,KAAMvL,IAIrB+K,IAAUA,EAAM,IAAO9K,EAgDrB,OAAMA,GAAWA,EAAQW,QACtBX,GAAWsY,GAAa9J,KAAMzO,GAKhCd,KAAK2B,YAAaZ,GAAUwO,KAAMzO,EAnDzC,IAAK+K,EAAM,GAAK,CAYf,GAXA9K,EAAUA,YAAmBF,GAASE,EAAQ,GAAKA,EAInDF,EAAOuB,MAAOpC,KAAMa,EAAOyY,UAC1BzN,EAAM,GACN9K,GAAWA,EAAQkE,SAAWlE,EAAQqL,eAAiBrL,EAAUnB,GACjE,IAIImZ,EAAWpM,KAAMd,EAAM,KAAQhL,EAAOmD,cAAejD,GACzD,IAAM8K,IAAS9K,GAETF,EAAOkD,WAAY/D,KAAM6L,IAC7B7L,KAAM6L,GAAS9K,EAAS8K,IAIxB7L,KAAK+Q,KAAMlF,EAAO9K,EAAS8K,GAK9B,OAAO7L,MAgBP,MAZA0C,GAAO9C,EAAS0M,eAAgBT,EAAM,IAIjCnJ,GAAQA,EAAKmD,aAEjB7F,KAAK4B,OAAS,EACd5B,KAAK,GAAK0C,GAGX1C,KAAKe,QAAUnB,EACfI,KAAKc,SAAWA,EACTd,KAcH,MAAKc,GAASmE,UACpBjF,KAAKe,QAAUf,KAAK,GAAKc,EACzBd,KAAK4B,OAAS,EACP5B,MAIIa,EAAOkD,WAAYjD,GACK,mBAArBuY,GAAWE,MACxBF,EAAWE,MAAOzY,GAElBA,EAAUD,IAGeqD,SAAtBpD,EAASA,WACbd,KAAKc,SAAWA,EAASA,SACzBd,KAAKe,QAAUD,EAASC,SAGlBF,EAAOwF,UAAWvF,EAAUd,OAIrCiB,GAAKQ,UAAYZ,EAAOG,GAGxBqY,EAAaxY,EAAQjB,EAGrB,IAAI4Z,GAAe,iCAElBC,GACCC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,MAAM,EAGRhZ,GAAOyC,QACNuO,IAAK,SAAUnP,EAAMmP,EAAKiI,GACzB,GAAIxG,MACHyG,EAAqB7V,SAAV4V,CAEZ,QAASpX,EAAOA,EAAMmP,KAA4B,IAAlBnP,EAAKuC,SACpC,GAAuB,IAAlBvC,EAAKuC,SAAiB,CAC1B,GAAK8U,GAAYlZ,EAAQ6B,GAAO0W,GAAIU,GACnC,KAEDxG,GAAQjT,KAAMqC,GAGhB,MAAO4Q,IAGR0G,QAAS,SAAUC,EAAGvX,GAGrB,IAFA,GAAI4Q,MAEI2G,EAAGA,EAAIA,EAAE7L,YACI,IAAf6L,EAAEhV,UAAkBgV,IAAMvX,GAC9B4Q,EAAQjT,KAAM4Z,EAIhB,OAAO3G,MAITzS,EAAOG,GAAGsC,QACToQ,IAAK,SAAU7P,GACd,GAAIqW,GAAUrZ,EAAQgD,EAAQ7D,MAC7Bma,EAAID,EAAQtY,MAEb,OAAO5B,MAAKwP,OAAO,WAElB,IADA,GAAI7M,GAAI,EACIwX,EAAJxX,EAAOA,IACd,GAAK9B,EAAOwH,SAAUrI,KAAMka,EAAQvX,IACnC,OAAO,KAMXyX,QAAS,SAAU3I,EAAW1Q,GAS7B,IARA,GAAIkN,GACHtL,EAAI,EACJwX,EAAIna,KAAK4B,OACT0R,KACA+G,EAAMvB,EAAcnM,KAAM8E,IAAoC,gBAAdA,GAC/C5Q,EAAQ4Q,EAAW1Q,GAAWf,KAAKe,SACnC,EAEUoZ,EAAJxX,EAAOA,IACd,IAAMsL,EAAMjO,KAAK2C,GAAIsL,GAAOA,IAAQlN,EAASkN,EAAMA,EAAIpI,WAEtD,GAAKoI,EAAIhJ,SAAW,KAAOoV,EAC1BA,EAAIC,MAAMrM,GAAO,GAGA,IAAjBA,EAAIhJ,UACHpE,EAAO0O,KAAKO,gBAAgB7B,EAAKwD,IAAc,CAEhD6B,EAAQjT,KAAM4N,EACd,OAKH,MAAOjO,MAAKiC,UAAWqR,EAAQ1R,OAAS,EAAIf,EAAO+X,OAAQtF,GAAYA,IAIxEgH,MAAO,SAAU5X,GAGhB,MAAMA,GAKe,gBAATA,GACJpC,EAAQwB,KAAMjB,EAAQ6B,GAAQ1C,KAAM,IAIrCM,EAAQwB,KAAM9B,KAGpB0C,EAAKhB,OAASgB,EAAM,GAAMA,GAZjB1C,KAAM,IAAOA,KAAM,GAAI6F,WAAe7F,KAAK8C,QAAQyX,UAAU3Y,OAAS,IAgBjF4Y,IAAK,SAAU1Z,EAAUC,GACxB,MAAOf,MAAKiC,UACXpB,EAAO+X,OACN/X,EAAOuB,MAAOpC,KAAK+B,MAAOlB,EAAQC,EAAUC,OAK/C0Z,QAAS,SAAU3Z,GAClB,MAAOd,MAAKwa,IAAiB,MAAZ1Z,EAChBd,KAAKqC,WAAarC,KAAKqC,WAAWmN,OAAO1O,MAK5C,SAASkZ,GAAS/L,EAAK4D,GACtB,OAAS5D,EAAMA,EAAI4D,KAA0B,IAAjB5D,EAAIhJ,UAChC,MAAOgJ,GAGRpN,EAAOyB,MACNuM,OAAQ,SAAUnM,GACjB,GAAImM,GAASnM,EAAKmD,UAClB,OAAOgJ,IAA8B,KAApBA,EAAO5J,SAAkB4J,EAAS,MAEpD6L,QAAS,SAAUhY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,eAE1BiY,aAAc,SAAUjY,EAAMC,EAAGmX,GAChC,MAAOjZ,GAAOgR,IAAKnP,EAAM,aAAcoX,IAExCF,KAAM,SAAUlX,GACf,MAAOsX,GAAStX,EAAM,gBAEvBmX,KAAM,SAAUnX,GACf,MAAOsX,GAAStX,EAAM,oBAEvBkY,QAAS,SAAUlY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,gBAE1B6X,QAAS,SAAU7X,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,oBAE1BmY,UAAW,SAAUnY,EAAMC,EAAGmX,GAC7B,MAAOjZ,GAAOgR,IAAKnP,EAAM,cAAeoX,IAEzCgB,UAAW,SAAUpY,EAAMC,EAAGmX,GAC7B,MAAOjZ,GAAOgR,IAAKnP,EAAM,kBAAmBoX,IAE7CiB,SAAU,SAAUrY,GACnB,MAAO7B,GAAOmZ,SAAWtX,EAAKmD,gBAAmB0L,WAAY7O,IAE9DgX,SAAU,SAAUhX,GACnB,MAAO7B,GAAOmZ,QAAStX,EAAK6O,aAE7BoI,SAAU,SAAUjX,GACnB,MAAOA,GAAKsY,iBAAmBna,EAAOuB,SAAWM,EAAK+I,cAErD,SAAUjI,EAAMxC,GAClBH,EAAOG,GAAIwC,GAAS,SAAUsW,EAAOhZ,GACpC,GAAIwS,GAAUzS,EAAO4B,IAAKzC,KAAMgB,EAAI8Y,EAsBpC,OApB0B,UAArBtW,EAAKrD,MAAO,MAChBW,EAAWgZ,GAGPhZ,GAAgC,gBAAbA,KACvBwS,EAAUzS,EAAO2O,OAAQ1O,EAAUwS,IAG/BtT,KAAK4B,OAAS,IAEZ6X,EAAkBjW,IACvB3C,EAAO+X,OAAQtF,GAIXkG,EAAa7M,KAAMnJ,IACvB8P,EAAQ2H,WAIHjb,KAAKiC,UAAWqR,KAGzB,IAAI4H,GAAY,OAKZC,IAGJ,SAASC,GAAe7X,GACvB,GAAI8X,GAASF,EAAc5X,KAI3B,OAHA1C,GAAOyB,KAAMiB,EAAQsI,MAAOqP,OAAmB,SAAUhQ,EAAGoQ,GAC3DD,EAAQC,IAAS,IAEXD,EAyBRxa,EAAO0a,UAAY,SAAUhY,GAI5BA,EAA6B,gBAAZA,GACd4X,EAAc5X,IAAa6X,EAAe7X,GAC5C1C,EAAOyC,UAAYC,EAEpB,IACCiY,GAEAC,EAEAC,EAEAC,EAEAC,EAEAC,EAEA1S,KAEA2S,GAASvY,EAAQwY,SAEjBC,EAAO,SAAUC,GAOhB,IANAT,EAASjY,EAAQiY,QAAUS,EAC3BR,GAAQ,EACRI,EAAcF,GAAe,EAC7BA,EAAc,EACdC,EAAezS,EAAKvH,OACpB8Z,GAAS,EACDvS,GAAsByS,EAAdC,EAA4BA,IAC3C,GAAK1S,EAAM0S,GAAcjZ,MAAOqZ,EAAM,GAAKA,EAAM,OAAU,GAAS1Y,EAAQ2Y,YAAc,CACzFV,GAAS,CACT,OAGFE,GAAS,EACJvS,IACC2S,EACCA,EAAMla,QACVoa,EAAMF,EAAMtO,SAEFgO,EACXrS,KAEAgQ,EAAKgD,YAKRhD,GAECqB,IAAK,WACJ,GAAKrR,EAAO,CAEX,GAAI6J,GAAQ7J,EAAKvH,QACjB,QAAU4Y,GAAKhY,GACd3B,EAAOyB,KAAME,EAAM,SAAU0I,EAAGnE,GAC/B,GAAInC,GAAO/D,EAAO+D,KAAMmC,EACV,cAATnC,EACErB,EAAQqV,QAAWO,EAAKzF,IAAK3M,IAClCoC,EAAK9I,KAAM0G,GAEDA,GAAOA,EAAInF,QAAmB,WAATgD,GAEhC4V,EAAKzT,MAGJlE,WAGC6Y,EACJE,EAAezS,EAAKvH,OAGT4Z,IACXG,EAAc3I,EACdgJ,EAAMR,IAGR,MAAOxb,OAGRoc,OAAQ,WAkBP,MAjBKjT,IACJtI,EAAOyB,KAAMO,UAAW,SAAUqI,EAAGnE,GACpC,GAAIuT,EACJ,QAAUA,EAAQzZ,EAAO2F,QAASO,EAAKoC,EAAMmR,IAAY,GACxDnR,EAAK9F,OAAQiX,EAAO,GAEfoB,IACUE,GAATtB,GACJsB,IAEaC,GAATvB,GACJuB,OAME7b,MAIR0T,IAAK,SAAU1S,GACd,MAAOA,GAAKH,EAAO2F,QAASxF,EAAImI,GAAS,MAASA,IAAQA,EAAKvH,SAGhE+S,MAAO,WAGN,MAFAxL,MACAyS,EAAe,EACR5b,MAGRmc,QAAS,WAER,MADAhT,GAAO2S,EAAQN,EAAStX,OACjBlE,MAGRuU,SAAU,WACT,OAAQpL,GAGTkT,KAAM,WAKL,MAJAP,GAAQ5X,OACFsX,GACLrC,EAAKgD,UAECnc,MAGRsc,OAAQ,WACP,OAAQR,GAGTS,SAAU,SAAUxb,EAASyB,GAU5B,OATK2G,GAAWsS,IAASK,IACxBtZ,EAAOA,MACPA,GAASzB,EAASyB,EAAKrC,MAAQqC,EAAKrC,QAAUqC,GACzCkZ,EACJI,EAAMzb,KAAMmC,GAEZwZ,EAAMxZ,IAGDxC,MAGRgc,KAAM,WAEL,MADA7C,GAAKoD,SAAUvc,KAAM6C,WACd7C,MAGRyb,MAAO,WACN,QAASA,GAIZ,OAAOtC,IAIRtY,EAAOyC,QAENkZ,SAAU,SAAUC,GACnB,GAAIC,KAEA,UAAW,OAAQ7b,EAAO0a,UAAU,eAAgB,aACpD,SAAU,OAAQ1a,EAAO0a,UAAU,eAAgB,aACnD,SAAU,WAAY1a,EAAO0a,UAAU,YAE1CoB,EAAQ,UACRC,GACCD,MAAO,WACN,MAAOA,IAERE,OAAQ,WAEP,MADAC,GAAStU,KAAM3F,WAAYka,KAAMla,WAC1B7C,MAERgd,KAAM,WACL,GAAIC,GAAMpa,SACV,OAAOhC,GAAO2b,SAAS,SAAUU,GAChCrc,EAAOyB,KAAMoa,EAAQ,SAAU/Z,EAAGwa,GACjC,GAAInc,GAAKH,EAAOkD,WAAYkZ,EAAKta,KAASsa,EAAKta,EAE/Cma,GAAUK,EAAM,IAAK,WACpB,GAAIC,GAAWpc,GAAMA,EAAG4B,MAAO5C,KAAM6C,UAChCua,IAAYvc,EAAOkD,WAAYqZ,EAASR,SAC5CQ,EAASR,UACPpU,KAAM0U,EAASG,SACfN,KAAMG,EAASI,QACfC,SAAUL,EAASM,QAErBN,EAAUC,EAAO,GAAM,QAAUnd,OAAS4c,EAAUM,EAASN,UAAY5c,KAAMgB,GAAOoc,GAAava,eAItGoa,EAAM,OACJL,WAIJA,QAAS,SAAUjY,GAClB,MAAc,OAAPA,EAAc9D,EAAOyC,OAAQqB,EAAKiY,GAAYA,IAGvDE,IAwCD,OArCAF,GAAQa,KAAOb,EAAQI,KAGvBnc,EAAOyB,KAAMoa,EAAQ,SAAU/Z,EAAGwa,GACjC,GAAIhU,GAAOgU,EAAO,GACjBO,EAAcP,EAAO,EAGtBP,GAASO,EAAM,IAAOhU,EAAKqR,IAGtBkD,GACJvU,EAAKqR,IAAI,WAERmC,EAAQe,GAGNhB,EAAY,EAAJ/Z,GAAS,GAAIwZ,QAASO,EAAQ,GAAK,GAAIL,MAInDS,EAAUK,EAAM,IAAO,WAEtB,MADAL,GAAUK,EAAM,GAAK,QAAUnd,OAAS8c,EAAWF,EAAU5c,KAAM6C,WAC5D7C,MAER8c,EAAUK,EAAM,GAAK,QAAWhU,EAAKoT,WAItCK,EAAQA,QAASE,GAGZL,GACJA,EAAK3a,KAAMgb,EAAUA,GAIfA,GAIRa,KAAM,SAAUC,GACf,GAAIjb,GAAI,EACPkb,EAAgB1d,EAAM2B,KAAMe,WAC5BjB,EAASic,EAAcjc,OAGvBkc,EAAuB,IAAXlc,GAAkBgc,GAAe/c,EAAOkD,WAAY6Z,EAAYhB,SAAchb,EAAS,EAGnGkb,EAAyB,IAAdgB,EAAkBF,EAAc/c,EAAO2b,WAGlDuB,EAAa,SAAUpb,EAAG8T,EAAUuH,GACnC,MAAO,UAAU7X,GAChBsQ,EAAU9T,GAAM3C,KAChBge,EAAQrb,GAAME,UAAUjB,OAAS,EAAIzB,EAAM2B,KAAMe,WAAcsD,EAC1D6X,IAAWC,EACfnB,EAASoB,WAAYzH,EAAUuH,KACfF,GAChBhB,EAASqB,YAAa1H,EAAUuH,KAKnCC,EAAgBG,EAAkBC,CAGnC,IAAKzc,EAAS,EAIb,IAHAqc,EAAiB,GAAIpZ,OAAOjD,GAC5Bwc,EAAmB,GAAIvZ,OAAOjD,GAC9Byc,EAAkB,GAAIxZ,OAAOjD,GACjBA,EAAJe,EAAYA,IACdkb,EAAelb,IAAO9B,EAAOkD,WAAY8Z,EAAelb,GAAIia,SAChEiB,EAAelb,GAAIia,UACjBpU,KAAMuV,EAAYpb,EAAG0b,EAAiBR,IACtCd,KAAMD,EAASQ,QACfC,SAAUQ,EAAYpb,EAAGyb,EAAkBH,MAE3CH,CAUL,OAJMA,IACLhB,EAASqB,YAAaE,EAAiBR,GAGjCf,EAASF,YAMlB,IAAI0B,EAEJzd,GAAOG,GAAGuY,MAAQ,SAAUvY,GAI3B,MAFAH,GAAO0Y,MAAMqD,UAAUpU,KAAMxH,GAEtBhB,MAGRa,EAAOyC,QAENiB,SAAS,EAITga,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJ5d,EAAO0d,YAEP1d,EAAO0Y,OAAO,IAKhBA,MAAO,SAAUmF,IAGXA,KAAS,IAAS7d,EAAO0d,UAAY1d,EAAO0D,WAKjD1D,EAAO0D,SAAU,EAGZma,KAAS,KAAU7d,EAAO0d,UAAY,IAK3CD,EAAUH,YAAave,GAAYiB,IAG9BA,EAAOG,GAAG2d,iBACd9d,EAAQjB,GAAW+e,eAAgB,SACnC9d,EAAQjB,GAAWgf,IAAK,cAQ3B,SAASC,KACRjf,EAASkf,oBAAqB,mBAAoBD,GAAW,GAC7D9e,EAAO+e,oBAAqB,OAAQD,GAAW,GAC/Che,EAAO0Y,QAGR1Y,EAAO0Y,MAAMqD,QAAU,SAAUjY,GAqBhC,MApBM2Z,KAELA,EAAYzd,EAAO2b,WAKU,aAAxB5c,EAASmf,WAEbC,WAAYne,EAAO0Y,QAKnB3Z,EAASqP,iBAAkB,mBAAoB4P,GAAW,GAG1D9e,EAAOkP,iBAAkB,OAAQ4P,GAAW,KAGvCP,EAAU1B,QAASjY,IAI3B9D,EAAO0Y,MAAMqD,SAOb,IAAIqC,GAASpe,EAAOoe,OAAS,SAAU/c,EAAOlB,EAAIsM,EAAKnH,EAAO+Y,EAAWC,EAAUC,GAClF,GAAIzc,GAAI,EACPM,EAAMf,EAAMN,OACZyd,EAAc,MAAP/R,CAGR,IAA4B,WAAvBzM,EAAO+D,KAAM0I,GAAqB,CACtC4R,GAAY,CACZ,KAAMvc,IAAK2K,GACVzM,EAAOoe,OAAQ/c,EAAOlB,EAAI2B,EAAG2K,EAAI3K,IAAI,EAAMwc,EAAUC,OAIhD,IAAelb,SAAViC,IACX+Y,GAAY,EAENre,EAAOkD,WAAYoC,KACxBiZ,GAAM,GAGFC,IAECD,GACJpe,EAAGc,KAAMI,EAAOiE,GAChBnF,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAU0B,EAAM4K,EAAKnH,GACzB,MAAOkZ,GAAKvd,KAAMjB,EAAQ6B,GAAQyD,MAKhCnF,GACJ,KAAYiC,EAAJN,EAASA,IAChB3B,EAAIkB,EAAMS,GAAI2K,EAAK8R,EAAMjZ,EAAQA,EAAMrE,KAAMI,EAAMS,GAAIA,EAAG3B,EAAIkB,EAAMS,GAAI2K,IAK3E,OAAO4R,GACNhd,EAGAmd,EACCre,EAAGc,KAAMI,GACTe,EAAMjC,EAAIkB,EAAM,GAAIoL,GAAQ6R,EAO/Bte,GAAOye,WAAa,SAAUC,GAQ7B,MAA0B,KAAnBA,EAAMta,UAAqC,IAAnBsa,EAAMta,YAAsBsa,EAAMta,SAIlE,SAASua,KAIRjZ,OAAOkZ,eAAgBzf,KAAKqN,SAAY,GACvCtL,IAAK,WACJ,YAIF/B,KAAKmE,QAAUtD,EAAOsD,QAAUqb,EAAKE,MAGtCF,EAAKE,IAAM,EACXF,EAAKG,QAAU9e,EAAOye,WAEtBE,EAAK/d,WACJ6L,IAAK,SAAUiS,GAId,IAAMC,EAAKG,QAASJ,GACnB,MAAO,EAGR,IAAIK,MAEHC,EAASN,EAAOvf,KAAKmE,QAGtB,KAAM0b,EAAS,CACdA,EAASL,EAAKE,KAGd,KACCE,EAAY5f,KAAKmE,UAAcgC,MAAO0Z,GACtCtZ,OAAOuZ,iBAAkBP,EAAOK,GAI/B,MAAQlU,GACTkU,EAAY5f,KAAKmE,SAAY0b,EAC7Bhf,EAAOyC,OAAQic,EAAOK,IASxB,MAJM5f,MAAKqN,MAAOwS,KACjB7f,KAAKqN,MAAOwS,OAGNA,GAERE,IAAK,SAAUR,EAAOtD,EAAM9V,GAC3B,GAAI6Z,GAIHH,EAAS7f,KAAKsN,IAAKiS,GACnBlS,EAAQrN,KAAKqN,MAAOwS,EAGrB,IAAqB,gBAAT5D,GACX5O,EAAO4O,GAAS9V,MAKhB,IAAKtF,EAAOqE,cAAemI,GAC1BxM,EAAOyC,OAAQtD,KAAKqN,MAAOwS,GAAU5D,OAGrC,KAAM+D,IAAQ/D,GACb5O,EAAO2S,GAAS/D,EAAM+D,EAIzB,OAAO3S,IAERtL,IAAK,SAAUwd,EAAOjS,GAKrB,GAAID,GAAQrN,KAAKqN,MAAOrN,KAAKsN,IAAKiS,GAElC,OAAerb,UAARoJ,EACND,EAAQA,EAAOC,IAEjB2R,OAAQ,SAAUM,EAAOjS,EAAKnH,GAC7B,GAAI8Z,EAYJ,OAAa/b,UAARoJ,GACDA,GAAsB,gBAARA,IAA+BpJ,SAAViC,GAEtC8Z,EAASjgB,KAAK+B,IAAKwd,EAAOjS,GAERpJ,SAAX+b,EACNA,EAASjgB,KAAK+B,IAAKwd,EAAO1e,EAAOkF,UAAUuH,MAS7CtN,KAAK+f,IAAKR,EAAOjS,EAAKnH,GAILjC,SAAViC,EAAsBA,EAAQmH,IAEtC8O,OAAQ,SAAUmD,EAAOjS,GACxB,GAAI3K,GAAGa,EAAM0c,EACZL,EAAS7f,KAAKsN,IAAKiS,GACnBlS,EAAQrN,KAAKqN,MAAOwS,EAErB,IAAa3b,SAARoJ,EACJtN,KAAKqN,MAAOwS,UAEN,CAEDhf,EAAOoD,QAASqJ,GAOpB9J,EAAO8J,EAAIlN,OAAQkN,EAAI7K,IAAK5B,EAAOkF,aAEnCma,EAAQrf,EAAOkF,UAAWuH,GAErBA,IAAOD,GACX7J,GAAS8J,EAAK4S,IAId1c,EAAO0c,EACP1c,EAAOA,IAAQ6J,IACZ7J,GAAWA,EAAKqI,MAAOqP,SAI5BvY,EAAIa,EAAK5B,MACT,OAAQe,UACA0K,GAAO7J,EAAMb,MAIvBwd,QAAS,SAAUZ,GAClB,OAAQ1e,EAAOqE,cACdlF,KAAKqN,MAAOkS,EAAOvf,KAAKmE,gBAG1Bic,QAAS,SAAUb,GACbA,EAAOvf,KAAKmE,gBACTnE,MAAKqN,MAAOkS,EAAOvf,KAAKmE,WAIlC,IAAIkc,GAAY,GAAIb,GAEhBc,EAAY,GAAId,GAchBe,EAAS,gCACZC,EAAa,UAEd,SAASC,GAAU/d,EAAM4K,EAAK2O,GAC7B,GAAIzY,EAIJ,IAAcU,SAAT+X,GAAwC,IAAlBvZ,EAAKuC,SAI/B,GAHAzB,EAAO,QAAU8J,EAAIhJ,QAASkc,EAAY,OAAQta,cAClD+V,EAAOvZ,EAAKkK,aAAcpJ,GAEL,gBAATyY,GAAoB,CAC/B,IACCA,EAAgB,SAATA,GAAkB,EACf,UAATA,GAAmB,EACV,SAATA,EAAkB,MAEjBA,EAAO,KAAOA,GAAQA,EACvBsE,EAAO5T,KAAMsP,GAASpb,EAAO6f,UAAWzE,GACxCA,EACA,MAAOvQ,IAGT4U,EAAUP,IAAKrd,EAAM4K,EAAK2O,OAE1BA,GAAO/X,MAGT,OAAO+X,GAGRpb,EAAOyC,QACN6c,QAAS,SAAUzd,GAClB,MAAO4d,GAAUH,QAASzd,IAAU2d,EAAUF,QAASzd,IAGxDuZ,KAAM,SAAUvZ,EAAMc,EAAMyY;AAC3B,MAAOqE,GAAUrB,OAAQvc,EAAMc,EAAMyY,IAGtC0E,WAAY,SAAUje,EAAMc,GAC3B8c,EAAUlE,OAAQ1Z,EAAMc,IAKzBod,MAAO,SAAUle,EAAMc,EAAMyY,GAC5B,MAAOoE,GAAUpB,OAAQvc,EAAMc,EAAMyY,IAGtC4E,YAAa,SAAUne,EAAMc,GAC5B6c,EAAUjE,OAAQ1Z,EAAMc,MAI1B3C,EAAOG,GAAGsC,QACT2Y,KAAM,SAAU3O,EAAKnH,GACpB,GAAIxD,GAAGa,EAAMyY,EACZvZ,EAAO1C,KAAM,GACb6N,EAAQnL,GAAQA,EAAK8G,UAGtB,IAAatF,SAARoJ,EAAoB,CACxB,GAAKtN,KAAK4B,SACTqa,EAAOqE,EAAUve,IAAKW,GAEC,IAAlBA,EAAKuC,WAAmBob,EAAUte,IAAKW,EAAM,iBAAmB,CACpEC,EAAIkL,EAAMjM,MACV,OAAQe,IAIFkL,EAAOlL,KACXa,EAAOqK,EAAOlL,GAAIa,KACe,IAA5BA,EAAKlD,QAAS,WAClBkD,EAAO3C,EAAOkF,UAAWvC,EAAKrD,MAAM,IACpCsgB,EAAU/d,EAAMc,EAAMyY,EAAMzY,KAI/B6c,GAAUN,IAAKrd,EAAM,gBAAgB,GAIvC,MAAOuZ,GAIR,MAAoB,gBAAR3O,GACJtN,KAAKsC,KAAK,WAChBge,EAAUP,IAAK/f,KAAMsN,KAIhB2R,EAAQjf,KAAM,SAAUmG,GAC9B,GAAI8V,GACH6E,EAAWjgB,EAAOkF,UAAWuH,EAO9B,IAAK5K,GAAkBwB,SAAViC,EAAb,CAIC,GADA8V,EAAOqE,EAAUve,IAAKW,EAAM4K,GACdpJ,SAAT+X,EACJ,MAAOA,EAMR,IADAA,EAAOqE,EAAUve,IAAKW,EAAMoe,GACd5c,SAAT+X,EACJ,MAAOA,EAMR,IADAA,EAAOwE,EAAU/d,EAAMoe,EAAU5c,QACnBA,SAAT+X,EACJ,MAAOA,OAQTjc,MAAKsC,KAAK,WAGT,GAAI2Z,GAAOqE,EAAUve,IAAK/B,KAAM8gB,EAKhCR,GAAUP,IAAK/f,KAAM8gB,EAAU3a,GAKL,KAArBmH,EAAIhN,QAAQ,MAAwB4D,SAAT+X,GAC/BqE,EAAUP,IAAK/f,KAAMsN,EAAKnH,MAG1B,KAAMA,EAAOtD,UAAUjB,OAAS,EAAG,MAAM,IAG7C+e,WAAY,SAAUrT,GACrB,MAAOtN,MAAKsC,KAAK,WAChBge,EAAUlE,OAAQpc,KAAMsN,QAM3BzM,EAAOyC,QACNyd,MAAO,SAAUre,EAAMkC,EAAMqX,GAC5B,GAAI8E,EAEJ,OAAKre,IACJkC,GAASA,GAAQ,MAAS,QAC1Bmc,EAAQV,EAAUte,IAAKW,EAAMkC,GAGxBqX,KACE8E,GAASlgB,EAAOoD,QAASgY,GAC9B8E,EAAQV,EAAUpB,OAAQvc,EAAMkC,EAAM/D,EAAOwF,UAAU4V,IAEvD8E,EAAM1gB,KAAM4b,IAGP8E,OAZR,QAgBDC,QAAS,SAAUte,EAAMkC,GACxBA,EAAOA,GAAQ,IAEf,IAAImc,GAAQlgB,EAAOkgB,MAAOre,EAAMkC,GAC/Bqc,EAAcF,EAAMnf,OACpBZ,EAAK+f,EAAMvT,QACX0T,EAAQrgB,EAAOsgB,YAAaze,EAAMkC,GAClCgV,EAAO,WACN/Y,EAAOmgB,QAASte,EAAMkC,GAIZ,gBAAP5D,IACJA,EAAK+f,EAAMvT,QACXyT,KAGIjgB,IAIU,OAAT4D,GACJmc,EAAMnQ,QAAS,oBAITsQ,GAAME,KACbpgB,EAAGc,KAAMY,EAAMkX,EAAMsH,KAGhBD,GAAeC,GACpBA,EAAMvM,MAAMqH,QAKdmF,YAAa,SAAUze,EAAMkC,GAC5B,GAAI0I,GAAM1I,EAAO,YACjB,OAAOyb,GAAUte,IAAKW,EAAM4K,IAAS+S,EAAUpB,OAAQvc,EAAM4K,GAC5DqH,MAAO9T,EAAO0a,UAAU,eAAef,IAAI,WAC1C6F,EAAUjE,OAAQ1Z,GAAQkC,EAAO,QAAS0I,WAM9CzM,EAAOG,GAAGsC,QACTyd,MAAO,SAAUnc,EAAMqX,GACtB,GAAIoF,GAAS,CAQb,OANqB,gBAATzc,KACXqX,EAAOrX,EACPA,EAAO,KACPyc,KAGIxe,UAAUjB,OAASyf,EAChBxgB,EAAOkgB,MAAO/gB,KAAK,GAAI4E,GAGfV,SAAT+X,EACNjc,KACAA,KAAKsC,KAAK,WACT,GAAIye,GAAQlgB,EAAOkgB,MAAO/gB,KAAM4E,EAAMqX,EAGtCpb,GAAOsgB,YAAanhB,KAAM4E,GAEZ,OAATA,GAA8B,eAAbmc,EAAM,IAC3BlgB,EAAOmgB,QAAShhB,KAAM4E,MAI1Boc,QAAS,SAAUpc,GAClB,MAAO5E,MAAKsC,KAAK,WAChBzB,EAAOmgB,QAAShhB,KAAM4E,MAGxB0c,WAAY,SAAU1c,GACrB,MAAO5E,MAAK+gB,MAAOnc,GAAQ,UAI5BgY,QAAS,SAAUhY,EAAMD,GACxB,GAAIuC,GACHqa,EAAQ,EACRC,EAAQ3gB,EAAO2b,WACf1L,EAAW9Q,KACX2C,EAAI3C,KAAK4B,OACTyb,EAAU,aACCkE,GACTC,EAAMrD,YAAarN,GAAYA,IAIb,iBAATlM,KACXD,EAAMC,EACNA,EAAOV,QAERU,EAAOA,GAAQ,IAEf,OAAQjC,IACPuE,EAAMmZ,EAAUte,IAAK+O,EAAUnO,GAAKiC,EAAO,cACtCsC,GAAOA,EAAIyN,QACf4M,IACAra,EAAIyN,MAAM6F,IAAK6C,GAIjB,OADAA,KACOmE,EAAM5E,QAASjY,KAGxB,IAAI8c,GAAO,sCAAwCC,OAE/CC,GAAc,MAAO,QAAS,SAAU,QAExCC,EAAW,SAAUlf,EAAMmf,GAI7B,MADAnf,GAAOmf,GAAMnf,EAC4B,SAAlC7B,EAAOihB,IAAKpf,EAAM,aAA2B7B,EAAOwH,SAAU3F,EAAK0J,cAAe1J,IAGvFqf,EAAiB,yBAIrB,WACC,GAAIC,GAAWpiB,EAASqiB,yBACvBtU,EAAMqU,EAASpc,YAAahG,EAAS6F,cAAe,QACpDoK,EAAQjQ,EAAS6F,cAAe,QAMjCoK,GAAMhD,aAAc,OAAQ,SAC5BgD,EAAMhD,aAAc,UAAW,WAC/BgD,EAAMhD,aAAc,OAAQ,KAE5Bc,EAAI/H,YAAaiK,GAIjBlP,EAAQuhB,WAAavU,EAAIwU,WAAW,GAAOA,WAAW,GAAOjP,UAAUsB,QAIvE7G,EAAIiC,UAAY,yBAChBjP,EAAQyhB,iBAAmBzU,EAAIwU,WAAW,GAAOjP,UAAUyF,eAE5D,IAAI0J,GAAe,WAInB1hB,GAAQ2hB,eAAiB,aAAeviB,EAGxC,IACCwiB,GAAY,OACZC,EAAc,uCACdC,EAAc,kCACdC,EAAiB,sBAElB,SAASC,KACR,OAAO,EAGR,QAASC,KACR,OAAO,EAGR,QAASC,KACR,IACC,MAAOjjB,GAASsU,cACf,MAAQ4O,KAOXjiB,EAAOkiB,OAENvjB,UAEAgb,IAAK,SAAU9X,EAAMsgB,EAAOlV,EAASmO,EAAMnb,GAE1C,GAAImiB,GAAaC,EAAahc,EAC7Bic,EAAQC,EAAGC,EACXC,EAASC,EAAU3e,EAAM4e,EAAYC,EACrCC,EAAWrD,EAAUte,IAAKW,EAG3B,IAAMghB,EAAN,CAKK5V,EAAQA,UACZmV,EAAcnV,EACdA,EAAUmV,EAAYnV,QACtBhN,EAAWmiB,EAAYniB,UAIlBgN,EAAQ9G,OACb8G,EAAQ9G,KAAOnG,EAAOmG,SAIhBmc,EAASO,EAASP,UACxBA,EAASO,EAASP,YAEZD,EAAcQ,EAASC,UAC7BT,EAAcQ,EAASC,OAAS,SAAUjY,GAGzC,aAAc7K,KAAWwhB,GAAgBxhB,EAAOkiB,MAAMa,YAAclY,EAAE9G,KACrE/D,EAAOkiB,MAAMc,SAASjhB,MAAOF,EAAMG,WAAcqB,SAKpD8e,GAAUA,GAAS,IAAKnX,MAAOqP,KAAiB,IAChDkI,EAAIJ,EAAMphB,MACV,OAAQwhB,IACPlc,EAAMwb,EAAerW,KAAM2W,EAAMI,QACjCxe,EAAO6e,EAAWvc,EAAI,GACtBsc,GAAetc,EAAI,IAAM,IAAKG,MAAO,KAAMjE,OAGrCwB,IAKN0e,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAGhCA,GAAS9D,EAAWwiB,EAAQQ,aAAeR,EAAQS,WAAcnf,EAGjE0e,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAGhCye,EAAYxiB,EAAOyC,QAClBsB,KAAMA,EACN6e,SAAUA,EACVxH,KAAMA,EACNnO,QAASA,EACT9G,KAAM8G,EAAQ9G,KACdlG,SAAUA,EACV2J,aAAc3J,GAAYD,EAAOgQ,KAAKhF,MAAMpB,aAAakC,KAAM7L,GAC/DkjB,UAAWR,EAAWxW,KAAK,MACzBiW,IAGIM,EAAWJ,EAAQve,MACzB2e,EAAWJ,EAAQve,MACnB2e,EAASU,cAAgB,EAGnBX,EAAQY,OAASZ,EAAQY,MAAMpiB,KAAMY,EAAMuZ,EAAMuH,EAAYN,MAAkB,GAC/ExgB,EAAKuM,kBACTvM,EAAKuM,iBAAkBrK,EAAMse,GAAa,IAKxCI,EAAQ9I,MACZ8I,EAAQ9I,IAAI1Y,KAAMY,EAAM2gB,GAElBA,EAAUvV,QAAQ9G,OACvBqc,EAAUvV,QAAQ9G,KAAO8G,EAAQ9G,OAK9BlG,EACJyiB,EAASlgB,OAAQkgB,EAASU,gBAAiB,EAAGZ,GAE9CE,EAASljB,KAAMgjB,GAIhBxiB,EAAOkiB,MAAMvjB,OAAQoF,IAAS,KAMhCwX,OAAQ,SAAU1Z,EAAMsgB,EAAOlV,EAAShN,EAAUqjB,GAEjD,GAAIjhB,GAAGkhB,EAAWld,EACjBic,EAAQC,EAAGC,EACXC,EAASC,EAAU3e,EAAM4e,EAAYC,EACrCC,EAAWrD,EAAUF,QAASzd,IAAU2d,EAAUte,IAAKW,EAExD,IAAMghB,IAAcP,EAASO,EAASP,QAAtC,CAKAH,GAAUA,GAAS,IAAKnX,MAAOqP,KAAiB,IAChDkI,EAAIJ,EAAMphB,MACV,OAAQwhB,IAMP,GALAlc,EAAMwb,EAAerW,KAAM2W,EAAMI,QACjCxe,EAAO6e,EAAWvc,EAAI,GACtBsc,GAAetc,EAAI,IAAM,IAAKG,MAAO,KAAMjE,OAGrCwB,EAAN,CAOA0e,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAChCA,GAAS9D,EAAWwiB,EAAQQ,aAAeR,EAAQS,WAAcnf,EACjE2e,EAAWJ,EAAQve,OACnBsC,EAAMA,EAAI,IAAM,GAAIyC,QAAQ,UAAY6Z,EAAWxW,KAAK,iBAAmB,WAG3EoX,EAAYlhB,EAAIqgB,EAAS3hB,MACzB,OAAQsB,IACPmgB,EAAYE,EAAUrgB,IAEfihB,GAAeV,IAAaJ,EAAUI,UACzC3V,GAAWA,EAAQ9G,OAASqc,EAAUrc,MACtCE,IAAOA,EAAIyF,KAAM0W,EAAUW,YAC3BljB,GAAYA,IAAauiB,EAAUviB,WAAyB,OAAbA,IAAqBuiB,EAAUviB,YACjFyiB,EAASlgB,OAAQH,EAAG,GAEfmgB,EAAUviB,UACdyiB,EAASU,gBAELX,EAAQlH,QACZkH,EAAQlH,OAAOta,KAAMY,EAAM2gB,GAOzBe,KAAcb,EAAS3hB,SACrB0hB,EAAQe,UAAYf,EAAQe,SAASviB,KAAMY,EAAM8gB,EAAYE,EAASC,WAAa,GACxF9iB,EAAOyjB,YAAa5hB,EAAMkC,EAAM8e,EAASC,cAGnCR,GAAQve,QAtCf,KAAMA,IAAQue,GACbtiB,EAAOkiB,MAAM3G,OAAQ1Z,EAAMkC,EAAOoe,EAAOI,GAAKtV,EAAShN,GAAU,EA0C/DD,GAAOqE,cAAeie,WACnBO,GAASC,OAChBtD,EAAUjE,OAAQ1Z,EAAM,aAI1B6hB,QAAS,SAAUxB,EAAO9G,EAAMvZ,EAAM8hB,GAErC,GAAI7hB,GAAGsL,EAAK/G,EAAKud,EAAYC,EAAQf,EAAQL,EAC5CqB,GAAcjiB,GAAQ9C,GACtBgF,EAAOnE,EAAOqB,KAAMihB,EAAO,QAAWA,EAAMne,KAAOme,EACnDS,EAAa/iB,EAAOqB,KAAMihB,EAAO,aAAgBA,EAAMiB,UAAU3c,MAAM,OAKxE,IAHA4G,EAAM/G,EAAMxE,EAAOA,GAAQ9C,EAGJ,IAAlB8C,EAAKuC,UAAoC,IAAlBvC,EAAKuC,WAK5Bwd,EAAY9V,KAAM/H,EAAO/D,EAAOkiB,MAAMa,aAItChf,EAAKtE,QAAQ,MAAQ,IAEzBkjB,EAAa5e,EAAKyC,MAAM,KACxBzC,EAAO4e,EAAWhW,QAClBgW,EAAWpgB,QAEZshB,EAAS9f,EAAKtE,QAAQ,KAAO,GAAK,KAAOsE,EAGzCme,EAAQA,EAAOliB,EAAOsD,SACrB4e,EACA,GAAIliB,GAAO+jB,MAAOhgB,EAAuB,gBAAVme,IAAsBA,GAGtDA,EAAM8B,UAAYL,EAAe,EAAI,EACrCzB,EAAMiB,UAAYR,EAAWxW,KAAK,KAClC+V,EAAM+B,aAAe/B,EAAMiB,UAC1B,GAAIra,QAAQ,UAAY6Z,EAAWxW,KAAK,iBAAmB,WAC3D,KAGD+V,EAAMvQ,OAAStO,OACT6e,EAAMlf,SACXkf,EAAMlf,OAASnB,GAIhBuZ,EAAe,MAARA,GACJ8G,GACFliB,EAAOwF,UAAW4V,GAAQ8G,IAG3BO,EAAUziB,EAAOkiB,MAAMO,QAAS1e,OAC1B4f,IAAgBlB,EAAQiB,SAAWjB,EAAQiB,QAAQ3hB,MAAOF,EAAMuZ,MAAW,GAAjF,CAMA,IAAMuI,IAAiBlB,EAAQyB,WAAalkB,EAAOiE,SAAUpC,GAAS,CAMrE,IAJA+hB,EAAanB,EAAQQ,cAAgBlf,EAC/B6d,EAAY9V,KAAM8X,EAAa7f,KACpCqJ,EAAMA,EAAIpI,YAEHoI,EAAKA,EAAMA,EAAIpI,WACtB8e,EAAUtkB,KAAM4N,GAChB/G,EAAM+G,CAIF/G,MAASxE,EAAK0J,eAAiBxM,IACnC+kB,EAAUtkB,KAAM6G,EAAI6H,aAAe7H,EAAI8d,cAAgBjlB,GAKzD4C,EAAI,CACJ,QAASsL,EAAM0W,EAAUhiB,QAAUogB,EAAMkC,uBAExClC,EAAMne,KAAOjC,EAAI,EAChB8hB,EACAnB,EAAQS,UAAYnf,EAGrB+e,GAAWtD,EAAUte,IAAKkM,EAAK,eAAoB8U,EAAMne,OAAUyb,EAAUte,IAAKkM,EAAK,UAClF0V,GACJA,EAAO/gB,MAAOqL,EAAKgO,GAIpB0H,EAASe,GAAUzW,EAAKyW,GACnBf,GAAUA,EAAO/gB,OAAS/B,EAAOye,WAAYrR,KACjD8U,EAAMvQ,OAASmR,EAAO/gB,MAAOqL,EAAKgO,GAC7B8G,EAAMvQ,UAAW,GACrBuQ,EAAMmC,iBAmCT,OA/BAnC,GAAMne,KAAOA,EAGP4f,GAAiBzB,EAAMoC,sBAErB7B,EAAQ8B,UAAY9B,EAAQ8B,SAASxiB,MAAO+hB,EAAU1b,MAAOgT,MAAW,IAC9Epb,EAAOye,WAAY5c,IAIdgiB,GAAU7jB,EAAOkD,WAAYrB,EAAMkC,MAAa/D,EAAOiE,SAAUpC,KAGrEwE,EAAMxE,EAAMgiB,GAEPxd,IACJxE,EAAMgiB,GAAW,MAIlB7jB,EAAOkiB,MAAMa,UAAYhf,EACzBlC,EAAMkC,KACN/D,EAAOkiB,MAAMa,UAAY1f,OAEpBgD,IACJxE,EAAMgiB,GAAWxd,IAMd6b,EAAMvQ,SAGdqR,SAAU,SAAUd,GAGnBA,EAAQliB,EAAOkiB,MAAMsC,IAAKtC,EAE1B,IAAIpgB,GAAGO,EAAGf,EAAKmR,EAAS+P,EACvBiC,KACA9iB,EAAOrC,EAAM2B,KAAMe,WACnB0gB,GAAalD,EAAUte,IAAK/B,KAAM,eAAoB+iB,EAAMne,UAC5D0e,EAAUziB,EAAOkiB,MAAMO,QAASP,EAAMne,SAOvC,IAJApC,EAAK,GAAKugB,EACVA,EAAMwC,eAAiBvlB,MAGlBsjB,EAAQkC,aAAelC,EAAQkC,YAAY1jB,KAAM9B,KAAM+iB,MAAY,EAAxE,CAKAuC,EAAezkB,EAAOkiB,MAAMQ,SAASzhB,KAAM9B,KAAM+iB,EAAOQ,GAGxD5gB,EAAI,CACJ,QAAS2Q,EAAUgS,EAAc3iB,QAAWogB,EAAMkC,uBAAyB,CAC1ElC,EAAM0C,cAAgBnS,EAAQ5Q,KAE9BQ,EAAI,CACJ,QAASmgB,EAAY/P,EAAQiQ,SAAUrgB,QAAW6f,EAAM2C,kCAIjD3C,EAAM+B,cAAgB/B,EAAM+B,aAAanY,KAAM0W,EAAUW,cAE9DjB,EAAMM,UAAYA,EAClBN,EAAM9G,KAAOoH,EAAUpH,KAEvB9Z,IAAStB,EAAOkiB,MAAMO,QAASD,EAAUI,eAAkBE,QAAUN,EAAUvV,SAC5ElL,MAAO0Q,EAAQ5Q,KAAMF,GAEX0B,SAAR/B,IACE4gB,EAAMvQ,OAASrQ,MAAS,IAC7B4gB,EAAMmC,iBACNnC,EAAM4C,oBAYX,MAJKrC,GAAQsC,cACZtC,EAAQsC,aAAa9jB,KAAM9B,KAAM+iB,GAG3BA,EAAMvQ,SAGd+Q,SAAU,SAAUR,EAAOQ,GAC1B,GAAI5gB,GAAGkE,EAASgf,EAAKxC,EACpBiC,KACArB,EAAgBV,EAASU,cACzBhW,EAAM8U,EAAMlf,MAKb,IAAKogB,GAAiBhW,EAAIhJ,YAAc8d,EAAMlO,QAAyB,UAAfkO,EAAMne,MAE7D,KAAQqJ,IAAQjO,KAAMiO,EAAMA,EAAIpI,YAAc7F,KAG7C,GAAKiO,EAAIsG,YAAa,GAAuB,UAAfwO,EAAMne,KAAmB,CAEtD,IADAiC,KACMlE,EAAI,EAAOshB,EAAJthB,EAAmBA,IAC/B0gB,EAAYE,EAAU5gB,GAGtBkjB,EAAMxC,EAAUviB,SAAW,IAEHoD,SAAnB2C,EAASgf,KACbhf,EAASgf,GAAQxC,EAAU5Y,aAC1B5J,EAAQglB,EAAK7lB,MAAOsa,MAAOrM,IAAS,EACpCpN,EAAO0O,KAAMsW,EAAK7lB,KAAM,MAAQiO,IAAQrM,QAErCiF,EAASgf,IACbhf,EAAQxG,KAAMgjB,EAGXxc,GAAQjF,QACZ0jB,EAAajlB,MAAOqC,KAAMuL,EAAKsV,SAAU1c,IAW7C,MAJKod,GAAgBV,EAAS3hB,QAC7B0jB,EAAajlB,MAAOqC,KAAM1C,KAAMujB,SAAUA,EAASpjB,MAAO8jB,KAGpDqB,GAIRQ,MAAO,wHAAwHze,MAAM,KAErI0e,YAEAC,UACCF,MAAO,4BAA4Bze,MAAM,KACzCmI,OAAQ,SAAUuT,EAAOkD,GAOxB,MAJoB,OAAflD,EAAMmD,QACVnD,EAAMmD,MAA6B,MAArBD,EAASE,SAAmBF,EAASE,SAAWF,EAASG,SAGjErD,IAITsD,YACCP,MAAO,uFAAuFze,MAAM,KACpGmI,OAAQ,SAAUuT,EAAOkD,GACxB,GAAIK,GAAUxX,EAAKyX,EAClB1R,EAASoR,EAASpR,MAkBnB,OAfoB,OAAfkO,EAAMyD,OAAqC,MAApBP,EAASQ,UACpCH,EAAWvD,EAAMlf,OAAOuI,eAAiBxM,EACzCkP,EAAMwX,EAAS5X,gBACf6X,EAAOD,EAASC,KAEhBxD,EAAMyD,MAAQP,EAASQ,SAAY3X,GAAOA,EAAI4X,YAAcH,GAAQA,EAAKG,YAAc,IAAQ5X,GAAOA,EAAI6X,YAAcJ,GAAQA,EAAKI,YAAc,GACnJ5D,EAAM6D,MAAQX,EAASY,SAAY/X,GAAOA,EAAIgY,WAAcP,GAAQA,EAAKO,WAAc,IAAQhY,GAAOA,EAAIiY,WAAcR,GAAQA,EAAKQ,WAAc,IAK9IhE,EAAMmD,OAAoBhiB,SAAX2Q,IACpBkO,EAAMmD,MAAmB,EAATrR,EAAa,EAAe,EAATA,EAAa,EAAe,EAATA,EAAa,EAAI,GAGjEkO,IAITsC,IAAK,SAAUtC,GACd,GAAKA,EAAOliB,EAAOsD,SAClB,MAAO4e,EAIR,IAAIpgB,GAAGqd,EAAMtc,EACZkB,EAAOme,EAAMne,KACboiB,EAAgBjE,EAChBkE,EAAUjnB,KAAK+lB,SAAUnhB,EAEpBqiB,KACLjnB,KAAK+lB,SAAUnhB,GAASqiB,EACvBzE,EAAY7V,KAAM/H,GAAS5E,KAAKqmB,WAChC9D,EAAU5V,KAAM/H,GAAS5E,KAAKgmB,aAGhCtiB,EAAOujB,EAAQnB,MAAQ9lB,KAAK8lB,MAAM1lB,OAAQ6mB,EAAQnB,OAAU9lB,KAAK8lB,MAEjE/C,EAAQ,GAAIliB,GAAO+jB,MAAOoC,GAE1BrkB,EAAIe,EAAK9B,MACT,OAAQe,IACPqd,EAAOtc,EAAMf,GACbogB,EAAO/C,GAASgH,EAAehH,EAehC,OAVM+C,GAAMlf,SACXkf,EAAMlf,OAASjE,GAKe,IAA1BmjB,EAAMlf,OAAOoB,WACjB8d,EAAMlf,OAASkf,EAAMlf,OAAOgC,YAGtBohB,EAAQzX,OAASyX,EAAQzX,OAAQuT,EAAOiE,GAAkBjE,GAGlEO,SACC4D,MAECnC,UAAU,GAEX9Q,OAECsQ,QAAS,WACR,MAAKvkB,QAAS6iB,KAAuB7iB,KAAKiU,OACzCjU,KAAKiU,SACE,GAFR,QAKD6P,aAAc,WAEfqD,MACC5C,QAAS,WACR,MAAKvkB,QAAS6iB,KAAuB7iB,KAAKmnB,MACzCnnB,KAAKmnB,QACE,GAFR,QAKDrD,aAAc,YAEfsD,OAEC7C,QAAS,WACR,MAAmB,aAAdvkB,KAAK4E,MAAuB5E,KAAKonB,OAASvmB,EAAOoF,SAAUjG,KAAM,UACrEA,KAAKonB,SACE,GAFR,QAODhC,SAAU,SAAUrC,GACnB,MAAOliB,GAAOoF,SAAU8c,EAAMlf,OAAQ,OAIxCwjB,cACCzB,aAAc,SAAU7C,GAID7e,SAAjB6e,EAAMvQ,QAAwBuQ,EAAMiE,gBACxCjE,EAAMiE,cAAcM,YAAcvE,EAAMvQ,WAM5C+U,SAAU,SAAU3iB,EAAMlC,EAAMqgB,EAAOyE,GAItC,GAAI9b,GAAI7K,EAAOyC,OACd,GAAIzC,GAAO+jB,MACX7B,GAECne,KAAMA,EACN6iB,aAAa,EACbT,kBAGGQ,GACJ3mB,EAAOkiB,MAAMwB,QAAS7Y,EAAG,KAAMhJ,GAE/B7B,EAAOkiB,MAAMc,SAAS/hB,KAAMY,EAAMgJ,GAE9BA,EAAEyZ,sBACNpC,EAAMmC,mBAKTrkB,EAAOyjB,YAAc,SAAU5hB,EAAMkC,EAAM+e,GACrCjhB,EAAKoc,qBACTpc,EAAKoc,oBAAqBla,EAAM+e,GAAQ,IAI1C9iB,EAAO+jB,MAAQ,SAAUnhB,EAAKqiB,GAE7B,MAAO9lB,gBAAgBa,GAAO+jB,OAKzBnhB,GAAOA,EAAImB,MACf5E,KAAKgnB,cAAgBvjB,EACrBzD,KAAK4E,KAAOnB,EAAImB,KAIhB5E,KAAKmlB,mBAAqB1hB,EAAIikB,kBACHxjB,SAAzBT,EAAIikB,kBAEJjkB,EAAI6jB,eAAgB,EACrB3E,EACAC,GAID5iB,KAAK4E,KAAOnB,EAIRqiB,GACJjlB,EAAOyC,OAAQtD,KAAM8lB,GAItB9lB,KAAK2nB,UAAYlkB,GAAOA,EAAIkkB,WAAa9mB,EAAOsG,WAGhDnH,KAAMa,EAAOsD,UAAY,IA/BjB,GAAItD,GAAO+jB,MAAOnhB,EAAKqiB,IAoChCjlB,EAAO+jB,MAAMnjB,WACZ0jB,mBAAoBvC,EACpBqC,qBAAsBrC,EACtB8C,8BAA+B9C,EAE/BsC,eAAgB,WACf,GAAIxZ,GAAI1L,KAAKgnB,aAEbhnB,MAAKmlB,mBAAqBxC,EAErBjX,GAAKA,EAAEwZ,gBACXxZ,EAAEwZ,kBAGJS,gBAAiB,WAChB,GAAIja,GAAI1L,KAAKgnB,aAEbhnB,MAAKilB,qBAAuBtC,EAEvBjX,GAAKA,EAAEia,iBACXja,EAAEia,mBAGJiC,yBAA0B,WACzB,GAAIlc,GAAI1L,KAAKgnB,aAEbhnB,MAAK0lB,8BAAgC/C,EAEhCjX,GAAKA,EAAEkc,0BACXlc,EAAEkc,2BAGH5nB,KAAK2lB,oBAMP9kB,EAAOyB,MACNulB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5C,GAClBxkB,EAAOkiB,MAAMO,QAAS2E,IACrBnE,aAAcuB,EACdtB,SAAUsB,EAEV1B,OAAQ,SAAUZ,GACjB,GAAI5gB,GACH0B,EAAS7D,KACTkoB,EAAUnF,EAAMoF,cAChB9E,EAAYN,EAAMM,SASnB,SALM6E,GAAYA,IAAYrkB,IAAWhD,EAAOwH,SAAUxE,EAAQqkB,MACjEnF,EAAMne,KAAOye,EAAUI,SACvBthB,EAAMkhB,EAAUvV,QAAQlL,MAAO5C,KAAM6C,WACrCkgB,EAAMne,KAAOygB,GAEPljB,MAOJxB,EAAQ2hB,gBACbzhB,EAAOyB,MAAO2R,MAAO,UAAWkT,KAAM,YAAc,SAAUc,EAAM5C,GAGnE,GAAIvX,GAAU,SAAUiV,GACtBliB,EAAOkiB,MAAMwE,SAAUlC,EAAKtC,EAAMlf,OAAQhD,EAAOkiB,MAAMsC,IAAKtC,IAAS,GAGvEliB,GAAOkiB,MAAMO,QAAS+B,IACrBnB,MAAO,WACN,GAAIpV,GAAM9O,KAAKoM,eAAiBpM,KAC/BooB,EAAW/H,EAAUpB,OAAQnQ,EAAKuW,EAE7B+C,IACLtZ,EAAIG,iBAAkBgZ,EAAMna,GAAS,GAEtCuS,EAAUpB,OAAQnQ,EAAKuW,GAAO+C,GAAY,GAAM,IAEjD/D,SAAU,WACT,GAAIvV,GAAM9O,KAAKoM,eAAiBpM,KAC/BooB,EAAW/H,EAAUpB,OAAQnQ,EAAKuW,GAAQ,CAErC+C,GAKL/H,EAAUpB,OAAQnQ,EAAKuW,EAAK+C,IAJ5BtZ,EAAIgQ,oBAAqBmJ,EAAMna,GAAS,GACxCuS,EAAUjE,OAAQtN,EAAKuW,QAU5BxkB,EAAOG,GAAGsC,QAET+kB,GAAI,SAAUrF,EAAOliB,EAAUmb,EAAMjb,EAAiBsnB,GACrD,GAAIC,GAAQ3jB,CAGZ,IAAsB,gBAAVoe,GAAqB,CAEP,gBAAbliB,KAEXmb,EAAOA,GAAQnb,EACfA,EAAWoD,OAEZ,KAAMU,IAAQoe,GACbhjB,KAAKqoB,GAAIzjB,EAAM9D,EAAUmb,EAAM+G,EAAOpe,GAAQ0jB,EAE/C,OAAOtoB,MAmBR,GAhBa,MAARic,GAAsB,MAANjb,GAEpBA,EAAKF,EACLmb,EAAOnb,EAAWoD,QACD,MAANlD,IACc,gBAAbF,IAEXE,EAAKib,EACLA,EAAO/X,SAGPlD,EAAKib,EACLA,EAAOnb,EACPA,EAAWoD,SAGRlD,KAAO,EACXA,EAAK4hB,MACC,KAAM5hB,EACZ,MAAOhB,KAaR,OAVa,KAARsoB,IACJC,EAASvnB,EACTA,EAAK,SAAU+hB,GAGd,MADAliB,KAAS+d,IAAKmE,GACPwF,EAAO3lB,MAAO5C,KAAM6C,YAG5B7B,EAAGgG,KAAOuhB,EAAOvhB,OAAUuhB,EAAOvhB,KAAOnG,EAAOmG,SAE1ChH,KAAKsC,KAAM,WACjBzB,EAAOkiB,MAAMvI,IAAKxa,KAAMgjB,EAAOhiB,EAAIib,EAAMnb,MAG3CwnB,IAAK,SAAUtF,EAAOliB,EAAUmb,EAAMjb,GACrC,MAAOhB,MAAKqoB,GAAIrF,EAAOliB,EAAUmb,EAAMjb,EAAI,IAE5C4d,IAAK,SAAUoE,EAAOliB,EAAUE,GAC/B,GAAIqiB,GAAWze,CACf,IAAKoe,GAASA,EAAMkC,gBAAkBlC,EAAMK,UAQ3C,MANAA,GAAYL,EAAMK,UAClBxiB,EAAQmiB,EAAMuC,gBAAiB3G,IAC9ByE,EAAUW,UAAYX,EAAUI,SAAW,IAAMJ,EAAUW,UAAYX,EAAUI,SACjFJ,EAAUviB,SACVuiB,EAAUvV,SAEJ9N,IAER,IAAsB,gBAAVgjB,GAAqB,CAEhC,IAAMpe,IAAQoe,GACbhjB,KAAK4e,IAAKha,EAAM9D,EAAUkiB,EAAOpe,GAElC,OAAO5E,MAUR,OARKc,KAAa,GAA6B,kBAAbA,MAEjCE,EAAKF,EACLA,EAAWoD,QAEPlD,KAAO,IACXA,EAAK4hB,GAEC5iB,KAAKsC,KAAK,WAChBzB,EAAOkiB,MAAM3G,OAAQpc,KAAMgjB,EAAOhiB,EAAIF,MAIxCyjB,QAAS,SAAU3f,EAAMqX,GACxB,MAAOjc,MAAKsC,KAAK,WAChBzB,EAAOkiB,MAAMwB,QAAS3f,EAAMqX,EAAMjc,SAGpC2e,eAAgB,SAAU/Z,EAAMqX,GAC/B,GAAIvZ,GAAO1C,KAAK,EAChB,OAAK0C,GACG7B,EAAOkiB,MAAMwB,QAAS3f,EAAMqX,EAAMvZ,GAAM,GADhD,SAOF,IACC8lB,IAAY,0EACZC,GAAW,YACXC,GAAQ,YACRC,GAAe,0BAEfC,GAAW,oCACXC,GAAc,4BACdC,GAAoB,cACpBC,GAAe,2CAGfC,IAGCC,QAAU,EAAG,+BAAgC,aAE7CC,OAAS,EAAG,UAAW,YACvBC,KAAO,EAAG,oBAAqB,uBAC/BC,IAAM,EAAG,iBAAkB,oBAC3BC,IAAM,EAAG,qBAAsB,yBAE/BjE,UAAY,EAAG,GAAI,IAIrB4D,IAAQM,SAAWN,GAAQC,OAE3BD,GAAQO,MAAQP,GAAQQ,MAAQR,GAAQS,SAAWT,GAAQU,QAAUV,GAAQE,MAC7EF,GAAQW,GAAKX,GAAQK,EAIrB,SAASO,IAAoBlnB,EAAMmnB,GAClC,MAAOhpB,GAAOoF,SAAUvD,EAAM,UAC7B7B,EAAOoF,SAA+B,KAArB4jB,EAAQ5kB,SAAkB4kB,EAAUA,EAAQtY,WAAY,MAEzE7O,EAAK8J,qBAAqB,SAAS,IAClC9J,EAAKkD,YAAalD,EAAK0J,cAAc3G,cAAc,UACpD/C,EAIF,QAASonB,IAAepnB,GAEvB,MADAA,GAAKkC,MAAsC,OAA9BlC,EAAKkK,aAAa,SAAoB,IAAMlK,EAAKkC,KACvDlC,EAER,QAASqnB,IAAernB,GACvB,GAAImJ,GAAQid,GAAkBzc,KAAM3J,EAAKkC,KAQzC,OANKiH,GACJnJ,EAAKkC,KAAOiH,EAAO,GAEnBnJ,EAAKyK,gBAAgB,QAGfzK,EAIR,QAASsnB,IAAe9nB,EAAO+nB,GAI9B,IAHA,GAAItnB,GAAI,EACPwX,EAAIjY,EAAMN,OAECuY,EAAJxX,EAAOA,IACd0d,EAAUN,IACT7d,EAAOS,GAAK,cAAesnB,GAAe5J,EAAUte,IAAKkoB,EAAatnB,GAAK,eAK9E,QAASunB,IAAgBzmB,EAAK0mB,GAC7B,GAAIxnB,GAAGwX,EAAGvV,EAAMwlB,EAAUC,EAAUC,EAAUC,EAAUpH,CAExD,IAAuB,IAAlBgH,EAAKllB,SAAV,CAKA,GAAKob,EAAUF,QAAS1c,KACvB2mB,EAAW/J,EAAUpB,OAAQxb,GAC7B4mB,EAAWhK,EAAUN,IAAKoK,EAAMC,GAChCjH,EAASiH,EAASjH,QAEJ,OACNkH,GAAS1G,OAChB0G,EAASlH,SAET,KAAMve,IAAQue,GACb,IAAMxgB,EAAI,EAAGwX,EAAIgJ,EAAQve,GAAOhD,OAAYuY,EAAJxX,EAAOA,IAC9C9B,EAAOkiB,MAAMvI,IAAK2P,EAAMvlB,EAAMue,EAAQve,GAAQjC,IAO7C2d,EAAUH,QAAS1c,KACvB6mB,EAAWhK,EAAUrB,OAAQxb,GAC7B8mB,EAAW1pB,EAAOyC,UAAYgnB,GAE9BhK,EAAUP,IAAKoK,EAAMI,KAIvB,QAASC,IAAQzpB,EAAS4O,GACzB,GAAIxN,GAAMpB,EAAQyL,qBAAuBzL,EAAQyL,qBAAsBmD,GAAO,KAC5E5O,EAAQkM,iBAAmBlM,EAAQkM,iBAAkB0C,GAAO,OAG9D,OAAezL,UAARyL,GAAqBA,GAAO9O,EAAOoF,SAAUlF,EAAS4O,GAC5D9O,EAAOuB,OAASrB,GAAWoB,GAC3BA,EAIF,QAASsoB,IAAUhnB,EAAK0mB,GACvB,GAAIlkB,GAAWkkB,EAAKlkB,SAASC,aAGX,WAAbD,GAAwB8b,EAAepV,KAAMlJ,EAAImB,MACrDulB,EAAK3V,QAAU/Q,EAAI+Q,SAGK,UAAbvO,GAAqC,aAAbA,KACnCkkB,EAAKxR,aAAelV,EAAIkV,cAI1B9X,EAAOyC,QACNM,MAAO,SAAUlB,EAAMgoB,EAAeC,GACrC,GAAIhoB,GAAGwX,EAAGyQ,EAAaC,EACtBjnB,EAAQlB,EAAKyf,WAAW,GACxB2I,EAASjqB,EAAOwH,SAAU3F,EAAK0J,cAAe1J,EAG/C,MAAM/B,EAAQyhB,gBAAsC,IAAlB1f,EAAKuC,UAAoC,KAAlBvC,EAAKuC,UAC3DpE,EAAOgY,SAAUnW,IAMnB,IAHAmoB,EAAeL,GAAQ5mB,GACvBgnB,EAAcJ,GAAQ9nB,GAEhBC,EAAI,EAAGwX,EAAIyQ,EAAYhpB,OAAYuY,EAAJxX,EAAOA,IAC3C8nB,GAAUG,EAAajoB,GAAKkoB,EAAcloB,GAK5C,IAAK+nB,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAeJ,GAAQ9nB,GACrCmoB,EAAeA,GAAgBL,GAAQ5mB,GAEjCjB,EAAI,EAAGwX,EAAIyQ,EAAYhpB,OAAYuY,EAAJxX,EAAOA,IAC3CunB,GAAgBU,EAAajoB,GAAKkoB,EAAcloB,QAGjDunB,IAAgBxnB,EAAMkB,EAWxB,OANAinB,GAAeL,GAAQ5mB,EAAO,UACzBinB,EAAajpB,OAAS,GAC1BooB,GAAea,GAAeC,GAAUN,GAAQ9nB,EAAM,WAIhDkB,GAGRmnB,cAAe,SAAU7oB,EAAOnB,EAASiqB,EAASC,GAOjD,IANA,GAAIvoB,GAAMwE,EAAKyI,EAAKub,EAAM7iB,EAAUnF,EACnC8e,EAAWjhB,EAAQkhB,yBACnBkJ,KACAxoB,EAAI,EACJwX,EAAIjY,EAAMN,OAECuY,EAAJxX,EAAOA,IAGd,GAFAD,EAAOR,EAAOS,GAETD,GAAiB,IAATA,EAGZ,GAA6B,WAAxB7B,EAAO+D,KAAMlC,GAGjB7B,EAAOuB,MAAO+oB,EAAOzoB,EAAKuC,UAAavC,GAASA,OAG1C,IAAMgmB,GAAM/b,KAAMjK,GAIlB,CACNwE,EAAMA,GAAO8a,EAASpc,YAAa7E,EAAQ0E,cAAc,QAGzDkK,GAAQ8Y,GAASpc,KAAM3J,KAAY,GAAI,KAAQ,GAAIwD,cACnDglB,EAAOlC,GAASrZ,IAASqZ,GAAQ5D,SACjCle,EAAI0I,UAAYsb,EAAM,GAAMxoB,EAAK4B,QAASkkB,GAAW,aAAgB0C,EAAM,GAG3EhoB,EAAIgoB,EAAM,EACV,OAAQhoB,IACPgE,EAAMA,EAAIgM,SAKXrS,GAAOuB,MAAO+oB,EAAOjkB,EAAIuE,YAGzBvE,EAAM8a,EAASzQ,WAGfrK,EAAIoK,YAAc,OAzBlB6Z,GAAM9qB,KAAMU,EAAQqqB,eAAgB1oB,GA+BvCsf,GAAS1Q,YAAc,GAEvB3O,EAAI,CACJ,OAASD,EAAOyoB,EAAOxoB,KAItB,KAAKsoB,GAAmD,KAAtCpqB,EAAO2F,QAAS9D,EAAMuoB,MAIxC5iB,EAAWxH,EAAOwH,SAAU3F,EAAK0J,cAAe1J,GAGhDwE,EAAMsjB,GAAQxI,EAASpc,YAAalD,GAAQ,UAGvC2F,GACJ2hB,GAAe9iB,GAIX8jB,GAAU,CACd9nB,EAAI,CACJ,OAASR,EAAOwE,EAAKhE,KACf2lB,GAAYlc,KAAMjK,EAAKkC,MAAQ,KACnComB,EAAQ3qB,KAAMqC,GAMlB,MAAOsf,IAGRqJ,UAAW,SAAUnpB,GAKpB,IAJA,GAAI+Z,GAAMvZ,EAAMkC,EAAM0I,EACrBgW,EAAUziB,EAAOkiB,MAAMO,QACvB3gB,EAAI,EAE2BuB,UAAvBxB,EAAOR,EAAOS,IAAoBA,IAAM,CAChD,GAAK9B,EAAOye,WAAY5c,KACvB4K,EAAM5K,EAAM2d,EAAUlc,SAEjBmJ,IAAQ2O,EAAOoE,EAAUhT,MAAOC,KAAS,CAC7C,GAAK2O,EAAKkH,OACT,IAAMve,IAAQqX,GAAKkH,OACbG,EAAS1e,GACb/D,EAAOkiB,MAAM3G,OAAQ1Z,EAAMkC,GAI3B/D,EAAOyjB,YAAa5hB,EAAMkC,EAAMqX,EAAK0H,OAInCtD,GAAUhT,MAAOC,UAEd+S,GAAUhT,MAAOC,SAKpBgT,GAAUjT,MAAO3K,EAAM4d,EAAUnc,cAK3CtD,EAAOG,GAAGsC,QACToC,KAAM,SAAUS,GACf,MAAO8Y,GAAQjf,KAAM,SAAUmG,GAC9B,MAAiBjC,UAAViC,EACNtF,EAAO6E,KAAM1F,MACbA,KAAK2U,QAAQrS,KAAK,YACM,IAAlBtC,KAAKiF,UAAoC,KAAlBjF,KAAKiF,UAAqC,IAAlBjF,KAAKiF,YACxDjF,KAAKsR,YAAcnL,MAGpB,KAAMA,EAAOtD,UAAUjB,SAG3B0pB,OAAQ,WACP,MAAOtrB,MAAKurB,SAAU1oB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKiF,UAAoC,KAAlBjF,KAAKiF,UAAqC,IAAlBjF,KAAKiF,SAAiB,CACzE,GAAIpB,GAAS+lB,GAAoB5pB,KAAM0C,EACvCmB,GAAO+B,YAAalD,OAKvB8oB,QAAS,WACR,MAAOxrB,MAAKurB,SAAU1oB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKiF,UAAoC,KAAlBjF,KAAKiF,UAAqC,IAAlBjF,KAAKiF,SAAiB,CACzE,GAAIpB,GAAS+lB,GAAoB5pB,KAAM0C,EACvCmB,GAAO4nB,aAAc/oB,EAAMmB,EAAO0N,gBAKrCma,OAAQ,WACP,MAAO1rB,MAAKurB,SAAU1oB,UAAW,SAAUH,GACrC1C,KAAK6F,YACT7F,KAAK6F,WAAW4lB,aAAc/oB,EAAM1C,SAKvC2rB,MAAO,WACN,MAAO3rB,MAAKurB,SAAU1oB,UAAW,SAAUH,GACrC1C,KAAK6F,YACT7F,KAAK6F,WAAW4lB,aAAc/oB,EAAM1C,KAAKoO,gBAK5CgO,OAAQ,SAAUtb,EAAU8qB,GAK3B,IAJA,GAAIlpB,GACHR,EAAQpB,EAAWD,EAAO2O,OAAQ1O,EAAUd,MAASA,KACrD2C,EAAI,EAEwB,OAApBD,EAAOR,EAAMS,IAAaA,IAC5BipB,GAA8B,IAAlBlpB,EAAKuC,UACtBpE,EAAOwqB,UAAWb,GAAQ9nB,IAGtBA,EAAKmD,aACJ+lB,GAAY/qB,EAAOwH,SAAU3F,EAAK0J,cAAe1J,IACrDsnB,GAAeQ,GAAQ9nB,EAAM,WAE9BA,EAAKmD,WAAWC,YAAapD,GAI/B,OAAO1C,OAGR2U,MAAO,WAIN,IAHA,GAAIjS,GACHC,EAAI,EAEuB,OAAnBD,EAAO1C,KAAK2C,IAAaA,IACV,IAAlBD,EAAKuC,WAGTpE,EAAOwqB,UAAWb,GAAQ9nB,GAAM,IAGhCA,EAAK4O,YAAc,GAIrB,OAAOtR,OAGR4D,MAAO,SAAU8mB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAwB,EAAQA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD3qB,KAAKyC,IAAI,WACf,MAAO5B,GAAO+C,MAAO5D,KAAM0qB,EAAeC,MAI5CkB,KAAM,SAAU1lB,GACf,MAAO8Y,GAAQjf,KAAM,SAAUmG,GAC9B,GAAIzD,GAAO1C,KAAM,OAChB2C,EAAI,EACJwX,EAAIna,KAAK4B,MAEV,IAAesC,SAAViC,GAAyC,IAAlBzD,EAAKuC,SAChC,MAAOvC,GAAKkN,SAIb,IAAsB,gBAAVzJ,KAAuBwiB,GAAahc,KAAMxG,KACpD6iB,IAAWP,GAASpc,KAAMlG,KAAa,GAAI,KAAQ,GAAID,eAAkB,CAE1EC,EAAQA,EAAM7B,QAASkkB,GAAW,YAElC,KACC,KAAYrO,EAAJxX,EAAOA,IACdD,EAAO1C,KAAM2C,OAGU,IAAlBD,EAAKuC,WACTpE,EAAOwqB,UAAWb,GAAQ9nB,GAAM,IAChCA,EAAKkN,UAAYzJ,EAInBzD,GAAO,EAGN,MAAOgJ,KAGLhJ,GACJ1C,KAAK2U,QAAQ2W,OAAQnlB,IAEpB,KAAMA,EAAOtD,UAAUjB,SAG3BkqB,YAAa,WACZ,GAAI/kB,GAAMlE,UAAW,EAcrB,OAXA7C,MAAKurB,SAAU1oB,UAAW,SAAUH,GACnCqE,EAAM/G,KAAK6F,WAEXhF,EAAOwqB,UAAWb,GAAQxqB,OAErB+G,GACJA,EAAIglB,aAAcrpB,EAAM1C,QAKnB+G,IAAQA,EAAInF,QAAUmF,EAAI9B,UAAYjF,KAAOA,KAAKoc,UAG1D4P,OAAQ,SAAUlrB,GACjB,MAAOd,MAAKoc,OAAQtb,GAAU,IAG/ByqB,SAAU,SAAU/oB,EAAMD,GAGzBC,EAAOpC,EAAOwC,SAAWJ,EAEzB,IAAIwf,GAAUlf,EAAOkoB,EAASiB,EAAYtd,EAAMG,EAC/CnM,EAAI,EACJwX,EAAIna,KAAK4B,OACTme,EAAM/f,KACNksB,EAAW/R,EAAI,EACfhU,EAAQ3D,EAAM,GACduB,EAAalD,EAAOkD,WAAYoC,EAGjC,IAAKpC,GACDoW,EAAI,GAAsB,gBAAVhU,KAChBxF,EAAQuhB,YAAc0G,GAASjc,KAAMxG,GACxC,MAAOnG,MAAKsC,KAAK,SAAUgY,GAC1B,GAAInB,GAAO4G,EAAIhd,GAAIuX,EACdvW,KACJvB,EAAM,GAAM2D,EAAMrE,KAAM9B,KAAMsa,EAAOnB,EAAK0S,SAE3C1S,EAAKoS,SAAU/oB,EAAMD,IAIvB,IAAK4X,IACJ6H,EAAWnhB,EAAOkqB,cAAevoB,EAAMxC,KAAM,GAAIoM,eAAe,EAAOpM,MACvE8C,EAAQkf,EAASzQ,WAEmB,IAA/ByQ,EAASvW,WAAW7J,SACxBogB,EAAWlf,GAGPA,GAAQ,CAMZ,IALAkoB,EAAUnqB,EAAO4B,IAAK+nB,GAAQxI,EAAU,UAAY8H,IACpDmC,EAAajB,EAAQppB,OAITuY,EAAJxX,EAAOA,IACdgM,EAAOqT,EAEFrf,IAAMupB,IACVvd,EAAO9N,EAAO+C,MAAO+K,GAAM,GAAM,GAG5Bsd,GAGJprB,EAAOuB,MAAO4oB,EAASR,GAAQ7b,EAAM,YAIvCpM,EAAST,KAAM9B,KAAM2C,GAAKgM,EAAMhM,EAGjC,IAAKspB,EAOJ,IANAnd,EAAMkc,EAASA,EAAQppB,OAAS,GAAIwK,cAGpCvL,EAAO4B,IAAKuoB,EAASjB,IAGfpnB,EAAI,EAAOspB,EAAJtpB,EAAgBA,IAC5BgM,EAAOqc,EAASroB,GACXkmB,GAAYlc,KAAMgC,EAAK/J,MAAQ,MAClCyb,EAAUpB,OAAQtQ,EAAM,eAAkB9N,EAAOwH,SAAUyG,EAAKH,KAE5DA,EAAKlL,IAEJ5C,EAAOsrB,UACXtrB,EAAOsrB,SAAUxd,EAAKlL,KAGvB5C,EAAOsE,WAAYwJ,EAAK2C,YAAYhN,QAASykB,GAAc,MAQjE,MAAO/oB,SAITa,EAAOyB,MACN8pB,SAAU,SACVC,UAAW,UACXZ,aAAc,SACda,YAAa,QACbC,WAAY,eACV,SAAU/oB,EAAMyiB,GAClBplB,EAAOG,GAAIwC,GAAS,SAAU1C,GAO7B,IANA,GAAIoB,GACHC,KACAqqB,EAAS3rB,EAAQC,GACjBkC,EAAOwpB,EAAO5qB,OAAS,EACvBe,EAAI,EAEQK,GAALL,EAAWA,IAClBT,EAAQS,IAAMK,EAAOhD,KAAOA,KAAK4D,OAAO,GACxC/C,EAAQ2rB,EAAQ7pB,IAAOsjB,GAAY/jB,GAInC7B,EAAKuC,MAAOT,EAAKD,EAAMH,MAGxB,OAAO/B,MAAKiC,UAAWE,KAKzB,IAAIsqB,IACHC,KAQD,SAASC,IAAenpB,EAAMsL,GAC7B,GAAI8d,GACHlqB,EAAO7B,EAAQiO,EAAIrJ,cAAejC,IAAS4oB,SAAUtd,EAAIyX,MAGzDsG,EAAU9sB,EAAO+sB,0BAA6BF,EAAQ7sB,EAAO+sB,wBAAyBpqB,EAAM,KAI3FkqB,EAAMC,QAAUhsB,EAAOihB,IAAKpf,EAAM,GAAK,UAMzC,OAFAA,GAAKspB,SAEEa,EAOR,QAASE,IAAgB9mB,GACxB,GAAI6I,GAAMlP,EACTitB,EAAUH,GAAazmB,EA0BxB,OAxBM4mB,KACLA,EAAUF,GAAe1mB,EAAU6I,GAGlB,SAAZ+d,GAAuBA,IAG3BJ,IAAUA,IAAU5rB,EAAQ,mDAAoDurB,SAAUtd,EAAIJ,iBAG9FI,EAAM2d,GAAQ,GAAIzR,gBAGlBlM,EAAIke,QACJle,EAAIme,QAEJJ,EAAUF,GAAe1mB,EAAU6I,GACnC2d,GAAOT,UAIRU,GAAazmB,GAAa4mB,GAGpBA,EAER,GAAIK,IAAU,UAEVC,GAAY,GAAIxjB,QAAQ,KAAO8X,EAAO,kBAAmB,KAEzD2L,GAAY,SAAU1qB,GAIxB,MAAKA,GAAK0J,cAAc2C,YAAYse,OAC5B3qB,EAAK0J,cAAc2C,YAAYue,iBAAkB5qB,EAAM,MAGxD3C,EAAOutB,iBAAkB5qB,EAAM,MAKxC,SAAS6qB,IAAQ7qB,EAAMc,EAAMgqB,GAC5B,GAAIC,GAAOC,EAAUC,EAAUxrB,EAC9ByqB,EAAQlqB,EAAKkqB,KAsCd,OApCAY,GAAWA,GAAYJ,GAAW1qB,GAI7B8qB,IACJrrB,EAAMqrB,EAASI,iBAAkBpqB,IAAUgqB,EAAUhqB,IAGjDgqB,IAES,KAARrrB,GAAetB,EAAOwH,SAAU3F,EAAK0J,cAAe1J,KACxDP,EAAMtB,EAAO+rB,MAAOlqB,EAAMc,IAOtB2pB,GAAUxgB,KAAMxK,IAAS+qB,GAAQvgB,KAAMnJ,KAG3CiqB,EAAQb,EAAMa,MACdC,EAAWd,EAAMc,SACjBC,EAAWf,EAAMe,SAGjBf,EAAMc,SAAWd,EAAMe,SAAWf,EAAMa,MAAQtrB,EAChDA,EAAMqrB,EAASC,MAGfb,EAAMa,MAAQA,EACdb,EAAMc,SAAWA,EACjBd,EAAMe,SAAWA,IAIJzpB,SAAR/B,EAGNA,EAAM,GACNA,EAIF,QAAS0rB,IAAcC,EAAaC,GAEnC,OACChsB,IAAK,WACJ,MAAK+rB,gBAGG9tB,MAAK+B,KAKL/B,KAAK+B,IAAMgsB,GAAQnrB,MAAO5C,KAAM6C,cAM3C,WACC,GAAImrB,GAAkBC,EACrBhmB,EAAUrI,EAAS8O,gBACnBwf,EAAYtuB,EAAS6F,cAAe,OACpCkI,EAAM/N,EAAS6F,cAAe,MAE/B,IAAMkI,EAAIif,MAAV,CAMAjf,EAAIif,MAAMuB,eAAiB,cAC3BxgB,EAAIwU,WAAW,GAAOyK,MAAMuB,eAAiB,GAC7CxtB,EAAQytB,gBAA+C,gBAA7BzgB,EAAIif,MAAMuB,eAEpCD,EAAUtB,MAAMyB,QAAU,gFAE1BH,EAAUtoB,YAAa+H,EAIvB,SAAS2gB,KACR3gB,EAAIif,MAAMyB,QAGT,uKAGD1gB,EAAIiC,UAAY,GAChB3H,EAAQrC,YAAasoB,EAErB,IAAIK,GAAWxuB,EAAOutB,iBAAkB3f,EAAK,KAC7CqgB,GAAoC,OAAjBO,EAASvf,IAC5Bif,EAA0C,QAAnBM,EAASd,MAEhCxlB,EAAQnC,YAAaooB,GAKjBnuB,EAAOutB,kBACXzsB,EAAOyC,OAAQ3C,GACd6tB,cAAe,WAMd,MADAF,KACON,GAERS,kBAAmB,WAIlB,MAH6B,OAAxBR,GACJK,IAEML,GAERS,oBAAqB,WAOpB,GAAIvsB,GACHwsB,EAAYhhB,EAAI/H,YAAahG,EAAS6F,cAAe,OAiBtD,OAdAkpB,GAAU/B,MAAMyB,QAAU1gB,EAAIif,MAAMyB,QAGnC,8HAEDM,EAAU/B,MAAMgC,YAAcD,EAAU/B,MAAMa,MAAQ,IACtD9f,EAAIif,MAAMa,MAAQ,MAClBxlB,EAAQrC,YAAasoB,GAErB/rB,GAAO6C,WAAYjF,EAAOutB,iBAAkBqB,EAAW,MAAOC,aAE9D3mB,EAAQnC,YAAaooB,GACrBvgB,EAAI7H,YAAa6oB,GAEVxsB,SAQXtB,EAAOguB,KAAO,SAAUnsB,EAAMa,EAAShB,EAAUC,GAChD,GAAIL,GAAKqB,EACRwI,IAGD,KAAMxI,IAAQD,GACbyI,EAAKxI,GAASd,EAAKkqB,MAAOppB,GAC1Bd,EAAKkqB,MAAOppB,GAASD,EAASC,EAG/BrB,GAAMI,EAASK,MAAOF,EAAMF,MAG5B,KAAMgB,IAAQD,GACbb,EAAKkqB,MAAOppB,GAASwI,EAAKxI,EAG3B,OAAOrB,GAIR,IAGC2sB,IAAe,4BACfC,GAAY,GAAIplB,QAAQ,KAAO8X,EAAO,SAAU,KAChDuN,GAAU,GAAIrlB,QAAQ,YAAc8X,EAAO,IAAK,KAEhDwN,IAAYC,SAAU,WAAYC,WAAY,SAAUtC,QAAS,SACjEuC,IACCC,cAAe,IACfC,WAAY,OAGbC,IAAgB,SAAU,IAAK,MAAO,KAGvC,SAASC,IAAgB5C,EAAOppB,GAG/B,GAAKA,IAAQopB,GACZ,MAAOppB,EAIR,IAAIisB,GAAUjsB,EAAK,GAAGhC,cAAgBgC,EAAKrD,MAAM,GAChDuvB,EAAWlsB,EACXb,EAAI4sB,GAAY3tB,MAEjB,OAAQe,IAEP,GADAa,EAAO+rB,GAAa5sB,GAAM8sB,EACrBjsB,IAAQopB,GACZ,MAAOppB,EAIT,OAAOksB,GAGR,QAASC,IAAmBjtB,EAAMyD,EAAOypB,GACxC,GAAI/oB,GAAUkoB,GAAU1iB,KAAMlG,EAC9B,OAAOU,GAENzC,KAAKyrB,IAAK,EAAGhpB,EAAS,IAAQ+oB,GAAY,KAAU/oB,EAAS,IAAO,MACpEV,EAGF,QAAS2pB,IAAsBptB,EAAMc,EAAMusB,EAAOC,EAAaC,GAS9D,IARA,GAAIttB,GAAIotB,KAAYC,EAAc,SAAW,WAE5C,EAES,UAATxsB,EAAmB,EAAI,EAEvBwN,EAAM,EAEK,EAAJrO,EAAOA,GAAK,EAEJ,WAAVotB,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAMqtB,EAAQpO,EAAWhf,IAAK,EAAMstB,IAGnDD,GAEW,YAAVD,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAM,UAAYif,EAAWhf,IAAK,EAAMstB,IAI7C,WAAVF,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAM,SAAWif,EAAWhf,GAAM,SAAS,EAAMstB,MAIrEjf,GAAOnQ,EAAOihB,IAAKpf,EAAM,UAAYif,EAAWhf,IAAK,EAAMstB,GAG5C,YAAVF,IACJ/e,GAAOnQ,EAAOihB,IAAKpf,EAAM,SAAWif,EAAWhf,GAAM,SAAS,EAAMstB,IAKvE,OAAOjf,GAGR,QAASkf,IAAkBxtB,EAAMc,EAAMusB,GAGtC,GAAII,IAAmB,EACtBnf,EAAe,UAATxN,EAAmBd,EAAK0tB,YAAc1tB,EAAK2tB,aACjDJ,EAAS7C,GAAW1qB,GACpBstB,EAAiE,eAAnDnvB,EAAOihB,IAAKpf,EAAM,aAAa,EAAOutB,EAKrD,IAAY,GAAPjf,GAAmB,MAAPA,EAAc,CAQ9B,GANAA,EAAMuc,GAAQ7qB,EAAMc,EAAMysB,IACf,EAANjf,GAAkB,MAAPA,KACfA,EAAMtO,EAAKkqB,MAAOppB,IAId2pB,GAAUxgB,KAAKqE,GACnB,MAAOA,EAKRmf,GAAmBH,IAChBrvB,EAAQ8tB,qBAAuBzd,IAAQtO,EAAKkqB,MAAOppB,IAGtDwN,EAAMhM,WAAYgM,IAAS,EAI5B,MAASA,GACR8e,GACCptB,EACAc,EACAusB,IAAWC,EAAc,SAAW,WACpCG,EACAF,GAEE,KAGL,QAASK,IAAUxf,EAAUyf,GAM5B,IALA,GAAI1D,GAASnqB,EAAM8tB,EAClBxS,KACA1D,EAAQ,EACR1Y,EAASkP,EAASlP,OAEHA,EAAR0Y,EAAgBA,IACvB5X,EAAOoO,EAAUwJ,GACX5X,EAAKkqB,QAIX5O,EAAQ1D,GAAU+F,EAAUte,IAAKW,EAAM,cACvCmqB,EAAUnqB,EAAKkqB,MAAMC,QAChB0D,GAGEvS,EAAQ1D,IAAuB,SAAZuS,IACxBnqB,EAAKkqB,MAAMC,QAAU,IAMM,KAAvBnqB,EAAKkqB,MAAMC,SAAkBjL,EAAUlf,KAC3Csb,EAAQ1D,GAAU+F,EAAUpB,OAAQvc,EAAM,aAAcqqB,GAAerqB,EAAKuD,cAG7EuqB,EAAS5O,EAAUlf,GAEF,SAAZmqB,GAAuB2D,GAC3BnQ,EAAUN,IAAKrd,EAAM,aAAc8tB,EAAS3D,EAAUhsB,EAAOihB,IAAKpf,EAAM,aAO3E,KAAM4X,EAAQ,EAAW1Y,EAAR0Y,EAAgBA,IAChC5X,EAAOoO,EAAUwJ,GACX5X,EAAKkqB,QAGL2D,GAA+B,SAAvB7tB,EAAKkqB,MAAMC,SAA6C,KAAvBnqB,EAAKkqB,MAAMC,UACzDnqB,EAAKkqB,MAAMC,QAAU0D,EAAOvS,EAAQ1D,IAAW,GAAK,QAItD,OAAOxJ,GAGRjQ,EAAOyC,QAINmtB,UACCC,SACC3uB,IAAK,SAAUW,EAAM8qB,GACpB,GAAKA,EAAW,CAGf,GAAIrrB,GAAMorB,GAAQ7qB,EAAM,UACxB,OAAe,KAARP,EAAa,IAAMA,MAO9BwuB,WACCC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,YAAc,EACdN,SAAW,EACXO,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKTC,UACCC,QAAS,YAIV3E,MAAO,SAAUlqB,EAAMc,EAAM2C,EAAO4pB,GAGnC,GAAMrtB,GAA0B,IAAlBA,EAAKuC,UAAoC,IAAlBvC,EAAKuC,UAAmBvC,EAAKkqB,MAAlE,CAKA,GAAIzqB,GAAKyC,EAAMsc,EACdwO,EAAW7uB,EAAOkF,UAAWvC,GAC7BopB,EAAQlqB,EAAKkqB,KAQd,OANAppB,GAAO3C,EAAOywB,SAAU5B,KAAgB7uB,EAAOywB,SAAU5B,GAAaF,GAAgB5C,EAAO8C,IAG7FxO,EAAQrgB,EAAO4vB,SAAUjtB,IAAU3C,EAAO4vB,SAAUf,GAGrCxrB,SAAViC,EAiCC+a,GAAS,OAASA,IAAqDhd,UAA3C/B,EAAM+e,EAAMnf,IAAKW,GAAM,EAAOqtB,IACvD5tB,EAIDyqB,EAAOppB,IArCdoB,QAAcuB,GAGA,WAATvB,IAAsBzC,EAAM6sB,GAAQ3iB,KAAMlG,MAC9CA,GAAUhE,EAAI,GAAK,GAAMA,EAAI,GAAK6C,WAAYnE,EAAOihB,IAAKpf,EAAMc,IAEhEoB,EAAO,UAIM,MAATuB,GAAiBA,IAAUA,IAKlB,WAATvB,GAAsB/D,EAAO8vB,UAAWjB,KAC5CvpB,GAAS,MAKJxF,EAAQytB,iBAA6B,KAAVjoB,GAAiD,IAAjC3C,EAAKlD,QAAS,gBAC9DssB,EAAOppB,GAAS,WAIX0d,GAAW,OAASA,IAAwDhd,UAA7CiC,EAAQ+a,EAAMnB,IAAKrd,EAAMyD,EAAO4pB,MACpEnD,EAAOppB,GAAS2C,IAjBjB,UA+BF2b,IAAK,SAAUpf,EAAMc,EAAMusB,EAAOE,GACjC,GAAIjf,GAAKhP,EAAKkf,EACbwO,EAAW7uB,EAAOkF,UAAWvC,EAwB9B,OArBAA,GAAO3C,EAAOywB,SAAU5B,KAAgB7uB,EAAOywB,SAAU5B,GAAaF,GAAgB9sB,EAAKkqB,MAAO8C,IAGlGxO,EAAQrgB,EAAO4vB,SAAUjtB,IAAU3C,EAAO4vB,SAAUf,GAG/CxO,GAAS,OAASA,KACtBlQ,EAAMkQ,EAAMnf,IAAKW,GAAM,EAAMqtB,IAIjB7rB,SAAR8M,IACJA,EAAMuc,GAAQ7qB,EAAMc,EAAMysB,IAId,WAARjf,GAAoBxN,IAAQ4rB,MAChCpe,EAAMoe,GAAoB5rB,IAIZ,KAAVusB,GAAgBA,GACpB/tB,EAAMgD,WAAYgM,GACX+e,KAAU,GAAQlvB,EAAOkE,UAAW/C,GAAQA,GAAO,EAAIgP,GAExDA,KAITnQ,EAAOyB,MAAO,SAAU,SAAW,SAAUK,EAAGa,GAC/C3C,EAAO4vB,SAAUjtB,IAChBzB,IAAK,SAAUW,EAAM8qB,EAAUuC,GAC9B,MAAKvC,GAIGsB,GAAaniB,KAAM9L,EAAOihB,IAAKpf,EAAM,aAAsC,IAArBA,EAAK0tB,YACjEvvB,EAAOguB,KAAMnsB,EAAMusB,GAAS,WAC3B,MAAOiB,IAAkBxtB,EAAMc,EAAMusB,KAEtCG,GAAkBxtB,EAAMc,EAAMusB,GARhC,QAYDhQ,IAAK,SAAUrd,EAAMyD,EAAO4pB,GAC3B,GAAIE,GAASF,GAAS3C,GAAW1qB,EACjC,OAAOitB,IAAmBjtB,EAAMyD,EAAO4pB,EACtCD,GACCptB,EACAc,EACAusB,EACmD,eAAnDlvB,EAAOihB,IAAKpf,EAAM,aAAa,EAAOutB,GACtCA,GACG,OAORpvB,EAAO4vB,SAAS7B,YAAcf,GAAcltB,EAAQ+tB,oBACnD,SAAUhsB,EAAM8qB,GACf,MAAKA,GACG3sB,EAAOguB,KAAMnsB,GAAQmqB,QAAW,gBACtCU,IAAU7qB,EAAM,gBAFlB,SAQF7B,EAAOyB,MACNkvB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB/wB,EAAO4vB,SAAUkB,EAASC,IACzBC,OAAQ,SAAU1rB,GAOjB,IANA,GAAIxD,GAAI,EACPmvB,KAGAC,EAAyB,gBAAV5rB,GAAqBA,EAAMkB,MAAM,MAASlB,GAE9C,EAAJxD,EAAOA,IACdmvB,EAAUH,EAAShQ,EAAWhf,GAAMivB,GACnCG,EAAOpvB,IAAOovB,EAAOpvB,EAAI,IAAOovB,EAAO,EAGzC,OAAOD,KAIH5E,GAAQvgB,KAAMglB,KACnB9wB,EAAO4vB,SAAUkB,EAASC,GAAS7R,IAAM4P,MAI3C9uB,EAAOG,GAAGsC,QACTwe,IAAK,SAAUte,EAAM2C,GACpB,MAAO8Y,GAAQjf,KAAM,SAAU0C,EAAMc,EAAM2C,GAC1C,GAAI8pB,GAAQhtB,EACXR,KACAE,EAAI,CAEL,IAAK9B,EAAOoD,QAAST,GAAS,CAI7B,IAHAysB,EAAS7C,GAAW1qB,GACpBO,EAAMO,EAAK5B,OAECqB,EAAJN,EAASA,IAChBF,EAAKe,EAAMb,IAAQ9B,EAAOihB,IAAKpf,EAAMc,EAAMb,IAAK,EAAOstB,EAGxD,OAAOxtB,GAGR,MAAiByB,UAAViC,EACNtF,EAAO+rB,MAAOlqB,EAAMc,EAAM2C,GAC1BtF,EAAOihB,IAAKpf,EAAMc,IACjBA,EAAM2C,EAAOtD,UAAUjB,OAAS,IAEpC2uB,KAAM,WACL,MAAOD,IAAUtwB,MAAM,IAExBgyB,KAAM,WACL,MAAO1B,IAAUtwB,OAElBiyB,OAAQ,SAAUtV,GACjB,MAAsB,iBAAVA,GACJA,EAAQ3c,KAAKuwB,OAASvwB,KAAKgyB,OAG5BhyB,KAAKsC,KAAK,WACXsf,EAAU5hB,MACda,EAAQb,MAAOuwB,OAEf1vB,EAAQb,MAAOgyB,WAOnB,SAASE,IAAOxvB,EAAMa,EAASyc,EAAM7c,EAAKgvB,GACzC,MAAO,IAAID,IAAMzwB,UAAUR,KAAMyB,EAAMa,EAASyc,EAAM7c,EAAKgvB,GAE5DtxB,EAAOqxB,MAAQA,GAEfA,GAAMzwB,WACLE,YAAauwB,GACbjxB,KAAM,SAAUyB,EAAMa,EAASyc,EAAM7c,EAAKgvB,EAAQC,GACjDpyB,KAAK0C,KAAOA,EACZ1C,KAAKggB,KAAOA,EACZhgB,KAAKmyB,OAASA,GAAU,QACxBnyB,KAAKuD,QAAUA,EACfvD,KAAKgT,MAAQhT,KAAKmH,IAAMnH,KAAKiO,MAC7BjO,KAAKmD,IAAMA,EACXnD,KAAKoyB,KAAOA,IAAUvxB,EAAO8vB,UAAW3Q,GAAS,GAAK,OAEvD/R,IAAK,WACJ,GAAIiT,GAAQgR,GAAMG,UAAWryB,KAAKggB,KAElC,OAAOkB,IAASA,EAAMnf,IACrBmf,EAAMnf,IAAK/B,MACXkyB,GAAMG,UAAUjN,SAASrjB,IAAK/B,OAEhCsyB,IAAK,SAAUC,GACd,GAAIC,GACHtR,EAAQgR,GAAMG,UAAWryB,KAAKggB,KAoB/B,OAlBKhgB,MAAKuD,QAAQkvB,SACjBzyB,KAAKqa,IAAMmY,EAAQ3xB,EAAOsxB,OAAQnyB,KAAKmyB,QACtCI,EAASvyB,KAAKuD,QAAQkvB,SAAWF,EAAS,EAAG,EAAGvyB,KAAKuD,QAAQkvB,UAG9DzyB,KAAKqa,IAAMmY,EAAQD,EAEpBvyB,KAAKmH,KAAQnH,KAAKmD,IAAMnD,KAAKgT,OAAUwf,EAAQxyB,KAAKgT,MAE/ChT,KAAKuD,QAAQmvB,MACjB1yB,KAAKuD,QAAQmvB,KAAK5wB,KAAM9B,KAAK0C,KAAM1C,KAAKmH,IAAKnH,MAGzCkhB,GAASA,EAAMnB,IACnBmB,EAAMnB,IAAK/f,MAEXkyB,GAAMG,UAAUjN,SAASrF,IAAK/f,MAExBA,OAITkyB,GAAMzwB,UAAUR,KAAKQ,UAAYywB,GAAMzwB,UAEvCywB,GAAMG,WACLjN,UACCrjB,IAAK,SAAU4wB,GACd,GAAIngB,EAEJ,OAAiC,OAA5BmgB,EAAMjwB,KAAMiwB,EAAM3S,OACpB2S,EAAMjwB,KAAKkqB,OAA2C,MAAlC+F,EAAMjwB,KAAKkqB,MAAO+F,EAAM3S,OAQ/CxN,EAAS3R,EAAOihB,IAAK6Q,EAAMjwB,KAAMiwB,EAAM3S,KAAM,IAErCxN,GAAqB,SAAXA,EAAwBA,EAAJ,GAT9BmgB,EAAMjwB,KAAMiwB,EAAM3S,OAW3BD,IAAK,SAAU4S,GAIT9xB,EAAO+xB,GAAGF,KAAMC,EAAM3S,MAC1Bnf,EAAO+xB,GAAGF,KAAMC,EAAM3S,MAAQ2S,GACnBA,EAAMjwB,KAAKkqB,QAAgE,MAArD+F,EAAMjwB,KAAKkqB,MAAO/rB,EAAOywB,SAAUqB,EAAM3S,QAAoBnf,EAAO4vB,SAAUkC,EAAM3S,OACrHnf,EAAO+rB,MAAO+F,EAAMjwB,KAAMiwB,EAAM3S,KAAM2S,EAAMxrB,IAAMwrB,EAAMP,MAExDO,EAAMjwB,KAAMiwB,EAAM3S,MAAS2S,EAAMxrB,OAQrC+qB,GAAMG,UAAUvL,UAAYoL,GAAMG,UAAU3L,YAC3C3G,IAAK,SAAU4S,GACTA,EAAMjwB,KAAKuC,UAAY0tB,EAAMjwB,KAAKmD,aACtC8sB,EAAMjwB,KAAMiwB,EAAM3S,MAAS2S,EAAMxrB,OAKpCtG,EAAOsxB,QACNU,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAM1uB,KAAK4uB,IAAKF,EAAI1uB,KAAK6uB,IAAO,IAIzCpyB,EAAO+xB,GAAKV,GAAMzwB,UAAUR,KAG5BJ,EAAO+xB,GAAGF,OAKV,IACCQ,IAAOC,GACPC,GAAW,yBACXC,GAAS,GAAI1pB,QAAQ,iBAAmB8X,EAAO,cAAe,KAC9D6R,GAAO,cACPC,IAAwBC,IACxBC,IACCC,KAAO,SAAU1T,EAAM7Z,GACtB,GAAIwsB,GAAQ3yB,KAAK2zB,YAAa3T,EAAM7Z,GACnCtC,EAAS8uB,EAAM1kB,MACf8jB,EAAQsB,GAAOhnB,KAAMlG,GACrBisB,EAAOL,GAASA,EAAO,KAASlxB,EAAO8vB,UAAW3Q,GAAS,GAAK,MAGhEhN,GAAUnS,EAAO8vB,UAAW3Q,IAAmB,OAAToS,IAAkBvuB,IACvDwvB,GAAOhnB,KAAMxL,EAAOihB,IAAK6Q,EAAMjwB,KAAMsd,IACtC4T,EAAQ,EACRC,EAAgB,EAEjB,IAAK7gB,GAASA,EAAO,KAAQof,EAAO,CAEnCA,EAAOA,GAAQpf,EAAO,GAGtB+e,EAAQA,MAGR/e,GAASnP,GAAU,CAEnB,GAGC+vB,GAAQA,GAAS,KAGjB5gB,GAAgB4gB,EAChB/yB,EAAO+rB,MAAO+F,EAAMjwB,KAAMsd,EAAMhN,EAAQof,SAI/BwB,KAAWA,EAAQjB,EAAM1kB,MAAQpK,IAAqB,IAAV+vB,KAAiBC,GAaxE,MATK9B,KACJ/e,EAAQ2f,EAAM3f,OAASA,IAAUnP,GAAU,EAC3C8uB,EAAMP,KAAOA,EAEbO,EAAMxvB,IAAM4uB,EAAO,GAClB/e,GAAU+e,EAAO,GAAM,GAAMA,EAAO,IACnCA,EAAO,IAGHY,IAKV,SAASmB,MAIR,MAHA9U,YAAW,WACVkU,GAAQhvB,SAEAgvB,GAAQryB,EAAOsG,MAIzB,QAAS4sB,IAAOnvB,EAAMovB,GACrB,GAAI9N,GACHvjB,EAAI,EACJkL,GAAUomB,OAAQrvB,EAKnB,KADAovB,EAAeA,EAAe,EAAI,EACtB,EAAJrxB,EAAQA,GAAK,EAAIqxB,EACxB9N,EAAQvE,EAAWhf,GACnBkL,EAAO,SAAWqY,GAAUrY,EAAO,UAAYqY,GAAUthB,CAO1D,OAJKovB,KACJnmB,EAAM6iB,QAAU7iB,EAAM4f,MAAQ7oB,GAGxBiJ,EAGR,QAAS8lB,IAAaxtB,EAAO6Z,EAAMkU,GAKlC,IAJA,GAAIvB,GACHwB,GAAeV,GAAUzT,QAAe5f,OAAQqzB,GAAU,MAC1DnZ,EAAQ,EACR1Y,EAASuyB,EAAWvyB,OACLA,EAAR0Y,EAAgBA,IACvB,GAAMqY,EAAQwB,EAAY7Z,GAAQxY,KAAMoyB,EAAWlU,EAAM7Z,GAGxD,MAAOwsB,GAKV,QAASa,IAAkB9wB,EAAMojB,EAAOsO,GAEvC,GAAIpU,GAAM7Z,EAAO8rB,EAAQU,EAAOzR,EAAOmT,EAASxH,EAASyH,EACxDC,EAAOv0B,KACPioB,KACA2E,EAAQlqB,EAAKkqB,MACb4D,EAAS9tB,EAAKuC,UAAY2c,EAAUlf,GACpC8xB,EAAWnU,EAAUte,IAAKW,EAAM,SAG3B0xB,GAAKrT,QACVG,EAAQrgB,EAAOsgB,YAAaze,EAAM,MACX,MAAlBwe,EAAMuT,WACVvT,EAAMuT,SAAW,EACjBJ,EAAUnT,EAAMvM,MAAMqH,KACtBkF,EAAMvM,MAAMqH,KAAO,WACZkF,EAAMuT,UACXJ,MAIHnT,EAAMuT,WAENF,EAAK1X,OAAO,WAEX0X,EAAK1X,OAAO,WACXqE,EAAMuT,WACA5zB,EAAOkgB,MAAOre,EAAM,MAAOd,QAChCsf,EAAMvM,MAAMqH,YAOO,IAAlBtZ,EAAKuC,WAAoB,UAAY6gB,IAAS,SAAWA,MAK7DsO,EAAKM,UAAa9H,EAAM8H,SAAU9H,EAAM+H,UAAW/H,EAAMgI,WAIzD/H,EAAUhsB,EAAOihB,IAAKpf,EAAM,WAG5B4xB,EAA2B,SAAZzH,EACdxM,EAAUte,IAAKW,EAAM,eAAkBqqB,GAAgBrqB,EAAKuD,UAAa4mB,EAEpD,WAAjByH,GAA6D,SAAhCzzB,EAAOihB,IAAKpf,EAAM,WACnDkqB,EAAMC,QAAU,iBAIbuH,EAAKM,WACT9H,EAAM8H,SAAW,SACjBH,EAAK1X,OAAO,WACX+P,EAAM8H,SAAWN,EAAKM,SAAU,GAChC9H,EAAM+H,UAAYP,EAAKM,SAAU,GACjC9H,EAAMgI,UAAYR,EAAKM,SAAU,KAKnC,KAAM1U,IAAQ8F,GAEb,GADA3f,EAAQ2f,EAAO9F,GACVoT,GAAS/mB,KAAMlG,GAAU,CAG7B,SAFO2f,GAAO9F,GACdiS,EAASA,GAAoB,WAAV9rB,EACdA,KAAYqqB,EAAS,OAAS,QAAW,CAG7C,GAAe,SAAVrqB,IAAoBquB,GAAiCtwB,SAArBswB,EAAUxU,GAG9C,QAFAwQ,IAAS,EAKXvI,EAAMjI,GAASwU,GAAYA,EAAUxU,IAAUnf,EAAO+rB,MAAOlqB,EAAMsd,OAInE6M,GAAU3oB,MAIZ,IAAMrD,EAAOqE,cAAe+iB,GAyCqD,YAAxD,SAAZ4E,EAAqBE,GAAgBrqB,EAAKuD,UAAa4mB,KACnED,EAAMC,QAAUA,OA1CoB,CAC/B2H,EACC,UAAYA,KAChBhE,EAASgE,EAAShE,QAGnBgE,EAAWnU,EAAUpB,OAAQvc,EAAM,aAI/BuvB,IACJuC,EAAShE,QAAUA,GAEfA,EACJ3vB,EAAQ6B,GAAO6tB,OAEfgE,EAAK/rB,KAAK,WACT3H,EAAQ6B,GAAOsvB,SAGjBuC,EAAK/rB,KAAK,WACT,GAAIwX,EAEJK,GAAUjE,OAAQ1Z,EAAM,SACxB,KAAMsd,IAAQiI,GACbpnB,EAAO+rB,MAAOlqB,EAAMsd,EAAMiI,EAAMjI,KAGlC,KAAMA,IAAQiI,GACb0K,EAAQgB,GAAanD,EAASgE,EAAUxU,GAAS,EAAGA,EAAMuU,GAElDvU,IAAQwU,KACfA,EAAUxU,GAAS2S,EAAM3f,MACpBwd,IACJmC,EAAMxvB,IAAMwvB,EAAM3f,MAClB2f,EAAM3f,MAAiB,UAATgN,GAA6B,WAATA,EAAoB,EAAI,KAW/D,QAAS6U,IAAY/O,EAAOgP,GAC3B,GAAIxa,GAAO9W,EAAM2uB,EAAQhsB,EAAO+a,CAGhC,KAAM5G,IAASwL,GAed,GAdAtiB,EAAO3C,EAAOkF,UAAWuU,GACzB6X,EAAS2C,EAAetxB,GACxB2C,EAAQ2f,EAAOxL,GACVzZ,EAAOoD,QAASkC,KACpBgsB,EAAShsB,EAAO,GAChBA,EAAQ2f,EAAOxL,GAAUnU,EAAO,IAG5BmU,IAAU9W,IACdsiB,EAAOtiB,GAAS2C,QACT2f,GAAOxL,IAGf4G,EAAQrgB,EAAO4vB,SAAUjtB,GACpB0d,GAAS,UAAYA,GAAQ,CACjC/a,EAAQ+a,EAAM2Q,OAAQ1rB,SACf2f,GAAOtiB,EAId,KAAM8W,IAASnU,GACNmU,IAASwL,KAChBA,EAAOxL,GAAUnU,EAAOmU,GACxBwa,EAAexa,GAAU6X,OAI3B2C,GAAetxB,GAAS2uB,EAK3B,QAAS4C,IAAWryB,EAAMsyB,EAAYzxB,GACrC,GAAIiP,GACHyiB,EACA3a,EAAQ,EACR1Y,EAAS2xB,GAAoB3xB,OAC7Bkb,EAAWjc,EAAO2b,WAAWK,OAAQ,iBAE7BqY,GAAKxyB,OAEbwyB,EAAO,WACN,GAAKD,EACJ,OAAO,CAWR,KATA,GAAIE,GAAcjC,IAASY,KAC1BhW,EAAY1Z,KAAKyrB,IAAK,EAAGqE,EAAUkB,UAAYlB,EAAUzB,SAAW0C,GAGpEle,EAAO6G,EAAYoW,EAAUzB,UAAY,EACzCF,EAAU,EAAItb,EACdqD,EAAQ,EACR1Y,EAASsyB,EAAUmB,OAAOzzB,OAEXA,EAAR0Y,EAAiBA,IACxB4Z,EAAUmB,OAAQ/a,GAAQgY,IAAKC,EAKhC,OAFAzV,GAASoB,WAAYxb,GAAQwxB,EAAW3B,EAASzU,IAElC,EAAVyU,GAAe3wB,EACZkc,GAEPhB,EAASqB,YAAazb,GAAQwxB,KACvB,IAGTA,EAAYpX,EAASF,SACpBla,KAAMA,EACNojB,MAAOjlB,EAAOyC,UAAY0xB,GAC1BZ,KAAMvzB,EAAOyC,QAAQ,GAAQwxB,kBAAqBvxB,GAClD+xB,mBAAoBN,EACpBO,gBAAiBhyB,EACjB6xB,UAAWlC,IAASY,KACpBrB,SAAUlvB,EAAQkvB,SAClB4C,UACA1B,YAAa,SAAU3T,EAAM7c,GAC5B,GAAIwvB,GAAQ9xB,EAAOqxB,MAAOxvB,EAAMwxB,EAAUE,KAAMpU,EAAM7c,EACpD+wB,EAAUE,KAAKU,cAAe9U,IAAUkU,EAAUE,KAAKjC,OAEzD,OADA+B,GAAUmB,OAAOh1B,KAAMsyB,GAChBA,GAERvR,KAAM,SAAUoU,GACf,GAAIlb,GAAQ,EAGX1Y,EAAS4zB,EAAUtB,EAAUmB,OAAOzzB,OAAS,CAC9C,IAAKqzB,EACJ,MAAOj1B,KAGR,KADAi1B,GAAU,EACMrzB,EAAR0Y,EAAiBA,IACxB4Z,EAAUmB,OAAQ/a,GAAQgY,IAAK,EAShC,OALKkD,GACJ1Y,EAASqB,YAAazb,GAAQwxB,EAAWsB,IAEzC1Y,EAAS2Y,WAAY/yB,GAAQwxB,EAAWsB,IAElCx1B,QAGT8lB,EAAQoO,EAAUpO,KAInB,KAFA+O,GAAY/O,EAAOoO,EAAUE,KAAKU,eAElBlzB,EAAR0Y,EAAiBA,IAExB,GADA9H,EAAS+gB,GAAqBjZ,GAAQxY,KAAMoyB,EAAWxxB,EAAMojB,EAAOoO,EAAUE,MAE7E,MAAO5hB,EAmBT,OAfA3R,GAAO4B,IAAKqjB,EAAO6N,GAAaO,GAE3BrzB,EAAOkD,WAAYmwB,EAAUE,KAAKphB,QACtCkhB,EAAUE,KAAKphB,MAAMlR,KAAMY,EAAMwxB,GAGlCrzB,EAAO+xB,GAAG8C,MACT70B,EAAOyC,OAAQ4xB,GACdxyB,KAAMA,EACN6xB,KAAML,EACNnT,MAAOmT,EAAUE,KAAKrT,SAKjBmT,EAAU3W,SAAU2W,EAAUE,KAAK7W,UACxC/U,KAAM0rB,EAAUE,KAAK5rB,KAAM0rB,EAAUE,KAAKuB,UAC1C5Y,KAAMmX,EAAUE,KAAKrX,MACrBF,OAAQqX,EAAUE,KAAKvX,QAG1Bhc,EAAOk0B,UAAYl0B,EAAOyC,OAAQyxB,IAEjCa,QAAS,SAAU9P,EAAOvjB,GACpB1B,EAAOkD,WAAY+hB,IACvBvjB,EAAWujB,EACXA,GAAU,MAEVA,EAAQA,EAAMze,MAAM,IAOrB,KAJA,GAAI2Y,GACH1F,EAAQ,EACR1Y,EAASkkB,EAAMlkB,OAEAA,EAAR0Y,EAAiBA,IACxB0F,EAAO8F,EAAOxL,GACdmZ,GAAUzT,GAASyT,GAAUzT,OAC7ByT,GAAUzT,GAAOpP,QAASrO,IAI5BszB,UAAW,SAAUtzB,EAAUipB,GACzBA,EACJ+H,GAAoB3iB,QAASrO,GAE7BgxB,GAAoBlzB,KAAMkC,MAK7B1B,EAAOi1B,MAAQ,SAAUA,EAAO3D,EAAQnxB,GACvC,GAAI+0B,GAAMD,GAA0B,gBAAVA,GAAqBj1B,EAAOyC,UAAYwyB,IACjEH,SAAU30B,IAAOA,GAAMmxB,GACtBtxB,EAAOkD,WAAY+xB,IAAWA,EAC/BrD,SAAUqD,EACV3D,OAAQnxB,GAAMmxB,GAAUA,IAAWtxB,EAAOkD,WAAYouB,IAAYA,EAwBnE,OArBA4D,GAAItD,SAAW5xB,EAAO+xB,GAAGhU,IAAM,EAA4B,gBAAjBmX,GAAItD,SAAwBsD,EAAItD,SACzEsD,EAAItD,WAAY5xB,GAAO+xB,GAAGoD,OAASn1B,EAAO+xB,GAAGoD,OAAQD,EAAItD,UAAa5xB,EAAO+xB,GAAGoD,OAAO5Q,UAGtE,MAAb2Q,EAAIhV,OAAiBgV,EAAIhV,SAAU,KACvCgV,EAAIhV,MAAQ,MAIbgV,EAAI/pB,IAAM+pB,EAAIJ,SAEdI,EAAIJ,SAAW,WACT90B,EAAOkD,WAAYgyB,EAAI/pB,MAC3B+pB,EAAI/pB,IAAIlK,KAAM9B,MAGV+1B,EAAIhV,OACRlgB,EAAOmgB,QAAShhB,KAAM+1B,EAAIhV,QAIrBgV,GAGRl1B,EAAOG,GAAGsC,QACT2yB,OAAQ,SAAUH,EAAOI,EAAI/D,EAAQ5vB,GAGpC,MAAOvC,MAAKwP,OAAQoS,GAAWE,IAAK,UAAW,GAAIyO,OAGjDptB,MAAMgzB,SAAUzF,QAASwF,GAAMJ,EAAO3D,EAAQ5vB,IAEjD4zB,QAAS,SAAUnW,EAAM8V,EAAO3D,EAAQ5vB,GACvC,GAAIoS,GAAQ9T,EAAOqE,cAAe8a,GACjCoW,EAASv1B,EAAOi1B,MAAOA,EAAO3D,EAAQ5vB,GACtC8zB,EAAc,WAEb,GAAI9B,GAAOQ,GAAW/0B,KAAMa,EAAOyC,UAAY0c,GAAQoW,IAGlDzhB,GAAS0L,EAAUte,IAAK/B,KAAM,YAClCu0B,EAAKnT,MAAM,GAKd,OAFCiV,GAAYC,OAASD,EAEf1hB,GAASyhB,EAAOrV,SAAU,EAChC/gB,KAAKsC,KAAM+zB,GACXr2B,KAAK+gB,MAAOqV,EAAOrV,MAAOsV,IAE5BjV,KAAM,SAAUxc,EAAM0c,EAAYkU,GACjC,GAAIe,GAAY,SAAUrV,GACzB,GAAIE,GAAOF,EAAME,WACVF,GAAME,KACbA,EAAMoU,GAYP,OATqB,gBAAT5wB,KACX4wB,EAAUlU,EACVA,EAAa1c,EACbA,EAAOV,QAEHod,GAAc1c,KAAS,GAC3B5E,KAAK+gB,MAAOnc,GAAQ,SAGd5E,KAAKsC,KAAK,WAChB,GAAI0e,IAAU,EACb1G,EAAgB,MAAR1V,GAAgBA,EAAO,aAC/B4xB,EAAS31B,EAAO21B,OAChBva,EAAOoE,EAAUte,IAAK/B,KAEvB,IAAKsa,EACC2B,EAAM3B,IAAW2B,EAAM3B,GAAQ8G,MACnCmV,EAAWta,EAAM3B,QAGlB,KAAMA,IAAS2B,GACTA,EAAM3B,IAAW2B,EAAM3B,GAAQ8G,MAAQkS,GAAK3mB,KAAM2N,IACtDic,EAAWta,EAAM3B,GAKpB,KAAMA,EAAQkc,EAAO50B,OAAQ0Y,KACvBkc,EAAQlc,GAAQ5X,OAAS1C,MAAiB,MAAR4E,GAAgB4xB,EAAQlc,GAAQyG,QAAUnc,IAChF4xB,EAAQlc,GAAQia,KAAKnT,KAAMoU,GAC3BxU,GAAU,EACVwV,EAAOnzB,OAAQiX,EAAO,KAOnB0G,IAAYwU,IAChB30B,EAAOmgB,QAAShhB,KAAM4E,MAIzB0xB,OAAQ,SAAU1xB,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAET5E,KAAKsC,KAAK,WAChB,GAAIgY,GACH2B,EAAOoE,EAAUte,IAAK/B,MACtB+gB,EAAQ9E,EAAMrX,EAAO,SACrBsc,EAAQjF,EAAMrX,EAAO,cACrB4xB,EAAS31B,EAAO21B,OAChB50B,EAASmf,EAAQA,EAAMnf,OAAS,CAajC,KAVAqa,EAAKqa,QAAS,EAGdz1B,EAAOkgB,MAAO/gB,KAAM4E,MAEfsc,GAASA,EAAME,MACnBF,EAAME,KAAKtf,KAAM9B,MAAM,GAIlBsa,EAAQkc,EAAO50B,OAAQ0Y,KACvBkc,EAAQlc,GAAQ5X,OAAS1C,MAAQw2B,EAAQlc,GAAQyG,QAAUnc,IAC/D4xB,EAAQlc,GAAQia,KAAKnT,MAAM,GAC3BoV,EAAOnzB,OAAQiX,EAAO,GAKxB,KAAMA,EAAQ,EAAW1Y,EAAR0Y,EAAgBA,IAC3ByG,EAAOzG,IAAWyG,EAAOzG,GAAQgc,QACrCvV,EAAOzG,GAAQgc,OAAOx0B,KAAM9B,YAKvBic,GAAKqa,YAKfz1B,EAAOyB,MAAO,SAAU,OAAQ,QAAU,SAAUK,EAAGa,GACtD,GAAIizB,GAAQ51B,EAAOG,GAAIwC,EACvB3C,GAAOG,GAAIwC,GAAS,SAAUsyB,EAAO3D,EAAQ5vB,GAC5C,MAAgB,OAATuzB,GAAkC,iBAAVA,GAC9BW,EAAM7zB,MAAO5C,KAAM6C,WACnB7C,KAAKm2B,QAASpC,GAAOvwB,GAAM,GAAQsyB,EAAO3D,EAAQ5vB,MAKrD1B,EAAOyB,MACNo0B,UAAW3C,GAAM,QACjB4C,QAAS5C,GAAM,QACf6C,YAAa7C,GAAM,UACnB8C,QAAUnG,QAAS,QACnBoG,SAAWpG,QAAS,QACpBqG,YAAcrG,QAAS,WACrB,SAAUltB,EAAMsiB,GAClBjlB,EAAOG,GAAIwC,GAAS,SAAUsyB,EAAO3D,EAAQ5vB,GAC5C,MAAOvC,MAAKm2B,QAASrQ,EAAOgQ,EAAO3D,EAAQ5vB,MAI7C1B,EAAO21B,UACP31B,EAAO+xB,GAAGsC,KAAO,WAChB,GAAIQ,GACH/yB,EAAI,EACJ6zB,EAAS31B,EAAO21B,MAIjB,KAFAtD,GAAQryB,EAAOsG,MAEPxE,EAAI6zB,EAAO50B,OAAQe,IAC1B+yB,EAAQc,EAAQ7zB,GAEV+yB,KAAWc,EAAQ7zB,KAAQ+yB,GAChCc,EAAOnzB,OAAQV,IAAK,EAIhB6zB,GAAO50B,QACZf,EAAO+xB,GAAGxR,OAEX8R,GAAQhvB,QAGTrD,EAAO+xB,GAAG8C,MAAQ,SAAUA,GAC3B70B,EAAO21B,OAAOn2B,KAAMq1B,GACfA,IACJ70B,EAAO+xB,GAAG5f,QAEVnS,EAAO21B,OAAOvtB,OAIhBpI,EAAO+xB,GAAGoE,SAAW,GAErBn2B,EAAO+xB,GAAG5f,MAAQ,WACXmgB,KACLA,GAAU8D,YAAap2B,EAAO+xB,GAAGsC,KAAMr0B,EAAO+xB,GAAGoE,YAInDn2B,EAAO+xB,GAAGxR,KAAO,WAChB8V,cAAe/D,IACfA,GAAU,MAGXtyB,EAAO+xB,GAAGoD,QACTmB,KAAM,IACNC,KAAM,IAENhS,SAAU,KAMXvkB,EAAOG,GAAGq2B,MAAQ,SAAUC,EAAM1yB,GAIjC,MAHA0yB,GAAOz2B,EAAO+xB,GAAK/xB,EAAO+xB,GAAGoD,OAAQsB,IAAUA,EAAOA,EACtD1yB,EAAOA,GAAQ,KAER5E,KAAK+gB,MAAOnc,EAAM,SAAUgV,EAAMsH,GACxC,GAAIqW,GAAUvY,WAAYpF,EAAM0d,EAChCpW,GAAME,KAAO,WACZoW,aAAcD,OAMjB,WACC,GAAI1nB,GAAQjQ,EAAS6F,cAAe,SACnCmC,EAAShI,EAAS6F,cAAe,UACjCswB,EAAMnuB,EAAOhC,YAAahG,EAAS6F,cAAe,UAEnDoK,GAAMjL,KAAO,WAIbjE,EAAQ82B,QAA0B,KAAhB5nB,EAAM1J,MAIxBxF,EAAQ+2B,YAAc3B,EAAIthB,SAI1B7M,EAAO2M,UAAW,EAClB5T,EAAQg3B,aAAe5B,EAAIxhB,SAI3B1E,EAAQjQ,EAAS6F,cAAe,SAChCoK,EAAM1J,MAAQ,IACd0J,EAAMjL,KAAO,QACbjE,EAAQi3B,WAA6B,MAAhB/nB,EAAM1J,QAI5B,IAAI0xB,IAAUC,GACb/pB,GAAalN,EAAOgQ,KAAK9C,UAE1BlN,GAAOG,GAAGsC,QACTyN,KAAM,SAAUvN,EAAM2C,GACrB,MAAO8Y,GAAQjf,KAAMa,EAAOkQ,KAAMvN,EAAM2C,EAAOtD,UAAUjB,OAAS,IAGnEm2B,WAAY,SAAUv0B,GACrB,MAAOxD,MAAKsC,KAAK,WAChBzB,EAAOk3B,WAAY/3B,KAAMwD,QAK5B3C,EAAOyC,QACNyN,KAAM,SAAUrO,EAAMc,EAAM2C,GAC3B,GAAI+a,GAAO/e,EACV61B,EAAQt1B,EAAKuC,QAGd,IAAMvC,GAAkB,IAAVs1B,GAAyB,IAAVA,GAAyB,IAAVA,EAK5C,aAAYt1B,GAAKkK,eAAiByV,EAC1BxhB,EAAOmf,KAAMtd,EAAMc,EAAM2C,IAKlB,IAAV6xB,GAAgBn3B,EAAOgY,SAAUnW,KACrCc,EAAOA,EAAK0C,cACZgb,EAAQrgB,EAAOo3B,UAAWz0B,KACvB3C,EAAOgQ,KAAKhF,MAAMrB,KAAKmC,KAAMnJ,GAASs0B,GAAWD;AAGtC3zB,SAAViC,EAaO+a,GAAS,OAASA,IAA6C,QAAnC/e,EAAM+e,EAAMnf,IAAKW,EAAMc,IACvDrB,GAGPA,EAAMtB,EAAO0O,KAAKwB,KAAMrO,EAAMc,GAGhB,MAAPrB,EACN+B,OACA/B,GApBc,OAAVgE,EAGO+a,GAAS,OAASA,IAAoDhd,UAA1C/B,EAAM+e,EAAMnB,IAAKrd,EAAMyD,EAAO3C,IAC9DrB,GAGPO,EAAKmK,aAAcrJ,EAAM2C,EAAQ,IAC1BA,OAPPtF,GAAOk3B,WAAYr1B,EAAMc,KAuB5Bu0B,WAAY,SAAUr1B,EAAMyD,GAC3B,GAAI3C,GAAM00B,EACTv1B,EAAI,EACJw1B,EAAYhyB,GAASA,EAAM0F,MAAOqP,EAEnC,IAAKid,GAA+B,IAAlBz1B,EAAKuC,SACtB,MAASzB,EAAO20B,EAAUx1B,KACzBu1B,EAAWr3B,EAAOu3B,QAAS50B,IAAUA,EAGhC3C,EAAOgQ,KAAKhF,MAAMrB,KAAKmC,KAAMnJ,KAEjCd,EAAMw1B,IAAa,GAGpBx1B,EAAKyK,gBAAiB3J,IAKzBy0B,WACCrzB,MACCmb,IAAK,SAAUrd,EAAMyD,GACpB,IAAMxF,EAAQi3B,YAAwB,UAAVzxB,GAC3BtF,EAAOoF,SAAUvD,EAAM,SAAY,CACnC,GAAIsO,GAAMtO,EAAKyD,KAKf,OAJAzD,GAAKmK,aAAc,OAAQ1G,GACtB6K,IACJtO,EAAKyD,MAAQ6K,GAEP7K,QAQZ2xB,IACC/X,IAAK,SAAUrd,EAAMyD,EAAO3C,GAO3B,MANK2C,MAAU,EAEdtF,EAAOk3B,WAAYr1B,EAAMc,GAEzBd,EAAKmK,aAAcrJ,EAAMA,GAEnBA,IAGT3C,EAAOyB,KAAMzB,EAAOgQ,KAAKhF,MAAMrB,KAAKkX,OAAO7V,MAAO,QAAU,SAAUlJ,EAAGa,GACxE,GAAI60B,GAAStqB,GAAYvK,IAAU3C,EAAO0O,KAAKwB,IAE/ChD,IAAYvK,GAAS,SAAUd,EAAMc,EAAMiE,GAC1C,GAAItF,GAAKwhB,CAUT,OATMlc,KAELkc,EAAS5V,GAAYvK,GACrBuK,GAAYvK,GAASrB,EACrBA,EAAqC,MAA/Bk2B,EAAQ31B,EAAMc,EAAMiE,GACzBjE,EAAK0C,cACL,KACD6H,GAAYvK,GAASmgB,GAEfxhB,IAOT,IAAIm2B,IAAa,qCAEjBz3B,GAAOG,GAAGsC,QACT0c,KAAM,SAAUxc,EAAM2C,GACrB,MAAO8Y,GAAQjf,KAAMa,EAAOmf,KAAMxc,EAAM2C,EAAOtD,UAAUjB,OAAS,IAGnE22B,WAAY,SAAU/0B,GACrB,MAAOxD,MAAKsC,KAAK,iBACTtC,MAAMa,EAAOu3B,QAAS50B,IAAUA,QAK1C3C,EAAOyC,QACN80B,SACCI,MAAO,UACPC,QAAS,aAGVzY,KAAM,SAAUtd,EAAMc,EAAM2C,GAC3B,GAAIhE,GAAK+e,EAAOwX,EACfV,EAAQt1B,EAAKuC,QAGd,IAAMvC,GAAkB,IAAVs1B,GAAyB,IAAVA,GAAyB,IAAVA,EAY5C,MARAU,GAAmB,IAAVV,IAAgBn3B,EAAOgY,SAAUnW,GAErCg2B,IAEJl1B,EAAO3C,EAAOu3B,QAAS50B,IAAUA,EACjC0d,EAAQrgB,EAAOwxB,UAAW7uB,IAGZU,SAAViC,EACG+a,GAAS,OAASA,IAAoDhd,UAA1C/B,EAAM+e,EAAMnB,IAAKrd,EAAMyD,EAAO3C,IAChErB,EACEO,EAAMc,GAAS2C,EAGX+a,GAAS,OAASA,IAA6C,QAAnC/e,EAAM+e,EAAMnf,IAAKW,EAAMc,IACzDrB,EACAO,EAAMc,IAIT6uB,WACChe,UACCtS,IAAK,SAAUW,GACd,MAAOA,GAAKi2B,aAAc,aAAgBL,GAAW3rB,KAAMjK,EAAKuD,WAAcvD,EAAK0R,KAClF1R,EAAK2R,SACL,QAMC1T,EAAQ+2B,cACb72B,EAAOwxB,UAAU5d,UAChB1S,IAAK,SAAUW,GACd,GAAImM,GAASnM,EAAKmD,UAIlB,OAHKgJ,IAAUA,EAAOhJ,YACrBgJ,EAAOhJ,WAAW6O,cAEZ,QAKV7T,EAAOyB,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFzB,EAAOu3B,QAASp4B,KAAKkG,eAAkBlG,MAMxC,IAAI44B,IAAS,aAEb/3B,GAAOG,GAAGsC,QACTu1B,SAAU,SAAU1yB,GACnB,GAAI2yB,GAASp2B,EAAMuL,EAAK8qB,EAAO71B,EAAG81B,EACjCC,EAA2B,gBAAV9yB,IAAsBA,EACvCxD,EAAI,EACJM,EAAMjD,KAAK4B,MAEZ,IAAKf,EAAOkD,WAAYoC,GACvB,MAAOnG,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAO64B,SAAU1yB,EAAMrE,KAAM9B,KAAMkD,EAAGlD,KAAKmP,aAIrD,IAAK8pB,EAIJ,IAFAH,GAAY3yB,GAAS,IAAK0F,MAAOqP,OAErBjY,EAAJN,EAASA,IAOhB,GANAD,EAAO1C,KAAM2C,GACbsL,EAAwB,IAAlBvL,EAAKuC,WAAoBvC,EAAKyM,WACjC,IAAMzM,EAAKyM,UAAY,KAAM7K,QAASs0B,GAAQ,KAChD,KAGU,CACV11B,EAAI,CACJ,OAAS61B,EAAQD,EAAQ51B,KACnB+K,EAAI3N,QAAS,IAAMy4B,EAAQ,KAAQ,IACvC9qB,GAAO8qB,EAAQ,IAKjBC,GAAan4B,EAAO2E,KAAMyI,GACrBvL,EAAKyM,YAAc6pB,IACvBt2B,EAAKyM,UAAY6pB,GAMrB,MAAOh5B,OAGRk5B,YAAa,SAAU/yB,GACtB,GAAI2yB,GAASp2B,EAAMuL,EAAK8qB,EAAO71B,EAAG81B,EACjCC,EAA+B,IAArBp2B,UAAUjB,QAAiC,gBAAVuE,IAAsBA,EACjExD,EAAI,EACJM,EAAMjD,KAAK4B,MAEZ,IAAKf,EAAOkD,WAAYoC,GACvB,MAAOnG,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAOk5B,YAAa/yB,EAAMrE,KAAM9B,KAAMkD,EAAGlD,KAAKmP,aAGxD,IAAK8pB,EAGJ,IAFAH,GAAY3yB,GAAS,IAAK0F,MAAOqP,OAErBjY,EAAJN,EAASA,IAQhB,GAPAD,EAAO1C,KAAM2C,GAEbsL,EAAwB,IAAlBvL,EAAKuC,WAAoBvC,EAAKyM,WACjC,IAAMzM,EAAKyM,UAAY,KAAM7K,QAASs0B,GAAQ,KAChD,IAGU,CACV11B,EAAI,CACJ,OAAS61B,EAAQD,EAAQ51B,KAExB,MAAQ+K,EAAI3N,QAAS,IAAMy4B,EAAQ,MAAS,EAC3C9qB,EAAMA,EAAI3J,QAAS,IAAMy0B,EAAQ,IAAK,IAKxCC,GAAa7yB,EAAQtF,EAAO2E,KAAMyI,GAAQ,GACrCvL,EAAKyM,YAAc6pB,IACvBt2B,EAAKyM,UAAY6pB,GAMrB,MAAOh5B,OAGRm5B,YAAa,SAAUhzB,EAAOizB,GAC7B,GAAIx0B,SAAcuB,EAElB,OAAyB,iBAAbizB,IAAmC,WAATx0B,EAC9Bw0B,EAAWp5B,KAAK64B,SAAU1yB,GAAUnG,KAAKk5B,YAAa/yB,GAItDnG,KAAKsC,KADRzB,EAAOkD,WAAYoC,GACN,SAAUxD,GAC1B9B,EAAQb,MAAOm5B,YAAahzB,EAAMrE,KAAK9B,KAAM2C,EAAG3C,KAAKmP,UAAWiqB,GAAWA,IAI5D,WAChB,GAAc,WAATx0B,EAAoB,CAExB,GAAIuK,GACHxM,EAAI,EACJwW,EAAOtY,EAAQb,MACfq5B,EAAalzB,EAAM0F,MAAOqP,MAE3B,OAAS/L,EAAYkqB,EAAY12B,KAE3BwW,EAAKmgB,SAAUnqB,GACnBgK,EAAK+f,YAAa/pB,GAElBgK,EAAK0f,SAAU1pB,QAKNvK,IAASyd,GAAyB,YAATzd,KAC/B5E,KAAKmP,WAETkR,EAAUN,IAAK/f,KAAM,gBAAiBA,KAAKmP,WAO5CnP,KAAKmP,UAAYnP,KAAKmP,WAAahJ,KAAU,EAAQ,GAAKka,EAAUte,IAAK/B,KAAM,kBAAqB,OAKvGs5B,SAAU,SAAUx4B,GAInB,IAHA,GAAIqO,GAAY,IAAMrO,EAAW,IAChC6B,EAAI,EACJwX,EAAIna,KAAK4B,OACEuY,EAAJxX,EAAOA,IACd,GAA0B,IAArB3C,KAAK2C,GAAGsC,WAAmB,IAAMjF,KAAK2C,GAAGwM,UAAY,KAAK7K,QAAQs0B,GAAQ,KAAKt4B,QAAS6O,IAAe,EAC3G,OAAO,CAIT,QAAO,IAOT,IAAIoqB,IAAU,KAEd14B,GAAOG,GAAGsC,QACT0N,IAAK,SAAU7K,GACd,GAAI+a,GAAO/e,EAAK4B,EACfrB,EAAO1C,KAAK,EAEb,EAAA,GAAM6C,UAAUjB,OAsBhB,MAFAmC,GAAalD,EAAOkD,WAAYoC,GAEzBnG,KAAKsC,KAAK,SAAUK,GAC1B,GAAIqO,EAEmB,KAAlBhR,KAAKiF,WAKT+L,EADIjN,EACEoC,EAAMrE,KAAM9B,KAAM2C,EAAG9B,EAAQb,MAAOgR,OAEpC7K,EAIK,MAAP6K,EACJA,EAAM,GAEoB,gBAARA,GAClBA,GAAO,GAEInQ,EAAOoD,QAAS+M,KAC3BA,EAAMnQ,EAAO4B,IAAKuO,EAAK,SAAU7K,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItC+a,EAAQrgB,EAAO24B,SAAUx5B,KAAK4E,OAAU/D,EAAO24B,SAAUx5B,KAAKiG,SAASC,eAGjEgb,GAAW,OAASA,IAA8Chd,SAApCgd,EAAMnB,IAAK/f,KAAMgR,EAAK,WACzDhR,KAAKmG,MAAQ6K,KAnDd,IAAKtO,EAGJ,MAFAwe,GAAQrgB,EAAO24B,SAAU92B,EAAKkC,OAAU/D,EAAO24B,SAAU92B,EAAKuD,SAASC,eAElEgb,GAAS,OAASA,IAAgDhd,UAAtC/B,EAAM+e,EAAMnf,IAAKW,EAAM,UAChDP,GAGRA,EAAMO,EAAKyD,MAEW,gBAARhE,GAEbA,EAAImC,QAAQi1B,GAAS,IAEd,MAAPp3B,EAAc,GAAKA,OA4CxBtB,EAAOyC,QACNk2B,UACCvQ,QACClnB,IAAK,SAAUW,GACd,GAAIsO,GAAMnQ,EAAO0O,KAAKwB,KAAMrO,EAAM,QAClC,OAAc,OAAPsO,EACNA,EAGAnQ,EAAO2E,KAAM3E,EAAO6E,KAAMhD,MAG7BkF,QACC7F,IAAK,SAAUW,GAYd,IAXA,GAAIyD,GAAO8iB,EACV1lB,EAAUb,EAAKa,QACf+W,EAAQ5X,EAAKgS,cACb4T,EAAoB,eAAd5lB,EAAKkC,MAAiC,EAAR0V,EACpC0D,EAASsK,EAAM,QACfuH,EAAMvH,EAAMhO,EAAQ,EAAI/W,EAAQ3B,OAChCe,EAAY,EAAR2X,EACHuV,EACAvH,EAAMhO,EAAQ,EAGJuV,EAAJltB,EAASA,IAIhB,GAHAsmB,EAAS1lB,EAASZ,MAGXsmB,EAAOxU,UAAY9R,IAAM2X,IAE5B3Z,EAAQg3B,YAAe1O,EAAO1U,SAAiD,OAAtC0U,EAAOrc,aAAc,cAC7Dqc,EAAOpjB,WAAW0O,UAAa1T,EAAOoF,SAAUgjB,EAAOpjB,WAAY,aAAiB,CAMxF,GAHAM,EAAQtF,EAAQooB,GAASjY,MAGpBsX,EACJ,MAAOniB,EAIR6X,GAAO3d,KAAM8F,GAIf,MAAO6X,IAGR+B,IAAK,SAAUrd,EAAMyD,GACpB,GAAIszB,GAAWxQ,EACd1lB,EAAUb,EAAKa,QACfya,EAASnd,EAAOwF,UAAWF,GAC3BxD,EAAIY,EAAQ3B,MAEb,OAAQe,IACPsmB,EAAS1lB,EAASZ,IACZsmB,EAAOxU,SAAW5T,EAAO2F,QAASyiB,EAAO9iB,MAAO6X,IAAY,KACjEyb,GAAY,EAQd,OAHMA,KACL/2B,EAAKgS,cAAgB,IAEfsJ,OAOXnd,EAAOyB,MAAO,QAAS,YAAc,WACpCzB,EAAO24B,SAAUx5B,OAChB+f,IAAK,SAAUrd,EAAMyD,GACpB,MAAKtF,GAAOoD,QAASkC,GACXzD,EAAK8R,QAAU3T,EAAO2F,QAAS3F,EAAO6B,GAAMsO,MAAO7K,IAAW,EADxE,SAKIxF,EAAQ82B,UACb52B,EAAO24B,SAAUx5B,MAAO+B,IAAM,SAAUW,GACvC,MAAsC,QAA/BA,EAAKkK,aAAa,SAAoB,KAAOlK,EAAKyD,UAW5DtF,EAAOyB,KAAM,0MAEqD+E,MAAM,KAAM,SAAU1E,EAAGa,GAG1F3C,EAAOG,GAAIwC,GAAS,SAAUyY,EAAMjb,GACnC,MAAO6B,WAAUjB,OAAS,EACzB5B,KAAKqoB,GAAI7kB,EAAM,KAAMyY,EAAMjb,GAC3BhB,KAAKukB,QAAS/gB,MAIjB3C,EAAOG,GAAGsC,QACTo2B,MAAO,SAAUC,EAAQC,GACxB,MAAO55B,MAAK6nB,WAAY8R,GAAS7R,WAAY8R,GAASD,IAGvDE,KAAM,SAAU7W,EAAO/G,EAAMjb,GAC5B,MAAOhB,MAAKqoB,GAAIrF,EAAO,KAAM/G,EAAMjb,IAEpC84B,OAAQ,SAAU9W,EAAOhiB,GACxB,MAAOhB,MAAK4e,IAAKoE,EAAO,KAAMhiB,IAG/B+4B,SAAU,SAAUj5B,EAAUkiB,EAAO/G,EAAMjb,GAC1C,MAAOhB,MAAKqoB,GAAIrF,EAAOliB,EAAUmb,EAAMjb,IAExCg5B,WAAY,SAAUl5B,EAAUkiB,EAAOhiB,GAEtC,MAA4B,KAArB6B,UAAUjB,OAAe5B,KAAK4e,IAAK9d,EAAU,MAASd,KAAK4e,IAAKoE,EAAOliB,GAAY,KAAME,KAKlG,IAAIi5B,IAAQp5B,EAAOsG,MAEf+yB,GAAS,IAMbr5B,GAAO6f,UAAY,SAAUzE,GAC5B,MAAOke,MAAKC,MAAOne,EAAO,KAK3Bpb,EAAOw5B,SAAW,SAAUpe,GAC3B,GAAIpJ,GAAK3L,CACT,KAAM+U,GAAwB,gBAATA,GACpB,MAAO,KAIR,KACC/U,EAAM,GAAIozB,WACVznB,EAAM3L,EAAIqzB,gBAAiBte,EAAM,YAChC,MAAQvQ,GACTmH,EAAM3O,OAMP,QAHM2O,GAAOA,EAAIrG,qBAAsB,eAAgB5K,SACtDf,EAAO2D,MAAO,gBAAkByX,GAE1BpJ,EAIR,IACC2nB,IAAQ,OACRC,GAAM,gBACNC,GAAW,6BAEXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QACZC,GAAO,4DAWPC,MAOAC,MAGAC,GAAW,KAAK76B,OAAQ,KAGxB86B,GAAen7B,EAAOgU,SAASK,KAG/B+mB,GAAeL,GAAKzuB,KAAM6uB,GAAah1B,kBAGxC,SAASk1B,IAA6BC,GAGrC,MAAO,UAAUC,EAAoB7e,GAED,gBAAvB6e,KACX7e,EAAO6e,EACPA,EAAqB,IAGtB,IAAIC,GACH54B,EAAI,EACJ64B,EAAYF,EAAmBp1B,cAAc2F,MAAOqP,MAErD,IAAKra,EAAOkD,WAAY0Y,GAEvB,MAAS8e,EAAWC,EAAU74B,KAER,MAAhB44B,EAAS,IACbA,EAAWA,EAASp7B,MAAO,IAAO,KACjCk7B,EAAWE,GAAaF,EAAWE,QAAkB3qB,QAAS6L,KAI9D4e,EAAWE,GAAaF,EAAWE,QAAkBl7B,KAAMoc,IAQjE,QAASgf,IAA+BJ,EAAW93B,EAASgyB,EAAiBmG,GAE5E,GAAIC,MACHC,EAAqBP,IAAcL,EAEpC,SAASa,GAASN,GACjB,GAAI9mB,EAYJ,OAXAknB,GAAWJ,IAAa,EACxB16B,EAAOyB,KAAM+4B,EAAWE,OAAkB,SAAUrwB,EAAG4wB,GACtD,GAAIC,GAAsBD,EAAoBv4B,EAASgyB,EAAiBmG,EACxE,OAAoC,gBAAxBK,IAAqCH,GAAqBD,EAAWI,GAIrEH,IACDnnB,EAAWsnB,GADf,QAHNx4B,EAAQi4B,UAAU5qB,QAASmrB,GAC3BF,EAASE,IACF,KAKFtnB,EAGR,MAAOonB,GAASt4B,EAAQi4B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAYn4B,EAAQJ,GAC5B,GAAI6J,GAAKxJ,EACRm4B,EAAcp7B,EAAOq7B,aAAaD,eAEnC,KAAM3uB,IAAO7J,GACQS,SAAfT,EAAK6J,MACP2uB,EAAa3uB,GAAQzJ,EAAWC,IAASA,OAAgBwJ,GAAQ7J,EAAK6J,GAO1E,OAJKxJ,IACJjD,EAAOyC,QAAQ,EAAMO,EAAQC,GAGvBD,EAOR,QAASs4B,IAAqBC,EAAGV,EAAOW,GAEvC,GAAIC,GAAI13B,EAAM23B,EAAeC,EAC5B7iB,EAAWyiB,EAAEziB,SACb6hB,EAAYY,EAAEZ,SAGf,OAA2B,MAAnBA,EAAW,GAClBA,EAAUhuB,QACEtJ,SAAPo4B,IACJA,EAAKF,EAAEK,UAAYf,EAAMgB,kBAAkB,gBAK7C,IAAKJ,EACJ,IAAM13B,IAAQ+U,GACb,GAAKA,EAAU/U,IAAU+U,EAAU/U,GAAO+H,KAAM2vB,GAAO,CACtDd,EAAU5qB,QAAShM,EACnB,OAMH,GAAK42B,EAAW,IAAOa,GACtBE,EAAgBf,EAAW,OACrB,CAEN,IAAM52B,IAAQy3B,GAAY,CACzB,IAAMb,EAAW,IAAOY,EAAEO,WAAY/3B,EAAO,IAAM42B,EAAU,IAAO,CACnEe,EAAgB33B,CAChB,OAEK43B,IACLA,EAAgB53B,GAIlB23B,EAAgBA,GAAiBC,EAMlC,MAAKD,IACCA,IAAkBf,EAAW,IACjCA,EAAU5qB,QAAS2rB,GAEbF,EAAWE,IAJnB,OAWD,QAASK,IAAaR,EAAGS,EAAUnB,EAAOoB,GACzC,GAAIC,GAAOC,EAASC,EAAM/1B,EAAK2S,EAC9B8iB,KAEAnB,EAAYY,EAAEZ,UAAUr7B,OAGzB,IAAKq7B,EAAW,GACf,IAAMyB,IAAQb,GAAEO,WACfA,EAAYM,EAAK/2B,eAAkBk2B,EAAEO,WAAYM,EAInDD,GAAUxB,EAAUhuB,OAGpB,OAAQwvB,EAcP,GAZKZ,EAAEc,eAAgBF,KACtBtB,EAAOU,EAAEc,eAAgBF,IAAcH,IAIlChjB,GAAQijB,GAAaV,EAAEe,aAC5BN,EAAWT,EAAEe,WAAYN,EAAUT,EAAEb,WAGtC1hB,EAAOmjB,EACPA,EAAUxB,EAAUhuB,QAKnB,GAAiB,MAAZwvB,EAEJA,EAAUnjB,MAGJ,IAAc,MAATA,GAAgBA,IAASmjB,EAAU,CAM9C,GAHAC,EAAON,EAAY9iB,EAAO,IAAMmjB,IAAaL,EAAY,KAAOK,IAG1DC,EACL,IAAMF,IAASJ,GAId,GADAz1B,EAAM61B,EAAM11B,MAAO,KACdH,EAAK,KAAQ81B,IAGjBC,EAAON,EAAY9iB,EAAO,IAAM3S,EAAK,KACpCy1B,EAAY,KAAOz1B,EAAK,KACb,CAEN+1B,KAAS,EACbA,EAAON,EAAYI,GAGRJ,EAAYI,MAAY,IACnCC,EAAU91B,EAAK,GACfs0B,EAAU5qB,QAAS1J,EAAK,IAEzB,OAOJ,GAAK+1B,KAAS,EAGb,GAAKA,GAAQb,EAAG,UACfS,EAAWI,EAAMJ,OAEjB,KACCA,EAAWI,EAAMJ,GAChB,MAAQnxB,GACT,OAASiR,MAAO,cAAenY,MAAOy4B,EAAOvxB,EAAI,sBAAwBmO,EAAO,OAASmjB,IAQ/F,OAASrgB,MAAO,UAAWV,KAAM4gB,GAGlCh8B,EAAOyC,QAGN85B,OAAQ,EAGRC,gBACAC,QAEApB,cACCqB,IAAKrC,GACLt2B,KAAM,MACN44B,QAAS7C,GAAehuB,KAAMwuB,GAAc,IAC5C37B,QAAQ,EACRi+B,aAAa,EACbC,OAAO,EACPC,YAAa,mDAabhe,SACC+T,IAAKuH,GACLv1B,KAAM,aACNmmB,KAAM,YACNhZ,IAAK,4BACL+qB,KAAM,qCAGPjkB,UACC9G,IAAK,MACLgZ,KAAM,OACN+R,KAAM,QAGPV,gBACCrqB,IAAK,cACLnN,KAAM,eACNk4B,KAAM,gBAKPjB,YAGCkB,SAAUvyB,OAGVwyB,aAAa,EAGbC,YAAal9B,EAAO6f,UAGpBsd,WAAYn9B,EAAOw5B,UAOpB4B,aACCsB,KAAK,EACLx8B,SAAS,IAOXk9B,UAAW,SAAUp6B,EAAQq6B,GAC5B,MAAOA,GAGNlC,GAAYA,GAAYn4B,EAAQhD,EAAOq7B,cAAgBgC,GAGvDlC,GAAYn7B,EAAOq7B,aAAcr4B,IAGnCs6B,cAAe/C,GAA6BL,IAC5CqD,cAAehD,GAA6BJ,IAG5CqD,KAAM,SAAUd,EAAKh6B,GAGA,gBAARg6B,KACXh6B,EAAUg6B,EACVA,EAAMr5B,QAIPX,EAAUA,KAEV,IAAI+6B,GAEHC,EAEAC,EACAC,EAEAC,EAEA3M,EAEA4M,EAEAh8B,EAEAy5B,EAAIv7B,EAAOo9B,aAAe16B,GAE1Bq7B,EAAkBxC,EAAEr7B,SAAWq7B,EAE/ByC,EAAqBzC,EAAEr7B,UAAa69B,EAAgB35B,UAAY25B,EAAgBl9B,QAC/Eb,EAAQ+9B,GACR/9B,EAAOkiB,MAERjG,EAAWjc,EAAO2b,WAClBsiB,EAAmBj+B,EAAO0a,UAAU,eAEpCwjB,EAAa3C,EAAE2C,eAEfC,KACAC,KAEAtiB,EAAQ,EAERuiB,EAAW,WAEXxD,GACC3c,WAAY,EAGZ2d,kBAAmB,SAAUpvB,GAC5B,GAAIzB,EACJ,IAAe,IAAV8Q,EAAc,CAClB,IAAM8hB,EAAkB,CACvBA,IACA,OAAS5yB,EAAQ6uB,GAASruB,KAAMmyB,GAC/BC,EAAiB5yB,EAAM,GAAG3F,eAAkB2F,EAAO,GAGrDA,EAAQ4yB,EAAiBnxB,EAAIpH,eAE9B,MAAgB,OAAT2F,EAAgB,KAAOA,GAI/BszB,sBAAuB,WACtB,MAAiB,KAAVxiB,EAAc6hB,EAAwB,MAI9CY,iBAAkB,SAAU57B,EAAM2C,GACjC,GAAIk5B,GAAQ77B,EAAK0C,aAKjB,OAJMyW,KACLnZ,EAAOy7B,EAAqBI,GAAUJ,EAAqBI,IAAW77B,EACtEw7B,EAAgBx7B,GAAS2C,GAEnBnG,MAIRs/B,iBAAkB,SAAU16B,GAI3B,MAHM+X,KACLyf,EAAEK,SAAW73B,GAEP5E,MAIR++B,WAAY,SAAUt8B,GACrB,GAAI2C,EACJ,IAAK3C,EACJ,GAAa,EAARka,EACJ,IAAMvX,IAAQ3C,GAEbs8B,EAAY35B,IAAW25B,EAAY35B,GAAQ3C,EAAK2C,QAIjDs2B,GAAM7e,OAAQpa,EAAKi5B,EAAM6D,QAG3B,OAAOv/B,OAIRw/B,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcP,CAK9B,OAJKZ,IACJA,EAAUkB,MAAOE,GAElBl3B,EAAM,EAAGk3B,GACF1/B,MAyCV,IApCA8c,EAASF,QAAS8e,GAAQ/F,SAAWmJ,EAAiBtkB,IACtDkhB,EAAMiE,QAAUjE,EAAMlzB,KACtBkzB,EAAMl3B,MAAQk3B,EAAM3e,KAMpBqf,EAAEmB,MAAUA,GAAOnB,EAAEmB,KAAOrC,IAAiB,IAAK52B,QAASk2B,GAAO,IAChEl2B,QAASu2B,GAAWM,GAAc,GAAM,MAG1CiB,EAAEx3B,KAAOrB,EAAQq8B,QAAUr8B,EAAQqB,MAAQw3B,EAAEwD,QAAUxD,EAAEx3B,KAGzDw3B,EAAEZ,UAAY36B,EAAO2E,KAAM42B,EAAEb,UAAY,KAAMr1B,cAAc2F,MAAOqP,KAAiB,IAG/D,MAAjBkhB,EAAEyD,cACN9N,EAAQ+I,GAAKzuB,KAAM+vB,EAAEmB,IAAIr3B,eACzBk2B,EAAEyD,eAAkB9N,GACjBA,EAAO,KAAQoJ,GAAc,IAAOpJ,EAAO,KAAQoJ,GAAc,KAChEpJ,EAAO,KAAwB,UAAfA,EAAO,GAAkB,KAAO,WAC/CoJ,GAAc,KAA+B,UAAtBA,GAAc,GAAkB,KAAO,UAK/DiB,EAAEngB,MAAQmgB,EAAEqB,aAAiC,gBAAXrB,GAAEngB,OACxCmgB,EAAEngB,KAAOpb,EAAOi/B,MAAO1D,EAAEngB,KAAMmgB,EAAE2D,cAIlCtE,GAA+BV,GAAYqB,EAAG74B,EAASm4B,GAGxC,IAAV/e,EACJ,MAAO+e,EAKRiD,GAAc99B,EAAOkiB,OAASqZ,EAAE58B,OAG3Bm/B,GAAmC,IAApB99B,EAAOu8B,UAC1Bv8B,EAAOkiB,MAAMwB,QAAQ,aAItB6X,EAAEx3B,KAAOw3B,EAAEx3B,KAAKpD,cAGhB46B,EAAE4D,YAAcpF,GAAWjuB,KAAMyvB,EAAEx3B,MAInC25B,EAAWnC,EAAEmB,IAGPnB,EAAE4D,aAGF5D,EAAEngB,OACNsiB,EAAanC,EAAEmB,MAASrD,GAAOvtB,KAAM4xB,GAAa,IAAM,KAAQnC,EAAEngB,WAE3DmgB,GAAEngB,MAILmgB,EAAE/uB,SAAU,IAChB+uB,EAAEmB,IAAM9C,GAAI9tB,KAAM4xB,GAGjBA,EAASj6B,QAASm2B,GAAK,OAASR,MAGhCsE,GAAarE,GAAOvtB,KAAM4xB,GAAa,IAAM,KAAQ,KAAOtE,OAK1DmC,EAAE6D,aACDp/B,EAAOw8B,aAAckB,IACzB7C,EAAM0D,iBAAkB,oBAAqBv+B,EAAOw8B,aAAckB,IAE9D19B,EAAOy8B,KAAMiB,IACjB7C,EAAM0D,iBAAkB,gBAAiBv+B,EAAOy8B,KAAMiB,MAKnDnC,EAAEngB,MAAQmgB,EAAE4D,YAAc5D,EAAEuB,eAAgB,GAASp6B,EAAQo6B,cACjEjC,EAAM0D,iBAAkB,eAAgBhD,EAAEuB,aAI3CjC,EAAM0D,iBACL,SACAhD,EAAEZ,UAAW,IAAOY,EAAEzc,QAASyc,EAAEZ,UAAU,IAC1CY,EAAEzc,QAASyc,EAAEZ,UAAU,KAA8B,MAArBY,EAAEZ,UAAW,GAAc,KAAOP,GAAW,WAAa,IAC1FmB,EAAEzc,QAAS,KAIb,KAAMhd,IAAKy5B,GAAE8D,QACZxE,EAAM0D,iBAAkBz8B,EAAGy5B,EAAE8D,QAASv9B,GAIvC,IAAKy5B,EAAE+D,aAAgB/D,EAAE+D,WAAWr+B,KAAM88B,EAAiBlD,EAAOU,MAAQ,GAAmB,IAAVzf,GAElF,MAAO+e,GAAM8D,OAIdN,GAAW,OAGX,KAAMv8B,KAAOg9B,QAAS,EAAGn7B,MAAO,EAAGmxB,SAAU,GAC5C+F,EAAO/4B,GAAKy5B,EAAGz5B,GAOhB,IAHA27B,EAAY7C,GAA+BT,GAAYoB,EAAG74B,EAASm4B,GAK5D,CACNA,EAAM3c,WAAa,EAGd4f,GACJE,EAAmBta,QAAS,YAAcmX,EAAOU,IAG7CA,EAAEsB,OAAStB,EAAE7E,QAAU,IAC3BmH,EAAe1f,WAAW,WACzB0c,EAAM8D,MAAM,YACVpD,EAAE7E,SAGN,KACC5a,EAAQ,EACR2hB,EAAU8B,KAAMpB,EAAgBx2B,GAC/B,MAAQkD,GAET,KAAa,EAARiR,GAIJ,KAAMjR,EAHNlD,GAAM,GAAIkD,QArBZlD,GAAM,GAAI,eA8BX,SAASA,GAAM+2B,EAAQc,EAAkBhE,EAAW6D,GACnD,GAAIpD,GAAW6C,EAASn7B,EAAOq4B,EAAUyD,EACxCb,EAAaY,CAGC,KAAV1jB,IAKLA,EAAQ,EAGH+hB,GACJlH,aAAckH,GAKfJ,EAAYp6B,OAGZs6B,EAAwB0B,GAAW,GAGnCxE,EAAM3c,WAAawgB,EAAS,EAAI,EAAI,EAGpCzC,EAAYyC,GAAU,KAAgB,IAATA,GAA2B,MAAXA,EAGxClD,IACJQ,EAAWV,GAAqBC,EAAGV,EAAOW,IAI3CQ,EAAWD,GAAaR,EAAGS,EAAUnB,EAAOoB,GAGvCA,GAGCV,EAAE6D,aACNK,EAAW5E,EAAMgB,kBAAkB,iBAC9B4D,IACJz/B,EAAOw8B,aAAckB,GAAa+B,GAEnCA,EAAW5E,EAAMgB,kBAAkB,QAC9B4D,IACJz/B,EAAOy8B,KAAMiB,GAAa+B,IAKZ,MAAXf,GAA6B,SAAXnD,EAAEx3B,KACxB66B,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAa5C,EAASlgB,MACtBgjB,EAAU9C,EAAS5gB,KACnBzX,EAAQq4B,EAASr4B,MACjBs4B,GAAat4B,KAIdA,EAAQi7B,GACHF,IAAWE,KACfA,EAAa,QACC,EAATF,IACJA,EAAS,KAMZ7D,EAAM6D,OAASA,EACf7D,EAAM+D,YAAeY,GAAoBZ,GAAe,GAGnD3C,EACJhgB,EAASqB,YAAaygB,GAAmBe,EAASF,EAAY/D,IAE9D5e,EAAS2Y,WAAYmJ,GAAmBlD,EAAO+D,EAAYj7B,IAI5Dk3B,EAAMqD,WAAYA,GAClBA,EAAa76B,OAERy6B,GACJE,EAAmBta,QAASuY,EAAY,cAAgB,aACrDpB,EAAOU,EAAGU,EAAY6C,EAAUn7B,IAIpCs6B,EAAiBviB,SAAUqiB,GAAmBlD,EAAO+D,IAEhDd,IACJE,EAAmBta,QAAS,gBAAkBmX,EAAOU,MAE3Cv7B,EAAOu8B,QAChBv8B,EAAOkiB,MAAMwB,QAAQ,cAKxB,MAAOmX,IAGR6E,QAAS,SAAUhD,EAAKthB,EAAM1Z,GAC7B,MAAO1B,GAAOkB,IAAKw7B,EAAKthB,EAAM1Z,EAAU,SAGzCi+B,UAAW,SAAUjD,EAAKh7B,GACzB,MAAO1B,GAAOkB,IAAKw7B,EAAKr5B,OAAW3B,EAAU,aAI/C1B,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGi9B,GAC5C/+B,EAAQ++B,GAAW,SAAUrC,EAAKthB,EAAM1Z,EAAUqC,GAQjD,MANK/D,GAAOkD,WAAYkY,KACvBrX,EAAOA,GAAQrC,EACfA,EAAW0Z,EACXA,EAAO/X,QAGDrD,EAAOw9B,MACbd,IAAKA,EACL34B,KAAMg7B,EACNrE,SAAU32B,EACVqX,KAAMA,EACN0jB,QAASp9B,OAMZ1B,EAAOsrB,SAAW,SAAUoR,GAC3B,MAAO18B,GAAOw9B,MACbd,IAAKA,EACL34B,KAAM,MACN22B,SAAU,SACVmC,OAAO,EACPl+B,QAAQ,EACRihC,UAAU,KAKZ5/B,EAAOG,GAAGsC,QACTo9B,QAAS,SAAU7U,GAClB,GAAIX,EAEJ,OAAKrqB,GAAOkD,WAAY8nB,GAChB7rB,KAAKsC,KAAK,SAAUK,GAC1B9B,EAAQb,MAAO0gC,QAAS7U,EAAK/pB,KAAK9B,KAAM2C,OAIrC3C,KAAM,KAGVkrB,EAAOrqB,EAAQgrB,EAAM7rB,KAAM,GAAIoM,eAAgBrJ,GAAI,GAAIa,OAAO,GAEzD5D,KAAM,GAAI6F,YACdqlB,EAAKO,aAAczrB,KAAM,IAG1BkrB,EAAKzoB,IAAI,WACR,GAAIC,GAAO1C,IAEX,OAAQ0C,EAAKi+B,kBACZj+B,EAAOA,EAAKi+B,iBAGb,OAAOj+B,KACL4oB,OAAQtrB,OAGLA,OAGR4gC,UAAW,SAAU/U,GACpB,MACQ7rB,MAAKsC,KADRzB,EAAOkD,WAAY8nB,GACN,SAAUlpB,GAC1B9B,EAAQb,MAAO4gC,UAAW/U,EAAK/pB,KAAK9B,KAAM2C,KAI3B,WAChB,GAAIwW,GAAOtY,EAAQb,MAClB2Z,EAAWR,EAAKQ,UAEZA,GAAS/X,OACb+X,EAAS+mB,QAAS7U,GAGlB1S,EAAKmS,OAAQO,MAKhBX,KAAM,SAAUW,GACf,GAAI9nB,GAAalD,EAAOkD,WAAY8nB,EAEpC,OAAO7rB,MAAKsC,KAAK,SAAUK,GAC1B9B,EAAQb,MAAO0gC,QAAS38B,EAAa8nB,EAAK/pB,KAAK9B,KAAM2C,GAAKkpB,MAI5DgV,OAAQ,WACP,MAAO7gC,MAAK6O,SAASvM,KAAK,WACnBzB,EAAOoF,SAAUjG,KAAM,SAC5Ba,EAAQb,MAAO8rB,YAAa9rB,KAAKyL,cAEhCtI,SAKLtC,EAAOgQ,KAAK4E,QAAQ+a,OAAS,SAAU9tB,GAGtC,MAAOA,GAAK0tB,aAAe,GAAK1tB,EAAK2tB,cAAgB,GAEtDxvB,EAAOgQ,KAAK4E,QAAQqrB,QAAU,SAAUp+B,GACvC,OAAQ7B,EAAOgQ,KAAK4E,QAAQ+a,OAAQ9tB,GAMrC,IAAIq+B,IAAM,OACTC,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhB,SAASC,IAAazP,EAAQhtB,EAAKo7B,EAAavlB,GAC/C,GAAIhX,EAEJ,IAAK3C,EAAOoD,QAASU,GAEpB9D,EAAOyB,KAAMqC,EAAK,SAAUhC,EAAG0+B,GACzBtB,GAAeiB,GAASr0B,KAAMglB,GAElCnX,EAAKmX,EAAQ0P,GAIbD,GAAazP,EAAS,KAAqB,gBAAN0P,GAAiB1+B,EAAI,IAAO,IAAK0+B,EAAGtB,EAAavlB,SAIlF,IAAMulB,GAAsC,WAAvBl/B,EAAO+D,KAAMD,GAQxC6V,EAAKmX,EAAQhtB,OANb,KAAMnB,IAAQmB,GACby8B,GAAazP,EAAS,IAAMnuB,EAAO,IAAKmB,EAAKnB,GAAQu8B,EAAavlB,GAWrE3Z,EAAOi/B,MAAQ,SAAUh3B,EAAGi3B,GAC3B,GAAIpO,GACHyK,KACA5hB,EAAM,SAAUlN,EAAKnH,GAEpBA,EAAQtF,EAAOkD,WAAYoC,GAAUA,IAAqB,MAATA,EAAgB,GAAKA,EACtEi2B,EAAGA,EAAEx6B,QAAW0/B,mBAAoBh0B,GAAQ,IAAMg0B,mBAAoBn7B,GASxE,IALqBjC,SAAhB67B,IACJA,EAAcl/B,EAAOq7B,cAAgBr7B,EAAOq7B,aAAa6D,aAIrDl/B,EAAOoD,QAAS6E,IAASA,EAAEpH,SAAWb,EAAOmD,cAAe8E,GAEhEjI,EAAOyB,KAAMwG,EAAG,WACf0R,EAAKxa,KAAKwD,KAAMxD,KAAKmG,aAMtB,KAAMwrB,IAAU7oB,GACfs4B,GAAazP,EAAQ7oB,EAAG6oB,GAAUoO,EAAavlB,EAKjD,OAAO4hB,GAAEpvB,KAAM,KAAM1I,QAASy8B,GAAK,MAGpClgC,EAAOG,GAAGsC,QACTi+B,UAAW,WACV,MAAO1gC,GAAOi/B,MAAO9/B,KAAKwhC,mBAE3BA,eAAgB,WACf,MAAOxhC,MAAKyC,IAAI,WAEf,GAAIqO,GAAWjQ,EAAOmf,KAAMhgB,KAAM,WAClC,OAAO8Q,GAAWjQ,EAAOwF,UAAWyK,GAAa9Q,OAEjDwP,OAAO,WACP,GAAI5K,GAAO5E,KAAK4E,IAGhB,OAAO5E,MAAKwD,OAAS3C,EAAQb,MAAOoZ,GAAI,cACvC+nB,GAAax0B,KAAM3M,KAAKiG,YAAei7B,GAAgBv0B,KAAM/H,KAC3D5E,KAAKwU,UAAYuN,EAAepV,KAAM/H,MAEzCnC,IAAI,SAAUE,EAAGD,GACjB,GAAIsO,GAAMnQ,EAAQb,MAAOgR,KAEzB,OAAc,OAAPA,EACN,KACAnQ,EAAOoD,QAAS+M,GACfnQ,EAAO4B,IAAKuO,EAAK,SAAUA,GAC1B,OAASxN,KAAMd,EAAKc,KAAM2C,MAAO6K,EAAI1M,QAAS28B,GAAO,YAEpDz9B,KAAMd,EAAKc,KAAM2C,MAAO6K,EAAI1M,QAAS28B,GAAO,WAC9Cl/B,SAKLlB,EAAOq7B,aAAauF,IAAM,WACzB,IACC,MAAO,IAAIC,gBACV,MAAOh2B,KAGV,IAAIi2B,IAAQ,EACXC,MACAC,IAEC,EAAG,IAGHC,KAAM,KAEPC,GAAelhC,EAAOq7B,aAAauF,KAK/B1hC,GAAOmP,aACXnP,EAAOmP,YAAa,WAAY,WAC/B,IAAM,GAAI5B,KAAOs0B,IAChBA,GAAct0B,OAKjB3M,EAAQqhC,OAASD,IAAkB,mBAAqBA,IACxDphC,EAAQ09B,KAAO0D,KAAiBA,GAEhClhC,EAAOu9B,cAAc,SAAU76B,GAC9B,GAAIhB,EAGJ,OAAK5B,GAAQqhC,MAAQD,KAAiBx+B,EAAQs8B,aAE5CO,KAAM,SAAUF,EAASvK,GACxB,GAAIhzB,GACH8+B,EAAMl+B,EAAQk+B,MACdl1B,IAAOo1B,EAKR,IAHAF,EAAIQ,KAAM1+B,EAAQqB,KAAMrB,EAAQg6B,IAAKh6B,EAAQm6B,MAAOn6B,EAAQ2+B,SAAU3+B,EAAQ8R,UAGzE9R,EAAQ4+B,UACZ,IAAMx/B,IAAKY,GAAQ4+B,UAClBV,EAAK9+B,GAAMY,EAAQ4+B,UAAWx/B,EAK3BY,GAAQk5B,UAAYgF,EAAInC,kBAC5BmC,EAAInC,iBAAkB/7B,EAAQk5B,UAQzBl5B,EAAQs8B,aAAgBK,EAAQ,sBACrCA,EAAQ,oBAAsB,iBAI/B,KAAMv9B,IAAKu9B,GACVuB,EAAIrC,iBAAkBz8B,EAAGu9B,EAASv9B,GAInCJ,GAAW,SAAUqC,GACpB,MAAO,YACDrC,UACGq/B,IAAcr1B,GACrBhK,EAAWk/B,EAAIW,OAASX,EAAIY,QAAU,KAExB,UAATz9B,EACJ68B,EAAIjC,QACgB,UAAT56B,EACX+wB,EAEC8L,EAAIlC,OACJkC,EAAIhC,YAGL9J,EACCkM,GAAkBJ,EAAIlC,SAAYkC,EAAIlC,OACtCkC,EAAIhC,WAIwB,gBAArBgC,GAAIa,cACV58B,KAAM+7B,EAAIa,cACPp+B,OACJu9B,EAAItC,4BAQTsC,EAAIW,OAAS7/B,IACbk/B,EAAIY,QAAU9/B,EAAS,SAGvBA,EAAWq/B,GAAcr1B,GAAOhK,EAAS,QAEzC,KAECk/B,EAAIrB,KAAM78B,EAAQy8B,YAAcz8B,EAAQ0Y,MAAQ,MAC/C,MAAQvQ,GAET,GAAKnJ,EACJ,KAAMmJ,KAKT8zB,MAAO,WACDj9B,GACJA,MAvFJ,SAkGD1B,EAAOo9B,WACNte,SACCta,OAAQ,6FAETsU,UACCtU,OAAQ,uBAETs3B,YACC4F,cAAe,SAAU78B,GAExB,MADA7E,GAAOsE,WAAYO,GACZA,MAMV7E,EAAOs9B,cAAe,SAAU,SAAU/B,GACxBl4B,SAAZk4B,EAAE/uB,QACN+uB,EAAE/uB,OAAQ,GAEN+uB,EAAEyD,cACNzD,EAAEx3B,KAAO,SAKX/D,EAAOu9B,cAAe,SAAU,SAAUhC,GAEzC,GAAKA,EAAEyD,YAAc,CACpB,GAAIx6B,GAAQ9C,CACZ,QACC69B,KAAM,SAAUl1B,EAAGyqB,GAClBtwB,EAASxE,EAAO,YAAYmf,MAC3B0d,OAAO,EACP8E,QAASpG,EAAEqG,cACXh/B,IAAK24B,EAAEmB,MACLlV,GACF,aACA9lB,EAAW,SAAUmgC,GACpBr9B,EAAO+W,SACP7Z,EAAW,KACNmgC,GACJ/M,EAAuB,UAAb+M,EAAI99B,KAAmB,IAAM,IAAK89B,EAAI99B,QAInDhF,EAAS+F,KAAKC,YAAaP,EAAQ,KAEpCm6B,MAAO,WACDj9B,GACJA,QAUL,IAAIogC,OACHC,GAAS,mBAGV/hC,GAAOo9B,WACN4E,MAAO,WACPC,cAAe,WACd,GAAIvgC,GAAWogC,GAAa15B,OAAWpI,EAAOsD,QAAU,IAAQ81B,IAEhE,OADAj6B,MAAMuC,IAAa,EACZA,KAKT1B,EAAOs9B,cAAe,aAAc,SAAU/B,EAAG2G,EAAkBrH,GAElE,GAAIsH,GAAcC,EAAaC,EAC9BC,EAAW/G,EAAEyG,SAAU,IAAWD,GAAOj2B,KAAMyvB,EAAEmB,KAChD,MACkB,gBAAXnB,GAAEngB,QAAwBmgB,EAAEuB,aAAe,IAAKr9B,QAAQ,sCAAwCsiC,GAAOj2B,KAAMyvB,EAAEngB,OAAU,OAIlI,OAAKknB,IAAiC,UAArB/G,EAAEZ,UAAW,IAG7BwH,EAAe5G,EAAE0G,cAAgBjiC,EAAOkD,WAAYq4B,EAAE0G,eACrD1G,EAAE0G,gBACF1G,EAAE0G,cAGEK,EACJ/G,EAAG+G,GAAa/G,EAAG+G,GAAW7+B,QAASs+B,GAAQ,KAAOI,GAC3C5G,EAAEyG,SAAU,IACvBzG,EAAEmB,MAASrD,GAAOvtB,KAAMyvB,EAAEmB,KAAQ,IAAM,KAAQnB,EAAEyG,MAAQ,IAAMG,GAIjE5G,EAAEO,WAAW,eAAiB,WAI7B,MAHMuG,IACLriC,EAAO2D,MAAOw+B,EAAe,mBAEvBE,EAAmB,IAI3B9G,EAAEZ,UAAW,GAAM,OAGnByH,EAAcljC,EAAQijC,GACtBjjC,EAAQijC,GAAiB,WACxBE,EAAoBrgC,WAIrB64B,EAAM7e,OAAO,WAEZ9c,EAAQijC,GAAiBC,EAGpB7G,EAAG4G,KAEP5G,EAAE0G,cAAgBC,EAAiBD,cAGnCH,GAAatiC,KAAM2iC,IAIfE,GAAqBriC,EAAOkD,WAAYk/B,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAc/+B,SAI5B,UAtDR,SAgEDrD,EAAOyY,UAAY,SAAU2C,EAAMlb,EAASqiC,GAC3C,IAAMnnB,GAAwB,gBAATA,GACpB,MAAO,KAEgB,kBAAZlb,KACXqiC,EAAcriC,EACdA,GAAU,GAEXA,EAAUA,GAAWnB,CAErB,IAAIyjC,GAAStqB,EAAW1M,KAAM4P,GAC7B+O,GAAWoY,KAGZ,OAAKC,IACKtiC,EAAQ0E,cAAe49B,EAAO,MAGxCA,EAASxiC,EAAOkqB,eAAiB9O,GAAQlb,EAASiqB,GAE7CA,GAAWA,EAAQppB,QACvBf,EAAQmqB,GAAU5O,SAGZvb,EAAOuB,SAAWihC,EAAO53B,aAKjC,IAAI63B,IAAQziC,EAAOG,GAAGkmB,IAKtBrmB,GAAOG,GAAGkmB,KAAO,SAAUqW,EAAKgG,EAAQhhC,GACvC,GAAoB,gBAARg7B,IAAoB+F,GAC/B,MAAOA,IAAM1gC,MAAO5C,KAAM6C,UAG3B,IAAI/B,GAAU8D,EAAMi4B,EACnB1jB,EAAOnZ,KACP4e,EAAM2e,EAAIj9B,QAAQ,IA+CnB,OA7CKse,IAAO,IACX9d,EAAWD,EAAO2E,KAAM+3B,EAAIp9B,MAAOye,IACnC2e,EAAMA,EAAIp9B,MAAO,EAAGye,IAIhB/d,EAAOkD,WAAYw/B,IAGvBhhC,EAAWghC,EACXA,EAASr/B,QAGEq/B,GAA4B,gBAAXA,KAC5B3+B,EAAO,QAIHuU,EAAKvX,OAAS,GAClBf,EAAOw9B,MACNd,IAAKA,EAGL34B,KAAMA,EACN22B,SAAU,OACVtf,KAAMsnB,IACJ/6B,KAAK,SAAU85B,GAGjBzF,EAAWh6B,UAEXsW,EAAK0S,KAAM/qB,EAIVD,EAAO,SAASyqB,OAAQzqB,EAAOyY,UAAWgpB,IAAiB/yB,KAAMzO,GAGjEwhC,KAEC3M,SAAUpzB,GAAY,SAAUm5B,EAAO6D,GACzCpmB,EAAK7W,KAAMC,EAAUs6B,IAAcnB,EAAM4G,aAAc/C,EAAQ7D,MAI1D17B,MAORa,EAAOyB,MAAQ,YAAa,WAAY,eAAgB,YAAa,cAAe,YAAc,SAAUK,EAAGiC,GAC9G/D,EAAOG,GAAI4D,GAAS,SAAU5D,GAC7B,MAAOhB,MAAKqoB,GAAIzjB,EAAM5D,MAOxBH,EAAOgQ,KAAK4E,QAAQ+tB,SAAW,SAAU9gC,GACxC,MAAO7B,GAAO6F,KAAK7F,EAAO21B,OAAQ,SAAUx1B,GAC3C,MAAO0B,KAAS1B,EAAG0B,OACjBd,OAMJ,IAAIqG,IAAUlI,EAAOH,SAAS8O,eAK9B,SAAS+0B,IAAW/gC,GACnB,MAAO7B,GAAOiE,SAAUpC,GAASA,EAAyB,IAAlBA,EAAKuC,UAAkBvC,EAAKqM,YAGrElO,EAAO6iC,QACNC,UAAW,SAAUjhC,EAAMa,EAASZ,GACnC,GAAIihC,GAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnEhV,EAAWruB,EAAOihB,IAAKpf,EAAM,YAC7ByhC,EAAUtjC,EAAQ6B,GAClBojB,IAGiB,YAAboJ,IACJxsB,EAAKkqB,MAAMsC,SAAW,YAGvB8U,EAAYG,EAAQT,SACpBI,EAAYjjC,EAAOihB,IAAKpf,EAAM,OAC9BuhC,EAAapjC,EAAOihB,IAAKpf,EAAM,QAC/BwhC,GAAmC,aAAbhV,GAAwC,UAAbA,KAC9C4U,EAAYG,GAAa3jC,QAAQ,QAAU,GAIzC4jC,GACJN,EAAcO,EAAQjV,WACtB6U,EAASH,EAAY50B,IACrB60B,EAAUD,EAAYQ,OAGtBL,EAAS/+B,WAAY8+B,IAAe,EACpCD,EAAU7+B,WAAYi/B,IAAgB,GAGlCpjC,EAAOkD,WAAYR,KACvBA,EAAUA,EAAQzB,KAAMY,EAAMC,EAAGqhC,IAGd,MAAfzgC,EAAQyL,MACZ8W,EAAM9W,IAAQzL,EAAQyL,IAAMg1B,EAAUh1B,IAAQ+0B,GAE1B,MAAhBxgC,EAAQ6gC,OACZte,EAAMse,KAAS7gC,EAAQ6gC,KAAOJ,EAAUI,KAASP,GAG7C,SAAWtgC,GACfA,EAAQ8gC,MAAMviC,KAAMY,EAAMojB,GAG1Bqe,EAAQriB,IAAKgE,KAKhBjlB,EAAOG,GAAGsC,QACTogC,OAAQ,SAAUngC,GACjB,GAAKV,UAAUjB,OACd,MAAmBsC,UAAZX,EACNvD,KACAA,KAAKsC,KAAK,SAAUK,GACnB9B,EAAO6iC,OAAOC,UAAW3jC,KAAMuD,EAASZ,IAI3C,IAAIsF,GAASq8B,EACZ5hC,EAAO1C,KAAM,GACbukC,GAAQv1B,IAAK,EAAGo1B,KAAM,GACtBt1B,EAAMpM,GAAQA,EAAK0J,aAEpB,IAAM0C,EAON,MAHA7G,GAAU6G,EAAIJ,gBAGR7N,EAAOwH,SAAUJ,EAASvF,UAMpBA,GAAK8hC,wBAA0BniB,IAC1CkiB,EAAM7hC,EAAK8hC,yBAEZF,EAAMb,GAAW30B,IAEhBE,IAAKu1B,EAAIv1B,IAAMs1B,EAAIG,YAAcx8B,EAAQ8e,UACzCqd,KAAMG,EAAIH,KAAOE,EAAII,YAAcz8B,EAAQ0e,aAXpC4d,GAeTrV,SAAU,WACT,GAAMlvB,KAAM,GAAZ,CAIA,GAAI2kC,GAAcjB,EACjBhhC,EAAO1C,KAAM,GACb4kC,GAAiB51B,IAAK,EAAGo1B,KAAM,EAuBhC,OApBwC,UAAnCvjC,EAAOihB,IAAKpf,EAAM,YAEtBghC,EAAShhC,EAAK8hC,yBAIdG,EAAe3kC,KAAK2kC,eAGpBjB,EAAS1jC,KAAK0jC,SACR7iC,EAAOoF,SAAU0+B,EAAc,GAAK,UACzCC,EAAeD,EAAajB,UAI7BkB,EAAa51B,KAAOnO,EAAOihB,IAAK6iB,EAAc,GAAK,kBAAkB,GACrEC,EAAaR,MAAQvjC,EAAOihB,IAAK6iB,EAAc,GAAK,mBAAmB,KAKvE31B,IAAK00B,EAAO10B,IAAM41B,EAAa51B,IAAMnO,EAAOihB,IAAKpf,EAAM,aAAa,GACpE0hC,KAAMV,EAAOU,KAAOQ,EAAaR,KAAOvjC,EAAOihB,IAAKpf,EAAM,cAAc,MAI1EiiC,aAAc,WACb,MAAO3kC,MAAKyC,IAAI,WACf,GAAIkiC,GAAe3kC,KAAK2kC,cAAgB18B,EAExC,OAAQ08B,IAAmB9jC,EAAOoF,SAAU0+B,EAAc,SAAuD,WAA3C9jC,EAAOihB,IAAK6iB,EAAc,YAC/FA,EAAeA,EAAaA,YAG7B,OAAOA,IAAgB18B,QAM1BpH,EAAOyB,MAAQokB,WAAY,cAAeI,UAAW,eAAiB,SAAU8Y,EAAQ5f,GACvF,GAAIhR,GAAM,gBAAkBgR,CAE5Bnf,GAAOG,GAAI4+B,GAAW,SAAU5uB,GAC/B,MAAOiO,GAAQjf,KAAM,SAAU0C,EAAMk9B,EAAQ5uB,GAC5C,GAAIszB,GAAMb,GAAW/gC,EAErB,OAAawB,UAAR8M,EACGszB,EAAMA,EAAKtkB,GAAStd,EAAMk9B,QAG7B0E,EACJA,EAAIO,SACF71B,EAAYjP,EAAO2kC,YAAb1zB,EACPhC,EAAMgC,EAAMjR,EAAO0kC,aAIpB/hC,EAAMk9B,GAAW5uB,IAEhB4uB,EAAQ5uB,EAAKnO,UAAUjB,OAAQ,SAUpCf,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGqd,GAC5Cnf,EAAO4vB,SAAUzQ,GAAS6N,GAAcltB,EAAQ6tB,cAC/C,SAAU9rB,EAAM8qB,GACf,MAAKA,IACJA,EAAWD,GAAQ7qB,EAAMsd,GAElBmN,GAAUxgB,KAAM6gB,GACtB3sB,EAAQ6B,GAAOwsB,WAAYlP,GAAS,KACpCwN,GALF,WAaH3sB,EAAOyB,MAAQwiC,OAAQ,SAAUC,MAAO,SAAW,SAAUvhC,EAAMoB,GAClE/D,EAAOyB,MAAQmvB,QAAS,QAAUjuB,EAAMqmB,QAASjlB,EAAM,GAAI,QAAUpB,GAAQ,SAAUwhC,EAAcC,GAEpGpkC,EAAOG,GAAIikC,GAAa,SAAUzT,EAAQrrB,GACzC,GAAI+Y,GAAYrc,UAAUjB,SAAYojC,GAAkC,iBAAXxT,IAC5DzB,EAAQiV,IAAkBxT,KAAW,GAAQrrB,KAAU,EAAO,SAAW,SAE1E,OAAO8Y,GAAQjf,KAAM,SAAU0C,EAAMkC,EAAMuB,GAC1C,GAAI2I,EAEJ,OAAKjO,GAAOiE,SAAUpC,GAIdA,EAAK9C,SAAS8O,gBAAiB,SAAWlL,GAI3B,IAAlBd,EAAKuC,UACT6J,EAAMpM,EAAKgM,gBAIJtK,KAAKyrB,IACXntB,EAAK6jB,KAAM,SAAW/iB,GAAQsL,EAAK,SAAWtL,GAC9Cd,EAAK6jB,KAAM,SAAW/iB,GAAQsL,EAAK,SAAWtL,GAC9CsL,EAAK,SAAWtL,KAIDU,SAAViC,EAENtF,EAAOihB,IAAKpf,EAAMkC,EAAMmrB,GAGxBlvB,EAAO+rB,MAAOlqB,EAAMkC,EAAMuB,EAAO4pB,IAChCnrB,EAAMsa,EAAYsS,EAASttB,OAAWgb,EAAW,WAOvDre,EAAOG,GAAGkkC,KAAO,WAChB,MAAOllC,MAAK4B,QAGbf,EAAOG,GAAGmkC,QAAUtkC,EAAOG,GAAGyZ,QAkBP,kBAAX2qB,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WACrB,MAAOvkC,IAOT,IAECykC,IAAUvlC,EAAOc,OAGjB0kC,GAAKxlC,EAAOylC,CAwBb,OAtBA3kC,GAAO4kC,WAAa,SAAU3hC,GAS7B,MARK/D,GAAOylC,IAAM3kC,IACjBd,EAAOylC,EAAID,IAGPzhC,GAAQ/D,EAAOc,SAAWA,IAC9Bd,EAAOc,OAASykC,IAGVzkC,SAMIZ,KAAaoiB,IACxBtiB,EAAOc,OAASd,EAAOylC,EAAI3kC,GAMrBA"} \ No newline at end of file
diff --git a/core/vendor/jquery/jquery.min.js b/core/vendor/jquery/jquery.min.js
deleted file mode 100644
index 29b3a2c7b49..00000000000
--- a/core/vendor/jquery/jquery.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/
-(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
-}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
-u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/core/vendor/jquery/jquery.min.map b/core/vendor/jquery/jquery.min.map
deleted file mode 100644
index 2dd27a6b413..00000000000
--- a/core/vendor/jquery/jquery.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"jquery-1.10.2.min.js","sources":["jquery-1.10.2.js"],"names":["window","undefined","readyList","rootjQuery","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rtrim","rquickExpr","rsingleTag","rvalidchars","rvalidbraces","rvalidescape","rvalidtokens","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","event","addEventListener","type","readyState","detach","ready","removeEventListener","detachEvent","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","id","makeArray","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isArray","expando","Math","random","replace","noConflict","isReady","readyWait","holdReady","hold","wait","body","setTimeout","resolveWith","trigger","off","obj","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","key","e","support","ownLast","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","Function","parseXML","xml","tmp","DOMParser","parseFromString","ActiveXObject","async","loadXML","getElementsByTagName","noop","globalEval","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","arr","results","Object","inArray","max","second","l","grep","inv","retVal","arg","guid","proxy","access","chainable","emptyGet","raw","bulk","now","Date","getTime","swap","old","style","Deferred","attachEvent","top","frameElement","doScroll","doScrollCheck","split","cachedruns","Expr","getText","isXML","compile","outermostContext","sortInput","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","hasDuplicate","sortOrder","a","b","strundefined","MAX_NEGATIVE","hasOwn","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rsibling","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rnative","rinputs","rheader","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","fromCharCode","els","Sizzle","seed","m","groups","nid","newContext","newSelector","getElementsByClassName","qsa","tokenize","getAttribute","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","node","doc","parent","defaultView","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","self","disable","add","index","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","progressContexts","resolveContexts","fragment","opt","eventName","isSupported","cssText","getSetAttribute","leadingWhitespace","tbody","htmlSerialize","hrefNormalized","opacity","cssFloat","checkOn","optSelected","enctype","html5Clone","cloneNode","outerHTML","inlineBlockNeedsLayout","shrinkWrapBlocks","pixelPosition","deleteExpando","noCloneEvent","reliableMarginRight","boxSizingReliable","noCloneChecked","optDisabled","radioValue","createDocumentFragment","appendChecked","checkClone","click","change","focusin","backgroundClip","clearCloneStyle","container","marginDiv","tds","divReset","offsetHeight","display","reliableHiddenOffsets","zoom","boxSizing","offsetWidth","getComputedStyle","width","marginRight","rbrace","rmultiDash","internalData","pvt","acceptData","thisCache","internalKey","isNode","toJSON","internalRemoveData","isEmptyDataObject","cleanData","noData","applet","embed","hasData","removeData","_data","_removeData","dataAttr","queue","dequeue","startLength","hooks","_queueHooks","next","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","nodeHook","boolHook","rclass","rreturn","rfocusable","rclickable","ruseDefault","getSetInput","removeAttr","prop","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","valHooks","set","option","one","optionSet","nType","attrHooks","propName","attrNames","for","class","notxml","propHooks","tabindex","parseInt","getter","setAttributeNode","createAttribute","coords","contenteditable","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","global","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","origFn","triggerHandler","isSimple","rparentsprev","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","n","r","qualifier","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","append","createTextNode","domManip","manipulationTarget","prepend","insertBefore","before","after","keepData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","html","replaceWith","allowIntersection","hasScripts","iNoClone","disableScript","restoreScript","_evalUrl","content","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultChecked","defaultSelected","appendTo","prependTo","insertAfter","replaceAll","insert","found","fixDefaultChecked","destElements","srcElements","inPage","selection","wrap","safe","nodes","url","ajax","dataType","throws","wrapAll","wrapInner","unwrap","iframe","getStyles","curCSS","ralpha","ropacity","rposition","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","cssHooks","computed","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","extra","_computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","actualDisplay","write","close","$1","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","active","lastModified","etag","isLocal","processData","contentType","accepts","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","code","abort","statusText","finalText","success","method","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getJSON","getScript","firstDataType","ct","finalDataType","conv2","current","conv","dataFilter","script","text script","head","scriptCharset","charset","onload","onreadystatechange","isAbort","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhrCallbacks","xhrSupported","xhrId","xhrOnUnloadAbort","createStandardXHR","XMLHttpRequest","createActiveXHR","xhr","cors","username","open","xhrFields","firefoxAccessException","unload","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","tween","createTween","unit","scale","maxIterations","createFxNow","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curElem","curOffset","curCSSTop","curCSSLeft","calculatePosition","curPosition","curTop","curLeft","using","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","module","exports","define","amd"],"mappings":"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"}
diff --git a/cron.php b/cron.php
index 73f233e1350..c4bc9e9667c 100644
--- a/cron.php
+++ b/cron.php
@@ -131,6 +131,10 @@ try {
// Work
$jobList = \OC::$server->getJobList();
+ // We only ask for jobs for 14 minutes, because after 15 minutes the next
+ // system cron task should spawn.
+ $endTime = time() + 14 * 60;
+
$executedJobs = [];
while ($job = $jobList->getNext()) {
if (isset($executedJobs[$job->getId()])) {
@@ -144,6 +148,10 @@ try {
$jobList->setLastJob($job);
$executedJobs[$job->getId()] = true;
unset($job);
+
+ if (time() > $endTime) {
+ break;
+ }
}
// unlock the file
@@ -175,4 +183,6 @@ try {
} catch (Exception $ex) {
\OCP\Util::writeLog('cron', $ex->getMessage(), \OCP\Util::FATAL);
+} catch (Error $ex) {
+ \OCP\Util::writeLog('cron', $ex->getMessage(), \OCP\Util::FATAL);
}
diff --git a/index.php b/index.php
index f3bf699f3c1..2acf81ab6d7 100644
--- a/index.php
+++ b/index.php
@@ -39,7 +39,7 @@ try {
OC::handleRequest();
} catch(\OC\ServiceUnavailableException $ex) {
- \OCP\Util::logException('index', $ex);
+ \OC::$server->getLogger()->logException($ex, ['app' => 'index']);
//show the user a detailed error page
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
@@ -48,9 +48,13 @@ try {
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
OC_Template::printErrorPage($ex->getMessage(), $ex->getHint());
} catch (Exception $ex) {
- \OCP\Util::logException('index', $ex);
+ \OC::$server->getLogger()->logException($ex, ['app' => 'index']);
//show the user a detailed error page
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
OC_Template::printExceptionErrorPage($ex);
+} catch (Error $ex) {
+ \OC::$server->getLogger()->logException($ex, ['app' => 'index']);
+ OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
+ OC_Template::printExceptionErrorPage($ex);
}
diff --git a/issue_template.md b/issue_template.md
index b240da51a7d..cf96fc6148d 100644
--- a/issue_template.md
+++ b/issue_template.md
@@ -3,6 +3,8 @@ Thanks for reporting issues back to ownCloud! This is the issue tracker of ownCl
This is the bug tracker for the Server component. Find other components at https://github.com/owncloud/core/blob/master/CONTRIBUTING.md#guidelines
+For reporting potential security issues please see https://owncloud.org/security/
+
To make it possible for us to help you please fill out below information carefully.
-->
### Steps to reproduce
diff --git a/lib/base.php b/lib/base.php
index 5a1d15913ba..fb58177a432 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -78,19 +78,14 @@ class OC {
*/
public static $WEBROOT = '';
/**
- * The installation path of the 3rdparty folder on the server (e.g. /srv/http/owncloud/3rdparty)
- */
- public static $THIRDPARTYROOT = '';
- /**
- * the root path of the 3rdparty folder for http requests (e.g. owncloud/3rdparty)
- */
- public static $THIRDPARTYWEBROOT = '';
- /**
* The installation path array of the apps folder on the server (e.g. /srv/http/owncloud) 'path' and
* web path in 'url'
*/
public static $APPSROOTS = array();
+ /**
+ * @var string
+ */
public static $configDir;
/**
@@ -183,25 +178,6 @@ class OC {
}
}
- // search the 3rdparty folder
- OC::$THIRDPARTYROOT = self::$config->getValue('3rdpartyroot', null);
- OC::$THIRDPARTYWEBROOT = self::$config->getValue('3rdpartyurl', null);
-
- if (empty(OC::$THIRDPARTYROOT) && empty(OC::$THIRDPARTYWEBROOT)) {
- if (file_exists(OC::$SERVERROOT . '/3rdparty')) {
- OC::$THIRDPARTYROOT = OC::$SERVERROOT;
- OC::$THIRDPARTYWEBROOT = OC::$WEBROOT;
- } elseif (file_exists(OC::$SERVERROOT . '/../3rdparty')) {
- OC::$THIRDPARTYWEBROOT = rtrim(dirname(OC::$WEBROOT), '/');
- OC::$THIRDPARTYROOT = rtrim(dirname(OC::$SERVERROOT), '/');
- }
- }
- if (empty(OC::$THIRDPARTYROOT) || !file_exists(OC::$THIRDPARTYROOT)) {
- throw new \RuntimeException('3rdparty directory not found! Please put the ownCloud 3rdparty'
- . ' folder in the ownCloud folder or the folder above.'
- . ' You can also configure the location in the config.php file.');
- }
-
// search the apps folder
$config_paths = self::$config->getValue('apps_paths', array());
if (!empty($config_paths)) {
@@ -240,7 +216,7 @@ class OC {
set_include_path(
OC::$SERVERROOT . '/lib/private' . PATH_SEPARATOR .
OC::$SERVERROOT . '/config' . PATH_SEPARATOR .
- OC::$THIRDPARTYROOT . '/3rdparty' . PATH_SEPARATOR .
+ OC::$SERVERROOT . '/3rdparty' . PATH_SEPARATOR .
implode(PATH_SEPARATOR, $paths) . PATH_SEPARATOR .
get_include_path() . PATH_SEPARATOR .
OC::$SERVERROOT
@@ -306,7 +282,7 @@ class OC {
// render error page
$template = new OC_Template('', 'update.user', 'guest');
- OC_Util::addscript('maintenance-check');
+ OC_Util::addScript('maintenance-check');
$template->printPage();
die();
}
@@ -361,27 +337,53 @@ class OC {
*/
private static function printUpgradePage() {
$systemConfig = \OC::$server->getSystemConfig();
+
+ $disableWebUpdater = $systemConfig->getValue('upgrade.disable-web', false);
+ $tooBig = false;
+ if (!$disableWebUpdater) {
+ $apps = \OC::$server->getAppManager();
+ $tooBig = $apps->isInstalled('user_ldap') || $apps->isInstalled('user_shibboleth');
+ if (!$tooBig) {
+ // count users
+ $stats = \OC::$server->getUserManager()->countUsers();
+ $totalUsers = array_sum($stats);
+ $tooBig = ($totalUsers > 50);
+ }
+ }
+ if ($disableWebUpdater || $tooBig) {
+ // send http status 503
+ header('HTTP/1.1 503 Service Temporarily Unavailable');
+ header('Status: 503 Service Temporarily Unavailable');
+ header('Retry-After: 120');
+
+ // render error page
+ $template = new OC_Template('', 'update.use-cli', 'guest');
+ $template->assign('productName', 'ownCloud'); // for now
+ $template->assign('version', OC_Util::getVersionString());
+ $template->assign('tooBig', $tooBig);
+
+ $template->printPage();
+ die();
+ }
+
+ // check whether this is a core update or apps update
+ $installedVersion = $systemConfig->getValue('version', '0.0.0');
+ $currentVersion = implode('.', \OCP\Util::getVersion());
+
+ // if not a core upgrade, then it's apps upgrade
+ $isAppsOnlyUpgrade = (version_compare($currentVersion, $installedVersion, '='));
+
$oldTheme = $systemConfig->getValue('theme');
$systemConfig->setValue('theme', '');
\OCP\Util::addScript('config'); // needed for web root
\OCP\Util::addScript('update');
\OCP\Util::addStyle('update');
- // check whether this is a core update or apps update
- $installedVersion = $systemConfig->getValue('version', '0.0.0');
- $currentVersion = implode('.', \OCP\Util::getVersion());
-
$appManager = \OC::$server->getAppManager();
$tmpl = new OC_Template('', 'update.admin', 'guest');
$tmpl->assign('version', OC_Util::getVersionString());
-
- // if not a core upgrade, then it's apps upgrade
- if (version_compare($currentVersion, $installedVersion, '=')) {
- $tmpl->assign('isAppsOnlyUpgrade', true);
- } else {
- $tmpl->assign('isAppsOnlyUpgrade', false);
- }
+ $tmpl->assign('isAppsOnlyUpgrade', $isAppsOnlyUpgrade);
// get third party apps
$ocVersion = \OCP\Util::getVersion();
@@ -447,7 +449,7 @@ class OC {
}
public static function loadAppClassPaths() {
- foreach (OC_APP::getEnabledApps() as $app) {
+ foreach (OC_App::getEnabledApps() as $app) {
$appPath = OC_App::getAppPath($app);
if ($appPath === false) {
continue;
@@ -490,10 +492,13 @@ class OC {
self::$CLI = (php_sapi_name() == 'cli');
+ // Add default composer PSR-4 autoloader
+ require_once OC::$SERVERROOT . '/lib/composer/autoload.php';
+
try {
self::initPaths();
// setup 3rdparty autoloader
- $vendorAutoLoad = OC::$THIRDPARTYROOT . '/3rdparty/autoload.php';
+ $vendorAutoLoad = OC::$SERVERROOT. '/3rdparty/autoload.php';
if (!file_exists($vendorAutoLoad)) {
throw new \RuntimeException('Composer autoloader not found, unable to continue. Check the folder "3rdparty". Running "git submodule update --init" will initialize the git submodule that handles the subfolder "3rdparty".');
}
@@ -509,9 +514,6 @@ class OC {
exit();
}
- // Add default composer PSR-4 autoloader
- require_once OC::$SERVERROOT . '/lib/composer/autoload.php';
-
// setup the basic server
self::$server = new \OC\Server(\OC::$WEBROOT, self::$config);
\OC::$server->getEventLogger()->log('autoloader', 'Autoloader', $loaderStart, $loaderEnd);
@@ -547,14 +549,9 @@ class OC {
OC_Util::isSetLocaleWorking();
if (!defined('PHPUNIT_RUN')) {
- $logger = \OC::$server->getLogger();
- OC\Log\ErrorHandler::setLogger($logger);
- if (\OC::$server->getConfig()->getSystemValue('debug', false)) {
- OC\Log\ErrorHandler::register(true);
- set_exception_handler(array('OC_Template', 'printExceptionErrorPage'));
- } else {
- OC\Log\ErrorHandler::register();
- }
+ OC\Log\ErrorHandler::setLogger(\OC::$server->getLogger());
+ $debug = \OC::$server->getConfig()->getSystemValue('debug', false);
+ OC\Log\ErrorHandler::register($debug);
}
// register the stream wrappers
@@ -778,7 +775,7 @@ class OC {
public static function registerShareHooks() {
if (\OC::$server->getSystemConfig()->getValue('installed')) {
OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Share20\Hooks', 'post_deleteUser');
- OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OC\Share\Hooks', 'post_removeFromGroup');
+ OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OC\Share20\Hooks', 'post_removeFromGroup');
OC_Hook::connect('OC_User', 'post_deleteGroup', 'OC\Share20\Hooks', 'post_deleteGroup');
}
}
@@ -860,7 +857,7 @@ class OC {
}
}
- if (!self::$CLI and (!isset($_GET["logout"]) or ($_GET["logout"] !== 'true'))) {
+ if (!self::$CLI) {
try {
if (!$systemConfig->getValue('maintenance', false) && !self::checkUpgrade(false)) {
OC_App::loadApps(array('filesystem', 'logging'));
@@ -899,31 +896,13 @@ class OC {
return;
}
- // Redirect to index if the logout link is accessed without valid session
- // this is needed to prevent "Token expired" messages while login if a session is expired
- // @see https://github.com/owncloud/core/pull/8443#issuecomment-42425583
- if(isset($_GET['logout']) && !OC_User::isLoggedIn()) {
- header("Location: " . \OC::$server->getURLGenerator()->getAbsoluteURL('/'));
- return;
- }
-
// Someone is logged in
if (OC_User::isLoggedIn()) {
OC_App::loadApps();
OC_User::setupBackends();
OC_Util::setupFS();
- if (isset($_GET["logout"]) and ($_GET["logout"])) {
- OC_JSON::callCheck();
- if (isset($_COOKIE['oc_token'])) {
- \OC::$server->getConfig()->deleteUserValue(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']);
- }
- OC_User::logout();
- // redirect to webroot and add slash if webroot is empty
- header("Location: " . \OC::$server->getURLGenerator()->getAbsoluteURL('/'));
- } else {
- // Redirect to default application
- OC_Util::redirectToDefaultPage();
- }
+ // Redirect to default application
+ OC_Util::redirectToDefaultPage();
} else {
// Not handled and not logged in
self::handleLogin();
@@ -975,7 +954,18 @@ class OC {
$error[] = 'internalexception';
}
- OC_Util::displayLoginPage(array_unique($error), $messages);
+ if(!\OC::$server->getUserSession()->isLoggedIn()) {
+ $loginMessages = array(array_unique($error), $messages);
+ \OC::$server->getSession()->set('loginMessages', $loginMessages);
+ // Read current user and append if possible
+ $args = [];
+ if(isset($_POST['user'])) {
+ $args['user'] = $_POST['user'];
+ }
+
+ $redirectionTarget = \OC::$server->getURLGenerator()->linkToRoute('core.login.showLoginForm', $args);
+ header('Location: ' . $redirectionTarget);
+ }
}
/**
diff --git a/lib/l10n/ast.js b/lib/l10n/ast.js
index 1bc7d036530..a807dab7190 100644
--- a/lib/l10n/ast.js
+++ b/lib/l10n/ast.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Davezu esto pue iguase %sdándo-y al sirvidor web accesu d'escritura al direutoriu de configuración%s.",
"Sample configuration detected" : "Configuración d'amuesa detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectose que la configuración d'amuesa copiose. Esto pue encaboxar la instalación y dexala ensín soporte. Llee la documentación enantes de facer cambéos en config.php",
- "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s",
"PHP %s or higher is required." : "Necesítase PHP %s o superior",
"PHP with a version lower than %s is required." : "Necesítase una versión PHP anterior a %s",
"Following databases are supported: %s" : "Les siguientes bases de datos tan sofitaes: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Les siguientes plataformes tan sofitaes: %s",
"ownCloud %s or higher is required." : "Necesítase ownCloud %s o superior.",
"ownCloud %s or lower is required." : "Necesítase ownCloud %s o anterior.",
+ "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s",
"Help" : "Ayuda",
"Personal" : "Personal",
"Users" : "Usuarios",
diff --git a/lib/l10n/ast.json b/lib/l10n/ast.json
index 845674462a6..61161c633a8 100644
--- a/lib/l10n/ast.json
+++ b/lib/l10n/ast.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Davezu esto pue iguase %sdándo-y al sirvidor web accesu d'escritura al direutoriu de configuración%s.",
"Sample configuration detected" : "Configuración d'amuesa detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectose que la configuración d'amuesa copiose. Esto pue encaboxar la instalación y dexala ensín soporte. Llee la documentación enantes de facer cambéos en config.php",
- "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s",
"PHP %s or higher is required." : "Necesítase PHP %s o superior",
"PHP with a version lower than %s is required." : "Necesítase una versión PHP anterior a %s",
"Following databases are supported: %s" : "Les siguientes bases de datos tan sofitaes: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Les siguientes plataformes tan sofitaes: %s",
"ownCloud %s or higher is required." : "Necesítase ownCloud %s o superior.",
"ownCloud %s or lower is required." : "Necesítase ownCloud %s o anterior.",
+ "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s",
"Help" : "Ayuda",
"Personal" : "Personal",
"Users" : "Usuarios",
diff --git a/lib/l10n/bg_BG.js b/lib/l10n/bg_BG.js
index ee5258e5514..394e72d544e 100644
--- a/lib/l10n/bg_BG.js
+++ b/lib/l10n/bg_BG.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в config папката %s.",
"Sample configuration detected" : "Открита е примерна конфигурация",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Усетено беше че примерната конфигурация е копирана. Това може да развли инсталацията ти и не се поддържа. Моля, прочети документацията преди да правиш промени на config.php",
- "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
"PHP %s or higher is required." : "Изисква се PHP %s или по-нова.",
"PHP with a version lower than %s is required." : "Необходим е PHP с версия по-ниска от %s.",
"Following databases are supported: %s" : "Следните бази данни са поддържани: %s",
@@ -17,6 +16,7 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ",
"Following platforms are supported: %s" : "Поддържани са следните платформи: %s",
"ownCloud %s or higher is required." : "Необходим е ownCloud %s или по-висока версия.",
+ "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
"Help" : "Помощ",
"Personal" : "Лични",
"Users" : "Потребители",
diff --git a/lib/l10n/bg_BG.json b/lib/l10n/bg_BG.json
index f5259d70946..4f6a9c52a32 100644
--- a/lib/l10n/bg_BG.json
+++ b/lib/l10n/bg_BG.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в config папката %s.",
"Sample configuration detected" : "Открита е примерна конфигурация",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Усетено беше че примерната конфигурация е копирана. Това може да развли инсталацията ти и не се поддържа. Моля, прочети документацията преди да правиш промени на config.php",
- "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
"PHP %s or higher is required." : "Изисква се PHP %s или по-нова.",
"PHP with a version lower than %s is required." : "Необходим е PHP с версия по-ниска от %s.",
"Following databases are supported: %s" : "Следните бази данни са поддържани: %s",
@@ -15,6 +14,7 @@
"Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ",
"Following platforms are supported: %s" : "Поддържани са следните платформи: %s",
"ownCloud %s or higher is required." : "Необходим е ownCloud %s или по-висока версия.",
+ "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
"Help" : "Помощ",
"Personal" : "Лични",
"Users" : "Потребители",
diff --git a/lib/l10n/ca.js b/lib/l10n/ca.js
index 83f81441f14..763e742f3b4 100644
--- a/lib/l10n/ca.js
+++ b/lib/l10n/ca.js
@@ -7,8 +7,8 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Això normalment es pot solucionar donant a %s permís d'escriptura a la carpeta de configuració %s",
"Sample configuration detected" : "Configuració d'exemple detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "S'ha detectat que la configuració d'exemple ha estat copiada. Això no està suportat, i podria corrompre la vostra instalació. Siusplau, llegiu la documentació abans de realitzar canvis a config.php",
- "You are not allowed to share %s" : "No se us permet compartir %s",
"PHP %s or higher is required." : "Es requereix PHP %s o superior.",
+ "You are not allowed to share %s" : "No se us permet compartir %s",
"Help" : "Ajuda",
"Personal" : "Personal",
"Users" : "Usuaris",
diff --git a/lib/l10n/ca.json b/lib/l10n/ca.json
index 8a32487cbe4..49dbe1ac3c3 100644
--- a/lib/l10n/ca.json
+++ b/lib/l10n/ca.json
@@ -5,8 +5,8 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Això normalment es pot solucionar donant a %s permís d'escriptura a la carpeta de configuració %s",
"Sample configuration detected" : "Configuració d'exemple detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "S'ha detectat que la configuració d'exemple ha estat copiada. Això no està suportat, i podria corrompre la vostra instalació. Siusplau, llegiu la documentació abans de realitzar canvis a config.php",
- "You are not allowed to share %s" : "No se us permet compartir %s",
"PHP %s or higher is required." : "Es requereix PHP %s o superior.",
+ "You are not allowed to share %s" : "No se us permet compartir %s",
"Help" : "Ajuda",
"Personal" : "Personal",
"Users" : "Usuaris",
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index f2e4916d6b5..f402a168df3 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To lze obvykle vyřešit %spovolením zápisu webovému serveru do konfiguračního adresáře%s.",
"Sample configuration detected" : "Byla detekována vzorová konfigurace",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php",
- "You are not allowed to share %s" : "Nemáte povoleno sdílet %s",
- "Cannot increase permissions of %s" : "Nelze navýšit oprávnění u %s",
- "Expiration date is in the past" : "Datum vypršení je v minulosti",
- "Cannot set expiration date more than %s days in the future" : "Datum vypršení nelze nastavit na více než %s dní do budoucnosti",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
"Following databases are supported: %s" : "Jsou podporovány následující databáze: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Jsou podporovány následující systémy: %s",
"ownCloud %s or higher is required." : "Je vyžadován ownCloud %s nebo vyšší.",
"ownCloud %s or lower is required." : "Je vyžadován ownCloud %s nebo nižší.",
+ "You are not allowed to share %s" : "Nemáte povoleno sdílet %s",
+ "Cannot increase permissions of %s" : "Nelze navýšit oprávnění u %s",
+ "Expiration date is in the past" : "Datum vypršení je v minulosti",
+ "Cannot set expiration date more than %s days in the future" : "Datum vypršení nelze nastavit na více než %s dní do budoucnosti",
"Help" : "Nápověda",
"Personal" : "Osobní",
"Users" : "Uživatelé",
@@ -60,6 +60,7 @@ OC.L10N.register(
"Archives of type %s are not supported" : "Archivy typu %s nejsou podporovány",
"Failed to open archive when installing app" : "Chyba při otevírání archivu během instalace aplikace",
"App does not provide an info.xml file" : "Aplikace neposkytuje soubor info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikaci nelze nainstalovat, soubor appinfo nelze číst.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Podpis nelze ověřit. Kontaktujte prosím vývojáře aplikace a zkontrolujte obrazovku administrace.",
"App can't be installed because of not allowed code in the App" : "Aplikace nemůže být nainstalována, protože obsahuje nepovolený kód",
"App can't be installed because it is not compatible with this version of ownCloud" : "Aplikace nemůže být nainstalována, protože není kompatibilní s touto verzí ownCloud",
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index acc708383f9..4ae661477c2 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To lze obvykle vyřešit %spovolením zápisu webovému serveru do konfiguračního adresáře%s.",
"Sample configuration detected" : "Byla detekována vzorová konfigurace",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php",
- "You are not allowed to share %s" : "Nemáte povoleno sdílet %s",
- "Cannot increase permissions of %s" : "Nelze navýšit oprávnění u %s",
- "Expiration date is in the past" : "Datum vypršení je v minulosti",
- "Cannot set expiration date more than %s days in the future" : "Datum vypršení nelze nastavit na více než %s dní do budoucnosti",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
"Following databases are supported: %s" : "Jsou podporovány následující databáze: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "Jsou podporovány následující systémy: %s",
"ownCloud %s or higher is required." : "Je vyžadován ownCloud %s nebo vyšší.",
"ownCloud %s or lower is required." : "Je vyžadován ownCloud %s nebo nižší.",
+ "You are not allowed to share %s" : "Nemáte povoleno sdílet %s",
+ "Cannot increase permissions of %s" : "Nelze navýšit oprávnění u %s",
+ "Expiration date is in the past" : "Datum vypršení je v minulosti",
+ "Cannot set expiration date more than %s days in the future" : "Datum vypršení nelze nastavit na více než %s dní do budoucnosti",
"Help" : "Nápověda",
"Personal" : "Osobní",
"Users" : "Uživatelé",
@@ -58,6 +58,7 @@
"Archives of type %s are not supported" : "Archivy typu %s nejsou podporovány",
"Failed to open archive when installing app" : "Chyba při otevírání archivu během instalace aplikace",
"App does not provide an info.xml file" : "Aplikace neposkytuje soubor info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikaci nelze nainstalovat, soubor appinfo nelze číst.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Podpis nelze ověřit. Kontaktujte prosím vývojáře aplikace a zkontrolujte obrazovku administrace.",
"App can't be installed because of not allowed code in the App" : "Aplikace nemůže být nainstalována, protože obsahuje nepovolený kód",
"App can't be installed because it is not compatible with this version of ownCloud" : "Aplikace nemůže být nainstalována, protože není kompatibilní s touto verzí ownCloud",
diff --git a/lib/l10n/da.js b/lib/l10n/da.js
index 6fced6db37e..c96ea1ae8f8 100644
--- a/lib/l10n/da.js
+++ b/lib/l10n/da.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan som regel rettes ved at %sgive webserveren skriveadgang til config-mappen%s.",
"Sample configuration detected" : "Eksempel for konfiguration registreret",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Der er registreret at eksempel for konfiguration er blevet kopieret. Dette kan ødelægge din installation og understøttes ikke. Læs venligst dokumentationen før der foretages ændringer i config.php",
- "You are not allowed to share %s" : "Du har ikke tilladelse til at dele %s",
- "Cannot increase permissions of %s" : "Kan give yderigere rettigheder til %s",
- "Expiration date is in the past" : "Udløbsdatoen ligger tilbage i tid",
- "Cannot set expiration date more than %s days in the future" : "Udløbsdato kan ikke sættes mere end %s dage ud i fremtiden",
"PHP %s or higher is required." : "Der kræves PHP %s eller nyere.",
"PHP with a version lower than %s is required." : "Der kræves PHP %s eller ældre.",
"Following databases are supported: %s" : "Følgende databaser understøttes: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Følgende platforme understøttes: %s",
"ownCloud %s or higher is required." : "Der kræves ownCloud %s eller højere.",
"ownCloud %s or lower is required." : "ownCloud %s eller lavere er påkrævet.",
+ "You are not allowed to share %s" : "Du har ikke tilladelse til at dele %s",
+ "Cannot increase permissions of %s" : "Kan give yderigere rettigheder til %s",
+ "Expiration date is in the past" : "Udløbsdatoen ligger tilbage i tid",
+ "Cannot set expiration date more than %s days in the future" : "Udløbsdato kan ikke sættes mere end %s dage ud i fremtiden",
"Help" : "Hjælp",
"Personal" : "Personligt",
"Users" : "Brugere",
diff --git a/lib/l10n/da.json b/lib/l10n/da.json
index 7a4a273e337..9577c26c628 100644
--- a/lib/l10n/da.json
+++ b/lib/l10n/da.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan som regel rettes ved at %sgive webserveren skriveadgang til config-mappen%s.",
"Sample configuration detected" : "Eksempel for konfiguration registreret",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Der er registreret at eksempel for konfiguration er blevet kopieret. Dette kan ødelægge din installation og understøttes ikke. Læs venligst dokumentationen før der foretages ændringer i config.php",
- "You are not allowed to share %s" : "Du har ikke tilladelse til at dele %s",
- "Cannot increase permissions of %s" : "Kan give yderigere rettigheder til %s",
- "Expiration date is in the past" : "Udløbsdatoen ligger tilbage i tid",
- "Cannot set expiration date more than %s days in the future" : "Udløbsdato kan ikke sættes mere end %s dage ud i fremtiden",
"PHP %s or higher is required." : "Der kræves PHP %s eller nyere.",
"PHP with a version lower than %s is required." : "Der kræves PHP %s eller ældre.",
"Following databases are supported: %s" : "Følgende databaser understøttes: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "Følgende platforme understøttes: %s",
"ownCloud %s or higher is required." : "Der kræves ownCloud %s eller højere.",
"ownCloud %s or lower is required." : "ownCloud %s eller lavere er påkrævet.",
+ "You are not allowed to share %s" : "Du har ikke tilladelse til at dele %s",
+ "Cannot increase permissions of %s" : "Kan give yderigere rettigheder til %s",
+ "Expiration date is in the past" : "Udløbsdatoen ligger tilbage i tid",
+ "Cannot set expiration date more than %s days in the future" : "Udløbsdato kan ikke sættes mere end %s dage ud i fremtiden",
"Help" : "Hjælp",
"Personal" : "Personligt",
"Users" : "Brugere",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index 64250641b77..39fc4abd904 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.",
"Sample configuration detected" : "Beispielkonfiguration gefunden",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Deine Installation zerstören und wird nicht unterstützt. Bitte lies die Dokumentation, bevor Du Änderungen an der config.php vornimmst.",
- "You are not allowed to share %s" : "Die Freigabe von %s ist Dir nicht erlaubt",
- "Cannot increase permissions of %s" : "Kann die Berechtigungen von %s nicht erhöhen",
- "Expiration date is in the past" : "Ablaufdatum ist in der Vergangenheit",
- "Cannot set expiration date more than %s days in the future" : "Das Ablaufdatum kann nicht mehr als %s Tage in die Zukunft liegen",
"PHP %s or higher is required." : "PHP %s oder höher wird benötigt.",
"PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.",
"Following databases are supported: %s" : "Die folgenden Datenbanken werden unterstützt: %s",
@@ -21,6 +17,12 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Die folgenden Plattformen werden unterstützt: %s",
"ownCloud %s or higher is required." : "ownCloud %s oder höher wird benötigt.",
"ownCloud %s or lower is required." : "ownCloud %s oder niedriger wird benötigt.",
+ "You are not allowed to share %s" : "Die Freigabe von %s ist Dir nicht erlaubt",
+ "Cannot increase permissions of %s" : "Kann die Berechtigungen von %s nicht erhöhen",
+ "Files can't be shared with delete permissions" : "Dateien mit Lösch-Berechtigungen können nicht geteilt werden",
+ "Files can't be shared with create permissions" : "Dateien mit Erstell-Berechtigungen können nicht geteilt werden",
+ "Expiration date is in the past" : "Ablaufdatum ist in der Vergangenheit",
+ "Cannot set expiration date more than %s days in the future" : "Das Ablaufdatum kann nicht mehr als %s Tage in die Zukunft liegen",
"Help" : "Hilfe",
"Personal" : "Persönlich",
"Users" : "Benutzer",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 633ab47d9de..a81cb8de631 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.",
"Sample configuration detected" : "Beispielkonfiguration gefunden",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Deine Installation zerstören und wird nicht unterstützt. Bitte lies die Dokumentation, bevor Du Änderungen an der config.php vornimmst.",
- "You are not allowed to share %s" : "Die Freigabe von %s ist Dir nicht erlaubt",
- "Cannot increase permissions of %s" : "Kann die Berechtigungen von %s nicht erhöhen",
- "Expiration date is in the past" : "Ablaufdatum ist in der Vergangenheit",
- "Cannot set expiration date more than %s days in the future" : "Das Ablaufdatum kann nicht mehr als %s Tage in die Zukunft liegen",
"PHP %s or higher is required." : "PHP %s oder höher wird benötigt.",
"PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.",
"Following databases are supported: %s" : "Die folgenden Datenbanken werden unterstützt: %s",
@@ -19,6 +15,12 @@
"Following platforms are supported: %s" : "Die folgenden Plattformen werden unterstützt: %s",
"ownCloud %s or higher is required." : "ownCloud %s oder höher wird benötigt.",
"ownCloud %s or lower is required." : "ownCloud %s oder niedriger wird benötigt.",
+ "You are not allowed to share %s" : "Die Freigabe von %s ist Dir nicht erlaubt",
+ "Cannot increase permissions of %s" : "Kann die Berechtigungen von %s nicht erhöhen",
+ "Files can't be shared with delete permissions" : "Dateien mit Lösch-Berechtigungen können nicht geteilt werden",
+ "Files can't be shared with create permissions" : "Dateien mit Erstell-Berechtigungen können nicht geteilt werden",
+ "Expiration date is in the past" : "Ablaufdatum ist in der Vergangenheit",
+ "Cannot set expiration date more than %s days in the future" : "Das Ablaufdatum kann nicht mehr als %s Tage in die Zukunft liegen",
"Help" : "Hilfe",
"Personal" : "Persönlich",
"Users" : "Benutzer",
diff --git a/lib/l10n/de_AT.js b/lib/l10n/de_AT.js
index 3f534e7e9fb..0fffa7623bb 100644
--- a/lib/l10n/de_AT.js
+++ b/lib/l10n/de_AT.js
@@ -3,6 +3,11 @@ OC.L10N.register(
{
"Help" : "Hilfe",
"Personal" : "Persönlich",
- "seconds ago" : "Sekunden zuvor"
+ "Users" : "Benutzer",
+ "Admin" : "Administration",
+ "Unknown filetype" : "Unbekannter Dateityp",
+ "Invalid image" : "Ungültiges Bild",
+ "seconds ago" : "Sekunden zuvor",
+ "Apps" : "Apps"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/de_AT.json b/lib/l10n/de_AT.json
index 5702c60934e..71ee4a31cf8 100644
--- a/lib/l10n/de_AT.json
+++ b/lib/l10n/de_AT.json
@@ -1,6 +1,11 @@
{ "translations": {
"Help" : "Hilfe",
"Personal" : "Persönlich",
- "seconds ago" : "Sekunden zuvor"
+ "Users" : "Benutzer",
+ "Admin" : "Administration",
+ "Unknown filetype" : "Unbekannter Dateityp",
+ "Invalid image" : "Ungültiges Bild",
+ "seconds ago" : "Sekunden zuvor",
+ "Apps" : "Apps"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index 54270493749..7908b04f62e 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.",
"Sample configuration detected" : "Beispielkonfiguration gefunden",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Ihre Installation zerstören und wird nicht unterstützt. Bitte lesen Sie die Dokumentation, bevor Sie Änderungen an der config.php vornehmen.",
- "You are not allowed to share %s" : "Die Freigabe von %s ist Ihnen nicht erlaubt",
- "Cannot increase permissions of %s" : "Konnte die Berechtigung von %s nicht anpassen",
- "Expiration date is in the past" : "Das Ablaufdatum liegt in der Vergangenheit.",
- "Cannot set expiration date more than %s days in the future" : "Ablaufdatum kann nicht mehr als %s Tage in der Zukunft liegen",
"PHP %s or higher is required." : "PHP %s oder höher wird benötigt.",
"PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.",
"Following databases are supported: %s" : "Die folgenden Datenbanken werden unterstützt: %s",
@@ -21,6 +17,12 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Die folgenden Plattformen werden unterstützt: %s",
"ownCloud %s or higher is required." : "ownCloud %s oder höher wird benötigt.",
"ownCloud %s or lower is required." : "ownCloud %s oder niedriger wird benötigt.",
+ "You are not allowed to share %s" : "Die Freigabe von %s ist Ihnen nicht erlaubt",
+ "Cannot increase permissions of %s" : "Konnte die Berechtigung von %s nicht anpassen",
+ "Files can't be shared with delete permissions" : "Dateien mit Lösch-Berechtigungen können nicht geteilt werden",
+ "Files can't be shared with create permissions" : "Dateien mit Erstell-Berechtigungen können nicht geteilt werden",
+ "Expiration date is in the past" : "Das Ablaufdatum liegt in der Vergangenheit.",
+ "Cannot set expiration date more than %s days in the future" : "Ablaufdatum kann nicht mehr als %s Tage in der Zukunft liegen",
"Help" : "Hilfe",
"Personal" : "Persönlich",
"Users" : "Benutzer",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 49abf03a567..710df8c6b37 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das Konfigurationsverzeichnis gegeben wird%s.",
"Sample configuration detected" : "Beispielkonfiguration gefunden",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es wurde festgestellt, dass die Beispielkonfiguration kopiert wurde. Dies kann Ihre Installation zerstören und wird nicht unterstützt. Bitte lesen Sie die Dokumentation, bevor Sie Änderungen an der config.php vornehmen.",
- "You are not allowed to share %s" : "Die Freigabe von %s ist Ihnen nicht erlaubt",
- "Cannot increase permissions of %s" : "Konnte die Berechtigung von %s nicht anpassen",
- "Expiration date is in the past" : "Das Ablaufdatum liegt in der Vergangenheit.",
- "Cannot set expiration date more than %s days in the future" : "Ablaufdatum kann nicht mehr als %s Tage in der Zukunft liegen",
"PHP %s or higher is required." : "PHP %s oder höher wird benötigt.",
"PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.",
"Following databases are supported: %s" : "Die folgenden Datenbanken werden unterstützt: %s",
@@ -19,6 +15,12 @@
"Following platforms are supported: %s" : "Die folgenden Plattformen werden unterstützt: %s",
"ownCloud %s or higher is required." : "ownCloud %s oder höher wird benötigt.",
"ownCloud %s or lower is required." : "ownCloud %s oder niedriger wird benötigt.",
+ "You are not allowed to share %s" : "Die Freigabe von %s ist Ihnen nicht erlaubt",
+ "Cannot increase permissions of %s" : "Konnte die Berechtigung von %s nicht anpassen",
+ "Files can't be shared with delete permissions" : "Dateien mit Lösch-Berechtigungen können nicht geteilt werden",
+ "Files can't be shared with create permissions" : "Dateien mit Erstell-Berechtigungen können nicht geteilt werden",
+ "Expiration date is in the past" : "Das Ablaufdatum liegt in der Vergangenheit.",
+ "Cannot set expiration date more than %s days in the future" : "Ablaufdatum kann nicht mehr als %s Tage in der Zukunft liegen",
"Help" : "Hilfe",
"Personal" : "Persönlich",
"Users" : "Benutzer",
diff --git a/lib/l10n/el.js b/lib/l10n/el.js
index c8af11fbcd7..1b6a874abae 100644
--- a/lib/l10n/el.js
+++ b/lib/l10n/el.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Αυτό μπορεί συνήθως να διορθωθεί %sπαρέχοντας δικαιώματα εγγραφής για το φάκελο config στο διακομιστή δικτύου%s.",
"Sample configuration detected" : "Ανιχνεύθηκε δείγμα εγκατάστασης",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Έχει ανιχνευθεί ότι το δείγμα εγκατάστασης έχει αντιγραφεί. Αυτό μπορεί να σπάσει την εγκατάστασή σας και δεν υποστηρίζεται. Παρακαλώ διαβάστε την τεκμηρίωση πριν εκτελέσετε αλλαγές στο config.php",
- "You are not allowed to share %s" : "Δεν επιτρέπεται να διαμοιράσετε τον πόρο %s",
"PHP %s or higher is required." : "PHP %s ή νεώτερη απαιτείται.",
"PHP with a version lower than %s is required." : "Απαιτείται PHP παλαιότερη από την έκδοση %s.",
"Following databases are supported: %s" : " Υποστηρίζονται οι ακόλουθες βάσεις δεδομένων: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Οι ακόλουθες πλατφόρμες υποστηρίζονται: %s",
"ownCloud %s or higher is required." : "Απαιτείται ownCloud %s ή νεότερο",
"ownCloud %s or lower is required." : "Απαιτείται έκδοση του ownCloud παλαιότερη από την %s.",
+ "You are not allowed to share %s" : "Δεν επιτρέπεται να διαμοιράσετε τον πόρο %s",
"Help" : "Βοήθεια",
"Personal" : "Προσωπικά",
"Users" : "Χρήστες",
diff --git a/lib/l10n/el.json b/lib/l10n/el.json
index 932113e5dd7..0c9bfca41d9 100644
--- a/lib/l10n/el.json
+++ b/lib/l10n/el.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Αυτό μπορεί συνήθως να διορθωθεί %sπαρέχοντας δικαιώματα εγγραφής για το φάκελο config στο διακομιστή δικτύου%s.",
"Sample configuration detected" : "Ανιχνεύθηκε δείγμα εγκατάστασης",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Έχει ανιχνευθεί ότι το δείγμα εγκατάστασης έχει αντιγραφεί. Αυτό μπορεί να σπάσει την εγκατάστασή σας και δεν υποστηρίζεται. Παρακαλώ διαβάστε την τεκμηρίωση πριν εκτελέσετε αλλαγές στο config.php",
- "You are not allowed to share %s" : "Δεν επιτρέπεται να διαμοιράσετε τον πόρο %s",
"PHP %s or higher is required." : "PHP %s ή νεώτερη απαιτείται.",
"PHP with a version lower than %s is required." : "Απαιτείται PHP παλαιότερη από την έκδοση %s.",
"Following databases are supported: %s" : " Υποστηρίζονται οι ακόλουθες βάσεις δεδομένων: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Οι ακόλουθες πλατφόρμες υποστηρίζονται: %s",
"ownCloud %s or higher is required." : "Απαιτείται ownCloud %s ή νεότερο",
"ownCloud %s or lower is required." : "Απαιτείται έκδοση του ownCloud παλαιότερη από την %s.",
+ "You are not allowed to share %s" : "Δεν επιτρέπεται να διαμοιράσετε τον πόρο %s",
"Help" : "Βοήθεια",
"Personal" : "Προσωπικά",
"Users" : "Χρήστες",
diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js
index 4ce04e5a6b8..fc17a32c99c 100644
--- a/lib/l10n/en_GB.js
+++ b/lib/l10n/en_GB.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "This can usually be fixed by %sgiving the webserver write access to the config directory%s.",
"Sample configuration detected" : "Sample configuration detected",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php",
- "You are not allowed to share %s" : "You are not allowed to share %s",
- "Cannot increase permissions of %s" : "Cannot increase permissions of %s",
- "Expiration date is in the past" : "Expiration date is in the past",
- "Cannot set expiration date more than %s days in the future" : "Cannot set expiration date more than %s days in the future",
"PHP %s or higher is required." : "PHP %s or higher is required.",
"PHP with a version lower than %s is required." : "PHP with a version lower than %s is required.",
"Following databases are supported: %s" : "Following databases are supported: %s",
@@ -21,11 +17,16 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Following platforms are supported: %s",
"ownCloud %s or higher is required." : "ownCloud %s or higher is required.",
"ownCloud %s or lower is required." : "ownCloud %s or lower is required.",
+ "You are not allowed to share %s" : "You are not allowed to share %s",
+ "Cannot increase permissions of %s" : "Cannot increase permissions of %s",
+ "Expiration date is in the past" : "Expiration date is in the past",
+ "Cannot set expiration date more than %s days in the future" : "Cannot set expiration date more than %s days in the future",
"Help" : "Help",
"Personal" : "Personal",
"Users" : "Users",
"Admin" : "Admin",
"Recommended" : "Recommended",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "App \"%s\" cannot be installed because appinfo file cannot be read.",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s",
"No app name specified" : "No app name specified",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Archives of type %s are not supported" : "Archives of type %s are not supported",
"Failed to open archive when installing app" : "Failed to open archive when installing app",
"App does not provide an info.xml file" : "App does not provide an info.xml file",
+ "App cannot be installed because appinfo file cannot be read." : "App cannot be installed because appinfo file cannot be read.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Signature could not get checked. Please contact the app developer and check your admin screen.",
"App can't be installed because of not allowed code in the App" : "App can't be installed because of unallowed code in the App",
"App can't be installed because it is not compatible with this version of ownCloud" : "App can't be installed because it is not compatible with this version of ownCloud",
@@ -131,6 +133,7 @@ OC.L10N.register(
"Cannot write into \"apps\" directory" : "Cannot write into \"apps\" directory",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file.",
"Cannot create \"data\" directory (%s)" : "Cannot create \"data\" directory (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>.",
"Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s.",
"Setting locale to %s failed" : "Setting locale to %s failed",
"Please install one of these locales on your system and restart your webserver." : "Please install one of these locales on your system and restart your webserver.",
diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json
index ef503400cad..9275dd4e111 100644
--- a/lib/l10n/en_GB.json
+++ b/lib/l10n/en_GB.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "This can usually be fixed by %sgiving the webserver write access to the config directory%s.",
"Sample configuration detected" : "Sample configuration detected",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php",
- "You are not allowed to share %s" : "You are not allowed to share %s",
- "Cannot increase permissions of %s" : "Cannot increase permissions of %s",
- "Expiration date is in the past" : "Expiration date is in the past",
- "Cannot set expiration date more than %s days in the future" : "Cannot set expiration date more than %s days in the future",
"PHP %s or higher is required." : "PHP %s or higher is required.",
"PHP with a version lower than %s is required." : "PHP with a version lower than %s is required.",
"Following databases are supported: %s" : "Following databases are supported: %s",
@@ -19,11 +15,16 @@
"Following platforms are supported: %s" : "Following platforms are supported: %s",
"ownCloud %s or higher is required." : "ownCloud %s or higher is required.",
"ownCloud %s or lower is required." : "ownCloud %s or lower is required.",
+ "You are not allowed to share %s" : "You are not allowed to share %s",
+ "Cannot increase permissions of %s" : "Cannot increase permissions of %s",
+ "Expiration date is in the past" : "Expiration date is in the past",
+ "Cannot set expiration date more than %s days in the future" : "Cannot set expiration date more than %s days in the future",
"Help" : "Help",
"Personal" : "Personal",
"Users" : "Users",
"Admin" : "Admin",
"Recommended" : "Recommended",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "App \"%s\" cannot be installed because appinfo file cannot be read.",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s",
"No app name specified" : "No app name specified",
@@ -58,6 +59,7 @@
"Archives of type %s are not supported" : "Archives of type %s are not supported",
"Failed to open archive when installing app" : "Failed to open archive when installing app",
"App does not provide an info.xml file" : "App does not provide an info.xml file",
+ "App cannot be installed because appinfo file cannot be read." : "App cannot be installed because appinfo file cannot be read.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Signature could not get checked. Please contact the app developer and check your admin screen.",
"App can't be installed because of not allowed code in the App" : "App can't be installed because of unallowed code in the App",
"App can't be installed because it is not compatible with this version of ownCloud" : "App can't be installed because it is not compatible with this version of ownCloud",
@@ -129,6 +131,7 @@
"Cannot write into \"apps\" directory" : "Cannot write into \"apps\" directory",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file.",
"Cannot create \"data\" directory (%s)" : "Cannot create \"data\" directory (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>.",
"Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s.",
"Setting locale to %s failed" : "Setting locale to %s failed",
"Please install one of these locales on your system and restart your webserver." : "Please install one of these locales on your system and restart your webserver.",
diff --git a/lib/l10n/eo.js b/lib/l10n/eo.js
index a4c82a25dc6..ac3a83ace78 100644
--- a/lib/l10n/eo.js
+++ b/lib/l10n/eo.js
@@ -3,15 +3,15 @@ OC.L10N.register(
{
"Cannot write into \"config\" directory!" : "Ne skribeblas la dosierujo “config”!",
"See %s" : "Vidi %s",
- "You are not allowed to share %s" : "Vi ne permesatas kunhavigi %s",
- "Cannot increase permissions of %s" : "Ne eblas pliigi permesojn de %s",
- "Expiration date is in the past" : "Senvalidiĝa dato estintas",
"PHP %s or higher is required." : "PHP %s aŭ pli alta necesas.",
"PHP with a version lower than %s is required." : "Necesas pli malalta eldono de PHP ol %s.",
"Following databases are supported: %s" : "La jenan datumbazoj kongruas: %s",
"The command line tool %s could not be found" : "La komandolinia ilo %s ne troviĝis",
"The library %s is not available." : "La biblioteko %s ne haveblas.",
"ownCloud %s or higher is required." : "ownCloud %s aŭ pli alta necesas.",
+ "You are not allowed to share %s" : "Vi ne permesatas kunhavigi %s",
+ "Cannot increase permissions of %s" : "Ne eblas pliigi permesojn de %s",
+ "Expiration date is in the past" : "Senvalidiĝa dato estintas",
"Help" : "Helpo",
"Personal" : "Persona",
"Users" : "Uzantoj",
diff --git a/lib/l10n/eo.json b/lib/l10n/eo.json
index 818772e4af5..1443fe388a0 100644
--- a/lib/l10n/eo.json
+++ b/lib/l10n/eo.json
@@ -1,15 +1,15 @@
{ "translations": {
"Cannot write into \"config\" directory!" : "Ne skribeblas la dosierujo “config”!",
"See %s" : "Vidi %s",
- "You are not allowed to share %s" : "Vi ne permesatas kunhavigi %s",
- "Cannot increase permissions of %s" : "Ne eblas pliigi permesojn de %s",
- "Expiration date is in the past" : "Senvalidiĝa dato estintas",
"PHP %s or higher is required." : "PHP %s aŭ pli alta necesas.",
"PHP with a version lower than %s is required." : "Necesas pli malalta eldono de PHP ol %s.",
"Following databases are supported: %s" : "La jenan datumbazoj kongruas: %s",
"The command line tool %s could not be found" : "La komandolinia ilo %s ne troviĝis",
"The library %s is not available." : "La biblioteko %s ne haveblas.",
"ownCloud %s or higher is required." : "ownCloud %s aŭ pli alta necesas.",
+ "You are not allowed to share %s" : "Vi ne permesatas kunhavigi %s",
+ "Cannot increase permissions of %s" : "Ne eblas pliigi permesojn de %s",
+ "Expiration date is in the past" : "Senvalidiĝa dato estintas",
"Help" : "Helpo",
"Personal" : "Persona",
"Users" : "Uzantoj",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index b2b04e15f3c..dfb9f4cff2e 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Esto puede solucionarse fácilmente %sotorgándole permisos de escritura al directorio de configuración%s.",
"Sample configuration detected" : "Ejemplo de configuración detectado",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Se ha detectado que el ejemplo de configuración ha sido copiado. Esto puede arruinar su instalación y es un caso para el que no se brinda soporte. Lea la documentación antes de hacer cambios en config.php",
- "You are not allowed to share %s" : "Usted no está autorizado para compartir %s",
- "Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s",
- "Expiration date is in the past" : "Ha pasado la fecha de caducidad",
- "Cannot set expiration date more than %s days in the future" : "No se puede fijar la fecha de caducidad más de %s días en el futuro.",
"PHP %s or higher is required." : "Se requiere PHP %s o superior.",
"PHP with a version lower than %s is required." : "PHP con una versión inferior que %s la requerida.",
"Following databases are supported: %s" : "Las siguientes bases de datos están soportadas: %s",
@@ -21,11 +17,16 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Las siguientes plataformas están soportadas: %s",
"ownCloud %s or higher is required." : "Se requiere ownCloud %s o superior.",
"ownCloud %s or lower is required." : "Se requiere ownCloud %s o una versión inferior.",
+ "You are not allowed to share %s" : "Usted no está autorizado para compartir %s",
+ "Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s",
+ "Expiration date is in the past" : "Ha pasado la fecha de caducidad",
+ "Cannot set expiration date more than %s days in the future" : "No se puede fijar la fecha de caducidad más de %s días en el futuro.",
"Help" : "Ayuda",
"Personal" : "Personal",
"Users" : "Usuarios",
"Admin" : "Administración",
"Recommended" : "Recomendado",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "La app \"%s\" no puede ser instalada debido a que no se puede leer la información de la app.",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "La App \"%s\" no puede ser instalada porque no es compatible con esta versión de ownCloud.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La app \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s",
"No app name specified" : "No se ha especificado nombre de la aplicación",
@@ -60,6 +61,7 @@ OC.L10N.register(
"Archives of type %s are not supported" : "Los ficheros de tipo %s no son soportados",
"Failed to open archive when installing app" : "Falló la apertura ded fichero mientras se instalaba la aplicación",
"App does not provide an info.xml file" : "La aplicación no suministra un fichero info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "La app no puede ser instalada debido a que no se puede leer la información de la app.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma no pudo ser evaluada. Por favor, contacte con el desarrollador de la aplicación y compruebe su pantalla de administración.",
"App can't be installed because of not allowed code in the App" : "La aplicación no puede ser instalada por tener código no autorizado en la aplicación",
"App can't be installed because it is not compatible with this version of ownCloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de ownCloud",
@@ -69,6 +71,7 @@ OC.L10N.register(
"Authentication error" : "Error de autenticación",
"Token expired. Please reload page." : "Token expirado. Por favor, recarge la página.",
"Unknown user" : "Usuario desconocido",
+ "%s enter the database username and name." : "%s introduzca el nombre de usuario y la contraseña de la BBDD.",
"%s enter the database username." : "%s ingresar el usuario de la base de datos.",
"%s enter the database name." : "%s ingresar el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index db87962de70..0b8cfd04344 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Esto puede solucionarse fácilmente %sotorgándole permisos de escritura al directorio de configuración%s.",
"Sample configuration detected" : "Ejemplo de configuración detectado",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Se ha detectado que el ejemplo de configuración ha sido copiado. Esto puede arruinar su instalación y es un caso para el que no se brinda soporte. Lea la documentación antes de hacer cambios en config.php",
- "You are not allowed to share %s" : "Usted no está autorizado para compartir %s",
- "Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s",
- "Expiration date is in the past" : "Ha pasado la fecha de caducidad",
- "Cannot set expiration date more than %s days in the future" : "No se puede fijar la fecha de caducidad más de %s días en el futuro.",
"PHP %s or higher is required." : "Se requiere PHP %s o superior.",
"PHP with a version lower than %s is required." : "PHP con una versión inferior que %s la requerida.",
"Following databases are supported: %s" : "Las siguientes bases de datos están soportadas: %s",
@@ -19,11 +15,16 @@
"Following platforms are supported: %s" : "Las siguientes plataformas están soportadas: %s",
"ownCloud %s or higher is required." : "Se requiere ownCloud %s o superior.",
"ownCloud %s or lower is required." : "Se requiere ownCloud %s o una versión inferior.",
+ "You are not allowed to share %s" : "Usted no está autorizado para compartir %s",
+ "Cannot increase permissions of %s" : "No se pueden incrementar los permisos de %s",
+ "Expiration date is in the past" : "Ha pasado la fecha de caducidad",
+ "Cannot set expiration date more than %s days in the future" : "No se puede fijar la fecha de caducidad más de %s días en el futuro.",
"Help" : "Ayuda",
"Personal" : "Personal",
"Users" : "Usuarios",
"Admin" : "Administración",
"Recommended" : "Recomendado",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "La app \"%s\" no puede ser instalada debido a que no se puede leer la información de la app.",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "La App \"%s\" no puede ser instalada porque no es compatible con esta versión de ownCloud.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La app \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s",
"No app name specified" : "No se ha especificado nombre de la aplicación",
@@ -58,6 +59,7 @@
"Archives of type %s are not supported" : "Los ficheros de tipo %s no son soportados",
"Failed to open archive when installing app" : "Falló la apertura ded fichero mientras se instalaba la aplicación",
"App does not provide an info.xml file" : "La aplicación no suministra un fichero info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "La app no puede ser instalada debido a que no se puede leer la información de la app.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma no pudo ser evaluada. Por favor, contacte con el desarrollador de la aplicación y compruebe su pantalla de administración.",
"App can't be installed because of not allowed code in the App" : "La aplicación no puede ser instalada por tener código no autorizado en la aplicación",
"App can't be installed because it is not compatible with this version of ownCloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de ownCloud",
@@ -67,6 +69,7 @@
"Authentication error" : "Error de autenticación",
"Token expired. Please reload page." : "Token expirado. Por favor, recarge la página.",
"Unknown user" : "Usuario desconocido",
+ "%s enter the database username and name." : "%s introduzca el nombre de usuario y la contraseña de la BBDD.",
"%s enter the database username." : "%s ingresar el usuario de la base de datos.",
"%s enter the database name." : "%s ingresar el nombre de la base de datos",
"%s you may not use dots in the database name" : "%s puede utilizar puntos en el nombre de la base de datos",
diff --git a/lib/l10n/et_EE.js b/lib/l10n/et_EE.js
index 15c89e580ec..38a1036e50d 100644
--- a/lib/l10n/et_EE.js
+++ b/lib/l10n/et_EE.js
@@ -7,8 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Tavaliselt saab selle lahendada %s andes veebiserverile seadete kataloogile \"config\" kirjutusõigused %s",
"Sample configuration detected" : "Tuvastati näidisseaded",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Tuvastati, et kopeeriti näidisseaded. See võib lõhkuda sinu saidi ja see pole toetatud. Palun loe enne faili config.php muutmist dokumentatsiooni",
- "You are not allowed to share %s" : "Sul pole lubatud %s jagada",
- "Expiration date is in the past" : "Aegumise kuupäev on minevikus",
"PHP %s or higher is required." : "PHP %s või uuem on nõutav.",
"PHP with a version lower than %s is required." : "Nõutud on PHP madalama versiooniga kui %s.",
"Following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
@@ -17,6 +15,8 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Toetatud on järgnevad platformid: %s",
"ownCloud %s or higher is required." : "ownCloud %s või uuem on nõutav.",
"ownCloud %s or lower is required." : "ownCloud %s või vanem on nõutav.",
+ "You are not allowed to share %s" : "Sul pole lubatud %s jagada",
+ "Expiration date is in the past" : "Aegumise kuupäev on minevikus",
"Help" : "Abiinfo",
"Personal" : "Isiklik",
"Users" : "Kasutajad",
diff --git a/lib/l10n/et_EE.json b/lib/l10n/et_EE.json
index 2e8e06265e6..00db79e2251 100644
--- a/lib/l10n/et_EE.json
+++ b/lib/l10n/et_EE.json
@@ -5,8 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Tavaliselt saab selle lahendada %s andes veebiserverile seadete kataloogile \"config\" kirjutusõigused %s",
"Sample configuration detected" : "Tuvastati näidisseaded",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Tuvastati, et kopeeriti näidisseaded. See võib lõhkuda sinu saidi ja see pole toetatud. Palun loe enne faili config.php muutmist dokumentatsiooni",
- "You are not allowed to share %s" : "Sul pole lubatud %s jagada",
- "Expiration date is in the past" : "Aegumise kuupäev on minevikus",
"PHP %s or higher is required." : "PHP %s või uuem on nõutav.",
"PHP with a version lower than %s is required." : "Nõutud on PHP madalama versiooniga kui %s.",
"Following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
@@ -15,6 +13,8 @@
"Following platforms are supported: %s" : "Toetatud on järgnevad platformid: %s",
"ownCloud %s or higher is required." : "ownCloud %s või uuem on nõutav.",
"ownCloud %s or lower is required." : "ownCloud %s või vanem on nõutav.",
+ "You are not allowed to share %s" : "Sul pole lubatud %s jagada",
+ "Expiration date is in the past" : "Aegumise kuupäev on minevikus",
"Help" : "Abiinfo",
"Personal" : "Isiklik",
"Users" : "Kasutajad",
diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js
index 05c7eb4eae9..ef4b3f4c0a9 100644
--- a/lib/l10n/eu.js
+++ b/lib/l10n/eu.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Hau normalean konpondu daiteke %sweb zerbitzarira config karpetan idazteko baimenak emanez%s.",
"Sample configuration detected" : "Adibide-ezarpena detektatua",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detektatu da adibide-ezarpena kopiatu dela. Honek zure instalazioa apur dezake eta ez da onartzen. Irakurri dokumentazioa config.php fitxategia aldatu aurretik.",
- "You are not allowed to share %s" : "Ez zadue %s elkarbanatzeko baimendua",
"PHP %s or higher is required." : "PHP %s edo berriagoa behar da.",
"PHP with a version lower than %s is required." : "PHPren bertsioa %s baino txikiagoa izan behar da.",
"Following databases are supported: %s" : "Hurrengo datubaseak onartzen dira: %s",
@@ -17,6 +16,7 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "%s liburutegiak %s baino bertsio txikiagoa izan behar du - dagoen bertsioa %s.",
"Following platforms are supported: %s" : "Hurrengo plataformak onartzen dira: %s",
"ownCloud %s or higher is required." : "ownCloud %s edo haundiagoa behar da.",
+ "You are not allowed to share %s" : "Ez zadue %s elkarbanatzeko baimendua",
"Help" : "Laguntza",
"Personal" : "Pertsonala",
"Users" : "Erabiltzaileak",
diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json
index 2efeab539da..7559f2eb8e8 100644
--- a/lib/l10n/eu.json
+++ b/lib/l10n/eu.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Hau normalean konpondu daiteke %sweb zerbitzarira config karpetan idazteko baimenak emanez%s.",
"Sample configuration detected" : "Adibide-ezarpena detektatua",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detektatu da adibide-ezarpena kopiatu dela. Honek zure instalazioa apur dezake eta ez da onartzen. Irakurri dokumentazioa config.php fitxategia aldatu aurretik.",
- "You are not allowed to share %s" : "Ez zadue %s elkarbanatzeko baimendua",
"PHP %s or higher is required." : "PHP %s edo berriagoa behar da.",
"PHP with a version lower than %s is required." : "PHPren bertsioa %s baino txikiagoa izan behar da.",
"Following databases are supported: %s" : "Hurrengo datubaseak onartzen dira: %s",
@@ -15,6 +14,7 @@
"Library %s with a version lower than %s is required - available version %s." : "%s liburutegiak %s baino bertsio txikiagoa izan behar du - dagoen bertsioa %s.",
"Following platforms are supported: %s" : "Hurrengo plataformak onartzen dira: %s",
"ownCloud %s or higher is required." : "ownCloud %s edo haundiagoa behar da.",
+ "You are not allowed to share %s" : "Ez zadue %s elkarbanatzeko baimendua",
"Help" : "Laguntza",
"Personal" : "Pertsonala",
"Users" : "Erabiltzaileak",
diff --git a/lib/l10n/fi_FI.js b/lib/l10n/fi_FI.js
index a7a35b1ea1d..0ad89e020fc 100644
--- a/lib/l10n/fi_FI.js
+++ b/lib/l10n/fi_FI.js
@@ -6,10 +6,6 @@ OC.L10N.register(
"See %s" : "Katso %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Tämän voi yleensä korjata antamalla %shttp-palvelimelle kirjoitusoikeuden asetushakemistoon%s.",
"Sample configuration detected" : "Esimerkkimääritykset havaittu",
- "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.",
- "Cannot increase permissions of %s" : "Kohteen %s käyttöoikeuksien lisääminen ei onnistu",
- "Expiration date is in the past" : "Vanhenemispäivä on menneisyydessä",
- "Cannot set expiration date more than %s days in the future" : "Vanhenemispäivä voi olla korkeintaan %s päivän päässä tulevaisuudessa",
"PHP %s or higher is required." : "PHP %s tai sitä uudempi vaaditaan.",
"PHP with a version lower than %s is required." : "PHP versiota %s alempi tarvitaan.",
"Following databases are supported: %s" : "Seuraavat tietokannat ovat tuettuja: %s",
@@ -20,6 +16,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Seuraavat alustat ovat tuettuja: %s",
"ownCloud %s or higher is required." : "ownCloud %s tai uudempi vaaditaan.",
"ownCloud %s or lower is required." : "ownCloud %s tai aiempi vaaditaan.",
+ "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.",
+ "Cannot increase permissions of %s" : "Kohteen %s käyttöoikeuksien lisääminen ei onnistu",
+ "Expiration date is in the past" : "Vanhenemispäivä on menneisyydessä",
+ "Cannot set expiration date more than %s days in the future" : "Vanhenemispäivä voi olla korkeintaan %s päivän päässä tulevaisuudessa",
"Help" : "Ohje",
"Personal" : "Henkilökohtainen",
"Users" : "Käyttäjät",
diff --git a/lib/l10n/fi_FI.json b/lib/l10n/fi_FI.json
index 1267b344f78..79cc08e4f82 100644
--- a/lib/l10n/fi_FI.json
+++ b/lib/l10n/fi_FI.json
@@ -4,10 +4,6 @@
"See %s" : "Katso %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Tämän voi yleensä korjata antamalla %shttp-palvelimelle kirjoitusoikeuden asetushakemistoon%s.",
"Sample configuration detected" : "Esimerkkimääritykset havaittu",
- "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.",
- "Cannot increase permissions of %s" : "Kohteen %s käyttöoikeuksien lisääminen ei onnistu",
- "Expiration date is in the past" : "Vanhenemispäivä on menneisyydessä",
- "Cannot set expiration date more than %s days in the future" : "Vanhenemispäivä voi olla korkeintaan %s päivän päässä tulevaisuudessa",
"PHP %s or higher is required." : "PHP %s tai sitä uudempi vaaditaan.",
"PHP with a version lower than %s is required." : "PHP versiota %s alempi tarvitaan.",
"Following databases are supported: %s" : "Seuraavat tietokannat ovat tuettuja: %s",
@@ -18,6 +14,10 @@
"Following platforms are supported: %s" : "Seuraavat alustat ovat tuettuja: %s",
"ownCloud %s or higher is required." : "ownCloud %s tai uudempi vaaditaan.",
"ownCloud %s or lower is required." : "ownCloud %s tai aiempi vaaditaan.",
+ "You are not allowed to share %s" : "Oikeutesi eivät riitä kohteen %s jakamiseen.",
+ "Cannot increase permissions of %s" : "Kohteen %s käyttöoikeuksien lisääminen ei onnistu",
+ "Expiration date is in the past" : "Vanhenemispäivä on menneisyydessä",
+ "Cannot set expiration date more than %s days in the future" : "Vanhenemispäivä voi olla korkeintaan %s päivän päässä tulevaisuudessa",
"Help" : "Ohje",
"Personal" : "Henkilökohtainen",
"Users" : "Käyttäjät",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index 51f22a711a4..edc37f25886 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ce problème est généralement résolu %sen donnant au serveur web un accès en écriture au répertoire de configuration%s.",
"Sample configuration detected" : "Configuration d'exemple détectée",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Il a été détecté que la configuration donnée à titre d'exemple a été copiée. Cela peut rendre votre installation inopérante et n'est pas pris en charge. Veuillez lire la documentation avant d'effectuer des modifications dans config.php",
- "You are not allowed to share %s" : "Vous n'êtes pas autorisé à partager %s",
- "Cannot increase permissions of %s" : "Impossible d'augmenter les permissions de %s",
- "Expiration date is in the past" : "La date d'expiration est dans le passé",
- "Cannot set expiration date more than %s days in the future" : "Impossible de définir la date d'expiration à plus de %s jours dans le futur",
"PHP %s or higher is required." : "PHP %s ou supérieur est requis.",
"PHP with a version lower than %s is required." : "PHP avec une version antérieure à %s est requis.",
"Following databases are supported: %s" : "Les bases de données suivantes sont supportées : %s",
@@ -21,6 +17,30 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Les plateformes suivantes sont prises en charge : %s",
"ownCloud %s or higher is required." : "ownCloud %s ou supérieur est requis.",
"ownCloud %s or lower is required." : "ownCloud %s ou inférieur est requis.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Le module avec l'id: %s n'existe pas. Merci de l'activer dans les paramètres d'applications ou de contacter votre administrateur.",
+ "Empty filename is not allowed" : "Le nom de fichier ne peut pas être vide",
+ "Dot files are not allowed" : "Le nom de fichier ne peut pas commencer par un point",
+ "4-byte characters are not supported in file names" : "Les caractères sur 4 octets ne sont pas pris en charge dans les noms de fichiers",
+ "File name is a reserved word" : "Ce nom de fichier est un mot réservé",
+ "File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
+ "File name is too long" : "Nom de fichier trop long",
+ "%s enter the database username and name." : "%s entrez le nom d'utilisateur et le nom de la base de données.",
+ "%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
+ "%s enter the database name." : "%s entrez le nom de la base de données.",
+ "%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
+ "Oracle connection could not be established" : "La connexion Oracle ne peut être établie",
+ "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
+ "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
+ "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
+ "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
+ "You are not allowed to share %s" : "Vous n'êtes pas autorisé à partager %s",
+ "Cannot increase permissions of %s" : "Impossible d'augmenter les permissions de %s",
+ "Files can't be shared with delete permissions" : "Les fichiers ne peuvent pas être partagés avec les autorisations de suppression",
+ "Files can't be shared with create permissions" : "Les fichiers ne peuvent pas être partagés avec les autorisations de création",
+ "Expiration date is in the past" : "La date d'expiration est dans le passé",
+ "Cannot set expiration date more than %s days in the future" : "Impossible de définir la date d'expiration à plus de %s jours dans le futur",
"Help" : "Aide",
"Personal" : "Personnel",
"Users" : "Utilisateurs",
@@ -43,13 +63,6 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["il y a %n minute","il y a %n minutes"],
"seconds ago" : "il y a quelques secondes",
"web services under your control" : "services web sous votre contrôle",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Le module avec l'id: %s n'existe pas. Merci de l'activer dans les paramètres d'applications ou de contacter votre administrateur.",
- "Empty filename is not allowed" : "Le nom de fichier ne peut pas être vide",
- "Dot files are not allowed" : "Le nom de fichier ne peut pas commencer par un point",
- "4-byte characters are not supported in file names" : "Les caractères sur 4 octets ne sont pas pris en charge dans les noms de fichiers",
- "File name is a reserved word" : "Ce nom de fichier est un mot réservé",
- "File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
- "File name is too long" : "Nom de fichier trop long",
"File is currently busy, please try again later" : "Le fichier est actuellement utilisé, veuillez réessayer plus tard",
"Can't read file" : "Impossible de lire le fichier",
"App directory already exists" : "Le dossier de l'application existe déjà",
@@ -71,17 +84,6 @@ OC.L10N.register(
"Authentication error" : "Erreur d'authentification",
"Token expired. Please reload page." : "La session a expiré. Veuillez recharger la page.",
"Unknown user" : "Utilisateur inconnu",
- "%s enter the database username and name." : "%s entrez le nom d'utilisateur et le nom de la base de données.",
- "%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
- "%s enter the database name." : "%s entrez le nom de la base de données.",
- "%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
- "Oracle connection could not be established" : "La connexion Oracle ne peut être établie",
- "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
- "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
- "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
- "Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
- "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
"For the best results, please consider using a GNU/Linux server instead." : "Pour obtenir les meilleurs résultats, vous devriez utiliser un serveur GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Il semble que cette instance %s fonctionne sur un environnement PHP 32-bit et open_basedir a été configuré dans php.ini. Cela engendre des problèmes avec les fichiers de taille supérieure à 4 Go et est donc fortement déconseillé.",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index d7351b2d422..d01a3d44f1a 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ce problème est généralement résolu %sen donnant au serveur web un accès en écriture au répertoire de configuration%s.",
"Sample configuration detected" : "Configuration d'exemple détectée",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Il a été détecté que la configuration donnée à titre d'exemple a été copiée. Cela peut rendre votre installation inopérante et n'est pas pris en charge. Veuillez lire la documentation avant d'effectuer des modifications dans config.php",
- "You are not allowed to share %s" : "Vous n'êtes pas autorisé à partager %s",
- "Cannot increase permissions of %s" : "Impossible d'augmenter les permissions de %s",
- "Expiration date is in the past" : "La date d'expiration est dans le passé",
- "Cannot set expiration date more than %s days in the future" : "Impossible de définir la date d'expiration à plus de %s jours dans le futur",
"PHP %s or higher is required." : "PHP %s ou supérieur est requis.",
"PHP with a version lower than %s is required." : "PHP avec une version antérieure à %s est requis.",
"Following databases are supported: %s" : "Les bases de données suivantes sont supportées : %s",
@@ -19,6 +15,30 @@
"Following platforms are supported: %s" : "Les plateformes suivantes sont prises en charge : %s",
"ownCloud %s or higher is required." : "ownCloud %s ou supérieur est requis.",
"ownCloud %s or lower is required." : "ownCloud %s ou inférieur est requis.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Le module avec l'id: %s n'existe pas. Merci de l'activer dans les paramètres d'applications ou de contacter votre administrateur.",
+ "Empty filename is not allowed" : "Le nom de fichier ne peut pas être vide",
+ "Dot files are not allowed" : "Le nom de fichier ne peut pas commencer par un point",
+ "4-byte characters are not supported in file names" : "Les caractères sur 4 octets ne sont pas pris en charge dans les noms de fichiers",
+ "File name is a reserved word" : "Ce nom de fichier est un mot réservé",
+ "File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
+ "File name is too long" : "Nom de fichier trop long",
+ "%s enter the database username and name." : "%s entrez le nom d'utilisateur et le nom de la base de données.",
+ "%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
+ "%s enter the database name." : "%s entrez le nom de la base de données.",
+ "%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
+ "Oracle connection could not be established" : "La connexion Oracle ne peut être établie",
+ "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
+ "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
+ "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
+ "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
+ "You are not allowed to share %s" : "Vous n'êtes pas autorisé à partager %s",
+ "Cannot increase permissions of %s" : "Impossible d'augmenter les permissions de %s",
+ "Files can't be shared with delete permissions" : "Les fichiers ne peuvent pas être partagés avec les autorisations de suppression",
+ "Files can't be shared with create permissions" : "Les fichiers ne peuvent pas être partagés avec les autorisations de création",
+ "Expiration date is in the past" : "La date d'expiration est dans le passé",
+ "Cannot set expiration date more than %s days in the future" : "Impossible de définir la date d'expiration à plus de %s jours dans le futur",
"Help" : "Aide",
"Personal" : "Personnel",
"Users" : "Utilisateurs",
@@ -41,13 +61,6 @@
"_%n minute ago_::_%n minutes ago_" : ["il y a %n minute","il y a %n minutes"],
"seconds ago" : "il y a quelques secondes",
"web services under your control" : "services web sous votre contrôle",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Le module avec l'id: %s n'existe pas. Merci de l'activer dans les paramètres d'applications ou de contacter votre administrateur.",
- "Empty filename is not allowed" : "Le nom de fichier ne peut pas être vide",
- "Dot files are not allowed" : "Le nom de fichier ne peut pas commencer par un point",
- "4-byte characters are not supported in file names" : "Les caractères sur 4 octets ne sont pas pris en charge dans les noms de fichiers",
- "File name is a reserved word" : "Ce nom de fichier est un mot réservé",
- "File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
- "File name is too long" : "Nom de fichier trop long",
"File is currently busy, please try again later" : "Le fichier est actuellement utilisé, veuillez réessayer plus tard",
"Can't read file" : "Impossible de lire le fichier",
"App directory already exists" : "Le dossier de l'application existe déjà",
@@ -69,17 +82,6 @@
"Authentication error" : "Erreur d'authentification",
"Token expired. Please reload page." : "La session a expiré. Veuillez recharger la page.",
"Unknown user" : "Utilisateur inconnu",
- "%s enter the database username and name." : "%s entrez le nom d'utilisateur et le nom de la base de données.",
- "%s enter the database username." : "%s entrez le nom d'utilisateur de la base de données.",
- "%s enter the database name." : "%s entrez le nom de la base de données.",
- "%s you may not use dots in the database name" : "%s vous ne pouvez pas utiliser de points dans le nom de la base de données",
- "Oracle connection could not be established" : "La connexion Oracle ne peut être établie",
- "Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
- "DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
- "Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
- "Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
- "PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
"For the best results, please consider using a GNU/Linux server instead." : "Pour obtenir les meilleurs résultats, vous devriez utiliser un serveur GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Il semble que cette instance %s fonctionne sur un environnement PHP 32-bit et open_basedir a été configuré dans php.ini. Cela engendre des problèmes avec les fichiers de taille supérieure à 4 Go et est donc fortement déconseillé.",
diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js
index 47a41687c3e..e51717224d1 100644
--- a/lib/l10n/gl.js
+++ b/lib/l10n/gl.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Polo xeral, isto pode ser fixado para %spermitirlle ao servidor web acceso de escritura ao directorio «config»%s.",
"Sample configuration detected" : "Detectouse a configuración de exemplo",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectouse que foi copiada a configuración de exemplo. Isto pode rachar a súa instalación e non é compatíbel. Lea a documentación antes de facer cambios en config.php",
- "You are not allowed to share %s" : "Non ten permiso para compartir %s",
"PHP %s or higher is required." : "Requirese PHP %s ou superior.",
"PHP with a version lower than %s is required." : "Requírese PHP cunha versión inferior a %s.",
"Following databases are supported: %s" : "Admítense as seguintes bases de datos: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Admítense as seguintes plataformas: %s",
"ownCloud %s or higher is required." : "Requírese ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "Requírese ownCloud %s ou inferior.",
+ "You are not allowed to share %s" : "Non ten permiso para compartir %s",
"Help" : "Axuda",
"Personal" : "Persoal",
"Users" : "Usuarios",
diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json
index e401047b21b..bee95609bf1 100644
--- a/lib/l10n/gl.json
+++ b/lib/l10n/gl.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Polo xeral, isto pode ser fixado para %spermitirlle ao servidor web acceso de escritura ao directorio «config»%s.",
"Sample configuration detected" : "Detectouse a configuración de exemplo",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectouse que foi copiada a configuración de exemplo. Isto pode rachar a súa instalación e non é compatíbel. Lea a documentación antes de facer cambios en config.php",
- "You are not allowed to share %s" : "Non ten permiso para compartir %s",
"PHP %s or higher is required." : "Requirese PHP %s ou superior.",
"PHP with a version lower than %s is required." : "Requírese PHP cunha versión inferior a %s.",
"Following databases are supported: %s" : "Admítense as seguintes bases de datos: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Admítense as seguintes plataformas: %s",
"ownCloud %s or higher is required." : "Requírese ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "Requírese ownCloud %s ou inferior.",
+ "You are not allowed to share %s" : "Non ten permiso para compartir %s",
"Help" : "Axuda",
"Personal" : "Persoal",
"Users" : "Usuarios",
diff --git a/lib/l10n/he.js b/lib/l10n/he.js
index 2b171ae887a..2e0f988e1c9 100644
--- a/lib/l10n/he.js
+++ b/lib/l10n/he.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "בדרך כלל ניתן לפתור את הבעיה על ידי כך ש- %s נותן ל- webserver הרשאות כניסה לתיקיית config %s.",
"Sample configuration detected" : "התגלתה דוגמת תצורה",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "התגלה שדוגמת התצורה הועתקה. דבר זה עלול לשבור את ההתקנה ולא נתמך.יש לקרוא את מסמכי התיעוד לפני שמבצעים שינויים ב- config.php",
- "You are not allowed to share %s" : "אינך רשאי/ת לשתף %s",
- "Cannot increase permissions of %s" : "לא ניתן להגדיל את ההיתרים של %s",
- "Expiration date is in the past" : "תאריך תפוגה הנו בעבר",
- "Cannot set expiration date more than %s days in the future" : "לא ניתן להגדיר את תאריך התפוגה מעל %s ימים בעתיד",
"PHP %s or higher is required." : "נדרש PHP בגרסת %s ומעלה.",
"PHP with a version lower than %s is required." : "נדרש PHP בגרסה נמוכה מ- %s.",
"Following databases are supported: %s" : "מסדי הנתונים הבאים נתמכים: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "הפלטפורמות הבאות נתמכות: %s",
"ownCloud %s or higher is required." : "נדרש ownCloud %s ומעלה.",
"ownCloud %s or lower is required." : "נדרש ownCloud %s ומטה.",
+ "You are not allowed to share %s" : "אינך רשאי/ת לשתף %s",
+ "Cannot increase permissions of %s" : "לא ניתן להגדיל את ההיתרים של %s",
+ "Expiration date is in the past" : "תאריך תפוגה הנו בעבר",
+ "Cannot set expiration date more than %s days in the future" : "לא ניתן להגדיר את תאריך התפוגה מעל %s ימים בעתיד",
"Help" : "עזרה",
"Personal" : "אישי",
"Users" : "משתמשים",
diff --git a/lib/l10n/he.json b/lib/l10n/he.json
index 97812942d56..c9592003d38 100644
--- a/lib/l10n/he.json
+++ b/lib/l10n/he.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "בדרך כלל ניתן לפתור את הבעיה על ידי כך ש- %s נותן ל- webserver הרשאות כניסה לתיקיית config %s.",
"Sample configuration detected" : "התגלתה דוגמת תצורה",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "התגלה שדוגמת התצורה הועתקה. דבר זה עלול לשבור את ההתקנה ולא נתמך.יש לקרוא את מסמכי התיעוד לפני שמבצעים שינויים ב- config.php",
- "You are not allowed to share %s" : "אינך רשאי/ת לשתף %s",
- "Cannot increase permissions of %s" : "לא ניתן להגדיל את ההיתרים של %s",
- "Expiration date is in the past" : "תאריך תפוגה הנו בעבר",
- "Cannot set expiration date more than %s days in the future" : "לא ניתן להגדיר את תאריך התפוגה מעל %s ימים בעתיד",
"PHP %s or higher is required." : "נדרש PHP בגרסת %s ומעלה.",
"PHP with a version lower than %s is required." : "נדרש PHP בגרסה נמוכה מ- %s.",
"Following databases are supported: %s" : "מסדי הנתונים הבאים נתמכים: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "הפלטפורמות הבאות נתמכות: %s",
"ownCloud %s or higher is required." : "נדרש ownCloud %s ומעלה.",
"ownCloud %s or lower is required." : "נדרש ownCloud %s ומטה.",
+ "You are not allowed to share %s" : "אינך רשאי/ת לשתף %s",
+ "Cannot increase permissions of %s" : "לא ניתן להגדיל את ההיתרים של %s",
+ "Expiration date is in the past" : "תאריך תפוגה הנו בעבר",
+ "Cannot set expiration date more than %s days in the future" : "לא ניתן להגדיר את תאריך התפוגה מעל %s ימים בעתיד",
"Help" : "עזרה",
"Personal" : "אישי",
"Users" : "משתמשים",
diff --git a/lib/l10n/hr.js b/lib/l10n/hr.js
index 3ce3d9098da..fd1e44c51b6 100644
--- a/lib/l10n/hr.js
+++ b/lib/l10n/hr.js
@@ -7,13 +7,13 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ovo se obično može popraviti %sdavanjem pristupa web poslužitelju za pisanje u config direktoriju%s.",
"Sample configuration detected" : "Nađena ogledna konfiguracija",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Otkriveno je da je ogledna konfiguracija kopirana. To može vašu instalaciju prekinuti i nije podržano.Molimo pročitajte dokumentaciju prije nego li izvršite promjene na config.php",
- "You are not allowed to share %s" : "Nije vam dopušteno dijeliti %s",
"PHP %s or higher is required." : "PHP verzija treba biti %s ili viša.",
"PHP with a version lower than %s is required." : "PHP sa verzijom manjom od %s je potrebna.",
"Following databases are supported: %s" : "Sljedece baza podataka je podrzana: %s",
"The library %s is not available." : "Knjiznica %s nije dostupna.",
"Following platforms are supported: %s" : "Sljedece platforme su podrzane: %s",
"ownCloud %s or higher is required." : "ownCloud %s ili visi je potreban.",
+ "You are not allowed to share %s" : "Nije vam dopušteno dijeliti %s",
"Help" : "Pomoć",
"Personal" : "Osobno",
"Users" : "Korisnici",
diff --git a/lib/l10n/hr.json b/lib/l10n/hr.json
index 6651f7dda1a..1c02e4859eb 100644
--- a/lib/l10n/hr.json
+++ b/lib/l10n/hr.json
@@ -5,13 +5,13 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ovo se obično može popraviti %sdavanjem pristupa web poslužitelju za pisanje u config direktoriju%s.",
"Sample configuration detected" : "Nađena ogledna konfiguracija",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Otkriveno je da je ogledna konfiguracija kopirana. To može vašu instalaciju prekinuti i nije podržano.Molimo pročitajte dokumentaciju prije nego li izvršite promjene na config.php",
- "You are not allowed to share %s" : "Nije vam dopušteno dijeliti %s",
"PHP %s or higher is required." : "PHP verzija treba biti %s ili viša.",
"PHP with a version lower than %s is required." : "PHP sa verzijom manjom od %s je potrebna.",
"Following databases are supported: %s" : "Sljedece baza podataka je podrzana: %s",
"The library %s is not available." : "Knjiznica %s nije dostupna.",
"Following platforms are supported: %s" : "Sljedece platforme su podrzane: %s",
"ownCloud %s or higher is required." : "ownCloud %s ili visi je potreban.",
+ "You are not allowed to share %s" : "Nije vam dopušteno dijeliti %s",
"Help" : "Pomoć",
"Personal" : "Osobno",
"Users" : "Korisnici",
diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js
index b704ce1e536..f59c457e5ff 100644
--- a/lib/l10n/hu_HU.js
+++ b/lib/l10n/hu_HU.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ez rendszerint úgy oldható meg, hogy %sírási jogot adunk a webszervernek a config könyvtárra%s.",
"Sample configuration detected" : "A példabeállítások vannak beállítva",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Úgy tűnik a példakonfigurációt próbálja ténylegesen használni. Ez nem támogatott, és működésképtelenné teheti a telepítést. Kérjük olvassa el a dokumentációt és azt követően változtasson a config.php-n!",
- "You are not allowed to share %s" : "Önnek nincs jogosultsága %s megosztására",
"PHP %s or higher is required." : "PHP %s vagy ennél újabb szükséges.",
"PHP with a version lower than %s is required." : "Ennél régebbi PHP szükséges: %s.",
"Following databases are supported: %s" : "A következő adatbázisok támogatottak: %s",
@@ -15,6 +14,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Ezek a platformok támogatottak: %s",
"ownCloud %s or higher is required." : "ownCoud %s vagy ennél újabb szükséges.",
"ownCloud %s or lower is required." : "ownCoud %s vagy ennél régebbi szükséges.",
+ "You are not allowed to share %s" : "Önnek nincs jogosultsága %s megosztására",
"Help" : "Súgó",
"Personal" : "Személyes",
"Users" : "Felhasználók",
diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json
index 10c28c20c8c..5e980ac90d2 100644
--- a/lib/l10n/hu_HU.json
+++ b/lib/l10n/hu_HU.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ez rendszerint úgy oldható meg, hogy %sírási jogot adunk a webszervernek a config könyvtárra%s.",
"Sample configuration detected" : "A példabeállítások vannak beállítva",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Úgy tűnik a példakonfigurációt próbálja ténylegesen használni. Ez nem támogatott, és működésképtelenné teheti a telepítést. Kérjük olvassa el a dokumentációt és azt követően változtasson a config.php-n!",
- "You are not allowed to share %s" : "Önnek nincs jogosultsága %s megosztására",
"PHP %s or higher is required." : "PHP %s vagy ennél újabb szükséges.",
"PHP with a version lower than %s is required." : "Ennél régebbi PHP szükséges: %s.",
"Following databases are supported: %s" : "A következő adatbázisok támogatottak: %s",
@@ -13,6 +12,7 @@
"Following platforms are supported: %s" : "Ezek a platformok támogatottak: %s",
"ownCloud %s or higher is required." : "ownCoud %s vagy ennél újabb szükséges.",
"ownCloud %s or lower is required." : "ownCoud %s vagy ennél régebbi szükséges.",
+ "You are not allowed to share %s" : "Önnek nincs jogosultsága %s megosztására",
"Help" : "Súgó",
"Personal" : "Személyes",
"Users" : "Felhasználók",
diff --git a/lib/l10n/id.js b/lib/l10n/id.js
index 612a34ddee0..1b18e494c88 100644
--- a/lib/l10n/id.js
+++ b/lib/l10n/id.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Hal ini biasanya dapat diperbaiki dengan %s memberikan akses tulis bagi situs web ke %s direktori config.",
"Sample configuration detected" : "Konfigurasi sampel ditemukan",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Ditemukan bahwa konfigurasi sampel telah disalin. Hal ini dapat merusak instalasi Anda dan tidak didukung. Silahkan baca dokumentasi sebelum melakukan perubahan pada config.php",
- "You are not allowed to share %s" : "Anda tidak diizinkan untuk membagikan %s",
"PHP %s or higher is required." : "Diperlukan PHP %s atau yang lebih tinggi.",
"PHP with a version lower than %s is required." : "Diperlukan PHP dengan versi yang lebh rendah dari %s.",
"Following databases are supported: %s" : "Berikut adalah basis data yang didukung: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Berikut adalah platform yang didukung: %s",
"ownCloud %s or higher is required." : "Diperlukan ownCloud %s atau yang lebih tinggi.",
"ownCloud %s or lower is required." : "ownCloud %s atau yang lebih rendah diperlukan.",
+ "You are not allowed to share %s" : "Anda tidak diizinkan untuk membagikan %s",
"Help" : "Bantuan",
"Personal" : "Pribadi",
"Users" : "Pengguna",
diff --git a/lib/l10n/id.json b/lib/l10n/id.json
index 464f00c6cd2..d04c6b589e3 100644
--- a/lib/l10n/id.json
+++ b/lib/l10n/id.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Hal ini biasanya dapat diperbaiki dengan %s memberikan akses tulis bagi situs web ke %s direktori config.",
"Sample configuration detected" : "Konfigurasi sampel ditemukan",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Ditemukan bahwa konfigurasi sampel telah disalin. Hal ini dapat merusak instalasi Anda dan tidak didukung. Silahkan baca dokumentasi sebelum melakukan perubahan pada config.php",
- "You are not allowed to share %s" : "Anda tidak diizinkan untuk membagikan %s",
"PHP %s or higher is required." : "Diperlukan PHP %s atau yang lebih tinggi.",
"PHP with a version lower than %s is required." : "Diperlukan PHP dengan versi yang lebh rendah dari %s.",
"Following databases are supported: %s" : "Berikut adalah basis data yang didukung: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Berikut adalah platform yang didukung: %s",
"ownCloud %s or higher is required." : "Diperlukan ownCloud %s atau yang lebih tinggi.",
"ownCloud %s or lower is required." : "ownCloud %s atau yang lebih rendah diperlukan.",
+ "You are not allowed to share %s" : "Anda tidak diizinkan untuk membagikan %s",
"Help" : "Bantuan",
"Personal" : "Pribadi",
"Users" : "Pengguna",
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index ad0b50d3fc5..8fc64dabf1b 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ciò può essere normalmente corretto %sfornendo al server web accesso in scrittura alla cartella \"config\"%s",
"Sample configuration detected" : "Configurazione di esempio rilevata",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "È stato rilevato che la configurazione di esempio è stata copiata. Ciò può compromettere la tua installazione e non è supportato. Leggi la documentazione prima di modificare il file config.php",
- "You are not allowed to share %s" : "Non ti è consentito condividere %s",
- "Cannot increase permissions of %s" : "Impossibile aumentare i permessi di %s",
- "Expiration date is in the past" : "La data di scadenza è nel passato",
- "Cannot set expiration date more than %s days in the future" : "Impossibile impostare la data di scadenza a più di %s giorni nel futuro",
"PHP %s or higher is required." : "Richiesto PHP %s o superiore",
"PHP with a version lower than %s is required." : "Richiesta una versione di PHP minore di %s.",
"Following databases are supported: %s" : "I seguenti database sono supportati: %s",
@@ -21,6 +17,24 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Sono supportate le seguenti piattaforme: %s",
"ownCloud %s or higher is required." : "Richiesto ownCloud %s o superiore.",
"ownCloud %s or lower is required." : "Richiesto ownCloud %s o inferiore.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Il modulo con id: %s non esiste. Abilitalo nelle impostazioni delle applicazioni o contatta il tuo amministratore.",
+ "%s enter the database username and name." : "%s digita il nome utente e il nome del database.",
+ "%s enter the database username." : "%s digita il nome utente del database.",
+ "%s enter the database name." : "%s digita il nome del database.",
+ "%s you may not use dots in the database name" : "%s non dovresti utilizzare punti nel nome del database",
+ "Oracle connection could not be established" : "La connessione a Oracle non può essere stabilita",
+ "Oracle username and/or password not valid" : "Nome utente e/o password di Oracle non validi",
+ "DB Error: \"%s\"" : "Errore DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Il comando non consentito era: \"%s\", nome: %s, password: %s",
+ "PostgreSQL username and/or password not valid" : "Nome utente e/o password di PostgreSQL non validi",
+ "You are not allowed to share %s" : "Non ti è consentito condividere %s",
+ "Cannot increase permissions of %s" : "Impossibile aumentare i permessi di %s",
+ "Files can't be shared with delete permissions" : "I file non possono essere condivisi con permessi di eliminazione",
+ "Files can't be shared with create permissions" : "I file non possono essere condivisi con permessi di creazione",
+ "Expiration date is in the past" : "La data di scadenza è nel passato",
+ "Cannot set expiration date more than %s days in the future" : "Impossibile impostare la data di scadenza a più di %s giorni nel futuro",
"Help" : "Aiuto",
"Personal" : "Personale",
"Users" : "Utenti",
@@ -43,7 +57,6 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["%n minuto fa","%n minuti fa"],
"seconds ago" : "secondi fa",
"web services under your control" : "servizi web nelle tue mani",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Il modulo con id: %s non esiste. Abilitalo nelle impostazioni delle applicazioni o contatta il tuo amministratore.",
"Empty filename is not allowed" : "Un nome di file vuoto non è consentito",
"Dot files are not allowed" : "I file con un punto iniziale non sono consentiti",
"4-byte characters are not supported in file names" : "I caratteri di 4 byte non sono supportati nei nomi dei file",
@@ -71,17 +84,6 @@ OC.L10N.register(
"Authentication error" : "Errore di autenticazione",
"Token expired. Please reload page." : "Token scaduto. Ricarica la pagina.",
"Unknown user" : "Utente sconosciuto",
- "%s enter the database username and name." : "%s digita il nome utente e il nome del database.",
- "%s enter the database username." : "%s digita il nome utente del database.",
- "%s enter the database name." : "%s digita il nome del database.",
- "%s you may not use dots in the database name" : "%s non dovresti utilizzare punti nel nome del database",
- "Oracle connection could not be established" : "La connessione a Oracle non può essere stabilita",
- "Oracle username and/or password not valid" : "Nome utente e/o password di Oracle non validi",
- "DB Error: \"%s\"" : "Errore DB: \"%s\"",
- "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
- "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
- "Offending command was: \"%s\", name: %s, password: %s" : "Il comando non consentito era: \"%s\", nome: %s, password: %s",
- "PostgreSQL username and/or password not valid" : "Nome utente e/o password di PostgreSQL non validi",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non è supportato e %s non funzionerà correttamente su questa piattaforma. Usalo a tuo rischio!",
"For the best results, please consider using a GNU/Linux server instead." : "Per avere il risultato migliore, prendi in considerazione l'utilizzo di un server GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Sembra che questa istanza di %s sia in esecuzione in un ambiente PHP a 32 bit e che open_basedir sia stata configurata in php.ini. Ciò comporterà problemi con i file più grandi di 4 GB ed è altamente sconsigliato.",
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index 93acead882f..2ff0bd24fe3 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ciò può essere normalmente corretto %sfornendo al server web accesso in scrittura alla cartella \"config\"%s",
"Sample configuration detected" : "Configurazione di esempio rilevata",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "È stato rilevato che la configurazione di esempio è stata copiata. Ciò può compromettere la tua installazione e non è supportato. Leggi la documentazione prima di modificare il file config.php",
- "You are not allowed to share %s" : "Non ti è consentito condividere %s",
- "Cannot increase permissions of %s" : "Impossibile aumentare i permessi di %s",
- "Expiration date is in the past" : "La data di scadenza è nel passato",
- "Cannot set expiration date more than %s days in the future" : "Impossibile impostare la data di scadenza a più di %s giorni nel futuro",
"PHP %s or higher is required." : "Richiesto PHP %s o superiore",
"PHP with a version lower than %s is required." : "Richiesta una versione di PHP minore di %s.",
"Following databases are supported: %s" : "I seguenti database sono supportati: %s",
@@ -19,6 +15,24 @@
"Following platforms are supported: %s" : "Sono supportate le seguenti piattaforme: %s",
"ownCloud %s or higher is required." : "Richiesto ownCloud %s o superiore.",
"ownCloud %s or lower is required." : "Richiesto ownCloud %s o inferiore.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Il modulo con id: %s non esiste. Abilitalo nelle impostazioni delle applicazioni o contatta il tuo amministratore.",
+ "%s enter the database username and name." : "%s digita il nome utente e il nome del database.",
+ "%s enter the database username." : "%s digita il nome utente del database.",
+ "%s enter the database name." : "%s digita il nome del database.",
+ "%s you may not use dots in the database name" : "%s non dovresti utilizzare punti nel nome del database",
+ "Oracle connection could not be established" : "La connessione a Oracle non può essere stabilita",
+ "Oracle username and/or password not valid" : "Nome utente e/o password di Oracle non validi",
+ "DB Error: \"%s\"" : "Errore DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Il comando non consentito era: \"%s\", nome: %s, password: %s",
+ "PostgreSQL username and/or password not valid" : "Nome utente e/o password di PostgreSQL non validi",
+ "You are not allowed to share %s" : "Non ti è consentito condividere %s",
+ "Cannot increase permissions of %s" : "Impossibile aumentare i permessi di %s",
+ "Files can't be shared with delete permissions" : "I file non possono essere condivisi con permessi di eliminazione",
+ "Files can't be shared with create permissions" : "I file non possono essere condivisi con permessi di creazione",
+ "Expiration date is in the past" : "La data di scadenza è nel passato",
+ "Cannot set expiration date more than %s days in the future" : "Impossibile impostare la data di scadenza a più di %s giorni nel futuro",
"Help" : "Aiuto",
"Personal" : "Personale",
"Users" : "Utenti",
@@ -41,7 +55,6 @@
"_%n minute ago_::_%n minutes ago_" : ["%n minuto fa","%n minuti fa"],
"seconds ago" : "secondi fa",
"web services under your control" : "servizi web nelle tue mani",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Il modulo con id: %s non esiste. Abilitalo nelle impostazioni delle applicazioni o contatta il tuo amministratore.",
"Empty filename is not allowed" : "Un nome di file vuoto non è consentito",
"Dot files are not allowed" : "I file con un punto iniziale non sono consentiti",
"4-byte characters are not supported in file names" : "I caratteri di 4 byte non sono supportati nei nomi dei file",
@@ -69,17 +82,6 @@
"Authentication error" : "Errore di autenticazione",
"Token expired. Please reload page." : "Token scaduto. Ricarica la pagina.",
"Unknown user" : "Utente sconosciuto",
- "%s enter the database username and name." : "%s digita il nome utente e il nome del database.",
- "%s enter the database username." : "%s digita il nome utente del database.",
- "%s enter the database name." : "%s digita il nome del database.",
- "%s you may not use dots in the database name" : "%s non dovresti utilizzare punti nel nome del database",
- "Oracle connection could not be established" : "La connessione a Oracle non può essere stabilita",
- "Oracle username and/or password not valid" : "Nome utente e/o password di Oracle non validi",
- "DB Error: \"%s\"" : "Errore DB: \"%s\"",
- "Offending command was: \"%s\"" : "Il comando non consentito era: \"%s\"",
- "You need to enter either an existing account or the administrator." : "È necessario inserire un account esistente o l'amministratore.",
- "Offending command was: \"%s\", name: %s, password: %s" : "Il comando non consentito era: \"%s\", nome: %s, password: %s",
- "PostgreSQL username and/or password not valid" : "Nome utente e/o password di PostgreSQL non validi",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non è supportato e %s non funzionerà correttamente su questa piattaforma. Usalo a tuo rischio!",
"For the best results, please consider using a GNU/Linux server instead." : "Per avere il risultato migliore, prendi in considerazione l'utilizzo di un server GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Sembra che questa istanza di %s sia in esecuzione in un ambiente PHP a 32 bit e che open_basedir sia stata configurata in php.ini. Ciò comporterà problemi con i file più grandi di 4 GB ed è altamente sconsigliato.",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index d2b0e3eb8a3..2f4d02bb2b7 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "多くの場合、これは %s Webサーバーにconfigディレクトリ %s への書き込み権限を与えることで解決できます。",
"Sample configuration detected" : "サンプル設定が見つかりました。",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "サンプル設定がコピーされてそのままです。このままではインストールが失敗し、サポート対象外になります。config.phpを変更する前にドキュメントを確認してください。",
- "You are not allowed to share %s" : "%s を共有することを許可されていません。",
- "Cannot increase permissions of %s" : "%s の権限を強化できません",
- "Expiration date is in the past" : "有効期限が切れています",
- "Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"PHP %s or higher is required." : "PHP %s 以上が必要です。",
"PHP with a version lower than %s is required." : "%s 以前のバージョンのPHPが必要です。",
"Following databases are supported: %s" : "次のデータベースをサポートしています: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "次のプラットフォームをサポートしています: %s",
"ownCloud %s or higher is required." : "ownCloud %s 以上が必要です。",
"ownCloud %s or lower is required." : "ownCloud %s 以下が必要です。",
+ "You are not allowed to share %s" : "%s を共有することを許可されていません。",
+ "Cannot increase permissions of %s" : "%s の権限を強化できません",
+ "Expiration date is in the past" : "有効期限が切れています",
+ "Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"Help" : "ヘルプ",
"Personal" : "個人",
"Users" : "ユーザー",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index 892091d0648..1e3a1956428 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "多くの場合、これは %s Webサーバーにconfigディレクトリ %s への書き込み権限を与えることで解決できます。",
"Sample configuration detected" : "サンプル設定が見つかりました。",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "サンプル設定がコピーされてそのままです。このままではインストールが失敗し、サポート対象外になります。config.phpを変更する前にドキュメントを確認してください。",
- "You are not allowed to share %s" : "%s を共有することを許可されていません。",
- "Cannot increase permissions of %s" : "%s の権限を強化できません",
- "Expiration date is in the past" : "有効期限が切れています",
- "Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"PHP %s or higher is required." : "PHP %s 以上が必要です。",
"PHP with a version lower than %s is required." : "%s 以前のバージョンのPHPが必要です。",
"Following databases are supported: %s" : "次のデータベースをサポートしています: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "次のプラットフォームをサポートしています: %s",
"ownCloud %s or higher is required." : "ownCloud %s 以上が必要です。",
"ownCloud %s or lower is required." : "ownCloud %s 以下が必要です。",
+ "You are not allowed to share %s" : "%s を共有することを許可されていません。",
+ "Cannot increase permissions of %s" : "%s の権限を強化できません",
+ "Expiration date is in the past" : "有効期限が切れています",
+ "Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"Help" : "ヘルプ",
"Personal" : "個人",
"Users" : "ユーザー",
diff --git a/lib/l10n/ko.js b/lib/l10n/ko.js
index be8f55ff83a..3c0722aa756 100644
--- a/lib/l10n/ko.js
+++ b/lib/l10n/ko.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "%sconfig 디렉터리에 웹 서버 쓰기 권한%s을 주면 해결됩니다.",
"Sample configuration detected" : "예제 설정 감지됨",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "예제 설정이 복사된 것 같습니다. 올바르게 작동하지 않을 수도 있기 때문에 지원되지 않습니다. config.php를 변경하기 전 문서를 읽어 보십시오",
- "You are not allowed to share %s" : "%s을(를) 공유할 수 있는 권한이 없습니다",
"PHP %s or higher is required." : "PHP 버전 %s 이상이 필요합니다.",
"PHP with a version lower than %s is required." : "PHP 버전 %s 미만이 필요합니다.",
"Following databases are supported: %s" : "다음 데이터베이스를 지원합니다: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "다음 플랫폼을 지원합니다: %s",
"ownCloud %s or higher is required." : "ownCloud 버전 %s 이상이 필요합니다.",
"ownCloud %s or lower is required." : "ownCloud %s 이하가 필요합니다.",
+ "You are not allowed to share %s" : "%s을(를) 공유할 수 있는 권한이 없습니다",
"Help" : "도움말",
"Personal" : "개인",
"Users" : "사용자",
diff --git a/lib/l10n/ko.json b/lib/l10n/ko.json
index ff183b6d4b7..d07d2abb861 100644
--- a/lib/l10n/ko.json
+++ b/lib/l10n/ko.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "%sconfig 디렉터리에 웹 서버 쓰기 권한%s을 주면 해결됩니다.",
"Sample configuration detected" : "예제 설정 감지됨",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "예제 설정이 복사된 것 같습니다. 올바르게 작동하지 않을 수도 있기 때문에 지원되지 않습니다. config.php를 변경하기 전 문서를 읽어 보십시오",
- "You are not allowed to share %s" : "%s을(를) 공유할 수 있는 권한이 없습니다",
"PHP %s or higher is required." : "PHP 버전 %s 이상이 필요합니다.",
"PHP with a version lower than %s is required." : "PHP 버전 %s 미만이 필요합니다.",
"Following databases are supported: %s" : "다음 데이터베이스를 지원합니다: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "다음 플랫폼을 지원합니다: %s",
"ownCloud %s or higher is required." : "ownCloud 버전 %s 이상이 필요합니다.",
"ownCloud %s or lower is required." : "ownCloud %s 이하가 필요합니다.",
+ "You are not allowed to share %s" : "%s을(를) 공유할 수 있는 권한이 없습니다",
"Help" : "도움말",
"Personal" : "개인",
"Users" : "사용자",
diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js
index 7e1899464fc..bf36288b2c3 100644
--- a/lib/l10n/nb_NO.js
+++ b/lib/l10n/nb_NO.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan vanligvis ordnes ved %så gi web-serveren skrivetilgang til config-mappen%s.",
"Sample configuration detected" : "Eksempelkonfigurasjon oppdaget",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempelkonfigurasjonen er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php",
- "You are not allowed to share %s" : "Du har ikke lov til å dele %s",
- "Cannot increase permissions of %s" : "Kan ikke øke tillatelser for %s",
- "Expiration date is in the past" : "Utløpsdato er tilbake i tid",
- "Cannot set expiration date more than %s days in the future" : "Kan ikke sette utløpsdato mer enn %s dager fram i tid",
"PHP %s or higher is required." : "PHP %s eller nyere kreves.",
"PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.",
"Following databases are supported: %s" : "Følgende databaser støttes: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Følgende plattformer støttes: %s",
"ownCloud %s or higher is required." : "ownCloud %s eller høyere kreves.",
"ownCloud %s or lower is required." : "ownCloud %s eller lavere kreves.",
+ "You are not allowed to share %s" : "Du har ikke lov til å dele %s",
+ "Cannot increase permissions of %s" : "Kan ikke øke tillatelser for %s",
+ "Expiration date is in the past" : "Utløpsdato er tilbake i tid",
+ "Cannot set expiration date more than %s days in the future" : "Kan ikke sette utløpsdato mer enn %s dager fram i tid",
"Help" : "Hjelp",
"Personal" : "Personlig",
"Users" : "Brukere",
diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json
index e198e9ffb34..f5ec1571e8e 100644
--- a/lib/l10n/nb_NO.json
+++ b/lib/l10n/nb_NO.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan vanligvis ordnes ved %så gi web-serveren skrivetilgang til config-mappen%s.",
"Sample configuration detected" : "Eksempelkonfigurasjon oppdaget",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempelkonfigurasjonen er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php",
- "You are not allowed to share %s" : "Du har ikke lov til å dele %s",
- "Cannot increase permissions of %s" : "Kan ikke øke tillatelser for %s",
- "Expiration date is in the past" : "Utløpsdato er tilbake i tid",
- "Cannot set expiration date more than %s days in the future" : "Kan ikke sette utløpsdato mer enn %s dager fram i tid",
"PHP %s or higher is required." : "PHP %s eller nyere kreves.",
"PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.",
"Following databases are supported: %s" : "Følgende databaser støttes: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "Følgende plattformer støttes: %s",
"ownCloud %s or higher is required." : "ownCloud %s eller høyere kreves.",
"ownCloud %s or lower is required." : "ownCloud %s eller lavere kreves.",
+ "You are not allowed to share %s" : "Du har ikke lov til å dele %s",
+ "Cannot increase permissions of %s" : "Kan ikke øke tillatelser for %s",
+ "Expiration date is in the past" : "Utløpsdato er tilbake i tid",
+ "Cannot set expiration date more than %s days in the future" : "Kan ikke sette utløpsdato mer enn %s dager fram i tid",
"Help" : "Hjelp",
"Personal" : "Personlig",
"Users" : "Brukere",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index e772d083dea..e7e445ac065 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dit kan hersteld worden door de webserver %sschrijfrechten te geven op de de config directory%s",
"Sample configuration detected" : "Voorbeeldconfiguratie gevonden",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Blijkbaar is de voorbeeldconfiguratie gekopieerd. Dit kan uw installatie beschadigen en wordt niet dan ook ondersteund. Lees de documentatie voordat u wijzigingen aan config.php doorvoert",
- "You are not allowed to share %s" : "U bent niet bevoegd om %s te delen",
- "Cannot increase permissions of %s" : "Kan de rechten van %s niet verruimen",
- "Expiration date is in the past" : "De vervaldatum ligt in het verleden",
- "Cannot set expiration date more than %s days in the future" : "Kan vervaldatum niet verder dan %s dagen in de toekomst instellen",
"PHP %s or higher is required." : "PHP %s of hoger vereist.",
"PHP with a version lower than %s is required." : "PHP met een versie lager dan %s is vereist.",
"Following databases are supported: %s" : "De volgende databases worden ondersteund: %s",
@@ -21,11 +17,18 @@ OC.L10N.register(
"Following platforms are supported: %s" : "De volgende platformen worden ondersteund: %s",
"ownCloud %s or higher is required." : "ownCloud %s of hoger vereist.",
"ownCloud %s or lower is required." : "ownCloud %s of lager vereist.",
+ "You are not allowed to share %s" : "U bent niet bevoegd om %s te delen",
+ "Cannot increase permissions of %s" : "Kan de rechten van %s niet verruimen",
+ "Files can't be shared with delete permissions" : "Bestanden kunnen niet worden gedeeld met verwijderrechten",
+ "Files can't be shared with create permissions" : "Bestanden kunnen niet worden gedeeld met creatie rechten",
+ "Expiration date is in the past" : "De vervaldatum ligt in het verleden",
+ "Cannot set expiration date more than %s days in the future" : "Kan vervaldatum niet verder dan %s dagen in de toekomst instellen",
"Help" : "Help",
"Personal" : "Persoonlijk",
"Users" : "Gebruikers",
"Admin" : "Beheerder",
"Recommended" : "Aanbevolen",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "App \"%s\" kan niet worden geïnstalleerd, omdat het appinfo bestand niet gelezen kan worden.",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van ownCloud.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "App \"%s\" kan niet worden geïnstalleerd, omdat de volgende afhankelijkheden niet zijn ingevuld: %s",
"No app name specified" : "Geen app naam opgegeven.",
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index cc3e455e222..323076b5ab9 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dit kan hersteld worden door de webserver %sschrijfrechten te geven op de de config directory%s",
"Sample configuration detected" : "Voorbeeldconfiguratie gevonden",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Blijkbaar is de voorbeeldconfiguratie gekopieerd. Dit kan uw installatie beschadigen en wordt niet dan ook ondersteund. Lees de documentatie voordat u wijzigingen aan config.php doorvoert",
- "You are not allowed to share %s" : "U bent niet bevoegd om %s te delen",
- "Cannot increase permissions of %s" : "Kan de rechten van %s niet verruimen",
- "Expiration date is in the past" : "De vervaldatum ligt in het verleden",
- "Cannot set expiration date more than %s days in the future" : "Kan vervaldatum niet verder dan %s dagen in de toekomst instellen",
"PHP %s or higher is required." : "PHP %s of hoger vereist.",
"PHP with a version lower than %s is required." : "PHP met een versie lager dan %s is vereist.",
"Following databases are supported: %s" : "De volgende databases worden ondersteund: %s",
@@ -19,11 +15,18 @@
"Following platforms are supported: %s" : "De volgende platformen worden ondersteund: %s",
"ownCloud %s or higher is required." : "ownCloud %s of hoger vereist.",
"ownCloud %s or lower is required." : "ownCloud %s of lager vereist.",
+ "You are not allowed to share %s" : "U bent niet bevoegd om %s te delen",
+ "Cannot increase permissions of %s" : "Kan de rechten van %s niet verruimen",
+ "Files can't be shared with delete permissions" : "Bestanden kunnen niet worden gedeeld met verwijderrechten",
+ "Files can't be shared with create permissions" : "Bestanden kunnen niet worden gedeeld met creatie rechten",
+ "Expiration date is in the past" : "De vervaldatum ligt in het verleden",
+ "Cannot set expiration date more than %s days in the future" : "Kan vervaldatum niet verder dan %s dagen in de toekomst instellen",
"Help" : "Help",
"Personal" : "Persoonlijk",
"Users" : "Gebruikers",
"Admin" : "Beheerder",
"Recommended" : "Aanbevolen",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "App \"%s\" kan niet worden geïnstalleerd, omdat het appinfo bestand niet gelezen kan worden.",
"App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van ownCloud.",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "App \"%s\" kan niet worden geïnstalleerd, omdat de volgende afhankelijkheden niet zijn ingevuld: %s",
"No app name specified" : "Geen app naam opgegeven.",
diff --git a/lib/l10n/oc.js b/lib/l10n/oc.js
index 26d31ab9353..186ddd154d7 100644
--- a/lib/l10n/oc.js
+++ b/lib/l10n/oc.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Aqueste problèma es generalament resolgut %sen donant al servidor web un accès en escritura al repertòri de configuracion%s.",
"Sample configuration detected" : "Configuracion d'exemple detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es estat detectat que la configuracion donada a títol d'exemple es estada copiada. Aquò pòt rendre vòstra installacion inoperanta e es pas pres en carga. Legissètz la documentacion abans d'efectuar de modifications dins config.php",
- "You are not allowed to share %s" : "Sètz pas autorizat a partejar %s",
"PHP %s or higher is required." : "PHP %s o superior es requesit.",
"PHP with a version lower than %s is required." : "PHP amb una version anteriora a %s es requesit.",
"Following databases are supported: %s" : "Les bases de donadas seguentas son suportadas : %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Las plataformas seguentas son presas en carga : %s",
"ownCloud %s or higher is required." : "ownCloud %s o superior es requesit.",
"ownCloud %s or lower is required." : "ownCloud %s o inferior es requesit.",
+ "You are not allowed to share %s" : "Sètz pas autorizat a partejar %s",
"Help" : "Ajuda",
"Personal" : "Personal",
"Users" : "Utilizaires",
diff --git a/lib/l10n/oc.json b/lib/l10n/oc.json
index bbb6dbed4a0..68748d0236a 100644
--- a/lib/l10n/oc.json
+++ b/lib/l10n/oc.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Aqueste problèma es generalament resolgut %sen donant al servidor web un accès en escritura al repertòri de configuracion%s.",
"Sample configuration detected" : "Configuracion d'exemple detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Es estat detectat que la configuracion donada a títol d'exemple es estada copiada. Aquò pòt rendre vòstra installacion inoperanta e es pas pres en carga. Legissètz la documentacion abans d'efectuar de modifications dins config.php",
- "You are not allowed to share %s" : "Sètz pas autorizat a partejar %s",
"PHP %s or higher is required." : "PHP %s o superior es requesit.",
"PHP with a version lower than %s is required." : "PHP amb una version anteriora a %s es requesit.",
"Following databases are supported: %s" : "Les bases de donadas seguentas son suportadas : %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Las plataformas seguentas son presas en carga : %s",
"ownCloud %s or higher is required." : "ownCloud %s o superior es requesit.",
"ownCloud %s or lower is required." : "ownCloud %s o inferior es requesit.",
+ "You are not allowed to share %s" : "Sètz pas autorizat a partejar %s",
"Help" : "Ajuda",
"Personal" : "Personal",
"Users" : "Utilizaires",
diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js
index ba399f019ba..a63bfce1c60 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Można to zwykle rozwiązać przez %sdodanie serwerowi www uprawnień zapisu do katalogu config%s.",
"Sample configuration detected" : "Wykryto przykładową konfigurację",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Wykryto skopiowanie przykładowej konfiguracji. To może popsuć Twoją instalację i nie jest wspierane. Proszę przeczytać dokumentację przed dokonywaniem zmian w config.php",
- "You are not allowed to share %s" : "Nie masz uprawnień aby udostępnić %s",
"PHP %s or higher is required." : "PHP %s lub wyższe jest wymagane.",
"PHP with a version lower than %s is required." : "Wersja PHP jest niższa niż %s, która jest wymagana.",
"Following databases are supported: %s" : "Obsługiwane są następujące bazy danych: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Obsługiwane są następujące platformy: %s",
"ownCloud %s or higher is required." : "ownCloud %s jest w wersji nowszej niż wymagana.",
"ownCloud %s or lower is required." : "ownCloud %s jest w wersji starszej niż wymagana.",
+ "You are not allowed to share %s" : "Nie masz uprawnień aby udostępnić %s",
"Help" : "Pomoc",
"Personal" : "Osobiste",
"Users" : "Użytkownicy",
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index d19dc2aa7b1..f968e0e45f2 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Można to zwykle rozwiązać przez %sdodanie serwerowi www uprawnień zapisu do katalogu config%s.",
"Sample configuration detected" : "Wykryto przykładową konfigurację",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Wykryto skopiowanie przykładowej konfiguracji. To może popsuć Twoją instalację i nie jest wspierane. Proszę przeczytać dokumentację przed dokonywaniem zmian w config.php",
- "You are not allowed to share %s" : "Nie masz uprawnień aby udostępnić %s",
"PHP %s or higher is required." : "PHP %s lub wyższe jest wymagane.",
"PHP with a version lower than %s is required." : "Wersja PHP jest niższa niż %s, która jest wymagana.",
"Following databases are supported: %s" : "Obsługiwane są następujące bazy danych: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Obsługiwane są następujące platformy: %s",
"ownCloud %s or higher is required." : "ownCloud %s jest w wersji nowszej niż wymagana.",
"ownCloud %s or lower is required." : "ownCloud %s jest w wersji starszej niż wymagana.",
+ "You are not allowed to share %s" : "Nie masz uprawnień aby udostępnić %s",
"Help" : "Pomoc",
"Personal" : "Osobiste",
"Users" : "Użytkownicy",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 1f2c517bfea..d567f8d8249 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isso geralmente pode ser corrigido dando permissão de gravação %sgiving ao webserver para o directory%s de configuração.",
"Sample configuration detected" : "Exemplo de configuração detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração exemplo foi copiada. Isso pode desestabilizar sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
- "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s",
- "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
- "Expiration date is in the past" : "Data de validade está ultrapassada",
- "Cannot set expiration date more than %s days in the future" : "Não é possível definir a data de validade mais de %s dias no futuro",
"PHP %s or higher is required." : "É requerido PHP %s ou superior.",
"PHP with a version lower than %s is required." : "É requerida uma versão PHP mais antiga que a %s .",
"Following databases are supported: %s" : "Following databases are supported: %s",
@@ -21,6 +17,12 @@ OC.L10N.register(
"Following platforms are supported: %s" : "As seguintes plataformas são suportadas: %s",
"ownCloud %s or higher is required." : "É necessário um ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "É necessário um ownCloud %s ou inferior.",
+ "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s",
+ "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can't be shared with delete permissions" : "Os arquivos não podem ser compartilhadas com permissões de exclusão",
+ "Files can't be shared with create permissions" : "Os arquivos não podem ser compartilhados com permissões de criação",
+ "Expiration date is in the past" : "Data de validade está ultrapassada",
+ "Cannot set expiration date more than %s days in the future" : "Não é possível definir a data de validade mais de %s dias no futuro",
"Help" : "Ajuda",
"Personal" : "Pessoal",
"Users" : "Usuários",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 48cd31f22c5..eae95180a02 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isso geralmente pode ser corrigido dando permissão de gravação %sgiving ao webserver para o directory%s de configuração.",
"Sample configuration detected" : "Exemplo de configuração detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração exemplo foi copiada. Isso pode desestabilizar sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
- "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s",
- "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
- "Expiration date is in the past" : "Data de validade está ultrapassada",
- "Cannot set expiration date more than %s days in the future" : "Não é possível definir a data de validade mais de %s dias no futuro",
"PHP %s or higher is required." : "É requerido PHP %s ou superior.",
"PHP with a version lower than %s is required." : "É requerida uma versão PHP mais antiga que a %s .",
"Following databases are supported: %s" : "Following databases are supported: %s",
@@ -19,6 +15,12 @@
"Following platforms are supported: %s" : "As seguintes plataformas são suportadas: %s",
"ownCloud %s or higher is required." : "É necessário um ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "É necessário um ownCloud %s ou inferior.",
+ "You are not allowed to share %s" : "Você não tem permissão para compartilhar %s",
+ "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can't be shared with delete permissions" : "Os arquivos não podem ser compartilhadas com permissões de exclusão",
+ "Files can't be shared with create permissions" : "Os arquivos não podem ser compartilhados com permissões de criação",
+ "Expiration date is in the past" : "Data de validade está ultrapassada",
+ "Cannot set expiration date more than %s days in the future" : "Não é possível definir a data de validade mais de %s dias no futuro",
"Help" : "Ajuda",
"Personal" : "Pessoal",
"Users" : "Usuários",
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index 7fc296f149f..8c392f77c39 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isto pode ser resolvido normalmente %sdando priviégios de escrita no directório de configuração ao serviço web%s.",
"Sample configuration detected" : "Exemplo de configuração detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração de amostra foi copiada. Isso pode danificar a sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
- "You are not allowed to share %s" : "Não está autorizado a partilhar %s",
- "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
- "Expiration date is in the past" : "A data de expiração está no passado",
- "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro",
"PHP %s or higher is required." : "Necessário PHP %s ou maior.",
"PHP with a version lower than %s is required." : "É necessário um PHP com uma versão inferir a %s.",
"Following databases are supported: %s" : "As seguintes bases de dados são suportadas: %s",
@@ -21,6 +17,24 @@ OC.L10N.register(
"Following platforms are supported: %s" : "As seguintes plataformas são suportadas: %s",
"ownCloud %s or higher is required." : "É necessário ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "É necessário ownCloud %s ou inferior.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "O módulo com a id: %s não existe. Por favor, ative-o nas definições da sua app ou contacte o seu administrador.",
+ "%s enter the database username and name." : "%s introduza o nome de utilizador da base de dados e o nome da base de dados.",
+ "%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
+ "%s enter the database name." : "%s introduza o nome da base de dados",
+ "%s you may not use dots in the database name" : "%s não é permitido utilizar pontos (.) no nome da base de dados",
+ "Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
+ "Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
+ "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
+ "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
+ "Offending command was: \"%s\", name: %s, password: %s" : "O comando gerador de erro foi: \"%s\", nome: %s, password: %s",
+ "PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
+ "You are not allowed to share %s" : "Não está autorizado a partilhar %s",
+ "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can't be shared with delete permissions" : "Ficheiros não podem ser partilhados com permissões de apagar",
+ "Files can't be shared with create permissions" : "Ficheiros não podem ser partilhados com permissões de criação",
+ "Expiration date is in the past" : "A data de expiração está no passado",
+ "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro",
"Help" : "Ajuda",
"Personal" : "Pessoal",
"Users" : "Utilizadores",
@@ -40,7 +54,6 @@ OC.L10N.register(
"_%n year ago_::_%n years ago_" : ["%n ano atrás","%n anos atrás"],
"seconds ago" : "Minutos atrás",
"web services under your control" : "serviços web sob o seu controlo",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "O módulo com a id: %s não existe. Por favor, ative-o nas definições da sua app ou contacte o seu administrador.",
"Empty filename is not allowed" : "Não é permitido um ficheiro sem nome",
"Dot files are not allowed" : "Ficheiros dot não são permitidos",
"4-byte characters are not supported in file names" : "Carateres 4-byte não são suportados como nome de ficheiros",
@@ -68,17 +81,6 @@ OC.L10N.register(
"Authentication error" : "Erro na autenticação",
"Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.",
"Unknown user" : "Utilizador desconhecido",
- "%s enter the database username and name." : "%s introduza o nome de utilizador da base de dados e o nome da base de dados.",
- "%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
- "%s enter the database name." : "%s introduza o nome da base de dados",
- "%s you may not use dots in the database name" : "%s não é permitido utilizar pontos (.) no nome da base de dados",
- "Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
- "Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
- "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
- "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
- "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
- "Offending command was: \"%s\", name: %s, password: %s" : "O comando gerador de erro foi: \"%s\", nome: %s, password: %s",
- "PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Esta plataforma não suporta o sistema operativo Mac OS X e o %s poderá não funcionar correctamente. Utilize por sua conta e risco.",
"For the best results, please consider using a GNU/Linux server instead." : "Para um melhor resultado, utilize antes o servidor GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Parece que a instância %s está a ser executada num ambiente PHP de 32-bits e o open_basedir foi configurado no php.ini. Isto levará a problemas com ficheiros de tamanho superior a 4 GB e é altamente desencorajado.",
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index afeeabc4a29..8a7f0ab575e 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Isto pode ser resolvido normalmente %sdando priviégios de escrita no directório de configuração ao serviço web%s.",
"Sample configuration detected" : "Exemplo de configuração detectada",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração de amostra foi copiada. Isso pode danificar a sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
- "You are not allowed to share %s" : "Não está autorizado a partilhar %s",
- "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
- "Expiration date is in the past" : "A data de expiração está no passado",
- "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro",
"PHP %s or higher is required." : "Necessário PHP %s ou maior.",
"PHP with a version lower than %s is required." : "É necessário um PHP com uma versão inferir a %s.",
"Following databases are supported: %s" : "As seguintes bases de dados são suportadas: %s",
@@ -19,6 +15,24 @@
"Following platforms are supported: %s" : "As seguintes plataformas são suportadas: %s",
"ownCloud %s or higher is required." : "É necessário ownCloud %s ou superior.",
"ownCloud %s or lower is required." : "É necessário ownCloud %s ou inferior.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "O módulo com a id: %s não existe. Por favor, ative-o nas definições da sua app ou contacte o seu administrador.",
+ "%s enter the database username and name." : "%s introduza o nome de utilizador da base de dados e o nome da base de dados.",
+ "%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
+ "%s enter the database name." : "%s introduza o nome da base de dados",
+ "%s you may not use dots in the database name" : "%s não é permitido utilizar pontos (.) no nome da base de dados",
+ "Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
+ "Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
+ "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
+ "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
+ "Offending command was: \"%s\", name: %s, password: %s" : "O comando gerador de erro foi: \"%s\", nome: %s, password: %s",
+ "PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
+ "You are not allowed to share %s" : "Não está autorizado a partilhar %s",
+ "Cannot increase permissions of %s" : "Não é possível aumentar as permissões de %s",
+ "Files can't be shared with delete permissions" : "Ficheiros não podem ser partilhados com permissões de apagar",
+ "Files can't be shared with create permissions" : "Ficheiros não podem ser partilhados com permissões de criação",
+ "Expiration date is in the past" : "A data de expiração está no passado",
+ "Cannot set expiration date more than %s days in the future" : "Não é possível definir data de expiração a mais de %s dias no futuro",
"Help" : "Ajuda",
"Personal" : "Pessoal",
"Users" : "Utilizadores",
@@ -38,7 +52,6 @@
"_%n year ago_::_%n years ago_" : ["%n ano atrás","%n anos atrás"],
"seconds ago" : "Minutos atrás",
"web services under your control" : "serviços web sob o seu controlo",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "O módulo com a id: %s não existe. Por favor, ative-o nas definições da sua app ou contacte o seu administrador.",
"Empty filename is not allowed" : "Não é permitido um ficheiro sem nome",
"Dot files are not allowed" : "Ficheiros dot não são permitidos",
"4-byte characters are not supported in file names" : "Carateres 4-byte não são suportados como nome de ficheiros",
@@ -66,17 +79,6 @@
"Authentication error" : "Erro na autenticação",
"Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.",
"Unknown user" : "Utilizador desconhecido",
- "%s enter the database username and name." : "%s introduza o nome de utilizador da base de dados e o nome da base de dados.",
- "%s enter the database username." : "%s introduza o nome de utilizador da base de dados",
- "%s enter the database name." : "%s introduza o nome da base de dados",
- "%s you may not use dots in the database name" : "%s não é permitido utilizar pontos (.) no nome da base de dados",
- "Oracle connection could not be established" : "Não foi possível estabelecer a ligação Oracle",
- "Oracle username and/or password not valid" : "Nome de utilizador/password do Oracle inválida",
- "DB Error: \"%s\"" : "Erro na BD: \"%s\"",
- "Offending command was: \"%s\"" : "O comando gerador de erro foi: \"%s\"",
- "You need to enter either an existing account or the administrator." : "Precisa de introduzir uma conta existente ou de administrador",
- "Offending command was: \"%s\", name: %s, password: %s" : "O comando gerador de erro foi: \"%s\", nome: %s, password: %s",
- "PostgreSQL username and/or password not valid" : "Nome de utilizador/password do PostgreSQL inválido",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Esta plataforma não suporta o sistema operativo Mac OS X e o %s poderá não funcionar correctamente. Utilize por sua conta e risco.",
"For the best results, please consider using a GNU/Linux server instead." : "Para um melhor resultado, utilize antes o servidor GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Parece que a instância %s está a ser executada num ambiente PHP de 32-bits e o open_basedir foi configurado no php.ini. Isto levará a problemas com ficheiros de tamanho superior a 4 GB e é altamente desencorajado.",
diff --git a/lib/l10n/ro.js b/lib/l10n/ro.js
index 888233d9bc6..cd2936ff5f4 100644
--- a/lib/l10n/ro.js
+++ b/lib/l10n/ro.js
@@ -4,11 +4,11 @@ OC.L10N.register(
"Cannot write into \"config\" directory!" : "Nu se poate scrie în folderul \"config\"!",
"This can usually be fixed by giving the webserver write access to the config directory" : "Aceasta se poate repara de obicei prin permiterea accesului de scriere la dosarul de configurarea a webserverului",
"See %s" : "Vezi %s",
- "You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"PHP %s or higher is required." : "Versiunea PHP %s sau mai mare este necesară.",
"PHP with a version lower than %s is required." : "Este necesară o versiune PHP mai mică decât %s",
"Following platforms are supported: %s" : "Sunt suportate următoarele platforme: %s",
"ownCloud %s or higher is required." : "ownCloud %s sau mai mare este necesar.",
+ "You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"Help" : "Ajutor",
"Personal" : "Personal",
"Users" : "Utilizatori",
diff --git a/lib/l10n/ro.json b/lib/l10n/ro.json
index 1f75f4330ba..d01b154ae64 100644
--- a/lib/l10n/ro.json
+++ b/lib/l10n/ro.json
@@ -2,11 +2,11 @@
"Cannot write into \"config\" directory!" : "Nu se poate scrie în folderul \"config\"!",
"This can usually be fixed by giving the webserver write access to the config directory" : "Aceasta se poate repara de obicei prin permiterea accesului de scriere la dosarul de configurarea a webserverului",
"See %s" : "Vezi %s",
- "You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"PHP %s or higher is required." : "Versiunea PHP %s sau mai mare este necesară.",
"PHP with a version lower than %s is required." : "Este necesară o versiune PHP mai mică decât %s",
"Following platforms are supported: %s" : "Sunt suportate următoarele platforme: %s",
"ownCloud %s or higher is required." : "ownCloud %s sau mai mare este necesar.",
+ "You are not allowed to share %s" : "Nu există permisiunea de partajare %s",
"Help" : "Ajutor",
"Personal" : "Personal",
"Users" : "Utilizatori",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 9ba53d3ca98..bd293e455ae 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.",
"Sample configuration detected" : "Обнаружена конфигурация из примера",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Была обнаружена конфигурация из примера. Такая конфигурация не поддерживается и может повредить вашей системе. Прочтите документацию перед внесением изменений в файл config.php",
- "You are not allowed to share %s" : "Вам запрещено делиться %s",
- "Cannot increase permissions of %s" : "Невозможно увеличить права доступа для %s",
- "Expiration date is in the past" : "Дата окончания срока действия уже прошла",
- "Cannot set expiration date more than %s days in the future" : "Невозможно установить дату окончания срока действия более %s дней",
"PHP %s or higher is required." : "Требуется PHP %s или выше",
"PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.",
"Following databases are supported: %s" : "Поддерживаются следующие СУБД: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Поддерживаются следующие платформы: %s",
"ownCloud %s or higher is required." : "Требуется ownCloud %s или выше.",
"ownCloud %s or lower is required." : "Требуется ownCloud версии %s или ниже.",
+ "You are not allowed to share %s" : "Вам запрещено делиться %s",
+ "Cannot increase permissions of %s" : "Невозможно увеличить права доступа для %s",
+ "Expiration date is in the past" : "Дата окончания срока действия уже прошла",
+ "Cannot set expiration date more than %s days in the future" : "Невозможно установить дату окончания срока действия более %s дней",
"Help" : "Помощь",
"Personal" : "Личное",
"Users" : "Пользователи",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index de1892fea61..09ca4187b72 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.",
"Sample configuration detected" : "Обнаружена конфигурация из примера",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Была обнаружена конфигурация из примера. Такая конфигурация не поддерживается и может повредить вашей системе. Прочтите документацию перед внесением изменений в файл config.php",
- "You are not allowed to share %s" : "Вам запрещено делиться %s",
- "Cannot increase permissions of %s" : "Невозможно увеличить права доступа для %s",
- "Expiration date is in the past" : "Дата окончания срока действия уже прошла",
- "Cannot set expiration date more than %s days in the future" : "Невозможно установить дату окончания срока действия более %s дней",
"PHP %s or higher is required." : "Требуется PHP %s или выше",
"PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.",
"Following databases are supported: %s" : "Поддерживаются следующие СУБД: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "Поддерживаются следующие платформы: %s",
"ownCloud %s or higher is required." : "Требуется ownCloud %s или выше.",
"ownCloud %s or lower is required." : "Требуется ownCloud версии %s или ниже.",
+ "You are not allowed to share %s" : "Вам запрещено делиться %s",
+ "Cannot increase permissions of %s" : "Невозможно увеличить права доступа для %s",
+ "Expiration date is in the past" : "Дата окончания срока действия уже прошла",
+ "Cannot set expiration date more than %s days in the future" : "Невозможно установить дату окончания срока действия более %s дней",
"Help" : "Помощь",
"Personal" : "Личное",
"Users" : "Пользователи",
diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js
index 1d4cc3b36b5..8b7a7fc6431 100644
--- a/lib/l10n/sk_SK.js
+++ b/lib/l10n/sk_SK.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis k adresáru s konfiguráciou%s.",
"Sample configuration detected" : "Detekovaná bola vzorová konfigurácia",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php",
- "You are not allowed to share %s" : "Nemôžete zdieľať %s",
"PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.",
"PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.",
"Following databases are supported: %s" : "Podporované sú tieto databázy: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
"ownCloud %s or higher is required." : "Požadovaná verzia ownCloudu %s alebo vyššia.",
"ownCloud %s or lower is required." : "Požadovaná verzia ownCloudu %s alebo nižšia.",
+ "You are not allowed to share %s" : "Nemôžete zdieľať %s",
"Help" : "Pomoc",
"Personal" : "Osobné",
"Users" : "Používatelia",
diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json
index 83af91cb38a..8b8b15316ea 100644
--- a/lib/l10n/sk_SK.json
+++ b/lib/l10n/sk_SK.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis k adresáru s konfiguráciou%s.",
"Sample configuration detected" : "Detekovaná bola vzorová konfigurácia",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php",
- "You are not allowed to share %s" : "Nemôžete zdieľať %s",
"PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.",
"PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.",
"Following databases are supported: %s" : "Podporované sú tieto databázy: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
"ownCloud %s or higher is required." : "Požadovaná verzia ownCloudu %s alebo vyššia.",
"ownCloud %s or lower is required." : "Požadovaná verzia ownCloudu %s alebo nižšia.",
+ "You are not allowed to share %s" : "Nemôžete zdieľať %s",
"Help" : "Pomoc",
"Personal" : "Osobné",
"Users" : "Používatelia",
diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js
index 47511d0c49e..aadb42d3fa5 100644
--- a/lib/l10n/sl.js
+++ b/lib/l10n/sl.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Napako je mogoče odpraviti z %sdodelitvijo dovoljenja spletnemu strežniku za pisanje v nastavitveno mapo%s.",
"Sample configuration detected" : "Zaznana je neustrezna preizkusna nastavitev",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zaznano je, da je bila v sistem kopirana datoteka z enostavno nastavitvijo. To lahko vpliva na namestitev in zato možnost ni podprta. Pred spremembami datoteke config.php si natančno preberite dokumentacijo.",
- "You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.",
- "Cannot increase permissions of %s" : "Ni mogoče povečati dovoljen %s",
- "Expiration date is in the past" : "Datum preteka je že mimo!",
- "Cannot set expiration date more than %s days in the future" : "Datuma pretaka ni mogoče nastaviti za več kot %s dni v prihodnosti.",
"PHP %s or higher is required." : "Zahtevana je različica PHP %s ali višja.",
"PHP with a version lower than %s is required." : "Zahtevana je različica PHP manj kot %s.",
"Following databases are supported: %s" : "Podprte so navedene podatkovne zbirke: %s",
@@ -21,11 +17,18 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Podprta so okolja: %s",
"ownCloud %s or higher is required." : "Zahtevana je različica ownCloud %s ali višja.",
"ownCloud %s or lower is required." : "Zahtevana je različica ownCloud %s ali nižja.",
+ "You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.",
+ "Cannot increase permissions of %s" : "Ni mogoče povečati dovoljen %s",
+ "Expiration date is in the past" : "Datum preteka je že mimo!",
+ "Cannot set expiration date more than %s days in the future" : "Datuma pretaka ni mogoče nastaviti za več kot %s dni v prihodnosti.",
"Help" : "Pomoč",
"Personal" : "Osebno",
"Users" : "Uporabniki",
"Admin" : "Skrbništvo",
"Recommended" : "Priporočljivo",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Programa \\\"%s\\\" ni mogoče namestiti, ker ni mogoče brati datoteke appinfo.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Programa \"%s\" ni mogoče namestiti, ker ni skladen s trenutno nameščeno različico oblaka ownCloud.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Programa \"%s\" ni mogoče namestiti zaradi nerešenih odvisnosti: %s",
"No app name specified" : "Ni podanega imena programa",
"Unknown filetype" : "Neznana vrsta datoteke",
"Invalid image" : "Neveljavna slika",
diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json
index be488a84000..0fc989dd17b 100644
--- a/lib/l10n/sl.json
+++ b/lib/l10n/sl.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Napako je mogoče odpraviti z %sdodelitvijo dovoljenja spletnemu strežniku za pisanje v nastavitveno mapo%s.",
"Sample configuration detected" : "Zaznana je neustrezna preizkusna nastavitev",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zaznano je, da je bila v sistem kopirana datoteka z enostavno nastavitvijo. To lahko vpliva na namestitev in zato možnost ni podprta. Pred spremembami datoteke config.php si natančno preberite dokumentacijo.",
- "You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.",
- "Cannot increase permissions of %s" : "Ni mogoče povečati dovoljen %s",
- "Expiration date is in the past" : "Datum preteka je že mimo!",
- "Cannot set expiration date more than %s days in the future" : "Datuma pretaka ni mogoče nastaviti za več kot %s dni v prihodnosti.",
"PHP %s or higher is required." : "Zahtevana je različica PHP %s ali višja.",
"PHP with a version lower than %s is required." : "Zahtevana je različica PHP manj kot %s.",
"Following databases are supported: %s" : "Podprte so navedene podatkovne zbirke: %s",
@@ -19,11 +15,18 @@
"Following platforms are supported: %s" : "Podprta so okolja: %s",
"ownCloud %s or higher is required." : "Zahtevana je različica ownCloud %s ali višja.",
"ownCloud %s or lower is required." : "Zahtevana je različica ownCloud %s ali nižja.",
+ "You are not allowed to share %s" : "Omogočanje souporabe %s brez ustreznih dovoljenj ni mogoče.",
+ "Cannot increase permissions of %s" : "Ni mogoče povečati dovoljen %s",
+ "Expiration date is in the past" : "Datum preteka je že mimo!",
+ "Cannot set expiration date more than %s days in the future" : "Datuma pretaka ni mogoče nastaviti za več kot %s dni v prihodnosti.",
"Help" : "Pomoč",
"Personal" : "Osebno",
"Users" : "Uporabniki",
"Admin" : "Skrbništvo",
"Recommended" : "Priporočljivo",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Programa \\\"%s\\\" ni mogoče namestiti, ker ni mogoče brati datoteke appinfo.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "Programa \"%s\" ni mogoče namestiti, ker ni skladen s trenutno nameščeno različico oblaka ownCloud.",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Programa \"%s\" ni mogoče namestiti zaradi nerešenih odvisnosti: %s",
"No app name specified" : "Ni podanega imena programa",
"Unknown filetype" : "Neznana vrsta datoteke",
"Invalid image" : "Neveljavna slika",
diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js
index 54a162455c6..05e72002ebd 100644
--- a/lib/l10n/sq.js
+++ b/lib/l10n/sq.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.",
"Sample configuration detected" : "U gjet formësim shembull",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php",
- "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët",
- "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s",
- "Expiration date is in the past" : "Data e skadimit bie në të kaluarën",
- "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen",
"PHP %s or higher is required." : "Lypse PHP %s ose më sipër.",
"PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.",
"Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s",
@@ -21,6 +17,24 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s",
"ownCloud %s or higher is required." : "Lypset ownCloud %s ose më sipër.",
"ownCloud %s or lower is required." : "Lypset ownCloud %s ose më poshtë.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.",
+ "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.",
+ "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.",
+ "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.",
+ "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave",
+ "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle",
+ "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm",
+ "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"",
+ "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s",
+ "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm",
+ "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët",
+ "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s",
+ "Files can't be shared with delete permissions" : "Kartelat s’mund të ndahen me leje fshirjeje",
+ "Files can't be shared with create permissions" : "Kartelat s’mund të ndahen me leje krijimi",
+ "Expiration date is in the past" : "Data e skadimit bie në të kaluarën",
+ "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen",
"Help" : "Ndihmë",
"Personal" : "Personale",
"Users" : "Përdorues",
@@ -43,7 +57,6 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"],
"seconds ago" : "sekonda më parë",
"web services under your control" : "shërbime web nën kontrollin tuaj",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.",
"Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash",
"Dot files are not allowed" : "Nuk lejohen kartela të fshehura",
"4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash",
@@ -71,17 +84,6 @@ OC.L10N.register(
"Authentication error" : "Gabim mirëfilltësimi",
"Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.",
"Unknown user" : "Përdorues i panjohur",
- "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.",
- "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.",
- "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.",
- "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave",
- "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle",
- "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm",
- "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"",
- "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"",
- "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.",
- "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s",
- "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ",
"For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.",
diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json
index 09d48e8f52a..0853cecc6c6 100644
--- a/lib/l10n/sq.json
+++ b/lib/l10n/sq.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.",
"Sample configuration detected" : "U gjet formësim shembull",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php",
- "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët",
- "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s",
- "Expiration date is in the past" : "Data e skadimit bie në të kaluarën",
- "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen",
"PHP %s or higher is required." : "Lypse PHP %s ose më sipër.",
"PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.",
"Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s",
@@ -19,6 +15,24 @@
"Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s",
"ownCloud %s or higher is required." : "Lypset ownCloud %s ose më sipër.",
"ownCloud %s or lower is required." : "Lypset ownCloud %s ose më poshtë.",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.",
+ "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.",
+ "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.",
+ "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.",
+ "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave",
+ "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle",
+ "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm",
+ "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"",
+ "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s",
+ "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm",
+ "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët",
+ "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s",
+ "Files can't be shared with delete permissions" : "Kartelat s’mund të ndahen me leje fshirjeje",
+ "Files can't be shared with create permissions" : "Kartelat s’mund të ndahen me leje krijimi",
+ "Expiration date is in the past" : "Data e skadimit bie në të kaluarën",
+ "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen",
"Help" : "Ndihmë",
"Personal" : "Personale",
"Users" : "Përdorues",
@@ -41,7 +55,6 @@
"_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"],
"seconds ago" : "sekonda më parë",
"web services under your control" : "shërbime web nën kontrollin tuaj",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.",
"Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash",
"Dot files are not allowed" : "Nuk lejohen kartela të fshehura",
"4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash",
@@ -69,17 +82,6 @@
"Authentication error" : "Gabim mirëfilltësimi",
"Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.",
"Unknown user" : "Përdorues i panjohur",
- "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.",
- "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.",
- "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.",
- "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave",
- "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle",
- "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm",
- "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"",
- "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"",
- "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.",
- "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s",
- "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ",
"For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.",
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index d7652c30f27..42b747f0405 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ово се обично може средити %sдавањем права веб серверу да пише у директоријум са подешавањима%s.",
"Sample configuration detected" : "Откривен је узорак подешавања",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Откривено је да је узорак подешавања ископиран. Ово може покварити инсталацију и није подржано. Прочитајте документацију пре вршења промена у фајлу config.php",
- "You are not allowed to share %s" : "Није вам дозвољено да делите %s",
"PHP %s or higher is required." : "Потребан је ПХП %s или новији.",
"PHP with a version lower than %s is required." : "Потребан је ПХП старији од %s.",
"Following databases are supported: %s" : "Следеће базе података су подржане: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Следеће платформе су подржане: %s",
"ownCloud %s or higher is required." : "оунКлауд %s или новији је потребан.",
"ownCloud %s or lower is required." : "оунКлауд %s или старији је потребан.",
+ "You are not allowed to share %s" : "Није вам дозвољено да делите %s",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index 92e7246afec..360f7a7dba9 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Ово се обично може средити %sдавањем права веб серверу да пише у директоријум са подешавањима%s.",
"Sample configuration detected" : "Откривен је узорак подешавања",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Откривено је да је узорак подешавања ископиран. Ово може покварити инсталацију и није подржано. Прочитајте документацију пре вршења промена у фајлу config.php",
- "You are not allowed to share %s" : "Није вам дозвољено да делите %s",
"PHP %s or higher is required." : "Потребан је ПХП %s или новији.",
"PHP with a version lower than %s is required." : "Потребан је ПХП старији од %s.",
"Following databases are supported: %s" : "Следеће базе података су подржане: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Следеће платформе су подржане: %s",
"ownCloud %s or higher is required." : "оунКлауд %s или новији је потребан.",
"ownCloud %s or lower is required." : "оунКлауд %s или старији је потребан.",
+ "You are not allowed to share %s" : "Није вам дозвољено да делите %s",
"Help" : "Помоћ",
"Personal" : "Лично",
"Users" : "Корисници",
diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js
index 42478ab1256..9dc27ed8cf2 100644
--- a/lib/l10n/sv.js
+++ b/lib/l10n/sv.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till konfigurations-katalogen %s.",
"Sample configuration detected" : "Exempel-konfiguration detekterad",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det har detekterats att exempel-konfigurationen har kopierats. Detta kan förstöra din installation och stöds ej. Vänligen läs dokumentationen innan ändringar på config.php utförs",
- "You are not allowed to share %s" : "Du har inte rätt att dela %s",
"PHP %s or higher is required." : "PHP %s eller högre krävs.",
"PHP with a version lower than %s is required." : "PHP med version lägre än %s krävs.",
"Following databases are supported: %s" : "Följande databastyper stödjs: %s",
@@ -17,6 +16,7 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "Bibliotek %s med version lägre än %s krävs - tillgänglig version %s.",
"Following platforms are supported: %s" : "Följande plattformar stödjs: %s",
"ownCloud %s or higher is required." : "ownCloud %s eller högre krävs.",
+ "You are not allowed to share %s" : "Du har inte rätt att dela %s",
"Help" : "Hjälp",
"Personal" : "Personligt",
"Users" : "Användare",
diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json
index 6c5721789a2..f5c3948418d 100644
--- a/lib/l10n/sv.json
+++ b/lib/l10n/sv.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till konfigurations-katalogen %s.",
"Sample configuration detected" : "Exempel-konfiguration detekterad",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det har detekterats att exempel-konfigurationen har kopierats. Detta kan förstöra din installation och stöds ej. Vänligen läs dokumentationen innan ändringar på config.php utförs",
- "You are not allowed to share %s" : "Du har inte rätt att dela %s",
"PHP %s or higher is required." : "PHP %s eller högre krävs.",
"PHP with a version lower than %s is required." : "PHP med version lägre än %s krävs.",
"Following databases are supported: %s" : "Följande databastyper stödjs: %s",
@@ -15,6 +14,7 @@
"Library %s with a version lower than %s is required - available version %s." : "Bibliotek %s med version lägre än %s krävs - tillgänglig version %s.",
"Following platforms are supported: %s" : "Följande plattformar stödjs: %s",
"ownCloud %s or higher is required." : "ownCloud %s eller högre krävs.",
+ "You are not allowed to share %s" : "Du har inte rätt att dela %s",
"Help" : "Hjälp",
"Personal" : "Personligt",
"Users" : "Användare",
diff --git a/lib/l10n/th_TH.js b/lib/l10n/th_TH.js
index 8159852b0a2..47cc1f10263 100644
--- a/lib/l10n/th_TH.js
+++ b/lib/l10n/th_TH.js
@@ -7,12 +7,8 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "นี้มักจะสามารถแก้ไขโดย %s ให้สิทธิ์การเขียนของเว็บเซิร์ฟเวอร์ไปยังการตั้งค่าไดเรกทอรี %s",
"Sample configuration detected" : "ตรวจพบการกำหนดค่าตัวอย่าง",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "ตรวจพบว่าการกำหนดค่าตัวอย่างที่ถูกคัดลอก นี้สามารถทำลายการติดตั้งของคุณและไม่ได้รับการสนับสนุน โปรดอ่านเอกสารก่อนที่จะดำเนินการเปลี่ยนแปลงใน config.php",
- "You are not allowed to share %s" : "คุณยังไม่ได้รับอนุญาตให้แชร์ %s",
- "Cannot increase permissions of %s" : "ไม่สามารถเพิ่มสิทธิ์ของ %s",
- "Expiration date is in the past" : "วันหมดอายุอยู่ในอดีตที่ผ่านมา",
- "Cannot set expiration date more than %s days in the future" : "ไม่สามารถกำหนดวันหมดอายุให้มากกว่า %s วันในอนาคต",
"PHP %s or higher is required." : "จำเป็นต้องมี PHP รุ่น %s หรือที่สูงกว่า ",
- "PHP with a version lower than %s is required." : "PHP จะต้องมีรุ่นที่ต่ำกว่า %s",
+ "PHP with a version lower than %s is required." : "รุ่น PHP ของคุณต่ำกว่า %s",
"Following databases are supported: %s" : "ฐานข้อมูลต่อไปนี้ได้รับการสนับสนุน: %s",
"The command line tool %s could not be found" : "ไม่พบเครื่องมือบรรทัดคำสั่ง %s ",
"The library %s is not available." : "ไลบรารี %s ไม่สามารถใช้ได้",
@@ -21,12 +17,31 @@ OC.L10N.register(
"Following platforms are supported: %s" : "แพลตฟอร์มต่อไปนี้ได้รับการสนับสนุน: %s",
"ownCloud %s or higher is required." : "จำเป็นต้องมี ownCloud รุ่น %s หรือรุ่นที่สูงกว่า",
"ownCloud %s or lower is required." : "ต้องการ ownCloud %s หรือรุ่นที่ต่ำกว่า",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "โมดูลที่มีไอดี: %s ไม่มีอยู่ กรุณาเปิดใช้งานได้ในการตั้งค่าแอพพลิเคชันของคุณหรือติดต่อผู้ดูแลระบบ",
+ "%s enter the database username and name." : "%s ป้อนชื่อผู้ใช้ฐานข้อมูล และชื่อ",
+ "%s enter the database username." : "%s ใส่ชื่อผู้ใช้ฐานข้อมูล",
+ "%s enter the database name." : "%s ใส่ชื่อฐานข้อมูล",
+ "%s you may not use dots in the database name" : "%s บางที่คุณไม่ควรใช้จุดในชื่อฐานข้อมูล",
+ "Oracle connection could not be established" : "ไม่สามารถสร้างการเชื่อมต่อกับ Oracle ",
+ "Oracle username and/or password not valid" : "Oracle ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
+ "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
+ "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
+ "Offending command was: \"%s\", name: %s, password: %s" : "คำสั่งที่กระทำผิดคือ: \"%s\", ชื่อผู้ใช้: %s, รหัสผ่าน: %s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
+ "You are not allowed to share %s" : "คุณยังไม่ได้รับอนุญาตให้แชร์ %s",
+ "Cannot increase permissions of %s" : "ไม่สามารถเพิ่มสิทธิ์ของ %s",
+ "Files can't be shared with delete permissions" : "ไม่สามารถแชร์ไฟล์และลบสิทธิ์",
+ "Files can't be shared with create permissions" : "ไม่สามารถแชร์ไฟล์และสร้างสิทธิ์",
+ "Expiration date is in the past" : "วันหมดอายุอยู่ในอดีตที่ผ่านมา",
+ "Cannot set expiration date more than %s days in the future" : "ไม่สามารถกำหนดวันหมดอายุให้มากกว่า %s วันในอนาคต",
"Help" : "ช่วยเหลือ",
"Personal" : "ส่วนตัว",
"Users" : "ผู้ใช้งาน",
"Admin" : "ผู้ดูแล",
"Recommended" : "แนะนำ",
- "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "แอพฯ \"%s\" ไม่สามารถติดตั้งได้เพราะเข้ากันไม่ได้กับรุ่นของ ownCloud นี้",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "แอพฯ \"%s\" ไม่สามารถติดตั้งได้เพราะไฟล์ appInfo ไม่สามารถอ่านได้",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "ไม่สามารถติดตั้งแอพฯ \"%s\" เพราะมันเข้ากันไม่ได้กับรุ่นของ ownCloud นี้",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "แอพฯ \"%s\" ไม่สามารถติดตั้งเพราะไม่ได้ปฏิบัติตามการอ้างอิงต่อไปนี้: %s",
"No app name specified" : "ไม่ได้ระบุชื่อแอพพลิเคชัน",
"Unknown filetype" : "ไม่รู้จักชนิดของไฟล์",
@@ -42,7 +57,6 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["%n นาทีที่ผ่านมา"],
"seconds ago" : "วินาที ก่อนหน้านี้",
"web services under your control" : "เว็บเซอร์วิสที่คุณควบคุมการใช้งานได้",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "โมดูลที่มีไอดี: %s ไม่มีอยู่ กรุณาเปิดใช้งานได้ในการตั้งค่าแอพพลิเคชันของคุณหรือติดต่อผู้ดูแลระบบ",
"Empty filename is not allowed" : "ชื่อไฟล์ห้ามว่างเปล่า",
"Dot files are not allowed" : "ชื่อไฟล์ห้ามมีจุด",
"4-byte characters are not supported in file names" : "ตัวอักษร 4 ไบต์ไม่ได้รับการสนับสนุนในชื่อไฟล์",
@@ -64,20 +78,11 @@ OC.L10N.register(
"App can't be installed because of not allowed code in the App" : "ไม่สามารถติดตั้งแอพพลิเคชันเพราะไม่ได้อนุญาตรหัสในแอพพลิเคชัน",
"App can't be installed because it is not compatible with this version of ownCloud" : "ไม่สามารถติดตั้งแอพพลิเคชันเพราะมันเข้ากันไม่ได้กับรุ่นของ ownCloud นี้",
"App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "ไม่สามารถติดตั้งแอพพลิเคชันเพราะมันมี <shipped>จริง</shipped> แท็กที่ไม่ได้รับอนุญาต",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "ไม่สามารถติดตั้งแอพฯ เพราะว่ารุ่นของ info.xml ไม่ตรงกับรุ่นที่ระบุไว้จากแอพสโตร์",
"Application is not enabled" : "แอพพลิเคชั่นดังกล่าวยังไม่ได้เปิดใช้งาน",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Token expired. Please reload page." : "รหัสยืนยันความถูกต้องหมดอายุแล้ว กรุณาโหลดหน้าเว็บใหม่อีกครั้ง",
"Unknown user" : "ไม่รู้จักผู้ใช้",
- "%s enter the database username." : "%s ใส่ชื่อผู้ใช้ฐานข้อมูล",
- "%s enter the database name." : "%s ใส่ชื่อฐานข้อมูล",
- "%s you may not use dots in the database name" : "%s บางที่คุณไม่ควรใช้จุดในชื่อฐานข้อมูล",
- "Oracle connection could not be established" : "ไม่สามารถสร้างการเชื่อมต่อกับ Oracle ",
- "Oracle username and/or password not valid" : "Oracle ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
- "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
- "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
- "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
- "Offending command was: \"%s\", name: %s, password: %s" : "คำสั่งที่กระทำผิดคือ: \"%s\", ชื่อผู้ใช้: %s, รหัสผ่าน: %s",
- "PostgreSQL username and/or password not valid" : "PostgreSQL ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "ระบบปฏิบัติการ Mac OS X ไม่ได้รับการสนับสนุนและ %s จะไม่ทำงานบนแพลตฟอร์มนี้ ใช้มันบนความเสี่ยงของคุณเอง!",
"For the best results, please consider using a GNU/Linux server instead." : "เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดโปรดพิจารณาใช้เซิร์ฟเวอร์ GNU/Linux แทน",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "ดูเหมือนว่า %s ทำงานบน PHP 32 บิต และ open_basedir ได้ถูกกำหนดค่าใน php.ini ซึ่งจะมีปัญหาหากไฟล์มีขนาดกว่า 4 GB กิกะไบต์",
@@ -137,6 +142,7 @@ OC.L10N.register(
"Adjusting this setting in php.ini will make ownCloud run again" : "การปรับตั้งค่าใน php.ini นี้ ownCloud จะทำงานอีกครั้ง",
"mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload ถูกตั้งเป็น \"%s\" แทนที่จะเป็น \"0\"",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "หากต้องการแก้ไขปัญหานี้กรุณาแก้ <code>mbstring.func_overload</code> เป็น <code>0</code> ในไฟล์ php.ini ของคุณ",
+ "To fix this issue update your libxml2 version and restart your web server." : "เพื่อแก้ไขปัญหานี้ กรุณาอัพเดทรุ่นของ libxml2 และรีสตาร์ทเว็บเซิร์ฟเวอร์ของคุณ",
"PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "เห็นได้ชัดว่า PHP มีการตั้งค่าเพื่อดึงบล็อกเอกสารแบบอินไลน์ ซึ่งจะทำให้แอพพลิเคชันไม่สามารถเข้าถึงได้",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "นี้อาจเกิดจาก cache/accelerator อย่างเช่น Zend OPcache หรือ eAccelerator",
"PHP modules have been installed, but they are still listed as missing?" : "โมดูล PHP ได้รับการติดตั้ง แต่พวกเขาไม่ได้ระบุไว้หรือมันอาจหายไป?",
diff --git a/lib/l10n/th_TH.json b/lib/l10n/th_TH.json
index 86b875fe314..69799f6b1ed 100644
--- a/lib/l10n/th_TH.json
+++ b/lib/l10n/th_TH.json
@@ -5,12 +5,8 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "นี้มักจะสามารถแก้ไขโดย %s ให้สิทธิ์การเขียนของเว็บเซิร์ฟเวอร์ไปยังการตั้งค่าไดเรกทอรี %s",
"Sample configuration detected" : "ตรวจพบการกำหนดค่าตัวอย่าง",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "ตรวจพบว่าการกำหนดค่าตัวอย่างที่ถูกคัดลอก นี้สามารถทำลายการติดตั้งของคุณและไม่ได้รับการสนับสนุน โปรดอ่านเอกสารก่อนที่จะดำเนินการเปลี่ยนแปลงใน config.php",
- "You are not allowed to share %s" : "คุณยังไม่ได้รับอนุญาตให้แชร์ %s",
- "Cannot increase permissions of %s" : "ไม่สามารถเพิ่มสิทธิ์ของ %s",
- "Expiration date is in the past" : "วันหมดอายุอยู่ในอดีตที่ผ่านมา",
- "Cannot set expiration date more than %s days in the future" : "ไม่สามารถกำหนดวันหมดอายุให้มากกว่า %s วันในอนาคต",
"PHP %s or higher is required." : "จำเป็นต้องมี PHP รุ่น %s หรือที่สูงกว่า ",
- "PHP with a version lower than %s is required." : "PHP จะต้องมีรุ่นที่ต่ำกว่า %s",
+ "PHP with a version lower than %s is required." : "รุ่น PHP ของคุณต่ำกว่า %s",
"Following databases are supported: %s" : "ฐานข้อมูลต่อไปนี้ได้รับการสนับสนุน: %s",
"The command line tool %s could not be found" : "ไม่พบเครื่องมือบรรทัดคำสั่ง %s ",
"The library %s is not available." : "ไลบรารี %s ไม่สามารถใช้ได้",
@@ -19,12 +15,31 @@
"Following platforms are supported: %s" : "แพลตฟอร์มต่อไปนี้ได้รับการสนับสนุน: %s",
"ownCloud %s or higher is required." : "จำเป็นต้องมี ownCloud รุ่น %s หรือรุ่นที่สูงกว่า",
"ownCloud %s or lower is required." : "ต้องการ ownCloud %s หรือรุ่นที่ต่ำกว่า",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "โมดูลที่มีไอดี: %s ไม่มีอยู่ กรุณาเปิดใช้งานได้ในการตั้งค่าแอพพลิเคชันของคุณหรือติดต่อผู้ดูแลระบบ",
+ "%s enter the database username and name." : "%s ป้อนชื่อผู้ใช้ฐานข้อมูล และชื่อ",
+ "%s enter the database username." : "%s ใส่ชื่อผู้ใช้ฐานข้อมูล",
+ "%s enter the database name." : "%s ใส่ชื่อฐานข้อมูล",
+ "%s you may not use dots in the database name" : "%s บางที่คุณไม่ควรใช้จุดในชื่อฐานข้อมูล",
+ "Oracle connection could not be established" : "ไม่สามารถสร้างการเชื่อมต่อกับ Oracle ",
+ "Oracle username and/or password not valid" : "Oracle ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
+ "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
+ "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
+ "Offending command was: \"%s\", name: %s, password: %s" : "คำสั่งที่กระทำผิดคือ: \"%s\", ชื่อผู้ใช้: %s, รหัสผ่าน: %s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
+ "You are not allowed to share %s" : "คุณยังไม่ได้รับอนุญาตให้แชร์ %s",
+ "Cannot increase permissions of %s" : "ไม่สามารถเพิ่มสิทธิ์ของ %s",
+ "Files can't be shared with delete permissions" : "ไม่สามารถแชร์ไฟล์และลบสิทธิ์",
+ "Files can't be shared with create permissions" : "ไม่สามารถแชร์ไฟล์และสร้างสิทธิ์",
+ "Expiration date is in the past" : "วันหมดอายุอยู่ในอดีตที่ผ่านมา",
+ "Cannot set expiration date more than %s days in the future" : "ไม่สามารถกำหนดวันหมดอายุให้มากกว่า %s วันในอนาคต",
"Help" : "ช่วยเหลือ",
"Personal" : "ส่วนตัว",
"Users" : "ผู้ใช้งาน",
"Admin" : "ผู้ดูแล",
"Recommended" : "แนะนำ",
- "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "แอพฯ \"%s\" ไม่สามารถติดตั้งได้เพราะเข้ากันไม่ได้กับรุ่นของ ownCloud นี้",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "แอพฯ \"%s\" ไม่สามารถติดตั้งได้เพราะไฟล์ appInfo ไม่สามารถอ่านได้",
+ "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "ไม่สามารถติดตั้งแอพฯ \"%s\" เพราะมันเข้ากันไม่ได้กับรุ่นของ ownCloud นี้",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "แอพฯ \"%s\" ไม่สามารถติดตั้งเพราะไม่ได้ปฏิบัติตามการอ้างอิงต่อไปนี้: %s",
"No app name specified" : "ไม่ได้ระบุชื่อแอพพลิเคชัน",
"Unknown filetype" : "ไม่รู้จักชนิดของไฟล์",
@@ -40,7 +55,6 @@
"_%n minute ago_::_%n minutes ago_" : ["%n นาทีที่ผ่านมา"],
"seconds ago" : "วินาที ก่อนหน้านี้",
"web services under your control" : "เว็บเซอร์วิสที่คุณควบคุมการใช้งานได้",
- "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "โมดูลที่มีไอดี: %s ไม่มีอยู่ กรุณาเปิดใช้งานได้ในการตั้งค่าแอพพลิเคชันของคุณหรือติดต่อผู้ดูแลระบบ",
"Empty filename is not allowed" : "ชื่อไฟล์ห้ามว่างเปล่า",
"Dot files are not allowed" : "ชื่อไฟล์ห้ามมีจุด",
"4-byte characters are not supported in file names" : "ตัวอักษร 4 ไบต์ไม่ได้รับการสนับสนุนในชื่อไฟล์",
@@ -62,20 +76,11 @@
"App can't be installed because of not allowed code in the App" : "ไม่สามารถติดตั้งแอพพลิเคชันเพราะไม่ได้อนุญาตรหัสในแอพพลิเคชัน",
"App can't be installed because it is not compatible with this version of ownCloud" : "ไม่สามารถติดตั้งแอพพลิเคชันเพราะมันเข้ากันไม่ได้กับรุ่นของ ownCloud นี้",
"App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "ไม่สามารถติดตั้งแอพพลิเคชันเพราะมันมี <shipped>จริง</shipped> แท็กที่ไม่ได้รับอนุญาต",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "ไม่สามารถติดตั้งแอพฯ เพราะว่ารุ่นของ info.xml ไม่ตรงกับรุ่นที่ระบุไว้จากแอพสโตร์",
"Application is not enabled" : "แอพพลิเคชั่นดังกล่าวยังไม่ได้เปิดใช้งาน",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Token expired. Please reload page." : "รหัสยืนยันความถูกต้องหมดอายุแล้ว กรุณาโหลดหน้าเว็บใหม่อีกครั้ง",
"Unknown user" : "ไม่รู้จักผู้ใช้",
- "%s enter the database username." : "%s ใส่ชื่อผู้ใช้ฐานข้อมูล",
- "%s enter the database name." : "%s ใส่ชื่อฐานข้อมูล",
- "%s you may not use dots in the database name" : "%s บางที่คุณไม่ควรใช้จุดในชื่อฐานข้อมูล",
- "Oracle connection could not be established" : "ไม่สามารถสร้างการเชื่อมต่อกับ Oracle ",
- "Oracle username and/or password not valid" : "Oracle ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
- "DB Error: \"%s\"" : "ข้อผิดพลาดในฐานข้อมูล: \"%s\"",
- "Offending command was: \"%s\"" : "คำสั่งที่ทำผิดคือ: \"%s\"",
- "You need to enter either an existing account or the administrator." : "คุณจำเป็นต้องใส่ทั้งบัญชีที่มีอยู่หรือบัญชีผู้ดูแล",
- "Offending command was: \"%s\", name: %s, password: %s" : "คำสั่งที่กระทำผิดคือ: \"%s\", ชื่อผู้ใช้: %s, รหัสผ่าน: %s",
- "PostgreSQL username and/or password not valid" : "PostgreSQL ชื่อผู้ใช้ และ/หรือ รหัสผ่านไม่ถูกต้อง",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "ระบบปฏิบัติการ Mac OS X ไม่ได้รับการสนับสนุนและ %s จะไม่ทำงานบนแพลตฟอร์มนี้ ใช้มันบนความเสี่ยงของคุณเอง!",
"For the best results, please consider using a GNU/Linux server instead." : "เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดโปรดพิจารณาใช้เซิร์ฟเวอร์ GNU/Linux แทน",
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "ดูเหมือนว่า %s ทำงานบน PHP 32 บิต และ open_basedir ได้ถูกกำหนดค่าใน php.ini ซึ่งจะมีปัญหาหากไฟล์มีขนาดกว่า 4 GB กิกะไบต์",
@@ -135,6 +140,7 @@
"Adjusting this setting in php.ini will make ownCloud run again" : "การปรับตั้งค่าใน php.ini นี้ ownCloud จะทำงานอีกครั้ง",
"mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload ถูกตั้งเป็น \"%s\" แทนที่จะเป็น \"0\"",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "หากต้องการแก้ไขปัญหานี้กรุณาแก้ <code>mbstring.func_overload</code> เป็น <code>0</code> ในไฟล์ php.ini ของคุณ",
+ "To fix this issue update your libxml2 version and restart your web server." : "เพื่อแก้ไขปัญหานี้ กรุณาอัพเดทรุ่นของ libxml2 และรีสตาร์ทเว็บเซิร์ฟเวอร์ของคุณ",
"PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "เห็นได้ชัดว่า PHP มีการตั้งค่าเพื่อดึงบล็อกเอกสารแบบอินไลน์ ซึ่งจะทำให้แอพพลิเคชันไม่สามารถเข้าถึงได้",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "นี้อาจเกิดจาก cache/accelerator อย่างเช่น Zend OPcache หรือ eAccelerator",
"PHP modules have been installed, but they are still listed as missing?" : "โมดูล PHP ได้รับการติดตั้ง แต่พวกเขาไม่ได้ระบุไว้หรือมันอาจหายไป?",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index a829153eeef..62d2916bbd1 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Bu genellikle, %sweb sunucusuna config dizinine yazma erişimi verilerek%s çözülebilir",
"Sample configuration detected" : "Örnek yapılandırma tespit edildi",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Örnek yapılandırmanın kopyalanmış olabileceği tespit edildi. Bu kurulumunuzu bozabilir ve desteklenmemektedir. Lütfen config.php dosyasında değişiklik yapmadan önce belgelendirmeyi okuyun",
- "You are not allowed to share %s" : "%s paylaşımını yapma izniniz yok",
- "Cannot increase permissions of %s" : "%s izinleri yükseltilemiyor",
- "Expiration date is in the past" : "Son kullanma tarihi geçmişte",
- "Cannot set expiration date more than %s days in the future" : "Paylaşımların son kullanım süreleri, gelecekte %s günden fazla olamaz",
"PHP %s or higher is required." : "PHP %s veya daha üst sürümü gerekli.",
"PHP with a version lower than %s is required." : "PHP'nin %s sürümü öncesi gerekli.",
"Following databases are supported: %s" : "Şu veritabanları desteklenmekte: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Aşağıdaki platformlar destekleniyor: %s",
"ownCloud %s or higher is required." : "ownCloud %s veya daha üstü gerekli.",
"ownCloud %s or lower is required." : "ownCloud %s veya daha düşük sürüm gerekli.",
+ "You are not allowed to share %s" : "%s paylaşımını yapma izniniz yok",
+ "Cannot increase permissions of %s" : "%s izinleri yükseltilemiyor",
+ "Expiration date is in the past" : "Son kullanma tarihi geçmişte",
+ "Cannot set expiration date more than %s days in the future" : "Paylaşımların son kullanım süreleri, gelecekte %s günden fazla olamaz",
"Help" : "Yardım",
"Personal" : "Kişisel",
"Users" : "Kullanıcılar",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index a5340ed3008..bfd94d21c11 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Bu genellikle, %sweb sunucusuna config dizinine yazma erişimi verilerek%s çözülebilir",
"Sample configuration detected" : "Örnek yapılandırma tespit edildi",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Örnek yapılandırmanın kopyalanmış olabileceği tespit edildi. Bu kurulumunuzu bozabilir ve desteklenmemektedir. Lütfen config.php dosyasında değişiklik yapmadan önce belgelendirmeyi okuyun",
- "You are not allowed to share %s" : "%s paylaşımını yapma izniniz yok",
- "Cannot increase permissions of %s" : "%s izinleri yükseltilemiyor",
- "Expiration date is in the past" : "Son kullanma tarihi geçmişte",
- "Cannot set expiration date more than %s days in the future" : "Paylaşımların son kullanım süreleri, gelecekte %s günden fazla olamaz",
"PHP %s or higher is required." : "PHP %s veya daha üst sürümü gerekli.",
"PHP with a version lower than %s is required." : "PHP'nin %s sürümü öncesi gerekli.",
"Following databases are supported: %s" : "Şu veritabanları desteklenmekte: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "Aşağıdaki platformlar destekleniyor: %s",
"ownCloud %s or higher is required." : "ownCloud %s veya daha üstü gerekli.",
"ownCloud %s or lower is required." : "ownCloud %s veya daha düşük sürüm gerekli.",
+ "You are not allowed to share %s" : "%s paylaşımını yapma izniniz yok",
+ "Cannot increase permissions of %s" : "%s izinleri yükseltilemiyor",
+ "Expiration date is in the past" : "Son kullanma tarihi geçmişte",
+ "Cannot set expiration date more than %s days in the future" : "Paylaşımların son kullanım süreleri, gelecekte %s günden fazla olamaz",
"Help" : "Yardım",
"Personal" : "Kişisel",
"Users" : "Kullanıcılar",
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 860e1d1e68d..e3f5697124c 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -7,7 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Зазвичай це можна виправити, %sнадавши веб-серверу права на запис в теці конфігурації%s.",
"Sample configuration detected" : "Виявлено приклад конфігурації",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Була виявлена конфігурація з прикладу. Це може нашкодити вашій системі та не підтримується. Будь ласка, зверніться до документації перед внесенням змін в файл config.php",
- "You are not allowed to share %s" : "Вам заборонено поширювати %s",
"PHP %s or higher is required." : "Необхідно PHP %s або вище",
"PHP with a version lower than %s is required." : "Потрібна версія PHP нижче %s ",
"Following databases are supported: %s" : "Підтримуються наступні сервери баз даних: %s",
@@ -18,6 +17,7 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Підтримуються наступні платформи: %s",
"ownCloud %s or higher is required." : "Потрібен ownCloud %s або вище.",
"ownCloud %s or lower is required." : "Потрібна версія %s ownCloud або нижча.",
+ "You are not allowed to share %s" : "Вам заборонено поширювати %s",
"Help" : "Допомога",
"Personal" : "Особисте",
"Users" : "Користувачі",
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index f27f8c56914..c5962f4814c 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -5,7 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Зазвичай це можна виправити, %sнадавши веб-серверу права на запис в теці конфігурації%s.",
"Sample configuration detected" : "Виявлено приклад конфігурації",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Була виявлена конфігурація з прикладу. Це може нашкодити вашій системі та не підтримується. Будь ласка, зверніться до документації перед внесенням змін в файл config.php",
- "You are not allowed to share %s" : "Вам заборонено поширювати %s",
"PHP %s or higher is required." : "Необхідно PHP %s або вище",
"PHP with a version lower than %s is required." : "Потрібна версія PHP нижче %s ",
"Following databases are supported: %s" : "Підтримуються наступні сервери баз даних: %s",
@@ -16,6 +15,7 @@
"Following platforms are supported: %s" : "Підтримуються наступні платформи: %s",
"ownCloud %s or higher is required." : "Потрібен ownCloud %s або вище.",
"ownCloud %s or lower is required." : "Потрібна версія %s ownCloud або нижча.",
+ "You are not allowed to share %s" : "Вам заборонено поширювати %s",
"Help" : "Допомога",
"Personal" : "Особисте",
"Users" : "Користувачі",
diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js
index d87e1215caf..48c086e37e2 100644
--- a/lib/l10n/zh_CN.js
+++ b/lib/l10n/zh_CN.js
@@ -3,8 +3,8 @@ OC.L10N.register(
{
"Cannot write into \"config\" directory!" : "无法写入“config”目录!",
"See %s" : "查看 %s",
- "You are not allowed to share %s" : "您无权分享 %s",
"PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。",
+ "You are not allowed to share %s" : "您无权分享 %s",
"Help" : "帮助",
"Personal" : "个人",
"Users" : "用户",
diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json
index e7726edb5a4..51a1280a07b 100644
--- a/lib/l10n/zh_CN.json
+++ b/lib/l10n/zh_CN.json
@@ -1,8 +1,8 @@
{ "translations": {
"Cannot write into \"config\" directory!" : "无法写入“config”目录!",
"See %s" : "查看 %s",
- "You are not allowed to share %s" : "您无权分享 %s",
"PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。",
+ "You are not allowed to share %s" : "您无权分享 %s",
"Help" : "帮助",
"Personal" : "个人",
"Users" : "用户",
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index d930f9e491c..13ebf305a9b 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -7,10 +7,6 @@ OC.L10N.register(
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "%s允許網頁伺服器寫入設定目錄%s通常可以解決這個問題",
"Sample configuration detected" : "偵測到範本設定",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "看來您直接複製了範本設定來使用,這可能會毀掉你的安裝,請閱讀說明文件後對 config.php 進行適當的修改",
- "You are not allowed to share %s" : "你不被允許分享 %s",
- "Cannot increase permissions of %s" : "無法增加%s的權限",
- "Expiration date is in the past" : "到期日是之前的時間",
- "Cannot set expiration date more than %s days in the future" : "無法設定到期日超過未來%s天",
"PHP %s or higher is required." : "需要 PHP %s 或更高版本",
"PHP with a version lower than %s is required." : "需要 PHP 版本低於 %s ",
"Following databases are supported: %s" : "這些資料庫支援: %s",
@@ -21,6 +17,10 @@ OC.L10N.register(
"Following platforms are supported: %s" : "這些平台支援: %s",
"ownCloud %s or higher is required." : "需要ownCloud %s 或更高版本",
"ownCloud %s or lower is required." : "需要ownCloud %s 或更低版本",
+ "You are not allowed to share %s" : "你不被允許分享 %s",
+ "Cannot increase permissions of %s" : "無法增加%s的權限",
+ "Expiration date is in the past" : "到期日是之前的時間",
+ "Cannot set expiration date more than %s days in the future" : "無法設定到期日超過未來%s天",
"Help" : "說明",
"Personal" : "個人",
"Users" : "使用者",
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index a0a736744fd..12cdbc83466 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -5,10 +5,6 @@
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "%s允許網頁伺服器寫入設定目錄%s通常可以解決這個問題",
"Sample configuration detected" : "偵測到範本設定",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "看來您直接複製了範本設定來使用,這可能會毀掉你的安裝,請閱讀說明文件後對 config.php 進行適當的修改",
- "You are not allowed to share %s" : "你不被允許分享 %s",
- "Cannot increase permissions of %s" : "無法增加%s的權限",
- "Expiration date is in the past" : "到期日是之前的時間",
- "Cannot set expiration date more than %s days in the future" : "無法設定到期日超過未來%s天",
"PHP %s or higher is required." : "需要 PHP %s 或更高版本",
"PHP with a version lower than %s is required." : "需要 PHP 版本低於 %s ",
"Following databases are supported: %s" : "這些資料庫支援: %s",
@@ -19,6 +15,10 @@
"Following platforms are supported: %s" : "這些平台支援: %s",
"ownCloud %s or higher is required." : "需要ownCloud %s 或更高版本",
"ownCloud %s or lower is required." : "需要ownCloud %s 或更低版本",
+ "You are not allowed to share %s" : "你不被允許分享 %s",
+ "Cannot increase permissions of %s" : "無法增加%s的權限",
+ "Expiration date is in the past" : "到期日是之前的時間",
+ "Cannot set expiration date more than %s days in the future" : "無法設定到期日超過未來%s天",
"Help" : "說明",
"Personal" : "個人",
"Users" : "使用者",
diff --git a/lib/private/activity/event.php b/lib/private/Activity/Event.php
index b7e271b2104..b7e271b2104 100644
--- a/lib/private/activity/event.php
+++ b/lib/private/Activity/Event.php
diff --git a/lib/private/app/appmanager.php b/lib/private/App/AppManager.php
index 69e5334774e..69e5334774e 100644
--- a/lib/private/app/appmanager.php
+++ b/lib/private/App/AppManager.php
diff --git a/lib/private/app/codechecker/abstractcheck.php b/lib/private/App/CodeChecker/AbstractCheck.php
index ca91d366482..ca91d366482 100644
--- a/lib/private/app/codechecker/abstractcheck.php
+++ b/lib/private/App/CodeChecker/AbstractCheck.php
diff --git a/lib/private/app/codechecker/codechecker.php b/lib/private/App/CodeChecker/CodeChecker.php
index 0ca597ccb4e..0ca597ccb4e 100644
--- a/lib/private/app/codechecker/codechecker.php
+++ b/lib/private/App/CodeChecker/CodeChecker.php
diff --git a/lib/private/app/codechecker/deprecationcheck.php b/lib/private/App/CodeChecker/DeprecationCheck.php
index fa5eae8ab1d..fa5eae8ab1d 100644
--- a/lib/private/app/codechecker/deprecationcheck.php
+++ b/lib/private/App/CodeChecker/DeprecationCheck.php
diff --git a/lib/private/app/codechecker/emptycheck.php b/lib/private/App/CodeChecker/EmptyCheck.php
index b779926d5e4..b779926d5e4 100644
--- a/lib/private/app/codechecker/emptycheck.php
+++ b/lib/private/App/CodeChecker/EmptyCheck.php
diff --git a/lib/private/app/codechecker/icheck.php b/lib/private/App/CodeChecker/ICheck.php
index 97e0bc9b8a0..97e0bc9b8a0 100644
--- a/lib/private/app/codechecker/icheck.php
+++ b/lib/private/App/CodeChecker/ICheck.php
diff --git a/lib/private/app/codechecker/infochecker.php b/lib/private/App/CodeChecker/InfoChecker.php
index 812007d8839..812007d8839 100644
--- a/lib/private/app/codechecker/infochecker.php
+++ b/lib/private/App/CodeChecker/InfoChecker.php
diff --git a/lib/private/app/codechecker/nodevisitor.php b/lib/private/App/CodeChecker/NodeVisitor.php
index f9386caeeae..f9386caeeae 100644
--- a/lib/private/app/codechecker/nodevisitor.php
+++ b/lib/private/App/CodeChecker/NodeVisitor.php
diff --git a/lib/private/app/codechecker/privatecheck.php b/lib/private/App/CodeChecker/PrivateCheck.php
index 32248ab21e2..32248ab21e2 100644
--- a/lib/private/app/codechecker/privatecheck.php
+++ b/lib/private/App/CodeChecker/PrivateCheck.php
diff --git a/lib/private/app/codechecker/strongcomparisoncheck.php b/lib/private/App/CodeChecker/StrongComparisonCheck.php
index 919647a6a54..919647a6a54 100644
--- a/lib/private/app/codechecker/strongcomparisoncheck.php
+++ b/lib/private/App/CodeChecker/StrongComparisonCheck.php
diff --git a/lib/private/app/dependencyanalyzer.php b/lib/private/App/DependencyAnalyzer.php
index 6519e15bd8b..6519e15bd8b 100644
--- a/lib/private/app/dependencyanalyzer.php
+++ b/lib/private/App/DependencyAnalyzer.php
diff --git a/lib/private/app/infoparser.php b/lib/private/App/InfoParser.php
index c33e5349f3b..e763364e148 100644
--- a/lib/private/app/infoparser.php
+++ b/lib/private/App/InfoParser.php
@@ -27,22 +27,14 @@ namespace OC\App;
use OCP\IURLGenerator;
class InfoParser {
- /**
- * @var \OC\HTTPHelper
- */
- private $httpHelper;
- /**
- * @var IURLGenerator
- */
+ /** @var IURLGenerator */
private $urlGenerator;
/**
- * @param \OC\HTTPHelper $httpHelper
* @param IURLGenerator $urlGenerator
*/
- public function __construct(\OC\HTTPHelper $httpHelper, IURLGenerator $urlGenerator) {
- $this->httpHelper = $httpHelper;
+ public function __construct(IURLGenerator $urlGenerator) {
$this->urlGenerator = $urlGenerator;
}
@@ -68,23 +60,32 @@ class InfoParser {
return null;
}
if (!array_key_exists('info', $array)) {
- $array['info'] = array();
+ $array['info'] = [];
}
if (!array_key_exists('remote', $array)) {
- $array['remote'] = array();
+ $array['remote'] = [];
}
if (!array_key_exists('public', $array)) {
- $array['public'] = array();
+ $array['public'] = [];
}
if (!array_key_exists('types', $array)) {
- $array['types'] = array();
+ $array['types'] = [];
+ }
+ if (!array_key_exists('repair-steps', $array)) {
+ $array['repair-steps'] = [];
+ }
+ if (!array_key_exists('pre-migration', $array['repair-steps'])) {
+ $array['repair-steps']['pre-migration'] = [];
+ }
+ if (!array_key_exists('post-migration', $array['repair-steps'])) {
+ $array['repair-steps']['post-migration'] = [];
}
if (array_key_exists('documentation', $array) && is_array($array['documentation'])) {
foreach ($array['documentation'] as $key => $url) {
// If it is not an absolute URL we assume it is a key
// i.e. admin-ldap will get converted to go.php?to=admin-ldap
- if (!$this->httpHelper->isHTTPURL($url)) {
+ if (!$this->isHTTPURL($url)) {
$url = $this->urlGenerator->linkToDocs($url);
}
@@ -100,10 +101,15 @@ class InfoParser {
}
}
} else {
- $array['types'] = array();
+ $array['types'] = [];
}
}
-
+ if (isset($array['repair-steps']['pre-migration']['step']) && is_array($array['repair-steps']['pre-migration']['step'])) {
+ $array['repair-steps']['pre-migration'] = $array['repair-steps']['pre-migration']['step'];
+ }
+ if (isset($array['repair-steps']['post-migration']['step']) && is_array($array['repair-steps']['post-migration']['step'])) {
+ $array['repair-steps']['post-migration'] = $array['repair-steps']['post-migration']['step'];
+ }
return $array;
}
@@ -116,7 +122,7 @@ class InfoParser {
return (string)$xml;
}
- $array = array();
+ $array = [];
foreach ($xml->children() as $element => $node) {
$totalElement = count($xml->{$element});
@@ -129,9 +135,9 @@ class InfoParser {
// Has attributes
if ($attributes = $node->attributes()) {
- $data = array(
- '@attributes' => array(),
- );
+ $data = [
+ '@attributes' => [],
+ ];
if (!count($node->children())){
$value = (string)$node;
if (!empty($value)) {
@@ -161,4 +167,8 @@ class InfoParser {
return $array;
}
+
+ private function isHTTPURL($url) {
+ return stripos($url, 'https://') === 0 || stripos($url, 'http://') === 0;
+ }
}
diff --git a/lib/private/app/platform.php b/lib/private/App/Platform.php
index 1d4c3767121..1d4c3767121 100644
--- a/lib/private/app/platform.php
+++ b/lib/private/App/Platform.php
diff --git a/lib/private/app/platformrepository.php b/lib/private/App/PlatformRepository.php
index 7363b2a44b1..7363b2a44b1 100644
--- a/lib/private/app/platformrepository.php
+++ b/lib/private/App/PlatformRepository.php
diff --git a/lib/private/appframework/app.php b/lib/private/AppFramework/App.php
index 376a8559454..376a8559454 100644
--- a/lib/private/appframework/app.php
+++ b/lib/private/AppFramework/App.php
diff --git a/lib/private/appframework/core/api.php b/lib/private/AppFramework/Core/API.php
index 67b696948f0..67b696948f0 100644
--- a/lib/private/appframework/core/api.php
+++ b/lib/private/AppFramework/Core/API.php
diff --git a/lib/private/appframework/db/db.php b/lib/private/AppFramework/Db/Db.php
index 0d17d7bc225..0d17d7bc225 100644
--- a/lib/private/appframework/db/db.php
+++ b/lib/private/AppFramework/Db/Db.php
diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index f74fe4aeb99..2951ee536d2 100644
--- a/lib/private/appframework/dependencyinjection/dicontainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -175,6 +175,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return $this->getServer()->getMimeTypeDetector();
});
+ $this->registerService('OCP\\Mail\\IMailer', function() {
+ return $this->getServer()->getMailer();
+ });
+
$this->registerService('OCP\\INavigationManager', function($c) {
return $this->getServer()->getNavigationManager();
});
diff --git a/lib/private/appframework/http.php b/lib/private/AppFramework/Http.php
index a99f7ea437f..a99f7ea437f 100644
--- a/lib/private/appframework/http.php
+++ b/lib/private/AppFramework/Http.php
diff --git a/lib/private/appframework/http/dispatcher.php b/lib/private/AppFramework/Http/Dispatcher.php
index 641339c0d94..641339c0d94 100644
--- a/lib/private/appframework/http/dispatcher.php
+++ b/lib/private/AppFramework/Http/Dispatcher.php
diff --git a/lib/private/appframework/http/output.php b/lib/private/AppFramework/Http/Output.php
index 469c809c21c..469c809c21c 100644
--- a/lib/private/appframework/http/output.php
+++ b/lib/private/AppFramework/Http/Output.php
diff --git a/lib/private/appframework/http/request.php b/lib/private/AppFramework/Http/Request.php
index c8525d1d141..7cd8cedcfdd 100644
--- a/lib/private/appframework/http/request.php
+++ b/lib/private/AppFramework/Http/Request.php
@@ -368,7 +368,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
/**
* Shortcut for getting cookie variables
* @param string $key the key that will be taken from the $_COOKIE array
- * @return array the value in the $_COOKIE element
+ * @return string the value in the $_COOKIE element
*/
public function getCookie($key) {
return isset($this->cookies[$key]) ? $this->cookies[$key] : null;
diff --git a/lib/private/appframework/middleware/middlewaredispatcher.php b/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
index 4bd25f79bba..4bd25f79bba 100644
--- a/lib/private/appframework/middleware/middlewaredispatcher.php
+++ b/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
diff --git a/lib/private/appframework/middleware/security/corsmiddleware.php b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php
index 258119b326a..258119b326a 100644
--- a/lib/private/appframework/middleware/security/corsmiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/CORSMiddleware.php
diff --git a/lib/private/appframework/middleware/security/exceptions/appnotenabledexception.php b/lib/private/AppFramework/Middleware/Security/Exceptions/AppNotEnabledException.php
index 59e247f3307..ce2d68054f2 100644
--- a/lib/private/appframework/middleware/security/exceptions/appnotenabledexception.php
+++ b/lib/private/AppFramework/Middleware/Security/Exceptions/AppNotEnabledException.php
@@ -21,7 +21,7 @@
*
*/
-namespace OC\Appframework\Middleware\Security\Exceptions;
+namespace OC\AppFramework\Middleware\Security\Exceptions;
use OCP\AppFramework\Http;
@@ -29,7 +29,7 @@ use OCP\AppFramework\Http;
* Class AppNotEnabledException is thrown when a resource for an application is
* requested that is not enabled.
*
- * @package OC\Appframework\Middleware\Security\Exceptions
+ * @package OC\AppFramework\Middleware\Security\Exceptions
*/
class AppNotEnabledException extends SecurityException {
public function __construct() {
diff --git a/lib/private/appframework/middleware/security/exceptions/crosssiterequestforgeryexception.php b/lib/private/AppFramework/Middleware/Security/Exceptions/CrossSiteRequestForgeryException.php
index 0eeb81730d4..251906bfca9 100644
--- a/lib/private/appframework/middleware/security/exceptions/crosssiterequestforgeryexception.php
+++ b/lib/private/AppFramework/Middleware/Security/Exceptions/CrossSiteRequestForgeryException.php
@@ -21,7 +21,7 @@
*
*/
-namespace OC\Appframework\Middleware\Security\Exceptions;
+namespace OC\AppFramework\Middleware\Security\Exceptions;
use OCP\AppFramework\Http;
@@ -29,7 +29,7 @@ use OCP\AppFramework\Http;
* Class CrossSiteRequestForgeryException is thrown when a CSRF exception has
* been encountered.
*
- * @package OC\Appframework\Middleware\Security\Exceptions
+ * @package OC\AppFramework\Middleware\Security\Exceptions
*/
class CrossSiteRequestForgeryException extends SecurityException {
public function __construct() {
diff --git a/lib/private/appframework/middleware/security/exceptions/notadminexception.php b/lib/private/AppFramework/Middleware/Security/Exceptions/NotAdminException.php
index be0f2f9d2a9..2a9fafa9f73 100644
--- a/lib/private/appframework/middleware/security/exceptions/notadminexception.php
+++ b/lib/private/AppFramework/Middleware/Security/Exceptions/NotAdminException.php
@@ -21,7 +21,7 @@
*
*/
-namespace OC\Appframework\Middleware\Security\Exceptions;
+namespace OC\AppFramework\Middleware\Security\Exceptions;
use OCP\AppFramework\Http;
@@ -29,7 +29,7 @@ use OCP\AppFramework\Http;
* Class NotAdminException is thrown when a resource has been requested by a
* non-admin user that is not accessible to non-admin users.
*
- * @package OC\Appframework\Middleware\Security\Exceptions
+ * @package OC\AppFramework\Middleware\Security\Exceptions
*/
class NotAdminException extends SecurityException {
public function __construct() {
diff --git a/lib/private/appframework/middleware/security/exceptions/notloggedinexception.php b/lib/private/AppFramework/Middleware/Security/Exceptions/NotLoggedInException.php
index f5b2e032032..54e78dc5a5b 100644
--- a/lib/private/appframework/middleware/security/exceptions/notloggedinexception.php
+++ b/lib/private/AppFramework/Middleware/Security/Exceptions/NotLoggedInException.php
@@ -21,7 +21,7 @@
*
*/
-namespace OC\Appframework\Middleware\Security\Exceptions;
+namespace OC\AppFramework\Middleware\Security\Exceptions;
use OCP\AppFramework\Http;
@@ -29,7 +29,7 @@ use OCP\AppFramework\Http;
* Class NotLoggedInException is thrown when a resource has been requested by a
* guest user that is not accessible to the public.
*
- * @package OC\Appframework\Middleware\Security\Exceptions
+ * @package OC\AppFramework\Middleware\Security\Exceptions
*/
class NotLoggedInException extends SecurityException {
public function __construct() {
diff --git a/lib/private/appframework/middleware/security/exceptions/securityexception.php b/lib/private/AppFramework/Middleware/Security/Exceptions/SecurityException.php
index c86614ec477..c86614ec477 100644
--- a/lib/private/appframework/middleware/security/exceptions/securityexception.php
+++ b/lib/private/AppFramework/Middleware/Security/Exceptions/SecurityException.php
diff --git a/lib/private/appframework/middleware/security/securitymiddleware.php b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
index 75bcc29a926..2c2f46a59f4 100644
--- a/lib/private/appframework/middleware/security/securitymiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
@@ -26,10 +26,10 @@
namespace OC\AppFramework\Middleware\Security;
-use OC\Appframework\Middleware\Security\Exceptions\AppNotEnabledException;
-use OC\Appframework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException;
-use OC\Appframework\Middleware\Security\Exceptions\NotAdminException;
-use OC\Appframework\Middleware\Security\Exceptions\NotLoggedInException;
+use OC\AppFramework\Middleware\Security\Exceptions\AppNotEnabledException;
+use OC\AppFramework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException;
+use OC\AppFramework\Middleware\Security\Exceptions\NotAdminException;
+use OC\AppFramework\Middleware\Security\Exceptions\NotLoggedInException;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OC\Security\CSP\ContentSecurityPolicyManager;
use OCP\AppFramework\Http\ContentSecurityPolicy;
@@ -192,9 +192,12 @@ class SecurityMiddleware extends Middleware {
);
} else {
if($exception instanceof NotLoggedInException) {
- // TODO: replace with link to route
- $url = $this->urlGenerator->getAbsoluteURL('index.php');
- $url .= '?redirect_url=' . urlencode($this->request->server['REQUEST_URI']);
+ $url = $this->urlGenerator->linkToRoute(
+ 'core.login.showLoginForm',
+ [
+ 'redirect_url' => urlencode($this->request->server['REQUEST_URI']),
+ ]
+ );
$response = new RedirectResponse($url);
} else {
$response = new TemplateResponse('core', '403', ['file' => $exception->getMessage()], 'guest');
diff --git a/lib/private/appframework/middleware/sessionmiddleware.php b/lib/private/AppFramework/Middleware/SessionMiddleware.php
index b218b48ea11..b218b48ea11 100644
--- a/lib/private/appframework/middleware/sessionmiddleware.php
+++ b/lib/private/AppFramework/Middleware/SessionMiddleware.php
diff --git a/lib/private/appframework/routing/routeactionhandler.php b/lib/private/AppFramework/Routing/RouteActionHandler.php
index b282fc1b452..e8a7b8a1c61 100644
--- a/lib/private/appframework/routing/routeactionhandler.php
+++ b/lib/private/AppFramework/Routing/RouteActionHandler.php
@@ -21,7 +21,7 @@
*
*/
-namespace OC\AppFramework\routing;
+namespace OC\AppFramework\Routing;
use \OC\AppFramework\App;
use \OC\AppFramework\DependencyInjection\DIContainer;
diff --git a/lib/private/appframework/routing/routeconfig.php b/lib/private/AppFramework/Routing/RouteConfig.php
index dd029ba9a00..f2ec5c0c881 100644
--- a/lib/private/appframework/routing/routeconfig.php
+++ b/lib/private/AppFramework/Routing/RouteConfig.php
@@ -24,7 +24,7 @@
*
*/
-namespace OC\AppFramework\routing;
+namespace OC\AppFramework\Routing;
use OC\AppFramework\DependencyInjection\DIContainer;
use OCP\Route\IRouter;
diff --git a/lib/private/appframework/utility/controllermethodreflector.php b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
index de83749fbaf..de83749fbaf 100644
--- a/lib/private/appframework/utility/controllermethodreflector.php
+++ b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
diff --git a/lib/private/appframework/utility/simplecontainer.php b/lib/private/AppFramework/Utility/SimpleContainer.php
index 78ded39735e..78ded39735e 100644
--- a/lib/private/appframework/utility/simplecontainer.php
+++ b/lib/private/AppFramework/Utility/SimpleContainer.php
diff --git a/lib/private/appframework/utility/timefactory.php b/lib/private/AppFramework/Utility/TimeFactory.php
index 5241b367069..5241b367069 100644
--- a/lib/private/appframework/utility/timefactory.php
+++ b/lib/private/AppFramework/Utility/TimeFactory.php
diff --git a/lib/private/backgroundjob/job.php b/lib/private/BackgroundJob/Job.php
index e7268894848..e7268894848 100644
--- a/lib/private/backgroundjob/job.php
+++ b/lib/private/BackgroundJob/Job.php
diff --git a/lib/private/backgroundjob/joblist.php b/lib/private/BackgroundJob/JobList.php
index b8230fca4de..2429b830446 100644
--- a/lib/private/backgroundjob/joblist.php
+++ b/lib/private/BackgroundJob/JobList.php
@@ -172,8 +172,8 @@ class JobList implements IJobList {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from('jobs')
- ->where($query->expr()->gt('id', $query->createNamedParameter($lastId, IQueryBuilder::PARAM_INT)))
- ->orderBy('id', 'ASC')
+ ->where($query->expr()->lt('id', $query->createNamedParameter($lastId, IQueryBuilder::PARAM_INT)))
+ ->orderBy('id', 'DESC')
->setMaxResults(1);
$result = $query->execute();
$row = $result->fetch();
@@ -187,7 +187,7 @@ class JobList implements IJobList {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from('jobs')
- ->orderBy('id', 'ASC')
+ ->orderBy('id', 'DESC')
->setMaxResults(1);
$result = $query->execute();
$row = $result->fetch();
diff --git a/lib/private/backgroundjob/legacy/queuedjob.php b/lib/private/BackgroundJob/Legacy/QueuedJob.php
index 983c06fe551..983c06fe551 100644
--- a/lib/private/backgroundjob/legacy/queuedjob.php
+++ b/lib/private/BackgroundJob/Legacy/QueuedJob.php
diff --git a/lib/private/backgroundjob/legacy/regularjob.php b/lib/private/BackgroundJob/Legacy/RegularJob.php
index aedd6ef657a..aedd6ef657a 100644
--- a/lib/private/backgroundjob/legacy/regularjob.php
+++ b/lib/private/BackgroundJob/Legacy/RegularJob.php
diff --git a/lib/private/backgroundjob/queuedjob.php b/lib/private/BackgroundJob/QueuedJob.php
index bf34db7cc02..bf34db7cc02 100644
--- a/lib/private/backgroundjob/queuedjob.php
+++ b/lib/private/BackgroundJob/QueuedJob.php
diff --git a/lib/private/backgroundjob/timedjob.php b/lib/private/BackgroundJob/TimedJob.php
index abf487a89e1..abf487a89e1 100644
--- a/lib/private/backgroundjob/timedjob.php
+++ b/lib/private/BackgroundJob/TimedJob.php
diff --git a/lib/private/cache/cappedmemorycache.php b/lib/private/Cache/CappedMemoryCache.php
index e3efbf76a23..e3efbf76a23 100644
--- a/lib/private/cache/cappedmemorycache.php
+++ b/lib/private/Cache/CappedMemoryCache.php
diff --git a/lib/private/cache/file.php b/lib/private/Cache/File.php
index 989e05275b7..989e05275b7 100644
--- a/lib/private/cache/file.php
+++ b/lib/private/Cache/File.php
diff --git a/lib/private/command/asyncbus.php b/lib/private/Command/AsyncBus.php
index eb692f9a8fb..eb692f9a8fb 100644
--- a/lib/private/command/asyncbus.php
+++ b/lib/private/Command/AsyncBus.php
diff --git a/lib/private/command/callablejob.php b/lib/private/Command/CallableJob.php
index acfeb83d606..acfeb83d606 100644
--- a/lib/private/command/callablejob.php
+++ b/lib/private/Command/CallableJob.php
diff --git a/lib/private/command/closurejob.php b/lib/private/Command/ClosureJob.php
index be2b5f0a4ba..be2b5f0a4ba 100644
--- a/lib/private/command/closurejob.php
+++ b/lib/private/Command/ClosureJob.php
diff --git a/lib/private/command/commandjob.php b/lib/private/Command/CommandJob.php
index 5d613c0305b..5d613c0305b 100644
--- a/lib/private/command/commandjob.php
+++ b/lib/private/Command/CommandJob.php
diff --git a/lib/private/command/fileaccess.php b/lib/private/Command/FileAccess.php
index 6fe3e111aef..6fe3e111aef 100644
--- a/lib/private/command/fileaccess.php
+++ b/lib/private/Command/FileAccess.php
diff --git a/lib/private/command/queuebus.php b/lib/private/Command/QueueBus.php
index be4ee589e6f..be4ee589e6f 100644
--- a/lib/private/command/queuebus.php
+++ b/lib/private/Command/QueueBus.php
diff --git a/lib/private/comments/comment.php b/lib/private/Comments/Comment.php
index 60663d61578..60663d61578 100644
--- a/lib/private/comments/comment.php
+++ b/lib/private/Comments/Comment.php
diff --git a/lib/private/comments/manager.php b/lib/private/Comments/Manager.php
index b986c8c51f9..b986c8c51f9 100644
--- a/lib/private/comments/manager.php
+++ b/lib/private/Comments/Manager.php
diff --git a/lib/private/comments/managerfactory.php b/lib/private/Comments/ManagerFactory.php
index 044463d1e96..044463d1e96 100644
--- a/lib/private/comments/managerfactory.php
+++ b/lib/private/Comments/ManagerFactory.php
diff --git a/lib/private/console/application.php b/lib/private/Console/Application.php
index 7f12db4eca6..7f12db4eca6 100644
--- a/lib/private/console/application.php
+++ b/lib/private/Console/Application.php
diff --git a/lib/private/console/timestampformatter.php b/lib/private/Console/TimestampFormatter.php
index 3beac5e2f9f..3beac5e2f9f 100644
--- a/lib/private/console/timestampformatter.php
+++ b/lib/private/Console/TimestampFormatter.php
diff --git a/lib/private/db/adapter.php b/lib/private/DB/Adapter.php
index 9522f768c88..9522f768c88 100644
--- a/lib/private/db/adapter.php
+++ b/lib/private/DB/Adapter.php
diff --git a/lib/private/db/adaptermysql.php b/lib/private/DB/AdapterMySQL.php
index ab87c589747..ab87c589747 100644
--- a/lib/private/db/adaptermysql.php
+++ b/lib/private/DB/AdapterMySQL.php
diff --git a/lib/private/db/adapteroci8.php b/lib/private/DB/AdapterOCI8.php
index 970d3eefa4d..970d3eefa4d 100644
--- a/lib/private/db/adapteroci8.php
+++ b/lib/private/DB/AdapterOCI8.php
diff --git a/lib/private/db/adapterpgsql.php b/lib/private/DB/AdapterPgSql.php
index a7d9377a0bf..a7d9377a0bf 100644
--- a/lib/private/db/adapterpgsql.php
+++ b/lib/private/DB/AdapterPgSql.php
diff --git a/lib/private/db/adaptersqlite.php b/lib/private/DB/AdapterSqlite.php
index d7769238abc..3466e0e1aac 100644
--- a/lib/private/db/adaptersqlite.php
+++ b/lib/private/DB/AdapterSqlite.php
@@ -32,6 +32,7 @@ class AdapterSqlite extends Adapter {
$statement = preg_replace('/`(\w+)` ILIKE \?/', 'LOWER($1) LIKE LOWER(?)', $statement);
$statement = str_replace( '`', '"', $statement );
$statement = str_ireplace( 'NOW()', 'datetime(\'now\')', $statement );
+ $statement = str_ireplace('GREATEST(', 'MAX(', $statement);
$statement = str_ireplace( 'UNIX_TIMESTAMP()', 'strftime(\'%s\',\'now\')', $statement );
return $statement;
}
diff --git a/lib/private/db/connection.php b/lib/private/DB/Connection.php
index 7904fab0726..7904fab0726 100644
--- a/lib/private/db/connection.php
+++ b/lib/private/DB/Connection.php
diff --git a/lib/private/db/connectionfactory.php b/lib/private/DB/ConnectionFactory.php
index 0856d8d19c0..0856d8d19c0 100644
--- a/lib/private/db/connectionfactory.php
+++ b/lib/private/DB/ConnectionFactory.php
diff --git a/lib/private/db/mdb2schemamanager.php b/lib/private/DB/MDB2SchemaManager.php
index f73f6b4351a..f73f6b4351a 100644
--- a/lib/private/db/mdb2schemamanager.php
+++ b/lib/private/DB/MDB2SchemaManager.php
diff --git a/lib/private/db/mdb2schemareader.php b/lib/private/DB/MDB2SchemaReader.php
index 375fec185cb..375fec185cb 100644
--- a/lib/private/db/mdb2schemareader.php
+++ b/lib/private/DB/MDB2SchemaReader.php
diff --git a/lib/private/db/mdb2schemawriter.php b/lib/private/DB/MDB2SchemaWriter.php
index 7dc3bd223a7..7dc3bd223a7 100644
--- a/lib/private/db/mdb2schemawriter.php
+++ b/lib/private/DB/MDB2SchemaWriter.php
diff --git a/lib/private/db/migrationexception.php b/lib/private/DB/MigrationException.php
index 57e4c5b8334..57e4c5b8334 100644
--- a/lib/private/db/migrationexception.php
+++ b/lib/private/DB/MigrationException.php
diff --git a/lib/private/db/migrator.php b/lib/private/DB/Migrator.php
index 8b8a34d9865..8b8a34d9865 100644
--- a/lib/private/db/migrator.php
+++ b/lib/private/DB/Migrator.php
diff --git a/lib/private/db/mysqlmigrator.php b/lib/private/DB/MySQLMigrator.php
index 1b3f70a817d..1b3f70a817d 100644
--- a/lib/private/db/mysqlmigrator.php
+++ b/lib/private/DB/MySQLMigrator.php
diff --git a/lib/private/db/nocheckmigrator.php b/lib/private/DB/NoCheckMigrator.php
index 23afae11816..23afae11816 100644
--- a/lib/private/db/nocheckmigrator.php
+++ b/lib/private/DB/NoCheckMigrator.php
diff --git a/lib/private/db/ocsqliteplatform.php b/lib/private/DB/OCSqlitePlatform.php
index fe68bc3cc91..fe68bc3cc91 100644
--- a/lib/private/db/ocsqliteplatform.php
+++ b/lib/private/DB/OCSqlitePlatform.php
diff --git a/lib/private/db/oracleconnection.php b/lib/private/DB/OracleConnection.php
index a95f37a8e6c..a95f37a8e6c 100644
--- a/lib/private/db/oracleconnection.php
+++ b/lib/private/DB/OracleConnection.php
diff --git a/lib/private/db/oraclemigrator.php b/lib/private/DB/OracleMigrator.php
index ceb89cf64d4..ceb89cf64d4 100644
--- a/lib/private/db/oraclemigrator.php
+++ b/lib/private/DB/OracleMigrator.php
diff --git a/lib/private/db/pgsqltools.php b/lib/private/DB/PgSqlTools.php
index e9e507551e6..e9e507551e6 100644
--- a/lib/private/db/pgsqltools.php
+++ b/lib/private/DB/PgSqlTools.php
diff --git a/lib/private/db/querybuilder/compositeexpression.php b/lib/private/DB/QueryBuilder/CompositeExpression.php
index 927dfe38378..927dfe38378 100644
--- a/lib/private/db/querybuilder/compositeexpression.php
+++ b/lib/private/DB/QueryBuilder/CompositeExpression.php
diff --git a/lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
index ce98816c42d..ce98816c42d 100644
--- a/lib/private/db/querybuilder/expressionbuilder/expressionbuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
diff --git a/lib/private/db/querybuilder/expressionbuilder/mysqlexpressionbuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php
index 0d34787d26a..0d34787d26a 100644
--- a/lib/private/db/querybuilder/expressionbuilder/mysqlexpressionbuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php
diff --git a/lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php
index 5d615ae52e8..5d615ae52e8 100644
--- a/lib/private/db/querybuilder/expressionbuilder/ociexpressionbuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php
diff --git a/lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php
index a8f1af87a45..a8f1af87a45 100644
--- a/lib/private/db/querybuilder/expressionbuilder/pgsqlexpressionbuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/PgSqlExpressionBuilder.php
diff --git a/lib/private/db/querybuilder/literal.php b/lib/private/DB/QueryBuilder/Literal.php
index 0cc96ab48b4..0cc96ab48b4 100644
--- a/lib/private/db/querybuilder/literal.php
+++ b/lib/private/DB/QueryBuilder/Literal.php
diff --git a/lib/private/db/querybuilder/parameter.php b/lib/private/DB/QueryBuilder/Parameter.php
index 1c233c83f1d..1c233c83f1d 100644
--- a/lib/private/db/querybuilder/parameter.php
+++ b/lib/private/DB/QueryBuilder/Parameter.php
diff --git a/lib/private/db/querybuilder/querybuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php
index bb463e43a75..bb463e43a75 100644
--- a/lib/private/db/querybuilder/querybuilder.php
+++ b/lib/private/DB/QueryBuilder/QueryBuilder.php
diff --git a/lib/private/db/querybuilder/queryfunction.php b/lib/private/DB/QueryBuilder/QueryFunction.php
index ac6d73f3cbf..ac6d73f3cbf 100644
--- a/lib/private/db/querybuilder/queryfunction.php
+++ b/lib/private/DB/QueryBuilder/QueryFunction.php
diff --git a/lib/private/db/querybuilder/quotehelper.php b/lib/private/DB/QueryBuilder/QuoteHelper.php
index fda243a3786..fda243a3786 100644
--- a/lib/private/db/querybuilder/quotehelper.php
+++ b/lib/private/DB/QueryBuilder/QuoteHelper.php
diff --git a/lib/private/db/sqlitemigrator.php b/lib/private/DB/SQLiteMigrator.php
index 8ea32581011..8ea32581011 100644
--- a/lib/private/db/sqlitemigrator.php
+++ b/lib/private/DB/SQLiteMigrator.php
diff --git a/lib/private/db/sqlitesessioninit.php b/lib/private/DB/SQLiteSessionInit.php
index 0683c47d08e..0683c47d08e 100644
--- a/lib/private/db/sqlitesessioninit.php
+++ b/lib/private/DB/SQLiteSessionInit.php
diff --git a/lib/private/diagnostics/event.php b/lib/private/Diagnostics/Event.php
index 8b5bb7e3bd8..8b5bb7e3bd8 100644
--- a/lib/private/diagnostics/event.php
+++ b/lib/private/Diagnostics/Event.php
diff --git a/lib/private/diagnostics/eventlogger.php b/lib/private/Diagnostics/EventLogger.php
index 3d909ce79cd..3d909ce79cd 100644
--- a/lib/private/diagnostics/eventlogger.php
+++ b/lib/private/Diagnostics/EventLogger.php
diff --git a/lib/private/diagnostics/nulleventlogger.php b/lib/private/Diagnostics/NullEventLogger.php
index 1b5e7af3ac9..1b5e7af3ac9 100644
--- a/lib/private/diagnostics/nulleventlogger.php
+++ b/lib/private/Diagnostics/NullEventLogger.php
diff --git a/lib/private/diagnostics/nullquerylogger.php b/lib/private/Diagnostics/NullQueryLogger.php
index 98ddef2e783..98ddef2e783 100644
--- a/lib/private/diagnostics/nullquerylogger.php
+++ b/lib/private/Diagnostics/NullQueryLogger.php
diff --git a/lib/private/diagnostics/query.php b/lib/private/Diagnostics/Query.php
index 567bc83ed4b..567bc83ed4b 100644
--- a/lib/private/diagnostics/query.php
+++ b/lib/private/Diagnostics/Query.php
diff --git a/lib/private/diagnostics/querylogger.php b/lib/private/Diagnostics/QueryLogger.php
index 66a65b71d04..66a65b71d04 100644
--- a/lib/private/diagnostics/querylogger.php
+++ b/lib/private/Diagnostics/QueryLogger.php
diff --git a/lib/private/encryption/decryptall.php b/lib/private/Encryption/DecryptAll.php
index 7a965a5f227..7a965a5f227 100644
--- a/lib/private/encryption/decryptall.php
+++ b/lib/private/Encryption/DecryptAll.php
diff --git a/lib/private/encryption/encryptionwrapper.php b/lib/private/Encryption/EncryptionWrapper.php
index 11beb0cd6b1..11beb0cd6b1 100644
--- a/lib/private/encryption/encryptionwrapper.php
+++ b/lib/private/Encryption/EncryptionWrapper.php
diff --git a/lib/private/encryption/exceptions/decryptionfailedexception.php b/lib/private/Encryption/Exceptions/DecryptionFailedException.php
index a0cbbc5cce0..a0cbbc5cce0 100644
--- a/lib/private/encryption/exceptions/decryptionfailedexception.php
+++ b/lib/private/Encryption/Exceptions/DecryptionFailedException.php
diff --git a/lib/private/encryption/exceptions/emptyencryptiondataexception.php b/lib/private/Encryption/Exceptions/EmptyEncryptionDataException.php
index 2c90c2db7df..2c90c2db7df 100644
--- a/lib/private/encryption/exceptions/emptyencryptiondataexception.php
+++ b/lib/private/Encryption/Exceptions/EmptyEncryptionDataException.php
diff --git a/lib/private/encryption/exceptions/encryptionfailedexception.php b/lib/private/Encryption/Exceptions/EncryptionFailedException.php
index 98e92eb199c..98e92eb199c 100644
--- a/lib/private/encryption/exceptions/encryptionfailedexception.php
+++ b/lib/private/Encryption/Exceptions/EncryptionFailedException.php
diff --git a/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php b/lib/private/Encryption/Exceptions/EncryptionHeaderKeyExistsException.php
index ab1a166018c..ab1a166018c 100644
--- a/lib/private/encryption/exceptions/encryptionheaderkeyexistsexception.php
+++ b/lib/private/Encryption/Exceptions/EncryptionHeaderKeyExistsException.php
diff --git a/lib/private/encryption/exceptions/encryptionheadertolargeexception.php b/lib/private/Encryption/Exceptions/EncryptionHeaderToLargeException.php
index 7b706e621de..7b706e621de 100644
--- a/lib/private/encryption/exceptions/encryptionheadertolargeexception.php
+++ b/lib/private/Encryption/Exceptions/EncryptionHeaderToLargeException.php
diff --git a/lib/private/encryption/exceptions/modulealreadyexistsexception.php b/lib/private/Encryption/Exceptions/ModuleAlreadyExistsException.php
index fcd08679acc..fcd08679acc 100644
--- a/lib/private/encryption/exceptions/modulealreadyexistsexception.php
+++ b/lib/private/Encryption/Exceptions/ModuleAlreadyExistsException.php
diff --git a/lib/private/encryption/exceptions/moduledoesnotexistsexception.php b/lib/private/Encryption/Exceptions/ModuleDoesNotExistsException.php
index 282c9ec080b..282c9ec080b 100644
--- a/lib/private/encryption/exceptions/moduledoesnotexistsexception.php
+++ b/lib/private/Encryption/Exceptions/ModuleDoesNotExistsException.php
diff --git a/lib/private/encryption/exceptions/unknowncipherexception.php b/lib/private/Encryption/Exceptions/UnknownCipherException.php
index beb4cb7f2e5..beb4cb7f2e5 100644
--- a/lib/private/encryption/exceptions/unknowncipherexception.php
+++ b/lib/private/Encryption/Exceptions/UnknownCipherException.php
diff --git a/lib/private/encryption/file.php b/lib/private/Encryption/File.php
index ec55c2cea00..ec55c2cea00 100644
--- a/lib/private/encryption/file.php
+++ b/lib/private/Encryption/File.php
diff --git a/lib/private/encryption/hookmanager.php b/lib/private/Encryption/HookManager.php
index 0bc42ec8159..0bc42ec8159 100644
--- a/lib/private/encryption/hookmanager.php
+++ b/lib/private/Encryption/HookManager.php
diff --git a/lib/private/encryption/keys/storage.php b/lib/private/Encryption/Keys/Storage.php
index 47360f45aa5..47360f45aa5 100644
--- a/lib/private/encryption/keys/storage.php
+++ b/lib/private/Encryption/Keys/Storage.php
diff --git a/lib/private/encryption/manager.php b/lib/private/Encryption/Manager.php
index d45bbf07ee9..8714d161807 100644
--- a/lib/private/encryption/manager.php
+++ b/lib/private/Encryption/Manager.php
@@ -117,6 +117,25 @@ class Manager implements IManager {
}
/**
+ * @param string $user
+ */
+ public function isReadyForUser($user) {
+ if (!$this->isReady()) {
+ return false;
+ }
+
+ foreach ($this->getEncryptionModules() as $module) {
+ /** @var IEncryptionModule $m */
+ $m = call_user_func($module['callback']);
+ if (!$m->isReadyForUser($user)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
* Registers an callback function which must return an encryption module instance
*
* @param string $id
diff --git a/lib/private/encryption/update.php b/lib/private/Encryption/Update.php
index 62c23c1fe0c..62c23c1fe0c 100644
--- a/lib/private/encryption/update.php
+++ b/lib/private/Encryption/Update.php
diff --git a/lib/private/encryption/util.php b/lib/private/Encryption/Util.php
index 9e0cfca830d..9e0cfca830d 100644
--- a/lib/private/encryption/util.php
+++ b/lib/private/Encryption/Util.php
diff --git a/lib/private/files/cache/cache.php b/lib/private/Files/Cache/Cache.php
index 53467c278d2..53467c278d2 100644
--- a/lib/private/files/cache/cache.php
+++ b/lib/private/Files/Cache/Cache.php
diff --git a/lib/private/files/cache/cacheentry.php b/lib/private/Files/Cache/CacheEntry.php
index 6d3c5d5b089..6d3c5d5b089 100644
--- a/lib/private/files/cache/cacheentry.php
+++ b/lib/private/Files/Cache/CacheEntry.php
diff --git a/lib/private/files/cache/failedcache.php b/lib/private/Files/Cache/FailedCache.php
index 0386ba3ca32..0386ba3ca32 100644
--- a/lib/private/files/cache/failedcache.php
+++ b/lib/private/Files/Cache/FailedCache.php
diff --git a/lib/private/files/cache/homecache.php b/lib/private/Files/Cache/HomeCache.php
index ae92504ddd6..ae92504ddd6 100644
--- a/lib/private/files/cache/homecache.php
+++ b/lib/private/Files/Cache/HomeCache.php
diff --git a/lib/private/files/cache/homepropagator.php b/lib/private/Files/Cache/HomePropagator.php
index 8edca9c0c87..db9e30ae0fc 100644
--- a/lib/private/files/cache/homepropagator.php
+++ b/lib/private/Files/Cache/HomePropagator.php
@@ -21,14 +21,16 @@
namespace OC\Files\Cache;
+use OCP\IDBConnection;
+
class HomePropagator extends Propagator {
private $ignoredBaseFolders;
/**
* @param \OC\Files\Storage\Storage $storage
*/
- public function __construct(\OC\Files\Storage\Storage $storage) {
- parent::__construct($storage);
+ public function __construct(\OC\Files\Storage\Storage $storage, IDBConnection $connection) {
+ parent::__construct($storage, $connection);
$this->ignoredBaseFolders = ['files_encryption'];
}
@@ -37,14 +39,13 @@ class HomePropagator extends Propagator {
* @param string $internalPath
* @param int $time
* @param int $sizeDifference number of bytes the file has grown
- * @return array[] all propagated entries
*/
public function propagateChange($internalPath, $time, $sizeDifference = 0) {
list($baseFolder) = explode('/', $internalPath, 2);
if (in_array($baseFolder, $this->ignoredBaseFolders)) {
return [];
} else {
- return parent::propagateChange($internalPath, $time, $sizeDifference);
+ parent::propagateChange($internalPath, $time, $sizeDifference);
}
}
}
diff --git a/lib/private/files/cache/movefromcachetrait.php b/lib/private/Files/Cache/MoveFromCacheTrait.php
index 7d8ed7b5d21..7d8ed7b5d21 100644
--- a/lib/private/files/cache/movefromcachetrait.php
+++ b/lib/private/Files/Cache/MoveFromCacheTrait.php
diff --git a/lib/private/Files/Cache/Propagator.php b/lib/private/Files/Cache/Propagator.php
new file mode 100644
index 00000000000..b998c6bcfae
--- /dev/null
+++ b/lib/private/Files/Cache/Propagator.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Files\Cache;
+
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\Files\Cache\IPropagator;
+use OCP\IDBConnection;
+
+/**
+ * Propagate etags and mtimes within the storage
+ */
+class Propagator implements IPropagator {
+ /**
+ * @var \OC\Files\Storage\Storage
+ */
+ protected $storage;
+
+ /**
+ * @var IDBConnection
+ */
+ private $connection;
+
+ /**
+ * @param \OC\Files\Storage\Storage $storage
+ * @param IDBConnection $connection
+ */
+ public function __construct(\OC\Files\Storage\Storage $storage, IDBConnection $connection) {
+ $this->storage = $storage;
+ $this->connection = $connection;
+ }
+
+
+ /**
+ * @param string $internalPath
+ * @param int $time
+ * @param int $sizeDifference number of bytes the file has grown
+ */
+ public function propagateChange($internalPath, $time, $sizeDifference = 0) {
+ $storageId = (int)$this->storage->getStorageCache()->getNumericId();
+
+ $parents = $this->getParents($internalPath);
+
+ $parentHashes = array_map('md5', $parents);
+ $etag = uniqid(); // since we give all folders the same etag we don't ask the storage for the etag
+
+ $builder = $this->connection->getQueryBuilder();
+ $hashParams = array_map(function ($hash) use ($builder) {
+ return $builder->expr()->literal($hash);
+ }, $parentHashes);
+
+ $builder->update('filecache')
+ ->set('mtime', $builder->createFunction('GREATEST(`mtime`, ' . $builder->createNamedParameter($time) . ')'))
+ ->set('etag', $builder->createNamedParameter($etag, IQueryBuilder::PARAM_STR))
+ ->where($builder->expr()->eq('storage', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT)))
+ ->andWhere($builder->expr()->in('path_hash', $hashParams));
+
+ $builder->execute();
+
+ if ($sizeDifference !== 0) {
+ // we need to do size separably so we can ignore entries with uncalculated size
+ $builder = $this->connection->getQueryBuilder();
+ $builder->update('filecache')
+ ->set('size', $builder->createFunction('`size` + ' . $builder->createNamedParameter($sizeDifference)))
+ ->where($builder->expr()->eq('storage', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT)))
+ ->andWhere($builder->expr()->in('path_hash', $hashParams))
+ ->andWhere($builder->expr()->gt('size', $builder->expr()->literal(-1, IQueryBuilder::PARAM_INT)));
+ }
+
+ $builder->execute();
+ }
+
+ protected function getParents($path) {
+ $parts = explode('/', $path);
+ $parent = '';
+ $parents = [];
+ foreach ($parts as $part) {
+ $parents[] = $parent;
+ $parent = trim($parent . '/' . $part, '/');
+ }
+ return $parents;
+ }
+}
diff --git a/lib/private/files/cache/scanner.php b/lib/private/Files/Cache/Scanner.php
index 0a207de7b64..03aca1924b0 100644
--- a/lib/private/files/cache/scanner.php
+++ b/lib/private/Files/Cache/Scanner.php
@@ -195,6 +195,8 @@ class Scanner extends BasicEmitter implements IScanner {
$fileId = -1;
}
if (!empty($newData)) {
+ // Reset the checksum if the data has changed
+ $newData['checksum'] = '';
$data['fileid'] = $this->addToCache($file, $newData, $fileId);
}
if (isset($cacheData['size'])) {
@@ -203,6 +205,10 @@ class Scanner extends BasicEmitter implements IScanner {
$data['oldSize'] = 0;
}
+ if (isset($cacheData['encrypted'])) {
+ $data['encrypted'] = $cacheData['encrypted'];
+ }
+
// post-emit only if it was a file. By that we avoid counting/treating folders as files
if ($data['mimetype'] !== 'httpd/unix-directory') {
$this->emit('\OC\Files\Cache\Scanner', 'postScanFile', array($file, $this->storageId));
@@ -220,6 +226,9 @@ class Scanner extends BasicEmitter implements IScanner {
}
}
+ if ($data && !isset($data['encrypted'])) {
+ $data['encrypted'] = false;
+ }
return $data;
}
@@ -287,6 +296,7 @@ class Scanner extends BasicEmitter implements IScanner {
}
if ($lock) {
if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
+ $this->storage->acquireLock('scanner::' . $path, ILockingProvider::LOCK_EXCLUSIVE, $this->lockingProvider);
$this->storage->acquireLock($path, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
}
}
@@ -298,6 +308,7 @@ class Scanner extends BasicEmitter implements IScanner {
if ($lock) {
if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
$this->storage->releaseLock($path, ILockingProvider::LOCK_SHARED, $this->lockingProvider);
+ $this->storage->releaseLock('scanner::' . $path, ILockingProvider::LOCK_EXCLUSIVE, $this->lockingProvider);
}
}
return $data;
@@ -448,26 +459,38 @@ class Scanner extends BasicEmitter implements IScanner {
* walk over any folders that are not fully scanned yet and scan them
*/
public function backgroundScan() {
- $lastPath = null;
- while (($path = $this->cache->getIncomplete()) !== false && $path !== $lastPath) {
- try {
- $this->scan($path, self::SCAN_RECURSIVE, self::REUSE_ETAG);
- \OC_Hook::emit('Scanner', 'correctFolderSize', array('path' => $path));
- if ($this->cacheActive) {
- $this->cache->correctFolderSize($path);
- }
- } catch (\OCP\Files\StorageInvalidException $e) {
- // skip unavailable storages
- } catch (\OCP\Files\StorageNotAvailableException $e) {
- // skip unavailable storages
- } catch (\OCP\Files\ForbiddenException $e) {
- // skip forbidden storages
- } catch (\OCP\Lock\LockedException $e) {
- // skip unavailable storages
+ if (!$this->cache->inCache('')) {
+ $this->runBackgroundScanJob(function () {
+ $this->scan('', self::SCAN_RECURSIVE, self::REUSE_ETAG);
+ }, '');
+ } else {
+ $lastPath = null;
+ while (($path = $this->cache->getIncomplete()) !== false && $path !== $lastPath) {
+ $this->runBackgroundScanJob(function() use ($path) {
+ $this->scan($path, self::SCAN_RECURSIVE, self::REUSE_ETAG);
+ }, $path);
+ // FIXME: this won't proceed with the next item, needs revamping of getIncomplete()
+ // to make this possible
+ $lastPath = $path;
+ }
+ }
+ }
+
+ private function runBackgroundScanJob(callable $callback, $path) {
+ try {
+ $callback();
+ \OC_Hook::emit('Scanner', 'correctFolderSize', array('path' => $path));
+ if ($this->cacheActive && $this->cache instanceof Cache) {
+ $this->cache->correctFolderSize($path);
}
- // FIXME: this won't proceed with the next item, needs revamping of getIncomplete()
- // to make this possible
- $lastPath = $path;
+ } catch (\OCP\Files\StorageInvalidException $e) {
+ // skip unavailable storages
+ } catch (\OCP\Files\StorageNotAvailableException $e) {
+ // skip unavailable storages
+ } catch (\OCP\Files\ForbiddenException $e) {
+ // skip forbidden storages
+ } catch (\OCP\Lock\LockedException $e) {
+ // skip unavailable storages
}
}
diff --git a/lib/private/files/cache/storage.php b/lib/private/Files/Cache/Storage.php
index 90c451ecc21..90c451ecc21 100644
--- a/lib/private/files/cache/storage.php
+++ b/lib/private/Files/Cache/Storage.php
diff --git a/lib/private/files/cache/updater.php b/lib/private/Files/Cache/Updater.php
index 80ba704883e..9e4214ad72a 100644
--- a/lib/private/files/cache/updater.php
+++ b/lib/private/Files/Cache/Updater.php
@@ -118,12 +118,17 @@ class Updater implements IUpdater {
}
$data = $this->scanner->scan($path, Scanner::SCAN_SHALLOW, -1, false);
- if (isset($data['oldSize']) && isset($data['size'])) {
+ if (
+ isset($data['oldSize']) && isset($data['size']) &&
+ !$data['encrypted'] // encryption is a pita and touches the cache itself
+ ) {
$sizeDifference = $data['size'] - $data['oldSize'];
} else {
// scanner didn't provide size info, fallback to full size calculation
$sizeDifference = 0;
- $this->cache->correctFolderSize($path, $data);
+ if ($this->cache instanceof Cache) {
+ $this->cache->correctFolderSize($path, $data);
+ }
}
$this->correctParentStorageMtime($path);
$this->propagator->propagateChange($path, $time, $sizeDifference);
@@ -145,7 +150,9 @@ class Updater implements IUpdater {
}
$this->cache->remove($path);
- $this->cache->correctFolderSize($parent);
+ if ($this->cache instanceof Cache) {
+ $this->cache->correctFolderSize($parent);
+ }
$this->correctParentStorageMtime($path);
$this->propagator->propagateChange($path, time());
}
@@ -187,8 +194,12 @@ class Updater implements IUpdater {
$this->cache->update($fileId, ['mimetype' => $mimeType]);
}
- $sourceCache->correctFolderSize($source);
- $this->cache->correctFolderSize($target);
+ if ($sourceCache instanceof Cache) {
+ $sourceCache->correctFolderSize($source);
+ }
+ if ($this->cache instanceof Cache) {
+ $this->cache->correctFolderSize($target);
+ }
if ($sourceUpdater instanceof Updater) {
$sourceUpdater->correctParentStorageMtime($source);
}
diff --git a/lib/private/files/cache/watcher.php b/lib/private/Files/Cache/Watcher.php
index a00e875a2d4..0cf6caf0c28 100644
--- a/lib/private/files/cache/watcher.php
+++ b/lib/private/Files/Cache/Watcher.php
@@ -106,7 +106,9 @@ class Watcher implements IWatcher {
if ($cachedData['mimetype'] === 'httpd/unix-directory') {
$this->cleanFolder($path);
}
- $this->cache->correctFolderSize($path);
+ if ($this->cache instanceof Cache) {
+ $this->cache->correctFolderSize($path);
+ }
}
/**
diff --git a/lib/private/files/cache/wrapper/cachejail.php b/lib/private/Files/Cache/Wrapper/CacheJail.php
index 868e63cdf81..3148d1412f4 100644
--- a/lib/private/files/cache/wrapper/cachejail.php
+++ b/lib/private/Files/Cache/Wrapper/CacheJail.php
@@ -23,6 +23,7 @@
*/
namespace OC\Files\Cache\Wrapper;
+use OC\Files\Cache\Cache;
/**
* Jail to a subdirectory of the wrapped cache
@@ -233,7 +234,9 @@ class CacheJail extends CacheWrapper {
* @param array $data (optional) meta data of the folder
*/
public function correctFolderSize($path, $data = null) {
- $this->cache->correctFolderSize($this->getSourcePath($path), $data);
+ if ($this->cache instanceof Cache) {
+ $this->cache->correctFolderSize($this->getSourcePath($path), $data);
+ }
}
/**
@@ -244,7 +247,12 @@ class CacheJail extends CacheWrapper {
* @return int
*/
public function calculateFolderSize($path, $entry = null) {
- return $this->cache->calculateFolderSize($this->getSourcePath($path), $entry);
+ if ($this->cache instanceof Cache) {
+ return $this->cache->calculateFolderSize($this->getSourcePath($path), $entry);
+ } else {
+ return 0;
+ }
+
}
/**
@@ -281,4 +289,20 @@ class CacheJail extends CacheWrapper {
$path = $this->cache->getPathById($id);
return $this->getJailedPath($path);
}
+
+ /**
+ * Move a file or folder in the cache
+ *
+ * Note that this should make sure the entries are removed from the source cache
+ *
+ * @param \OCP\Files\Cache\ICache $sourceCache
+ * @param string $sourcePath
+ * @param string $targetPath
+ */
+ public function moveFromCache(\OCP\Files\Cache\ICache $sourceCache, $sourcePath, $targetPath) {
+ if ($sourceCache === $this) {
+ return $this->move($sourcePath, $targetPath);
+ }
+ return $this->cache->moveFromCache($sourceCache, $sourcePath, $targetPath);
+ }
}
diff --git a/lib/private/files/cache/wrapper/cachepermissionsmask.php b/lib/private/Files/Cache/Wrapper/CachePermissionsMask.php
index b3a7bcb3a73..b3a7bcb3a73 100644
--- a/lib/private/files/cache/wrapper/cachepermissionsmask.php
+++ b/lib/private/Files/Cache/Wrapper/CachePermissionsMask.php
diff --git a/lib/private/files/cache/wrapper/cachewrapper.php b/lib/private/Files/Cache/Wrapper/CacheWrapper.php
index 8c77e3c340e..a6e6e61b8c7 100644
--- a/lib/private/files/cache/wrapper/cachewrapper.php
+++ b/lib/private/Files/Cache/Wrapper/CacheWrapper.php
@@ -240,7 +240,9 @@ class CacheWrapper extends Cache {
* @param array $data (optional) meta data of the folder
*/
public function correctFolderSize($path, $data = null) {
- $this->cache->correctFolderSize($path, $data);
+ if ($this->cache instanceof Cache) {
+ $this->cache->correctFolderSize($path, $data);
+ }
}
/**
@@ -251,7 +253,11 @@ class CacheWrapper extends Cache {
* @return int
*/
public function calculateFolderSize($path, $entry = null) {
- return $this->cache->calculateFolderSize($path, $entry);
+ if ($this->cache instanceof Cache) {
+ return $this->cache->calculateFolderSize($path, $entry);
+ } else {
+ return 0;
+ }
}
/**
diff --git a/lib/private/files/config/cachedmountinfo.php b/lib/private/Files/Config/CachedMountInfo.php
index 2993c979a7f..ce75cb66896 100644
--- a/lib/private/files/config/cachedmountinfo.php
+++ b/lib/private/Files/Config/CachedMountInfo.php
@@ -30,22 +30,22 @@ class CachedMountInfo implements ICachedMountInfo {
/**
* @var IUser
*/
- private $user;
+ protected $user;
/**
* @var int
*/
- private $storageId;
+ protected $storageId;
/**
* @var int
*/
- private $rootId;
+ protected $rootId;
/**
* @var string
*/
- private $mountPoint;
+ protected $mountPoint;
/**
* CachedMountInfo constructor.
@@ -88,9 +88,9 @@ class CachedMountInfo implements ICachedMountInfo {
*/
public function getMountPointNode() {
// TODO injection etc
- Filesystem::initMountPoints($this->user->getUID());
- $userNode = \OC::$server->getUserFolder($this->user->getUID());
- $nodes = $userNode->getById($this->rootId);
+ Filesystem::initMountPoints($this->getUser()->getUID());
+ $userNode = \OC::$server->getUserFolder($this->getUser()->getUID());
+ $nodes = $userNode->getById($this->getRootId());
if (count($nodes) > 0) {
return $nodes[0];
} else {
diff --git a/lib/private/Files/Config/LazyStorageMountInfo.php b/lib/private/Files/Config/LazyStorageMountInfo.php
new file mode 100644
index 00000000000..654c5b2b23e
--- /dev/null
+++ b/lib/private/Files/Config/LazyStorageMountInfo.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Files\Config;
+
+use OC\Files\Filesystem;
+use OCP\Files\Config\ICachedMountInfo;
+use OCP\Files\Mount\IMountPoint;
+use OCP\Files\Node;
+use OCP\IUser;
+
+class LazyStorageMountInfo extends CachedMountInfo {
+ /** @var IMountPoint */
+ private $mount;
+
+ /**
+ * CachedMountInfo constructor.
+ *
+ * @param IUser $user
+ * @param IMountPoint $mount
+ */
+ public function __construct(IUser $user, IMountPoint $mount) {
+ $this->user = $user;
+ $this->mount = $mount;
+ }
+
+ /**
+ * @return int the numeric storage id of the mount
+ */
+ public function getStorageId() {
+ if (!$this->storageId) {
+ $this->storageId = $this->mount->getStorage()->getStorageCache()->getNumericId();
+ }
+ return parent::getStorageId();
+ }
+
+ /**
+ * @return int the fileid of the root of the mount
+ */
+ public function getRootId() {
+ if (!$this->rootId) {
+ $this->rootId = $this->mount->getStorageRootId();
+ }
+ return parent::getRootId();
+ }
+
+ /**
+ * @return string the mount point of the mount for the user
+ */
+ public function getMountPoint() {
+ if (!$this->mountPoint) {
+ $this->mountPoint = $this->mount->getMountPoint();
+ }
+ return parent::getMountPoint();
+ }
+}
diff --git a/lib/private/files/config/mountprovidercollection.php b/lib/private/Files/Config/MountProviderCollection.php
index 499fa576fbc..499fa576fbc 100644
--- a/lib/private/files/config/mountprovidercollection.php
+++ b/lib/private/Files/Config/MountProviderCollection.php
diff --git a/lib/private/files/config/usermountcache.php b/lib/private/Files/Config/UserMountCache.php
index 78b19972787..05ca146f4be 100644
--- a/lib/private/files/config/usermountcache.php
+++ b/lib/private/Files/Config/UserMountCache.php
@@ -80,18 +80,11 @@ class UserMountCache implements IUserMountCache {
});
/** @var ICachedMountInfo[] $newMounts */
$newMounts = array_map(function (IMountPoint $mount) use ($user) {
- $storage = $mount->getStorage();
- if ($storage->instanceOfStorage('\OC\Files\Storage\Shared')) {
- $rootId = (int)$storage->getShare()['file_source'];
- } else {
- $rootId = (int)$storage->getCache()->getId('');
- }
- $storageId = (int)$storage->getStorageCache()->getNumericId();
// filter out any storages which aren't scanned yet since we aren't interested in files from those storages (yet)
- if ($rootId === -1) {
+ if ($mount->getStorageRootId() === -1) {
return null;
} else {
- return new CachedMountInfo($user, $storageId, $rootId, $mount->getMountPoint());
+ return new LazyStorageMountInfo($user, $mount);
}
}, $mounts);
$newMounts = array_values(array_filter($newMounts));
diff --git a/lib/private/files/config/usermountcachelistener.php b/lib/private/Files/Config/UserMountCacheListener.php
index 99673cf6285..99673cf6285 100644
--- a/lib/private/files/config/usermountcachelistener.php
+++ b/lib/private/Files/Config/UserMountCacheListener.php
diff --git a/lib/private/files/fileinfo.php b/lib/private/Files/FileInfo.php
index 5f32ad34bb3..5f32ad34bb3 100644
--- a/lib/private/files/fileinfo.php
+++ b/lib/private/Files/FileInfo.php
diff --git a/lib/private/files/filesystem.php b/lib/private/Files/Filesystem.php
index a9138b0d2d7..7283c815c97 100644
--- a/lib/private/files/filesystem.php
+++ b/lib/private/Files/Filesystem.php
@@ -372,11 +372,12 @@ class Filesystem {
if ($user == '') {
$user = \OC_User::getUser();
}
+ if ($user === null || $user === false || $user === '') {
+ throw new \OC\User\NoUserException('Attempted to initialize mount points for null user and no user in session');
+ }
if (isset(self::$usersSetup[$user])) {
return;
}
- self::$usersSetup[$user] = true;
-
$root = \OC_User::getHome($user);
$userManager = \OC::$server->getUserManager();
@@ -387,6 +388,8 @@ class Filesystem {
throw new \OC\User\NoUserException('Backends provided no user object for ' . $user);
}
+ self::$usersSetup[$user] = true;
+
$homeStorage = \OC::$server->getConfig()->getSystemValue('objectstore');
if (!empty($homeStorage)) {
// sanity checks
diff --git a/lib/private/files/mount/manager.php b/lib/private/Files/Mount/Manager.php
index ba4a7f8d910..ba4a7f8d910 100644
--- a/lib/private/files/mount/manager.php
+++ b/lib/private/Files/Mount/Manager.php
diff --git a/lib/private/files/mount/mountpoint.php b/lib/private/Files/Mount/MountPoint.php
index b606c625cb1..7b9294fc1e0 100644
--- a/lib/private/files/mount/mountpoint.php
+++ b/lib/private/Files/Mount/MountPoint.php
@@ -239,4 +239,13 @@ class MountPoint implements IMountPoint {
public function getOptions() {
return $this->mountOptions;
}
+
+ /**
+ * Get the file id of the root of the storage
+ *
+ * @return int
+ */
+ public function getStorageRootId() {
+ return (int)$this->getStorage()->getCache()->getId('');
+ }
}
diff --git a/lib/private/files/mount/moveablemount.php b/lib/private/Files/Mount/MoveableMount.php
index 8a1bd7dd9c5..8a1bd7dd9c5 100644
--- a/lib/private/files/mount/moveablemount.php
+++ b/lib/private/Files/Mount/MoveableMount.php
diff --git a/lib/private/files/node/file.php b/lib/private/Files/Node/File.php
index 9e0014abb0b..9e0014abb0b 100644
--- a/lib/private/files/node/file.php
+++ b/lib/private/Files/Node/File.php
diff --git a/lib/private/files/node/folder.php b/lib/private/Files/Node/Folder.php
index f4d7dae20a3..f4d7dae20a3 100644
--- a/lib/private/files/node/folder.php
+++ b/lib/private/Files/Node/Folder.php
diff --git a/lib/private/files/node/hookconnector.php b/lib/private/Files/Node/HookConnector.php
index 5c36ca3848e..5c36ca3848e 100644
--- a/lib/private/files/node/hookconnector.php
+++ b/lib/private/Files/Node/HookConnector.php
diff --git a/lib/private/Files/Node/LazyRoot.php b/lib/private/Files/Node/LazyRoot.php
new file mode 100644
index 00000000000..9661f036579
--- /dev/null
+++ b/lib/private/Files/Node/LazyRoot.php
@@ -0,0 +1,474 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Files\Node;
+
+use OC\Files\Mount\MountPoint;
+use OCP\Files\IRootFolder;
+use OCP\Files\NotPermittedException;
+
+/**
+ * Class LazyRoot
+ *
+ * This is a lazy wrapper around the root. So only
+ * once it is needed this will get initialized.
+ *
+ * @package OC\Files\Node
+ */
+class LazyRoot implements IRootFolder {
+ /** @var \Closure */
+ private $rootFolderClosure;
+
+ /** @var IRootFolder */
+ private $rootFolder;
+
+ /**
+ * LazyRoot constructor.
+ *
+ * @param \Closure $rootFolderClosure
+ */
+ public function __construct(\Closure $rootFolderClosure) {
+ $this->rootFolderClosure = $rootFolderClosure;
+ }
+
+ /**
+ * Magic method to first get the real rootFolder and then
+ * call $method with $args on it
+ *
+ * @param $method
+ * @param $args
+ * @return mixed
+ */
+ public function __call($method, $args) {
+ if ($this->rootFolder === null) {
+ $this->rootFolder = call_user_func($this->rootFolderClosure);
+ }
+
+ return call_user_func_array([$this->rootFolder, $method], $args);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getUser() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function listen($scope, $method, callable $callback) {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function removeListener($scope = null, $method = null, callable $callback = null) {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function emit($scope, $method, $arguments = array()) {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function mount($storage, $mountPoint, $arguments = array()) {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMount($mountPoint) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMountsIn($mountPoint) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMountByStorageId($storageId) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMountByNumericStorageId($numericId) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function unMount($mount) {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function get($path) {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function rename($targetPath) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function delete() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function copy($targetPath) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function touch($mtime = null) {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getStorage() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getPath() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getInternalPath() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getId() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function stat() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMTime() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getSize() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getEtag() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getPermissions() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isReadable() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isUpdateable() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isDeletable() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isShareable() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getParent() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getName() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getUserFolder($userId) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMimetype() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMimePart() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isEncrypted() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getType() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isShared() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isMounted() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getMountPoint() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getOwner() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getChecksum() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getFullPath($path) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getRelativePath($path) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isSubNode($node) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getDirectoryListing() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function nodeExists($path) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function newFolder($path) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function newFile($path) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function search($query) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function searchByMime($mimetype) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function searchByTag($tag, $userId) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getById($id) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getFreeSpace() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function isCreatable() {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getNonExistingName($name) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function move($targetPath) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function lock($type) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function changeLock($targetType) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function unlock($type) {
+ return $this->__call(__FUNCTION__, func_get_args());
+ }
+
+
+}
diff --git a/lib/private/files/node/node.php b/lib/private/Files/Node/Node.php
index c4fabfc2e2e..c4fabfc2e2e 100644
--- a/lib/private/files/node/node.php
+++ b/lib/private/Files/Node/Node.php
diff --git a/lib/private/files/node/nonexistingfile.php b/lib/private/Files/Node/NonExistingFile.php
index c1d09bcc491..c1d09bcc491 100644
--- a/lib/private/files/node/nonexistingfile.php
+++ b/lib/private/Files/Node/NonExistingFile.php
diff --git a/lib/private/files/node/nonexistingfolder.php b/lib/private/Files/Node/NonExistingFolder.php
index 7d6576f1bd6..7d6576f1bd6 100644
--- a/lib/private/files/node/nonexistingfolder.php
+++ b/lib/private/Files/Node/NonExistingFolder.php
diff --git a/lib/private/files/node/root.php b/lib/private/Files/Node/Root.php
index 04866e60b87..04866e60b87 100644
--- a/lib/private/files/node/root.php
+++ b/lib/private/Files/Node/Root.php
diff --git a/lib/private/files/objectstore/homeobjectstorestorage.php b/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php
index 6a330e2dab3..6a330e2dab3 100644
--- a/lib/private/files/objectstore/homeobjectstorestorage.php
+++ b/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php
diff --git a/lib/private/files/objectstore/noopscanner.php b/lib/private/Files/ObjectStore/NoopScanner.php
index f5316175ecf..f5316175ecf 100644
--- a/lib/private/files/objectstore/noopscanner.php
+++ b/lib/private/Files/ObjectStore/NoopScanner.php
diff --git a/lib/private/files/objectstore/objectstorestorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
index 8c643dbdcc7..8c643dbdcc7 100644
--- a/lib/private/files/objectstore/objectstorestorage.php
+++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
diff --git a/lib/private/files/objectstore/swift.php b/lib/private/Files/ObjectStore/Swift.php
index 4af09dca254..4af09dca254 100644
--- a/lib/private/files/objectstore/swift.php
+++ b/lib/private/Files/ObjectStore/Swift.php
diff --git a/lib/private/files/storage/common.php b/lib/private/Files/Storage/Common.php
index 85c2e1c6700..6382dbd26b1 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/Files/Storage/Common.php
@@ -313,20 +313,20 @@ abstract class Common implements Storage, ILockingStorage {
if (!$storage) {
$storage = $this;
}
- if (!isset($this->cache)) {
- $this->cache = new Cache($storage);
+ if (!isset($storage->cache)) {
+ $storage->cache = new Cache($storage);
}
- return $this->cache;
+ return $storage->cache;
}
public function getScanner($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
}
- if (!isset($this->scanner)) {
- $this->scanner = new Scanner($storage);
+ if (!isset($storage->scanner)) {
+ $storage->scanner = new Scanner($storage);
}
- return $this->scanner;
+ return $storage->scanner;
}
public function getWatcher($path = '', $storage = null) {
@@ -351,20 +351,20 @@ abstract class Common implements Storage, ILockingStorage {
if (!$storage) {
$storage = $this;
}
- if (!isset($this->propagator)) {
- $this->propagator = new Propagator($storage);
+ if (!isset($storage->propagator)) {
+ $storage->propagator = new Propagator($storage, \OC::$server->getDatabaseConnection());
}
- return $this->propagator;
+ return $storage->propagator;
}
public function getUpdater($storage = null) {
if (!$storage) {
$storage = $this;
}
- if (!isset($this->updater)) {
- $this->updater = new Updater($storage);
+ if (!isset($storage->updater)) {
+ $storage->updater = new Updater($storage);
}
- return $this->updater;
+ return $storage->updater;
}
public function getStorageCache($storage = null) {
diff --git a/lib/private/files/storage/commontest.php b/lib/private/Files/Storage/CommonTest.php
index 0047a51169c..0047a51169c 100644
--- a/lib/private/files/storage/commontest.php
+++ b/lib/private/Files/Storage/CommonTest.php
diff --git a/lib/private/files/storage/dav.php b/lib/private/Files/Storage/DAV.php
index df0f4c7e91d..8eebea1f3ba 100644
--- a/lib/private/files/storage/dav.php
+++ b/lib/private/Files/Storage/DAV.php
@@ -246,7 +246,7 @@ class DAV extends Common {
*
* @throws NotFound
*/
- private function propfind($path) {
+ protected function propfind($path) {
$path = $this->cleanPath($path);
$cachedResponse = $this->statCache->get($path);
if ($cachedResponse === false) {
@@ -264,6 +264,7 @@ class DAV extends Common {
'{DAV:}getcontentlength',
'{DAV:}getcontenttype',
'{http://owncloud.org/ns}permissions',
+ '{http://open-collaboration-services.org/ns}share-permissions',
'{DAV:}resourcetype',
'{DAV:}getetag',
)
@@ -741,6 +742,9 @@ class DAV extends Common {
}
if (!empty($etag) && $cachedData['etag'] !== $etag) {
return true;
+ } else if (isset($response['{http://open-collaboration-services.org/ns}share-permissions'])) {
+ $sharePermissions = (int)$response['{http://open-collaboration-services.org/ns}share-permissions'];
+ return $sharePermissions !== $cachedData['permissions'];
} else if (isset($response['{http://owncloud.org/ns}permissions'])) {
$permissions = $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
return $permissions !== $cachedData['permissions'];
diff --git a/lib/private/files/storage/failedstorage.php b/lib/private/Files/Storage/FailedStorage.php
index df7f76856d5..df7f76856d5 100644
--- a/lib/private/files/storage/failedstorage.php
+++ b/lib/private/Files/Storage/FailedStorage.php
diff --git a/lib/private/files/storage/flysystem.php b/lib/private/Files/Storage/Flysystem.php
index 608639b71a6..608639b71a6 100644
--- a/lib/private/files/storage/flysystem.php
+++ b/lib/private/Files/Storage/Flysystem.php
diff --git a/lib/private/files/storage/home.php b/lib/private/Files/Storage/Home.php
index 9b98f2f7e12..19ba217fa42 100644
--- a/lib/private/files/storage/home.php
+++ b/lib/private/Files/Storage/Home.php
@@ -88,7 +88,7 @@ class Home extends Local implements \OCP\Files\IHomeStorage {
$storage = $this;
}
if (!isset($this->propagator)) {
- $this->propagator = new HomePropagator($storage);
+ $this->propagator = new HomePropagator($storage, \OC::$server->getDatabaseConnection());
}
return $this->propagator;
}
diff --git a/lib/private/files/storage/local.php b/lib/private/Files/Storage/Local.php
index 25b202af5f8..03aaf1e0a8b 100644
--- a/lib/private/files/storage/local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -39,6 +39,9 @@ class Local extends \OC\Files\Storage\Common {
protected $datadir;
public function __construct($arguments) {
+ if (!isset($arguments['datadir']) || !is_string($arguments['datadir'])) {
+ throw new \InvalidArgumentException('No data directory set for local storage');
+ }
$this->datadir = $arguments['datadir'];
if (substr($this->datadir, -1) !== '/') {
$this->datadir .= '/';
diff --git a/lib/private/files/storage/localtempfiletrait.php b/lib/private/Files/Storage/LocalTempFileTrait.php
index 88f11e4e752..88f11e4e752 100644
--- a/lib/private/files/storage/localtempfiletrait.php
+++ b/lib/private/Files/Storage/LocalTempFileTrait.php
diff --git a/lib/private/files/storage/polyfill/copydirectory.php b/lib/private/Files/Storage/PolyFill/CopyDirectory.php
index d4cac117ade..d4cac117ade 100644
--- a/lib/private/files/storage/polyfill/copydirectory.php
+++ b/lib/private/Files/Storage/PolyFill/CopyDirectory.php
diff --git a/lib/private/files/storage/storage.php b/lib/private/Files/Storage/Storage.php
index c066336d4b8..c066336d4b8 100644
--- a/lib/private/files/storage/storage.php
+++ b/lib/private/Files/Storage/Storage.php
diff --git a/lib/private/files/storage/storagefactory.php b/lib/private/Files/Storage/StorageFactory.php
index 84362cabecc..84362cabecc 100644
--- a/lib/private/files/storage/storagefactory.php
+++ b/lib/private/Files/Storage/StorageFactory.php
diff --git a/lib/private/files/storage/temporary.php b/lib/private/Files/Storage/Temporary.php
index 2d8e84c2d52..2d8e84c2d52 100644
--- a/lib/private/files/storage/temporary.php
+++ b/lib/private/Files/Storage/Temporary.php
diff --git a/lib/private/files/storage/wrapper/availability.php b/lib/private/Files/Storage/Wrapper/Availability.php
index 0ed31ba854a..0ed31ba854a 100644
--- a/lib/private/files/storage/wrapper/availability.php
+++ b/lib/private/Files/Storage/Wrapper/Availability.php
diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/Files/Storage/Wrapper/Encryption.php
index 1add4d7fd0a..02da978a700 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/Files/Storage/Wrapper/Encryption.php
@@ -627,9 +627,10 @@ class Encryption extends Wrapper {
* @param string $sourceInternalPath
* @param string $targetInternalPath
* @param bool $preserveMtime
+ * @param bool $isRename
* @return bool
*/
- public function copyFromStorage(Storage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = false) {
+ public function copyFromStorage(Storage $sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime = false, $isRename = false) {
// TODO clean this up once the underlying moveFromStorage in OC\Files\Storage\Wrapper\Common is fixed:
// - call $this->storage->copyFromStorage() instead of $this->copyBetweenStorage
@@ -637,7 +638,7 @@ class Encryption extends Wrapper {
// - copy the copyKeys() call from $this->copyBetweenStorage to this method
// - remove $this->copyBetweenStorage
- return $this->copyBetweenStorage($sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime, false);
+ return $this->copyBetweenStorage($sourceStorage, $sourceInternalPath, $targetInternalPath, $preserveMtime, $isRename);
}
/**
@@ -732,7 +733,7 @@ class Encryption extends Wrapper {
if (is_resource($dh)) {
while ($result and ($file = readdir($dh)) !== false) {
if (!Filesystem::isIgnoredDir($file)) {
- $result &= $this->copyFromStorage($sourceStorage, $sourceInternalPath . '/' . $file, $targetInternalPath . '/' . $file);
+ $result &= $this->copyFromStorage($sourceStorage, $sourceInternalPath . '/' . $file, $targetInternalPath . '/' . $file, false, $isRename);
}
}
}
diff --git a/lib/private/files/storage/wrapper/jail.php b/lib/private/Files/Storage/Wrapper/Jail.php
index e5f5ab90359..e8063f670c5 100644
--- a/lib/private/files/storage/wrapper/jail.php
+++ b/lib/private/Files/Storage/Wrapper/Jail.php
@@ -47,7 +47,7 @@ class Jail extends Wrapper {
$this->rootPath = $arguments['root'];
}
- protected function getSourcePath($path) {
+ public function getSourcePath($path) {
if ($path === '') {
return $this->rootPath;
} else {
@@ -417,6 +417,14 @@ class Jail extends Wrapper {
/**
* @param string $path
+ * @return array
+ */
+ public function getMetaData($path) {
+ return $this->storage->getMetaData($this->getSourcePath($path));
+ }
+
+ /**
+ * @param string $path
* @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
* @param \OCP\Lock\ILockingProvider $provider
* @throws \OCP\Lock\LockedException
@@ -442,4 +450,40 @@ class Jail extends Wrapper {
public function changeLock($path, $type, ILockingProvider $provider) {
$this->storage->changeLock($this->getSourcePath($path), $type, $provider);
}
+
+ /**
+ * Resolve the path for the source of the share
+ *
+ * @param string $path
+ * @return array
+ */
+ public function resolvePath($path) {
+ return [$this->storage, $this->getSourcePath($path)];
+ }
+
+ /**
+ * @param \OCP\Files\Storage $sourceStorage
+ * @param string $sourceInternalPath
+ * @param string $targetInternalPath
+ * @return bool
+ */
+ public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
+ if ($sourceStorage === $this) {
+ return $this->copy($sourceInternalPath, $targetInternalPath);
+ }
+ return $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $this->getSourcePath($targetInternalPath));
+ }
+
+ /**
+ * @param \OCP\Files\Storage $sourceStorage
+ * @param string $sourceInternalPath
+ * @param string $targetInternalPath
+ * @return bool
+ */
+ public function moveFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
+ if ($sourceStorage === $this) {
+ return $this->rename($sourceInternalPath, $targetInternalPath);
+ }
+ return $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $this->getSourcePath($targetInternalPath));
+ }
}
diff --git a/lib/private/files/storage/wrapper/permissionsmask.php b/lib/private/Files/Storage/Wrapper/PermissionsMask.php
index 01dd78d418c..01dd78d418c 100644
--- a/lib/private/files/storage/wrapper/permissionsmask.php
+++ b/lib/private/Files/Storage/Wrapper/PermissionsMask.php
diff --git a/lib/private/files/storage/wrapper/quota.php b/lib/private/Files/Storage/Wrapper/Quota.php
index 500677b092e..500677b092e 100644
--- a/lib/private/files/storage/wrapper/quota.php
+++ b/lib/private/Files/Storage/Wrapper/Quota.php
diff --git a/lib/private/files/storage/wrapper/wrapper.php b/lib/private/Files/Storage/Wrapper/Wrapper.php
index 12914e7a1b8..21d7db1099b 100644
--- a/lib/private/files/storage/wrapper/wrapper.php
+++ b/lib/private/Files/Storage/Wrapper/Wrapper.php
@@ -35,6 +35,12 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage {
*/
protected $storage;
+ public $cache;
+ public $scanner;
+ public $watcher;
+ public $propagator;
+ public $updater;
+
/**
* @param array $parameters
*/
diff --git a/lib/private/files/stream/close.php b/lib/private/Files/Stream/Close.php
index 1c9b30705dd..1c9b30705dd 100644
--- a/lib/private/files/stream/close.php
+++ b/lib/private/Files/Stream/Close.php
diff --git a/lib/private/files/stream/dir.php b/lib/private/Files/Stream/Dir.php
index 7489ee683a2..7489ee683a2 100644
--- a/lib/private/files/stream/dir.php
+++ b/lib/private/Files/Stream/Dir.php
diff --git a/lib/private/files/stream/encryption.php b/lib/private/Files/Stream/Encryption.php
index 772c9769bf7..772c9769bf7 100644
--- a/lib/private/files/stream/encryption.php
+++ b/lib/private/Files/Stream/Encryption.php
diff --git a/lib/private/files/stream/oc.php b/lib/private/Files/Stream/OC.php
index 8439770e8fa..8439770e8fa 100644
--- a/lib/private/files/stream/oc.php
+++ b/lib/private/Files/Stream/OC.php
diff --git a/lib/private/files/stream/quota.php b/lib/private/Files/Stream/Quota.php
index 8d27575c568..8d27575c568 100644
--- a/lib/private/files/stream/quota.php
+++ b/lib/private/Files/Stream/Quota.php
diff --git a/lib/private/files/stream/staticstream.php b/lib/private/Files/Stream/StaticStream.php
index 7aacf7a9fe4..7aacf7a9fe4 100644
--- a/lib/private/files/stream/staticstream.php
+++ b/lib/private/Files/Stream/StaticStream.php
diff --git a/lib/private/files/type/detection.php b/lib/private/Files/Type/Detection.php
index f106a98064f..f106a98064f 100644
--- a/lib/private/files/type/detection.php
+++ b/lib/private/Files/Type/Detection.php
diff --git a/lib/private/files/type/loader.php b/lib/private/Files/Type/Loader.php
index 95ba7597257..95ba7597257 100644
--- a/lib/private/files/type/loader.php
+++ b/lib/private/Files/Type/Loader.php
diff --git a/lib/private/files/type/templatemanager.php b/lib/private/Files/Type/TemplateManager.php
index 363fb7a2a6c..363fb7a2a6c 100644
--- a/lib/private/files/type/templatemanager.php
+++ b/lib/private/Files/Type/TemplateManager.php
diff --git a/lib/private/files/utils/scanner.php b/lib/private/Files/Utils/Scanner.php
index 06526583899..b013cbecabc 100644
--- a/lib/private/files/utils/scanner.php
+++ b/lib/private/Files/Utils/Scanner.php
@@ -29,6 +29,7 @@ use OC\Files\Filesystem;
use OC\ForbiddenException;
use OC\Hooks\PublicEmitter;
use OC\Lock\DBLockingProvider;
+use OCP\Files\Storage\IStorage;
use OCP\Files\StorageNotAvailableException;
use OCP\ILogger;
@@ -153,6 +154,17 @@ class Scanner extends PublicEmitter {
$scanner->setUseTransactions(false);
$this->attachListener($mount);
$isDbLocking = \OC::$server->getLockingProvider() instanceof DBLockingProvider;
+
+ $scanner->listen('\OC\Files\Cache\Scanner', 'removeFromCache', function ($path) use ($storage) {
+ $this->triggerPropagator($storage, $path);
+ });
+ $scanner->listen('\OC\Files\Cache\Scanner', 'updateCache', function ($path) use ($storage) {
+ $this->triggerPropagator($storage, $path);
+ });
+ $scanner->listen('\OC\Files\Cache\Scanner', 'addToCache', function ($path) use ($storage) {
+ $this->triggerPropagator($storage, $path);
+ });
+
if (!$isDbLocking) {
$this->db->beginTransaction();
}
@@ -168,5 +180,9 @@ class Scanner extends PublicEmitter {
}
}
}
+
+ private function triggerPropagator(IStorage $storage, $internalPath) {
+ $storage->getPropagator()->propagateChange($internalPath, time());
+ }
}
diff --git a/lib/private/files/view.php b/lib/private/Files/View.php
index aac33a4598c..22e53a00706 100644
--- a/lib/private/files/view.php
+++ b/lib/private/Files/View.php
@@ -726,7 +726,7 @@ class View {
$result = false;
}
// moving a file/folder within the same mount point
- } elseif ($storage1 == $storage2) {
+ } elseif ($storage1 === $storage2) {
if ($storage1) {
$result = $storage1->rename($internalPath1, $internalPath2);
} else {
diff --git a/lib/private/hooks/basicemitter.php b/lib/private/Hooks/BasicEmitter.php
index 067962ec081..067962ec081 100644
--- a/lib/private/hooks/basicemitter.php
+++ b/lib/private/Hooks/BasicEmitter.php
diff --git a/lib/private/hooks/emitter.php b/lib/private/Hooks/Emitter.php
index d639e5ef892..d639e5ef892 100644
--- a/lib/private/hooks/emitter.php
+++ b/lib/private/Hooks/Emitter.php
diff --git a/lib/private/hooks/emittertrait.php b/lib/private/Hooks/EmitterTrait.php
index 775f46f838c..775f46f838c 100644
--- a/lib/private/hooks/emittertrait.php
+++ b/lib/private/Hooks/EmitterTrait.php
diff --git a/lib/private/hooks/forwardingemitter.php b/lib/private/Hooks/ForwardingEmitter.php
index 6a1fc571cea..6a1fc571cea 100644
--- a/lib/private/hooks/forwardingemitter.php
+++ b/lib/private/Hooks/ForwardingEmitter.php
diff --git a/lib/private/hooks/legacyemitter.php b/lib/private/Hooks/LegacyEmitter.php
index ac83477a144..ac83477a144 100644
--- a/lib/private/hooks/legacyemitter.php
+++ b/lib/private/Hooks/LegacyEmitter.php
diff --git a/lib/private/hooks/publicemitter.php b/lib/private/Hooks/PublicEmitter.php
index 4fe71073a1e..4fe71073a1e 100644
--- a/lib/private/hooks/publicemitter.php
+++ b/lib/private/Hooks/PublicEmitter.php
diff --git a/lib/private/integritycheck/checker.php b/lib/private/IntegrityCheck/Checker.php
index d7867936887..c3d6aefb829 100644
--- a/lib/private/integritycheck/checker.php
+++ b/lib/private/IntegrityCheck/Checker.php
@@ -25,7 +25,7 @@ use OC\IntegrityCheck\Exceptions\InvalidSignatureException;
use OC\IntegrityCheck\Helpers\AppLocator;
use OC\IntegrityCheck\Helpers\EnvironmentHelper;
use OC\IntegrityCheck\Helpers\FileAccessHelper;
-use OC\Integritycheck\Iterator\ExcludeFileByNameFilterIterator;
+use OC\IntegrityCheck\Iterator\ExcludeFileByNameFilterIterator;
use OC\IntegrityCheck\Iterator\ExcludeFoldersByPathFilterIterator;
use OCP\App\IAppManager;
use OCP\ICache;
diff --git a/lib/private/integritycheck/exceptions/invalidsignatureexception.php b/lib/private/IntegrityCheck/Exceptions/InvalidSignatureException.php
index 521171642b2..521171642b2 100644
--- a/lib/private/integritycheck/exceptions/invalidsignatureexception.php
+++ b/lib/private/IntegrityCheck/Exceptions/InvalidSignatureException.php
diff --git a/lib/private/integritycheck/helpers/applocator.php b/lib/private/IntegrityCheck/Helpers/AppLocator.php
index af22fca1fe4..af22fca1fe4 100644
--- a/lib/private/integritycheck/helpers/applocator.php
+++ b/lib/private/IntegrityCheck/Helpers/AppLocator.php
diff --git a/lib/private/integritycheck/helpers/environmenthelper.php b/lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php
index f56f07486c2..f56f07486c2 100644
--- a/lib/private/integritycheck/helpers/environmenthelper.php
+++ b/lib/private/IntegrityCheck/Helpers/EnvironmentHelper.php
diff --git a/lib/private/integritycheck/helpers/fileaccesshelper.php b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
index f0bf6576d35..f0bf6576d35 100644
--- a/lib/private/integritycheck/helpers/fileaccesshelper.php
+++ b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
diff --git a/lib/private/integritycheck/iterator/excludefilebynamefilteriterator.php b/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php
index 51850852cbd..51850852cbd 100644
--- a/lib/private/integritycheck/iterator/excludefilebynamefilteriterator.php
+++ b/lib/private/IntegrityCheck/Iterator/ExcludeFileByNameFilterIterator.php
diff --git a/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php b/lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php
index 1082e97c296..1082e97c296 100644
--- a/lib/private/integritycheck/iterator/excludefoldersbypathfilteriterator.php
+++ b/lib/private/IntegrityCheck/Iterator/ExcludeFoldersByPathFilterIterator.php
diff --git a/lib/private/lock/abstractlockingprovider.php b/lib/private/Lock/AbstractLockingProvider.php
index f96358778c1..f96358778c1 100644
--- a/lib/private/lock/abstractlockingprovider.php
+++ b/lib/private/Lock/AbstractLockingProvider.php
diff --git a/lib/private/lock/dblockingprovider.php b/lib/private/Lock/DBLockingProvider.php
index 9e97df44d3f..3a599a61e7d 100644
--- a/lib/private/lock/dblockingprovider.php
+++ b/lib/private/Lock/DBLockingProvider.php
@@ -24,7 +24,9 @@
namespace OC\Lock;
+use OC\DB\QueryBuilder\Literal;
use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\ILogger;
use OCP\Lock\ILockingProvider;
@@ -257,13 +259,22 @@ class DBLockingProvider extends AbstractLockingProvider {
parent::releaseAll();
// since we keep shared locks we need to manually clean those
- foreach ($this->sharedLocks as $path => $lock) {
- if ($lock) {
- $this->connection->executeUpdate(
- 'UPDATE `*PREFIX*file_locks` SET `lock` = `lock` - 1 WHERE `key` = ? AND `lock` > 0',
- [$path]
- );
- }
+ $lockedPaths = array_keys($this->sharedLocks);
+ $lockedPaths = array_filter($lockedPaths, function ($path) {
+ return $this->sharedLocks[$path];
+ });
+
+ $chunkedPaths = array_chunk($lockedPaths, 100);
+
+ foreach ($chunkedPaths as $chunk) {
+ $builder = $this->connection->getQueryBuilder();
+
+ $query = $builder->update('file_locks')
+ ->set('lock', $builder->createFunction('`lock` -1'))
+ ->where($builder->expr()->in('key', $builder->createNamedParameter($chunk, IQueryBuilder::PARAM_STR_ARRAY)))
+ ->andWhere($builder->expr()->gt('lock', new Literal(0)));
+
+ $query->execute();
}
}
}
diff --git a/lib/private/lock/memcachelockingprovider.php b/lib/private/Lock/MemcacheLockingProvider.php
index 536b29e2c28..536b29e2c28 100644
--- a/lib/private/lock/memcachelockingprovider.php
+++ b/lib/private/Lock/MemcacheLockingProvider.php
diff --git a/lib/private/lock/nooplockingprovider.php b/lib/private/Lock/NoopLockingProvider.php
index dc58230f77e..dc58230f77e 100644
--- a/lib/private/lock/nooplockingprovider.php
+++ b/lib/private/Lock/NoopLockingProvider.php
diff --git a/lib/private/mail/mailer.php b/lib/private/Mail/Mailer.php
index 742ff554892..742ff554892 100644
--- a/lib/private/mail/mailer.php
+++ b/lib/private/Mail/Mailer.php
diff --git a/lib/private/mail/message.php b/lib/private/Mail/Message.php
index 0e33e6383f7..0e33e6383f7 100644
--- a/lib/private/mail/message.php
+++ b/lib/private/Mail/Message.php
diff --git a/lib/private/memcache/apc.php b/lib/private/Memcache/APC.php
index 2354ad07749..2354ad07749 100644
--- a/lib/private/memcache/apc.php
+++ b/lib/private/Memcache/APC.php
diff --git a/lib/private/memcache/apcu.php b/lib/private/Memcache/APCu.php
index 350ce913ed8..350ce913ed8 100644
--- a/lib/private/memcache/apcu.php
+++ b/lib/private/Memcache/APCu.php
diff --git a/lib/private/memcache/arraycache.php b/lib/private/Memcache/ArrayCache.php
index 837f888a307..837f888a307 100644
--- a/lib/private/memcache/arraycache.php
+++ b/lib/private/Memcache/ArrayCache.php
diff --git a/lib/private/memcache/cadtrait.php b/lib/private/Memcache/CADTrait.php
index d44d98cba0b..d44d98cba0b 100644
--- a/lib/private/memcache/cadtrait.php
+++ b/lib/private/Memcache/CADTrait.php
diff --git a/lib/private/memcache/castrait.php b/lib/private/Memcache/CASTrait.php
index 43253fc966b..43253fc966b 100644
--- a/lib/private/memcache/castrait.php
+++ b/lib/private/Memcache/CASTrait.php
diff --git a/lib/private/memcache/cache.php b/lib/private/Memcache/Cache.php
index 63d20721aac..63d20721aac 100644
--- a/lib/private/memcache/cache.php
+++ b/lib/private/Memcache/Cache.php
diff --git a/lib/private/memcache/factory.php b/lib/private/Memcache/Factory.php
index a005f319b3e..a005f319b3e 100644
--- a/lib/private/memcache/factory.php
+++ b/lib/private/Memcache/Factory.php
diff --git a/lib/private/memcache/memcached.php b/lib/private/Memcache/Memcached.php
index a30f9da7ed7..a30f9da7ed7 100644
--- a/lib/private/memcache/memcached.php
+++ b/lib/private/Memcache/Memcached.php
diff --git a/lib/private/memcache/nullcache.php b/lib/private/Memcache/NullCache.php
index c490ca7e03c..c490ca7e03c 100644
--- a/lib/private/memcache/nullcache.php
+++ b/lib/private/Memcache/NullCache.php
diff --git a/lib/private/memcache/redis.php b/lib/private/Memcache/Redis.php
index b3444a2b4e9..b3444a2b4e9 100644
--- a/lib/private/memcache/redis.php
+++ b/lib/private/Memcache/Redis.php
diff --git a/lib/private/memcache/xcache.php b/lib/private/Memcache/XCache.php
index e80901faadc..e80901faadc 100644
--- a/lib/private/memcache/xcache.php
+++ b/lib/private/Memcache/XCache.php
diff --git a/lib/private/notification/action.php b/lib/private/Notification/Action.php
index deac6807653..deac6807653 100644
--- a/lib/private/notification/action.php
+++ b/lib/private/Notification/Action.php
diff --git a/lib/private/notification/manager.php b/lib/private/Notification/Manager.php
index 3ddc9b21161..3ddc9b21161 100644
--- a/lib/private/notification/manager.php
+++ b/lib/private/Notification/Manager.php
diff --git a/lib/private/notification/notification.php b/lib/private/Notification/Notification.php
index db0a76a7c32..db0a76a7c32 100644
--- a/lib/private/notification/notification.php
+++ b/lib/private/Notification/Notification.php
diff --git a/lib/private/preview/bmp.php b/lib/private/Preview/BMP.php
index da13cd9e5b8..da13cd9e5b8 100644
--- a/lib/private/preview/bmp.php
+++ b/lib/private/Preview/BMP.php
diff --git a/lib/private/preview/bitmap.php b/lib/private/Preview/Bitmap.php
index 34bc2f93fc7..34bc2f93fc7 100644
--- a/lib/private/preview/bitmap.php
+++ b/lib/private/Preview/Bitmap.php
diff --git a/lib/private/preview/font.php b/lib/private/Preview/Font.php
index caac2923789..caac2923789 100644
--- a/lib/private/preview/font.php
+++ b/lib/private/Preview/Font.php
diff --git a/lib/private/preview/gif.php b/lib/private/Preview/GIF.php
index 0716a6f4406..0716a6f4406 100644
--- a/lib/private/preview/gif.php
+++ b/lib/private/Preview/GIF.php
diff --git a/lib/private/preview/illustrator.php b/lib/private/Preview/Illustrator.php
index ef8448d7b53..ef8448d7b53 100644
--- a/lib/private/preview/illustrator.php
+++ b/lib/private/Preview/Illustrator.php
diff --git a/lib/private/preview/image.php b/lib/private/Preview/Image.php
index 3ea99d6963a..3ea99d6963a 100644
--- a/lib/private/preview/image.php
+++ b/lib/private/Preview/Image.php
diff --git a/lib/private/preview/jpeg.php b/lib/private/Preview/JPEG.php
index 2ee5dd24419..2ee5dd24419 100644
--- a/lib/private/preview/jpeg.php
+++ b/lib/private/Preview/JPEG.php
diff --git a/lib/private/preview/mp3.php b/lib/private/Preview/MP3.php
index c7b70457afe..c7b70457afe 100644
--- a/lib/private/preview/mp3.php
+++ b/lib/private/Preview/MP3.php
diff --git a/lib/private/preview/msoffice2003.php b/lib/private/Preview/MSOffice2003.php
index 20dbe13543a..20dbe13543a 100644
--- a/lib/private/preview/msoffice2003.php
+++ b/lib/private/Preview/MSOffice2003.php
diff --git a/lib/private/preview/msoffice2007.php b/lib/private/Preview/MSOffice2007.php
index ef6758843f1..ef6758843f1 100644
--- a/lib/private/preview/msoffice2007.php
+++ b/lib/private/Preview/MSOffice2007.php
diff --git a/lib/private/preview/msofficedoc.php b/lib/private/Preview/MSOfficeDoc.php
index 05d839d508f..05d839d508f 100644
--- a/lib/private/preview/msofficedoc.php
+++ b/lib/private/Preview/MSOfficeDoc.php
diff --git a/lib/private/preview/markdown.php b/lib/private/Preview/MarkDown.php
index 394af6576c7..394af6576c7 100644
--- a/lib/private/preview/markdown.php
+++ b/lib/private/Preview/MarkDown.php
diff --git a/lib/private/preview/movie.php b/lib/private/Preview/Movie.php
index 43a8d674fc9..43a8d674fc9 100644
--- a/lib/private/preview/movie.php
+++ b/lib/private/Preview/Movie.php
diff --git a/lib/private/preview/office.php b/lib/private/Preview/Office.php
index 6496e091b1d..6496e091b1d 100644
--- a/lib/private/preview/office.php
+++ b/lib/private/Preview/Office.php
diff --git a/lib/private/preview/opendocument.php b/lib/private/Preview/OpenDocument.php
index 0da1e88cafa..0da1e88cafa 100644
--- a/lib/private/preview/opendocument.php
+++ b/lib/private/Preview/OpenDocument.php
diff --git a/lib/private/preview/pdf.php b/lib/private/Preview/PDF.php
index 6ddf33cdea2..6ddf33cdea2 100644
--- a/lib/private/preview/pdf.php
+++ b/lib/private/Preview/PDF.php
diff --git a/lib/private/preview/png.php b/lib/private/Preview/PNG.php
index 5dd9ae484a5..5dd9ae484a5 100644
--- a/lib/private/preview/png.php
+++ b/lib/private/Preview/PNG.php
diff --git a/lib/private/preview/photoshop.php b/lib/private/Preview/Photoshop.php
index df91247f072..df91247f072 100644
--- a/lib/private/preview/photoshop.php
+++ b/lib/private/Preview/Photoshop.php
diff --git a/lib/private/preview/postscript.php b/lib/private/Preview/Postscript.php
index edfd43968c2..edfd43968c2 100644
--- a/lib/private/preview/postscript.php
+++ b/lib/private/Preview/Postscript.php
diff --git a/lib/private/preview/provider.php b/lib/private/Preview/Provider.php
index 738d13d7fc8..738d13d7fc8 100644
--- a/lib/private/preview/provider.php
+++ b/lib/private/Preview/Provider.php
diff --git a/lib/private/preview/svg.php b/lib/private/Preview/SVG.php
index 6618c1fbf82..6618c1fbf82 100644
--- a/lib/private/preview/svg.php
+++ b/lib/private/Preview/SVG.php
diff --git a/lib/private/preview/staroffice.php b/lib/private/Preview/StarOffice.php
index 6ea4efa5144..6ea4efa5144 100644
--- a/lib/private/preview/staroffice.php
+++ b/lib/private/Preview/StarOffice.php
diff --git a/lib/private/preview/tiff.php b/lib/private/Preview/TIFF.php
index 006ced6aec0..006ced6aec0 100644
--- a/lib/private/preview/tiff.php
+++ b/lib/private/Preview/TIFF.php
diff --git a/lib/private/preview/txt.php b/lib/private/Preview/TXT.php
index a27517c9f39..a27517c9f39 100644
--- a/lib/private/preview/txt.php
+++ b/lib/private/Preview/TXT.php
diff --git a/lib/private/preview/xbitmap.php b/lib/private/Preview/XBitmap.php
index 604a51a6a83..604a51a6a83 100644
--- a/lib/private/preview/xbitmap.php
+++ b/lib/private/Preview/XBitmap.php
diff --git a/lib/private/repair/assetcache.php b/lib/private/Repair/AssetCache.php
index 72fe99bbe1a..e4787bab95f 100644
--- a/lib/private/repair/assetcache.php
+++ b/lib/private/Repair/AssetCache.php
@@ -23,23 +23,23 @@
namespace OC\Repair;
-use Doctrine\DBAL\Platforms\MySqlPlatform;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class AssetCache extends BasicEmitter implements \OC\RepairStep {
+class AssetCache implements IRepairStep {
public function getName() {
return 'Clear asset cache after upgrade';
}
- public function run() {
+ public function run(IOutput $output) {
if (!\OC_Template::isAssetPipelineEnabled()) {
- $this->emit('\OC\Repair', 'info', array('Asset pipeline disabled -> nothing to do'));
+ $output->info('Asset pipeline disabled -> nothing to do');
return;
}
$assetDir = \OC::$server->getConfig()->getSystemValue('assetdirectory', \OC::$SERVERROOT) . '/assets';
\OC_Helper::rmdirr($assetDir, false);
- $this->emit('\OC\Repair', 'info', array('Asset cache cleared.'));
+ $output->info('Asset cache cleared.');
}
}
diff --git a/lib/private/repair/cleantags.php b/lib/private/Repair/CleanTags.php
index 537c4da78aa..2607151cd9c 100644
--- a/lib/private/repair/cleantags.php
+++ b/lib/private/Repair/CleanTags.php
@@ -22,17 +22,17 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
-use OC\RepairStep;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
/**
* Class RepairConfig
*
* @package OC\Repair
*/
-class CleanTags extends BasicEmitter implements RepairStep {
+class CleanTags implements IRepairStep {
/** @var IDBConnection */
protected $connection;
@@ -54,17 +54,18 @@ class CleanTags extends BasicEmitter implements RepairStep {
/**
* Updates the configuration after running an update
*/
- public function run() {
- $this->deleteOrphanFileEntries();
- $this->deleteOrphanTagEntries();
- $this->deleteOrphanCategoryEntries();
+ public function run(IOutput $output) {
+ $this->deleteOrphanFileEntries($output);
+ $this->deleteOrphanTagEntries($output);
+ $this->deleteOrphanCategoryEntries($output);
}
/**
* Delete tag entries for deleted files
*/
- protected function deleteOrphanFileEntries() {
+ protected function deleteOrphanFileEntries(IOutput $output) {
$this->deleteOrphanEntries(
+ $output,
'%d tags for delete files have been removed.',
'vcategory_to_object', 'objid',
'filecache', 'fileid', 'path_hash'
@@ -74,8 +75,9 @@ class CleanTags extends BasicEmitter implements RepairStep {
/**
* Delete tag entries for deleted tags
*/
- protected function deleteOrphanTagEntries() {
+ protected function deleteOrphanTagEntries(IOutput $output) {
$this->deleteOrphanEntries(
+ $output,
'%d tag entries for deleted tags have been removed.',
'vcategory_to_object', 'categoryid',
'vcategory', 'id', 'uid'
@@ -85,8 +87,9 @@ class CleanTags extends BasicEmitter implements RepairStep {
/**
* Delete tags that have no entries
*/
- protected function deleteOrphanCategoryEntries() {
+ protected function deleteOrphanCategoryEntries(IOutput $output) {
$this->deleteOrphanEntries(
+ $output,
'%d tags with no entries have been removed.',
'vcategory', 'id',
'vcategory_to_object', 'categoryid', 'type'
@@ -108,7 +111,7 @@ class CleanTags extends BasicEmitter implements RepairStep {
* @param string $sourceNullColumn If this column is null in the source table,
* the entry is deleted in the $deleteTable
*/
- protected function deleteOrphanEntries($repairInfo, $deleteTable, $deleteId, $sourceTable, $sourceId, $sourceNullColumn) {
+ protected function deleteOrphanEntries(IOutput $output, $repairInfo, $deleteTable, $deleteId, $sourceTable, $sourceId, $sourceNullColumn) {
$qb = $this->connection->getQueryBuilder();
$qb->select('d.' . $deleteId)
@@ -141,7 +144,7 @@ class CleanTags extends BasicEmitter implements RepairStep {
}
if ($repairInfo) {
- $this->emit('\OC\Repair', 'info', array(sprintf($repairInfo, sizeof($orphanItems))));
+ $output->info(sprintf($repairInfo, sizeof($orphanItems)));
}
}
}
diff --git a/lib/private/repair/collation.php b/lib/private/Repair/Collation.php
index 48035f8d331..1376785e17d 100644
--- a/lib/private/repair/collation.php
+++ b/lib/private/Repair/Collation.php
@@ -23,9 +23,10 @@
namespace OC\Repair;
use Doctrine\DBAL\Platforms\MySqlPlatform;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class Collation extends BasicEmitter implements \OC\RepairStep {
+class Collation implements IRepairStep {
/**
* @var \OCP\IConfig
*/
@@ -52,15 +53,15 @@ class Collation extends BasicEmitter implements \OC\RepairStep {
/**
* Fix mime types
*/
- public function run() {
+ public function run(IOutput $output) {
if (!$this->connection->getDatabasePlatform() instanceof MySqlPlatform) {
- $this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to no'));
+ $output->info('Not a mysql database -> nothing to no');
return;
}
$tables = $this->getAllNonUTF8BinTables($this->connection);
foreach ($tables as $table) {
- $this->emit('\OC\Repair', 'info', array("Change collation for $table ..."));
+ $output->info("Change collation for $table ...");
$query = $this->connection->prepare('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;');
$query->execute();
}
diff --git a/lib/private/repair/dropoldjobs.php b/lib/private/Repair/DropOldJobs.php
index 594af83e511..489b89d0869 100644
--- a/lib/private/repair/dropoldjobs.php
+++ b/lib/private/Repair/DropOldJobs.php
@@ -22,11 +22,11 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
-use OC\RepairStep;
use OCP\BackgroundJob\IJobList;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class DropOldJobs extends BasicEmitter implements RepairStep {
+class DropOldJobs implements IRepairStep {
/** @var IJobList */
protected $jobList;
@@ -53,7 +53,7 @@ class DropOldJobs extends BasicEmitter implements RepairStep {
*
* @throws \Exception in case of failure
*/
- public function run() {
+ public function run(IOutput $output) {
$oldJobs = $this->oldJobs();
foreach($oldJobs as $job) {
if($this->jobList->has($job['class'], $job['arguments'])) {
diff --git a/lib/private/repair/dropoldtables.php b/lib/private/Repair/DropOldTables.php
index abd3bd49b0a..15d5b9a3577 100644
--- a/lib/private/repair/dropoldtables.php
+++ b/lib/private/Repair/DropOldTables.php
@@ -23,11 +23,11 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
-use OC\RepairStep;
use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class DropOldTables extends BasicEmitter implements RepairStep {
+class DropOldTables implements IRepairStep {
/** @var IDBConnection */
protected $connection;
@@ -54,12 +54,10 @@ class DropOldTables extends BasicEmitter implements RepairStep {
*
* @throws \Exception in case of failure
*/
- public function run() {
+ public function run(IOutput $output) {
foreach ($this->oldDatabaseTables() as $tableName) {
if ($this->connection->tableExists($tableName)){
- $this->emit('\OC\Repair', 'info', [
- sprintf('Table %s has been deleted', $tableName)
- ]);
+ $output->info(sprintf('Table %s has been deleted', $tableName));
$this->connection->dropTable($tableName);
}
}
@@ -92,6 +90,13 @@ class DropOldTables extends BasicEmitter implements RepairStep {
'principals',
'queuedtasks',
'sharing',
+ 'clndr_calendars',
+ 'clndr_objects',
+ 'clndr_share_event',
+ 'clndr_share_calendar',
+ 'clndr_repeat',
+ 'contacts_addressbooks',
+ 'contacts_cards'
];
}
}
diff --git a/lib/private/repair/filletags.php b/lib/private/Repair/FillETags.php
index dc2ffdcbc36..7ed55f20ac1 100644
--- a/lib/private/repair/filletags.php
+++ b/lib/private/Repair/FillETags.php
@@ -23,9 +23,10 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class FillETags extends BasicEmitter implements \OC\RepairStep {
+class FillETags implements IRepairStep {
/** @var \OCP\IDBConnection */
protected $connection;
@@ -41,7 +42,7 @@ class FillETags extends BasicEmitter implements \OC\RepairStep {
return 'Generate ETags for file where no ETag is present.';
}
- public function run() {
+ public function run(IOutput $output) {
$qb = $this->connection->getQueryBuilder();
$qb->update('filecache')
->set('etag', $qb->expr()->literal('xxx'))
@@ -49,7 +50,7 @@ class FillETags extends BasicEmitter implements \OC\RepairStep {
->orWhere($qb->expr()->isNull('etag'));
$result = $qb->execute();
- $this->emit('\OC\Repair', 'info', array("ETags have been fixed for $result files/folders."));
+ $output->info("ETags have been fixed for $result files/folders.");
}
}
diff --git a/lib/private/repair/innodb.php b/lib/private/Repair/InnoDB.php
index 4e157e66045..ed119dcc032 100644
--- a/lib/private/repair/innodb.php
+++ b/lib/private/Repair/InnoDB.php
@@ -25,9 +25,10 @@
namespace OC\Repair;
use Doctrine\DBAL\Platforms\MySqlPlatform;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class InnoDB extends BasicEmitter implements \OC\RepairStep {
+class InnoDB implements IRepairStep {
public function getName() {
return 'Repair MySQL database engine';
@@ -36,10 +37,10 @@ class InnoDB extends BasicEmitter implements \OC\RepairStep {
/**
* Fix mime types
*/
- public function run() {
+ public function run(IOutput $output) {
$connection = \OC::$server->getDatabaseConnection();
if (!$connection->getDatabasePlatform() instanceof MySqlPlatform) {
- $this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to do'));
+ $output->info('Not a mysql database -> nothing to do');
return;
}
@@ -47,7 +48,7 @@ class InnoDB extends BasicEmitter implements \OC\RepairStep {
if (is_array($tables)) {
foreach ($tables as $table) {
$connection->exec("ALTER TABLE $table ENGINE=InnoDB;");
- $this->emit('\OC\Repair', 'info', array("Fixed $table"));
+ $output->info("Fixed $table");
}
}
}
diff --git a/lib/private/repair/oldgroupmembershipshares.php b/lib/private/Repair/OldGroupMembershipShares.php
index 627645b116d..e982dd81f3b 100644
--- a/lib/private/repair/oldgroupmembershipshares.php
+++ b/lib/private/Repair/OldGroupMembershipShares.php
@@ -21,14 +21,13 @@
namespace OC\Repair;
-
-use OC\Hooks\BasicEmitter;
-use OC\RepairStep;
use OCP\IDBConnection;
use OCP\IGroupManager;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
use OCP\Share;
-class OldGroupMembershipShares extends BasicEmitter implements RepairStep {
+class OldGroupMembershipShares implements IRepairStep {
/** @var \OCP\IDBConnection */
protected $connection;
@@ -65,7 +64,7 @@ class OldGroupMembershipShares extends BasicEmitter implements RepairStep {
*
* @throws \Exception in case of failure
*/
- public function run() {
+ public function run(IOutput $output) {
$deletedEntries = 0;
$query = $this->connection->getQueryBuilder();
@@ -92,7 +91,7 @@ class OldGroupMembershipShares extends BasicEmitter implements RepairStep {
$result->closeCursor();
if ($deletedEntries) {
- $this->emit('\OC\Repair', 'info', array('Removed ' . $deletedEntries . ' shares where user is not a member of the group anymore'));
+ $output->info('Removed ' . $deletedEntries . ' shares where user is not a member of the group anymore');
}
}
diff --git a/lib/private/repair/preview.php b/lib/private/Repair/Preview.php
index 481e98b42d1..7e26e45cb80 100644
--- a/lib/private/repair/preview.php
+++ b/lib/private/Repair/Preview.php
@@ -21,15 +21,16 @@
namespace OC\Repair;
use OC\Files\View;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class Preview extends BasicEmitter implements \OC\RepairStep {
+class Preview implements IRepairStep {
public function getName() {
return 'Cleaning-up broken previews';
}
- public function run() {
+ public function run(IOutput $out) {
$view = new View('/');
$children = $view->getDirectoryContent('/');
@@ -42,4 +43,4 @@ class Preview extends BasicEmitter implements \OC\RepairStep {
}
}
}
-} \ No newline at end of file
+}
diff --git a/lib/private/repair/removegetetagentries.php b/lib/private/Repair/RemoveGetETagEntries.php
index e118da7973a..67bfb53bf14 100644
--- a/lib/private/repair/removegetetagentries.php
+++ b/lib/private/Repair/RemoveGetETagEntries.php
@@ -21,10 +21,11 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class RemoveGetETagEntries extends BasicEmitter {
+class RemoveGetETagEntries implements IRepairStep {
/**
* @var IDBConnection
@@ -45,15 +46,11 @@ class RemoveGetETagEntries extends BasicEmitter {
/**
* Removes all entries with the key "{DAV:}getetag" from the table properties
*/
- public function run() {
+ public function run(IOutput $out) {
$sql = 'DELETE FROM `*PREFIX*properties`'
. ' WHERE `propertyname` = ?';
$deletedRows = $this->connection->executeUpdate($sql, ['{DAV:}getetag']);
- $this->emit(
- '\OC\Repair',
- 'info',
- ['Removed ' . $deletedRows . ' unneeded "{DAV:}getetag" entries from properties table.']
- );
+ $out->info('Removed ' . $deletedRows . ' unneeded "{DAV:}getetag" entries from properties table.');
}
}
diff --git a/lib/private/repair/repairinvalidshares.php b/lib/private/Repair/RepairInvalidShares.php
index beef5e37798..e30b4ab0d31 100644
--- a/lib/private/repair/repairinvalidshares.php
+++ b/lib/private/Repair/RepairInvalidShares.php
@@ -23,23 +23,20 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
/**
* Repairs shares with invalid data
*/
-class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
+class RepairInvalidShares implements IRepairStep {
const CHUNK_SIZE = 200;
- /**
- * @var \OCP\IConfig
- */
+ /** @var \OCP\IConfig */
protected $config;
- /**
- * @var \OCP\IDBConnection
- */
+ /** @var \OCP\IDBConnection */
protected $connection;
/**
@@ -59,7 +56,7 @@ class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
* Past bugs would make it possible to set an expiration date on user shares even
* though it is not supported. This functions removes the expiration date from such entries.
*/
- private function removeExpirationDateFromNonLinkShares() {
+ private function removeExpirationDateFromNonLinkShares(IOutput $out) {
$builder = $this->connection->getQueryBuilder();
$builder
->update('share')
@@ -69,14 +66,14 @@ class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
$updatedEntries = $builder->execute();
if ($updatedEntries > 0) {
- $this->emit('\OC\Repair', 'info', array('Removed invalid expiration date from ' . $updatedEntries . ' shares'));
+ $out->info('Removed invalid expiration date from ' . $updatedEntries . ' shares');
}
}
/**
* Remove shares where the parent share does not exist anymore
*/
- private function removeSharesNonExistingParent() {
+ private function removeSharesNonExistingParent(IOutput $out) {
$deletedEntries = 0;
$query = $this->connection->getQueryBuilder();
@@ -105,17 +102,17 @@ class RepairInvalidShares extends BasicEmitter implements \OC\RepairStep {
}
if ($deletedEntries) {
- $this->emit('\OC\Repair', 'info', array('Removed ' . $deletedEntries . ' shares where the parent did not exist'));
+ $out->info('Removed ' . $deletedEntries . ' shares where the parent did not exist');
}
}
- public function run() {
+ public function run(IOutput $out) {
$ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
if (version_compare($ocVersionFromBeforeUpdate, '8.2.0.7', '<')) {
// this situation was only possible before 8.2
- $this->removeExpirationDateFromNonLinkShares();
+ $this->removeExpirationDateFromNonLinkShares($out);
}
- $this->removeSharesNonExistingParent();
+ $this->removeSharesNonExistingParent($out);
}
}
diff --git a/lib/private/repair/repairlegacystorages.php b/lib/private/Repair/RepairLegacyStorages.php
index ee189110a87..9582629b1a3 100644
--- a/lib/private/repair/repairlegacystorages.php
+++ b/lib/private/Repair/RepairLegacyStorages.php
@@ -24,10 +24,11 @@
namespace OC\Repair;
use OC\Files\Cache\Storage;
-use OC\Hooks\BasicEmitter;
use OC\RepairException;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class RepairLegacyStorages extends BasicEmitter {
+class RepairLegacyStorages implements IRepairStep{
/**
* @var \OCP\IConfig
*/
@@ -149,7 +150,7 @@ class RepairLegacyStorages extends BasicEmitter {
* Converts legacy home storage ids in the format
* "local::/data/dir/path/userid/" to the new format "home::userid"
*/
- public function run() {
+ public function run(IOutput $out) {
// only run once
if ($this->config->getAppValue('core', 'repairlegacystoragesdone') === 'yes') {
return;
@@ -186,11 +187,7 @@ class RepairLegacyStorages extends BasicEmitter {
}
catch (RepairException $e) {
$hasWarnings = true;
- $this->emit(
- '\OC\Repair',
- 'warning',
- array('Could not repair legacy storage ' . $currentId . ' automatically.')
- );
+ $out->warning('Could not repair legacy storage ' . $currentId . ' automatically.');
}
}
@@ -233,11 +230,7 @@ class RepairLegacyStorages extends BasicEmitter {
}
catch (RepairException $e) {
$hasWarnings = true;
- $this->emit(
- '\OC\Repair',
- 'warning',
- array('Could not repair legacy storage ' . $storageId . ' automatically.')
- );
+ $out->warning('Could not repair legacy storage ' . $storageId . ' automatically.');
}
}
}
@@ -245,16 +238,12 @@ class RepairLegacyStorages extends BasicEmitter {
} while (count($results) >= $limit);
}
- $this->emit('\OC\Repair', 'info', array('Updated ' . $count . ' legacy home storage ids'));
+ $out->info('Updated ' . $count . ' legacy home storage ids');
$this->connection->commit();
if ($hasWarnings) {
- $this->emit(
- '\OC\Repair',
- 'warning',
- array('Some legacy storages could not be repaired. Please manually fix them then re-run ./occ maintenance:repair')
- );
+ $out->warning('Some legacy storages could not be repaired. Please manually fix them then re-run ./occ maintenance:repair');
} else {
// if all were done, no need to redo the repair during next upgrade
$this->config->setAppValue('core', 'repairlegacystoragesdone', 'yes');
diff --git a/lib/private/repair/repairmimetypes.php b/lib/private/Repair/RepairMimeTypes.php
index c5180302443..0d56245312a 100644
--- a/lib/private/repair/repairmimetypes.php
+++ b/lib/private/Repair/RepairMimeTypes.php
@@ -28,9 +28,10 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
+class RepairMimeTypes implements IRepairStep {
/**
* @var \OCP\IConfig
*/
@@ -308,7 +309,7 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
/**
* Fix mime types
*/
- public function run() {
+ public function run(IOutput $out) {
$ocVersionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
@@ -318,60 +319,60 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
// only update mime types if necessary as it can be expensive
if (version_compare($ocVersionFromBeforeUpdate, '8.2.0', '<')) {
if ($this->fixOfficeMimeTypes()) {
- $this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
+ $out->info('Fixed office mime types');
}
if ($this->fixApkMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed APK mime type'));
+ $out->info('Fixed APK mime type');
}
if ($this->fixFontsMimeTypes()) {
- $this->emit('\OC\Repair', 'info', array('Fixed fonts mime types'));
+ $out->info('Fixed fonts mime types');
}
if ($this->fixPostscriptMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Postscript mime types'));
+ $out->info('Fixed Postscript mime types');
}
if ($this->introduceRawMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Raw mime types'));
+ $out->info('Fixed Raw mime types');
}
if ($this->introduce3dImagesMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed 3D images mime types'));
+ $out->info('Fixed 3D images mime types');
}
if ($this->introduceConfMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Conf/cnf mime types'));
+ $out->info('Fixed Conf/cnf mime types');
}
if ($this->introduceYamlMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed Yaml/Yml mime types'));
+ $out->info('Fixed Yaml/Yml mime types');
}
}
// Mimetype updates from #19272
if (version_compare($ocVersionFromBeforeUpdate, '8.2.0.8', '<')) {
if ($this->introduceJavaMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed java/class mime types'));
+ $out->info('Fixed java/class mime types');
}
if ($this->introduceHppMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed hpp mime type'));
+ $out->info('Fixed hpp mime type');
}
if ($this->introduceRssMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed rss mime type'));
+ $out->info('Fixed rss mime type');
}
if ($this->introduceRtfMimeType()) {
- $this->emit('\OC\Repair', 'info', array('Fixed rtf mime type'));
+ $out->info('Fixed rtf mime type');
}
}
if (version_compare($ocVersionFromBeforeUpdate, '9.0.0.10', '<')) {
if ($this->introduceRichDocumentsMimeTypes()) {
- $this->emit('\OC\Repair', 'info', array('Fixed richdocuments additional office mime types'));
+ $out->info('Fixed richdocuments additional office mime types');
}
}
}
diff --git a/lib/private/repair/searchlucenetables.php b/lib/private/Repair/SearchLuceneTables.php
index 9f3601eeb03..56bae6ff655 100644
--- a/lib/private/repair/searchlucenetables.php
+++ b/lib/private/Repair/SearchLuceneTables.php
@@ -22,9 +22,10 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
-class SearchLuceneTables extends BasicEmitter implements \OC\RepairStep {
+class SearchLuceneTables implements IRepairStep {
public function getName() {
return 'Repair duplicate entries in oc_lucene_status';
@@ -51,10 +52,10 @@ class SearchLuceneTables extends BasicEmitter implements \OC\RepairStep {
*
* search_lucene will then reindex the fileids without a status when the next indexing job is executed
*/
- public function run() {
+ public function run(IOutput $out) {
$connection = \OC::$server->getDatabaseConnection();
if ($connection->tableExists('lucene_status')) {
- $this->emit('\OC\Repair', 'info', array('removing duplicate entries from lucene_status'));
+ $out->info('removing duplicate entries from lucene_status');
$query = $connection->prepare('
DELETE FROM `*PREFIX*lucene_status`
@@ -69,7 +70,7 @@ class SearchLuceneTables extends BasicEmitter implements \OC\RepairStep {
)');
$query->execute();
} else {
- $this->emit('\OC\Repair', 'info', array('lucene_status table does not exist -> nothing to do'));
+ $out->info('lucene_status table does not exist -> nothing to do');
}
}
diff --git a/lib/private/repair/sharepropagation.php b/lib/private/Repair/SharePropagation.php
index 26d7a9e128c..cd0c091b325 100644
--- a/lib/private/repair/sharepropagation.php
+++ b/lib/private/Repair/SharePropagation.php
@@ -20,10 +20,12 @@
*/
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
use OCP\IConfig;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+class SharePropagation implements IRepairStep {
-class SharePropagation extends BasicEmitter implements \OC\RepairStep {
/** @var IConfig */
private $config;
@@ -40,7 +42,7 @@ class SharePropagation extends BasicEmitter implements \OC\RepairStep {
return 'Remove old share propagation app entries';
}
- public function run() {
+ public function run(IOutput $out ) {
$keys = $this->config->getAppKeys('files_sharing');
foreach ($keys as $key) {
diff --git a/lib/private/repair/sqliteautoincrement.php b/lib/private/Repair/SqliteAutoincrement.php
index d7cac57229d..e6f90dcece3 100644
--- a/lib/private/repair/sqliteautoincrement.php
+++ b/lib/private/Repair/SqliteAutoincrement.php
@@ -26,13 +26,14 @@ use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Schema\SchemaDiff;
use Doctrine\DBAL\Schema\TableDiff;
use Doctrine\DBAL\Schema\ColumnDiff;
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
/**
* Fixes Sqlite autoincrement by forcing the SQLite table schemas to be
* altered in order to retrigger SQL schema generation through OCSqlitePlatform.
*/
-class SqliteAutoincrement extends BasicEmitter implements \OC\RepairStep {
+class SqliteAutoincrement implements IRepairStep {
/**
* @var \OC\DB\Connection
*/
@@ -52,7 +53,7 @@ class SqliteAutoincrement extends BasicEmitter implements \OC\RepairStep {
/**
* Fix mime types
*/
- public function run() {
+ public function run(IOutput $out) {
if (!$this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
return;
}
diff --git a/lib/private/repair/updatecertificatestore.php b/lib/private/Repair/UpdateCertificateStore.php
index ae7585f07f6..9397fc77bce 100644
--- a/lib/private/repair/updatecertificatestore.php
+++ b/lib/private/Repair/UpdateCertificateStore.php
@@ -22,10 +22,10 @@
namespace OC\Repair;
use OC\Files\View;
-use OC\Hooks\BasicEmitter;
-use OC\RepairStep;
use OC\Server;
use OCP\IConfig;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
/**
* Class UpdateCertificateStore rewrites the user specific certificate store after
@@ -34,7 +34,7 @@ use OCP\IConfig;
*
* @package OC\Repair
*/
-class UpdateCertificateStore extends BasicEmitter implements RepairStep {
+class UpdateCertificateStore implements IRepairStep {
/**
* FIXME: The certificate manager does only allow specifying the user
* within the constructor. This makes DI impossible.
@@ -60,7 +60,7 @@ class UpdateCertificateStore extends BasicEmitter implements RepairStep {
}
/** {@inheritDoc} */
- public function run() {
+ public function run(IOutput $out) {
$rootView = new View();
$dataDirectory = $this->config->getSystemValue('datadirectory', null);
if(is_null($dataDirectory)) {
diff --git a/lib/private/repair/updateoutdatedocsids.php b/lib/private/Repair/UpdateOutdatedOcsIds.php
index 60024b3055c..4c768e93bd6 100644
--- a/lib/private/repair/updateoutdatedocsids.php
+++ b/lib/private/Repair/UpdateOutdatedOcsIds.php
@@ -21,9 +21,9 @@
namespace OC\Repair;
-use OC\Hooks\BasicEmitter;
-use OC\RepairStep;
use OCP\IConfig;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
/**
* Class UpdateOutdatedOcsIds is used to update invalid outdated OCS IDs, this is
@@ -33,7 +33,7 @@ use OCP\IConfig;
*
* @package OC\Repair
*/
-class UpdateOutdatedOcsIds extends BasicEmitter implements RepairStep {
+class UpdateOutdatedOcsIds implements IRepairStep {
/** @var IConfig */
private $config;
@@ -71,7 +71,7 @@ class UpdateOutdatedOcsIds extends BasicEmitter implements RepairStep {
/**
* {@inheritdoc}
*/
- public function run() {
+ public function run(IOutput $output) {
$appsToUpdate = [
'contacts' => [
'old' => '166044',
@@ -97,11 +97,7 @@ class UpdateOutdatedOcsIds extends BasicEmitter implements RepairStep {
foreach($appsToUpdate as $appName => $ids) {
if ($this->fixOcsId($appName, $ids['old'], $ids['new'])) {
- $this->emit(
- '\OC\Repair',
- 'info',
- [sprintf('Fixed invalid %s OCS id', $appName)]
- );
+ $output->info("Fixed invalid $appName OCS id");
}
}
}
diff --git a/lib/private/route/cachingrouter.php b/lib/private/Route/CachingRouter.php
index d6270dcf2c7..d6270dcf2c7 100644
--- a/lib/private/route/cachingrouter.php
+++ b/lib/private/Route/CachingRouter.php
diff --git a/lib/private/route/route.php b/lib/private/Route/Route.php
index 966790a63c0..966790a63c0 100644
--- a/lib/private/route/route.php
+++ b/lib/private/Route/Route.php
diff --git a/lib/private/route/router.php b/lib/private/Route/Router.php
index ef02b5aba0e..ef02b5aba0e 100644
--- a/lib/private/route/router.php
+++ b/lib/private/Route/Router.php
diff --git a/lib/private/search/provider/file.php b/lib/private/Search/Provider/File.php
index 69ffbd3ae6b..69ffbd3ae6b 100644
--- a/lib/private/search/provider/file.php
+++ b/lib/private/Search/Provider/File.php
diff --git a/lib/private/search/result/audio.php b/lib/private/Search/Result/Audio.php
index 3f9b3dc640c..3f9b3dc640c 100644
--- a/lib/private/search/result/audio.php
+++ b/lib/private/Search/Result/Audio.php
diff --git a/lib/private/search/result/file.php b/lib/private/Search/Result/File.php
index f1347001eaf..f1347001eaf 100644
--- a/lib/private/search/result/file.php
+++ b/lib/private/Search/Result/File.php
diff --git a/lib/private/search/result/folder.php b/lib/private/Search/Result/Folder.php
index 6f0c0a7b2a5..6f0c0a7b2a5 100644
--- a/lib/private/search/result/folder.php
+++ b/lib/private/Search/Result/Folder.php
diff --git a/lib/private/search/result/image.php b/lib/private/Search/Result/Image.php
index 87b36fc9f73..87b36fc9f73 100644
--- a/lib/private/search/result/image.php
+++ b/lib/private/Search/Result/Image.php
diff --git a/lib/private/security/csp/contentsecuritypolicy.php b/lib/private/Security/CSP/ContentSecurityPolicy.php
index 25eacfab1d6..25eacfab1d6 100644
--- a/lib/private/security/csp/contentsecuritypolicy.php
+++ b/lib/private/Security/CSP/ContentSecurityPolicy.php
diff --git a/lib/private/security/csp/contentsecuritypolicymanager.php b/lib/private/Security/CSP/ContentSecurityPolicyManager.php
index 760cd36e56b..760cd36e56b 100644
--- a/lib/private/security/csp/contentsecuritypolicymanager.php
+++ b/lib/private/Security/CSP/ContentSecurityPolicyManager.php
diff --git a/lib/private/security/csrf/csrftoken.php b/lib/private/Security/CSRF/CsrfToken.php
index 4524d0db6e6..4524d0db6e6 100644
--- a/lib/private/security/csrf/csrftoken.php
+++ b/lib/private/Security/CSRF/CsrfToken.php
diff --git a/lib/private/security/csrf/csrftokengenerator.php b/lib/private/Security/CSRF/CsrfTokenGenerator.php
index 6ea71636d22..6ea71636d22 100644
--- a/lib/private/security/csrf/csrftokengenerator.php
+++ b/lib/private/Security/CSRF/CsrfTokenGenerator.php
diff --git a/lib/private/security/csrf/csrftokenmanager.php b/lib/private/Security/CSRF/CsrfTokenManager.php
index 8d1bf5c0819..8d1bf5c0819 100644
--- a/lib/private/security/csrf/csrftokenmanager.php
+++ b/lib/private/Security/CSRF/CsrfTokenManager.php
diff --git a/lib/private/security/csrf/tokenstorage/sessionstorage.php b/lib/private/Security/CSRF/TokenStorage/SessionStorage.php
index e1c8c96e920..e1c8c96e920 100644
--- a/lib/private/security/csrf/tokenstorage/sessionstorage.php
+++ b/lib/private/Security/CSRF/TokenStorage/SessionStorage.php
diff --git a/lib/private/security/certificate.php b/lib/private/Security/Certificate.php
index 54486ff51fe..9aca278174e 100644
--- a/lib/private/security/certificate.php
+++ b/lib/private/Security/Certificate.php
@@ -50,6 +50,13 @@ class Certificate implements ICertificate {
public function __construct($data, $name) {
$this->name = $name;
$gmt = new \DateTimeZone('GMT');
+
+ // If string starts with "file://" ignore the certificate
+ $query = 'file://';
+ if(strtolower(substr($data, 0, strlen($query))) === $query) {
+ throw new \Exception('Certificate could not get parsed.');
+ }
+
$info = openssl_x509_parse($data);
if(!is_array($info)) {
throw new \Exception('Certificate could not get parsed.');
diff --git a/lib/private/security/certificatemanager.php b/lib/private/Security/CertificateManager.php
index f4932ca568e..f4932ca568e 100644
--- a/lib/private/security/certificatemanager.php
+++ b/lib/private/Security/CertificateManager.php
diff --git a/lib/private/security/credentialsmanager.php b/lib/private/Security/CredentialsManager.php
index d4104dbe712..d4104dbe712 100644
--- a/lib/private/security/credentialsmanager.php
+++ b/lib/private/Security/CredentialsManager.php
diff --git a/lib/private/security/crypto.php b/lib/private/Security/Crypto.php
index 3c3ffb47398..3c3ffb47398 100644
--- a/lib/private/security/crypto.php
+++ b/lib/private/Security/Crypto.php
diff --git a/lib/private/security/hasher.php b/lib/private/Security/Hasher.php
index a8b81aa60eb..a8b81aa60eb 100644
--- a/lib/private/security/hasher.php
+++ b/lib/private/Security/Hasher.php
diff --git a/lib/private/security/securerandom.php b/lib/private/Security/SecureRandom.php
index 45cb3f17ee4..45cb3f17ee4 100644
--- a/lib/private/security/securerandom.php
+++ b/lib/private/Security/SecureRandom.php
diff --git a/lib/private/security/trusteddomainhelper.php b/lib/private/Security/TrustedDomainHelper.php
index 409628677a7..409628677a7 100644
--- a/lib/private/security/trusteddomainhelper.php
+++ b/lib/private/Security/TrustedDomainHelper.php
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 2ce895c6f72..d37edc4f45f 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -48,6 +48,7 @@ use OC\Diagnostics\QueryLogger;
use OC\Files\Config\UserMountCache;
use OC\Files\Config\UserMountCacheListener;
use OC\Files\Node\HookConnector;
+use OC\Files\Node\LazyRoot;
use OC\Files\Node\Root;
use OC\Files\View;
use OC\Http\Client\ClientService;
@@ -73,6 +74,7 @@ use OC\Security\SecureRandom;
use OC\Security\TrustedDomainHelper;
use OC\Session\CryptoWrapper;
use OC\Tagging\TagMapper;
+use OCP\IL10N;
use OCP\IServerContainer;
use OCP\Security\IContentSecurityPolicyManager;
use Symfony\Component\EventDispatcher\EventDispatcher;
@@ -172,6 +174,11 @@ class Server extends ServerContainer implements IServerContainer {
$connector->viewToNode();
return $root;
});
+ $this->registerService('LazyRootFolder', function(Server $c) {
+ return new LazyRoot(function() use ($c) {
+ return $c->getRootFolder();
+ });
+ });
$this->registerService('UserManager', function (Server $c) {
$config = $c->getConfig();
return new \OC\User\Manager($config);
@@ -621,7 +628,7 @@ class Server extends ServerContainer implements IServerContainer {
$c->getL10N('core'),
$factory,
$c->getUserManager(),
- $c->getRootFolder()
+ $c->getLazyRootFolder()
);
return $manager;
@@ -728,6 +735,17 @@ class Server extends ServerContainer implements IServerContainer {
}
/**
+ * Returns the root folder of ownCloud's data directory
+ * This is the lazy variant so this gets only initialized once it
+ * is actually used.
+ *
+ * @return \OCP\Files\IRootFolder
+ */
+ public function getLazyRootFolder() {
+ return $this->query('LazyRootFolder');
+ }
+
+ /**
* Returns a view to ownCloud's files folder
*
* @param string $userId user ID
@@ -840,7 +858,7 @@ class Server extends ServerContainer implements IServerContainer {
*
* @param string $app appid
* @param string $lang
- * @return \OC_L10N
+ * @return IL10N
*/
public function getL10N($app, $lang = null) {
return $this->getL10NFactory()->get($app, $lang);
diff --git a/lib/private/session/cryptosessiondata.php b/lib/private/Session/CryptoSessionData.php
index f6c585c1611..f6c585c1611 100644
--- a/lib/private/session/cryptosessiondata.php
+++ b/lib/private/Session/CryptoSessionData.php
diff --git a/lib/private/session/cryptowrapper.php b/lib/private/Session/CryptoWrapper.php
index f1819b31b89..f1819b31b89 100644
--- a/lib/private/session/cryptowrapper.php
+++ b/lib/private/Session/CryptoWrapper.php
diff --git a/lib/private/session/internal.php b/lib/private/Session/Internal.php
index 09175bf1f2f..09175bf1f2f 100644
--- a/lib/private/session/internal.php
+++ b/lib/private/Session/Internal.php
diff --git a/lib/private/session/memory.php b/lib/private/Session/Memory.php
index 777458a9aa5..777458a9aa5 100644
--- a/lib/private/session/memory.php
+++ b/lib/private/Session/Memory.php
diff --git a/lib/private/session/session.php b/lib/private/Session/Session.php
index 198d0049956..198d0049956 100644
--- a/lib/private/session/session.php
+++ b/lib/private/Session/Session.php
diff --git a/lib/private/setup/abstractdatabase.php b/lib/private/Setup/AbstractDatabase.php
index 90203b67c1d..90203b67c1d 100644
--- a/lib/private/setup/abstractdatabase.php
+++ b/lib/private/Setup/AbstractDatabase.php
diff --git a/lib/private/setup/mysql.php b/lib/private/Setup/MySQL.php
index ba1b2ca854c..18b6dab4ff8 100644
--- a/lib/private/setup/mysql.php
+++ b/lib/private/Setup/MySQL.php
@@ -43,7 +43,7 @@ class MySQL extends AbstractDatabase {
$query='select count(*) from information_schema.tables where table_schema=? AND table_name = ?';
$result = $connection->executeQuery($query, [$this->dbName, $this->tablePrefix.'users']);
$row = $result->fetch();
- if(!$result or $row[0]==0) {
+ if (!$row or $row['count(*)'] === '0') {
\OC_DB::createDbFromStructure($this->dbDefinitionFile);
}
}
diff --git a/lib/private/setup/oci.php b/lib/private/Setup/OCI.php
index a398876ad16..a398876ad16 100644
--- a/lib/private/setup/oci.php
+++ b/lib/private/Setup/OCI.php
diff --git a/lib/private/setup/postgresql.php b/lib/private/Setup/PostgreSQL.php
index 893999bb0b9..893999bb0b9 100644
--- a/lib/private/setup/postgresql.php
+++ b/lib/private/Setup/PostgreSQL.php
diff --git a/lib/private/setup/sqlite.php b/lib/private/Setup/Sqlite.php
index 61bc501fd75..61bc501fd75 100644
--- a/lib/private/setup/sqlite.php
+++ b/lib/private/Setup/Sqlite.php
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index b1f3b4dab83..f0de39fdad3 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -910,4 +910,42 @@ class DefaultShareProvider implements IShareProvider {
->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
$qb->execute();
}
+
+ /**
+ * Delete custom group shares to this group for this user
+ *
+ * @param string $uid
+ * @param string $gid
+ */
+ public function userDeletedFromGroup($uid, $gid) {
+ /*
+ * Get all group shares
+ */
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->select('id')
+ ->from('share')
+ ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
+ ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
+
+ $cursor = $qb->execute();
+ $ids = [];
+ while($row = $cursor->fetch()) {
+ $ids[] = (int)$row['id'];
+ }
+ $cursor->closeCursor();
+
+ if (!empty($ids)) {
+ $chunks = array_chunk($ids, 100);
+ foreach ($chunks as $chunk) {
+ /*
+ * Delete all special shares wit this users for the found group shares
+ */
+ $qb->delete('share')
+ ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
+ ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($uid)))
+ ->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
+ $qb->execute();
+ }
+ }
+ }
}
diff --git a/lib/private/Share20/Hooks.php b/lib/private/Share20/Hooks.php
index b391ffce8d5..f29114a1b5d 100644
--- a/lib/private/Share20/Hooks.php
+++ b/lib/private/Share20/Hooks.php
@@ -28,4 +28,8 @@ class Hooks {
public static function post_deleteGroup($arguments) {
\OC::$server->getShareManager()->groupDeleted($arguments['gid']);
}
+
+ public static function post_removeFromGroup($arguments) {
+ \OC::$server->getShareManager()->userDeletedFromGroup($arguments['uid'], $arguments['gid']);
+ }
}
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index af846b9283c..dee9e0cdd21 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -237,6 +237,17 @@ class Manager implements IManager {
if (($share->getPermissions() & \OCP\Constants::PERMISSION_READ) === 0) {
throw new \InvalidArgumentException('Shares need at least read permissions');
}
+
+ if ($share->getNode() instanceof \OCP\Files\File) {
+ if ($share->getPermissions() & \OCP\Constants::PERMISSION_DELETE) {
+ $message_t = $this->l->t('Files can\'t be shared with delete permissions');
+ throw new GenericShareException($message_t);
+ }
+ if ($share->getPermissions() & \OCP\Constants::PERMISSION_CREATE) {
+ $message_t = $this->l->t('Files can\'t be shared with create permissions');
+ throw new GenericShareException($message_t);
+ }
+ }
}
/**
@@ -505,6 +516,24 @@ class Manager implements IManager {
$this->generalCreateChecks($share);
+ // Verify if there are any issues with the path
+ $this->pathCreateChecks($share->getNode());
+
+ /*
+ * On creation of a share the owner is always the owner of the path
+ * Except for mounted federated shares.
+ */
+ $storage = $share->getNode()->getStorage();
+ if ($storage->instanceOfStorage('OCA\Files_Sharing\External\Storage')) {
+ $parent = $share->getNode()->getParent();
+ while($parent->getStorage()->instanceOfStorage('OCA\Files_Sharing\External\Storage')) {
+ $parent = $parent->getParent();
+ }
+ $share->setShareOwner($parent->getOwner()->getUID());
+ } else {
+ $share->setShareOwner($share->getNode()->getOwner()->getUID());
+ }
+
//Verify share type
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
$this->userCreateChecks($share);
@@ -538,24 +567,6 @@ class Manager implements IManager {
}
}
- // Verify if there are any issues with the path
- $this->pathCreateChecks($share->getNode());
-
- /*
- * On creation of a share the owner is always the owner of the path
- * Except for mounted federated shares.
- */
- $storage = $share->getNode()->getStorage();
- if ($storage->instanceOfStorage('OCA\Files_Sharing\External\Storage')) {
- $parent = $share->getNode()->getParent();
- while($parent->getStorage()->instanceOfStorage('OCA\Files_Sharing\External\Storage')) {
- $parent = $parent->getParent();
- }
- $share->setShareOwner($parent->getOwner()->getUID());
- } else {
- $share->setShareOwner($share->getNode()->getOwner()->getUID());
- }
-
// Cannot share with the owner
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER &&
$share->getSharedWith() === $share->getShareOwner()) {
@@ -818,7 +829,7 @@ class Manager implements IManager {
* @param string $recipientId
*/
public function deleteFromSelf(\OCP\Share\IShare $share, $recipientId) {
- list($providerId, ) = $this->splitFullId($share->getId());
+ list($providerId, ) = $this->splitFullId($share->getFullId());
$provider = $this->factory->getProvider($providerId);
$provider->deleteFromSelf($share, $recipientId);
@@ -844,7 +855,7 @@ class Manager implements IManager {
}
}
- list($providerId, ) = $this->splitFullId($share->getId());
+ list($providerId, ) = $this->splitFullId($share->getFullId());
$provider = $this->factory->getProvider($providerId);
$provider->move($share, $recipientId);
@@ -979,7 +990,7 @@ class Manager implements IManager {
try {
$share = $provider->getShareByToken($token);
} catch (ShareNotFound $e) {
- //Ignore
+ $share = null;
}
// If it is not a link share try to fetch a federated share by token
@@ -1057,6 +1068,14 @@ class Manager implements IManager {
}
/**
+ * @inheritdoc
+ */
+ public function userDeletedFromGroup($uid, $gid) {
+ $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_GROUP);
+ $provider->userDeletedFromGroup($uid, $gid);
+ }
+
+ /**
* Get access list to a path. This means
* all the users and groups that can access a given path.
*
diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php
index fdb2dacb0fc..0bedfb84fc7 100644
--- a/lib/private/Share20/ProviderFactory.php
+++ b/lib/private/Share20/ProviderFactory.php
@@ -63,7 +63,7 @@ class ProviderFactory implements IProviderFactory {
$this->serverContainer->getDatabaseConnection(),
$this->serverContainer->getUserManager(),
$this->serverContainer->getGroupManager(),
- $this->serverContainer->getRootFolder()
+ $this->serverContainer->getLazyRootFolder()
);
}
@@ -114,7 +114,8 @@ class ProviderFactory implements IProviderFactory {
$tokenHandler,
$l,
$this->serverContainer->getLogger(),
- $this->serverContainer->getRootFolder()
+ $this->serverContainer->getLazyRootFolder(),
+ $this->serverContainer->getConfig()
);
}
diff --git a/lib/private/systemtag/managerfactory.php b/lib/private/SystemTag/ManagerFactory.php
index d9acf327f8a..d9acf327f8a 100644
--- a/lib/private/systemtag/managerfactory.php
+++ b/lib/private/SystemTag/ManagerFactory.php
diff --git a/lib/private/systemtag/systemtag.php b/lib/private/SystemTag/SystemTag.php
index 559b6fdefa8..559b6fdefa8 100644
--- a/lib/private/systemtag/systemtag.php
+++ b/lib/private/SystemTag/SystemTag.php
diff --git a/lib/private/systemtag/systemtagmanager.php b/lib/private/SystemTag/SystemTagManager.php
index 76a60a91328..76a60a91328 100644
--- a/lib/private/systemtag/systemtagmanager.php
+++ b/lib/private/SystemTag/SystemTagManager.php
diff --git a/lib/private/systemtag/systemtagobjectmapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php
index 412842b69e3..412842b69e3 100644
--- a/lib/private/systemtag/systemtagobjectmapper.php
+++ b/lib/private/SystemTag/SystemTagObjectMapper.php
diff --git a/lib/private/tagging/tag.php b/lib/private/Tagging/Tag.php
index e35ac433e00..e35ac433e00 100644
--- a/lib/private/tagging/tag.php
+++ b/lib/private/Tagging/Tag.php
diff --git a/lib/private/tagging/tagmapper.php b/lib/private/Tagging/TagMapper.php
index 364dbc99b4d..364dbc99b4d 100644
--- a/lib/private/tagging/tagmapper.php
+++ b/lib/private/Tagging/TagMapper.php
diff --git a/lib/private/Updater/VersionCheck.php b/lib/private/Updater/VersionCheck.php
new file mode 100644
index 00000000000..e42a1e2a40c
--- /dev/null
+++ b/lib/private/Updater/VersionCheck.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ * @author Bart Visscher <bartv@thisnet.nl>
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Frank Karlitschek <frank@owncloud.org>
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Lukas Reschke <lukas@owncloud.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Robin Appelman <icewind@owncloud.com>
+ * @author Robin McCorkell <robin@mccorkell.me.uk>
+ * @author Steffen Lindner <mail@steffen-lindner.de>
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @author Victor Dubiniuk <dubiniuk@owncloud.com>
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Updater;
+
+use OC_Util;
+use OCP\Http\Client\IClientService;
+use OCP\IConfig;
+use OC\Setup;
+use OCP\Util;
+
+class VersionCheck {
+
+ /** @var IClientService */
+ private $clientService;
+
+ /** @var IConfig */
+ private $config;
+
+ /**
+ * @param IClientService $clientService
+ * @param IConfig $config
+ */
+ public function __construct(IClientService $clientService,
+ IConfig $config) {
+ $this->clientService = $clientService;
+ $this->config = $config;
+ }
+
+
+ /**
+ * Check if a new version is available
+ *
+ * @param string $updaterUrl the url to check, i.e. 'http://apps.owncloud.com/updater.php'
+ * @return array|bool
+ */
+ public function check($updaterUrl = null) {
+
+ // Look up the cache - it is invalidated all 30 minutes
+ if (((int)$this->config->getAppValue('core', 'lastupdatedat') + 1800) > time()) {
+ return json_decode($this->config->getAppValue('core', 'lastupdateResult'), true);
+ }
+
+ if (is_null($updaterUrl)) {
+ $updaterUrl = 'https://updates.owncloud.com/server/';
+ }
+
+ $this->config->setAppValue('core', 'lastupdatedat', time());
+
+ if ($this->config->getAppValue('core', 'installedat', '') === '') {
+ $this->config->setAppValue('core', 'installedat', microtime(true));
+ }
+
+ $version = Util::getVersion();
+ $version['installed'] = $this->config->getAppValue('core', 'installedat');
+ $version['updated'] = $this->config->getAppValue('core', 'lastupdatedat');
+ $version['updatechannel'] = \OC_Util::getChannel();
+ $version['edition'] = \OC_Util::getEditionString();
+ $version['build'] = \OC_Util::getBuild();
+ $versionString = implode('x', $version);
+
+ //fetch xml data from updater
+ $url = $updaterUrl . '?version=' . $versionString;
+
+ $tmp = [];
+ $xml = $this->getUrlContent($url);
+ if ($xml) {
+ $loadEntities = libxml_disable_entity_loader(true);
+ $data = @simplexml_load_string($xml);
+ libxml_disable_entity_loader($loadEntities);
+ if ($data !== false) {
+ $tmp['version'] = (string)$data->version;
+ $tmp['versionstring'] = (string)$data->versionstring;
+ $tmp['url'] = (string)$data->url;
+ $tmp['web'] = (string)$data->web;
+ } else {
+ libxml_clear_errors();
+ }
+ } else {
+ $data = [];
+ }
+
+ // Cache the result
+ $this->config->setAppValue('core', 'lastupdateResult', json_encode($data));
+ return $tmp;
+ }
+
+ /**
+ * @codeCoverageIgnore
+ * @param string $url
+ * @return bool|resource|string
+ */
+ protected function getUrlContent($url) {
+ try {
+ $client = $this->clientService->newClient();
+ $response = $client->get($url);
+ return $response->getBody();
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+}
+
diff --git a/lib/private/api.php b/lib/private/api.php
index 12a78f1424b..bab879c95f8 100644
--- a/lib/private/api.php
+++ b/lib/private/api.php
@@ -179,7 +179,7 @@ class OC_API {
$response = self::mergeResponses($responses);
$format = self::requestedFormat();
if (self::$logoutRequired) {
- OC_User::logout();
+ \OC::$server->getUserSession()->logout();
}
self::respond($response, $format);
diff --git a/lib/private/app.php b/lib/private/app.php
index 05d220f7d38..7bcbef32531 100644
--- a/lib/private/app.php
+++ b/lib/private/app.php
@@ -47,6 +47,7 @@
use OC\App\DependencyAnalyzer;
use OC\App\Platform;
use OC\OCSClient;
+use OC\Repair;
/**
* This class manages the apps. It allows them to register and integrate in the
@@ -159,8 +160,16 @@ class OC_App {
* @param string $app app name
*/
private static function requireAppFile($app) {
- // encapsulated here to avoid variable scope conflicts
- require_once $app . '/appinfo/app.php';
+ try {
+ // encapsulated here to avoid variable scope conflicts
+ require_once $app . '/appinfo/app.php';
+ } catch (Error $ex) {
+ \OC::$server->getLogger()->logException($ex);
+ $blacklist = \OC::$server->getAppManager()->getAlwaysEnabledApps();
+ if (!in_array($app, $blacklist)) {
+ self::disable($app);
+ }
+ }
}
/**
@@ -618,7 +627,7 @@ class OC_App {
$file = $appPath . '/appinfo/info.xml';
}
- $parser = new \OC\App\InfoParser(\OC::$server->getHTTPHelper(), \OC::$server->getURLGenerator());
+ $parser = new \OC\App\InfoParser(\OC::$server->getURLGenerator());
$data = $parser->parse($file);
if (is_array($data)) {
@@ -1023,7 +1032,6 @@ class OC_App {
if (!empty($requireMax)
&& version_compare(self::adjustVersionParts($ocVersion, $requireMax), $requireMax, '>')
) {
-
return false;
}
@@ -1043,7 +1051,6 @@ class OC_App {
return $versions;
}
-
/**
* @param string $app
* @return bool
@@ -1140,9 +1147,12 @@ class OC_App {
if($appPath === false) {
return false;
}
+ $appData = self::getAppInfo($appId);
+ self::executeRepairSteps($appId, $appData['repair-steps']['pre-migration']);
if (file_exists($appPath . '/appinfo/database.xml')) {
OC_DB::updateDbFromStructure($appPath . '/appinfo/database.xml');
}
+ self::executeRepairSteps($appId, $appData['repair-steps']['post-migration']);
unset(self::$appVersion[$appId]);
// run upgrade code
if (file_exists($appPath . '/appinfo/update.php')) {
@@ -1151,7 +1161,6 @@ class OC_App {
}
//set remote/public handlers
- $appData = self::getAppInfo($appId);
if (array_key_exists('ocsid', $appData)) {
\OC::$server->getConfig()->setAppValue($appId, 'ocsid', $appData['ocsid']);
} elseif(\OC::$server->getConfig()->getAppValue($appId, 'ocsid', null) !== null) {
@@ -1174,6 +1183,34 @@ class OC_App {
/**
* @param string $appId
+ * @param string[] $steps
+ * @throws \OC\NeedsUpdateException
+ */
+ private static function executeRepairSteps($appId, array $steps) {
+ if (empty($steps)) {
+ return;
+ }
+ // load the app
+ self::loadApp($appId, false);
+
+ $dispatcher = OC::$server->getEventDispatcher();
+
+ // load the steps
+ $r = new Repair([], $dispatcher);
+ foreach ($steps as $step) {
+ try {
+ $r->addStep($step);
+ } catch (Exception $ex) {
+ $r->emit('\OC\Repair', 'error', [$ex->getMessage()]);
+ \OC::$server->getLogger()->logException($ex);
+ }
+ }
+ // run the steps
+ $r->run();
+ }
+
+ /**
+ * @param string $appId
* @return \OC\Files\View|false
*/
public static function getStorage($appId) {
diff --git a/lib/private/files/cache/propagator.php b/lib/private/files/cache/propagator.php
deleted file mode 100644
index 50264e54d44..00000000000
--- a/lib/private/files/cache/propagator.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * @author Robin Appelman <icewind@owncloud.com>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Files\Cache;
-
-use OCP\Files\Cache\IPropagator;
-
-/**
- * Propagate etags and mtimes within the storage
- */
-class Propagator implements IPropagator {
- /**
- * @var \OC\Files\Storage\Storage
- */
- protected $storage;
-
- /**
- * @param \OC\Files\Storage\Storage $storage
- */
- public function __construct(\OC\Files\Storage\Storage $storage) {
- $this->storage = $storage;
- }
-
-
- /**
- * @param string $internalPath
- * @param int $time
- * @param int $sizeDifference number of bytes the file has grown
- * @return array[] all propagated entries
- */
- public function propagateChange($internalPath, $time, $sizeDifference = 0) {
- $cache = $this->storage->getCache($internalPath);
-
- $parentId = $cache->getParentId($internalPath);
- $propagatedEntries = [];
- while ($parentId !== -1) {
- $entry = $cache->get($parentId);
- $propagatedEntries[] = $entry;
- if (!$entry) {
- return $propagatedEntries;
- }
- $mtime = max($time, $entry['mtime']);
-
- if ($entry['size'] === -1) {
- $newSize = -1;
- } else {
- $newSize = $entry['size'] + $sizeDifference;
- }
- $cache->update($parentId, ['mtime' => $mtime, 'etag' => $this->storage->getETag($entry['path']), 'size' => $newSize]);
-
- $parentId = $entry['parent'];
- }
-
- return $propagatedEntries;
- }
-}
diff --git a/lib/private/helper.php b/lib/private/helper.php
index 70c50bb7b4b..e6aaed0fd15 100644
--- a/lib/private/helper.php
+++ b/lib/private/helper.php
@@ -628,7 +628,7 @@ class OC_Helper {
/** @var \OC\Files\Storage\Wrapper\Quota $storage */
$quota = $sourceStorage->getQuota();
}
- $free = $storage->free_space('');
+ $free = $sourceStorage->free_space('');
if ($free >= 0) {
$total = $free + $used;
} else {
diff --git a/lib/private/installer.php b/lib/private/installer.php
index 421e281e56b..24c79b2dd8c 100644
--- a/lib/private/installer.php
+++ b/lib/private/installer.php
@@ -269,7 +269,8 @@ class OC_Installer{
//download the file if necessary
if($data['source']=='http') {
$pathInfo = pathinfo($data['href']);
- $path = \OC::$server->getTempManager()->getTemporaryFile('.' . $pathInfo['extension']);
+ $extension = isset($pathInfo['extension']) ? '.' . $pathInfo['extension'] : '';
+ $path = \OC::$server->getTempManager()->getTemporaryFile($extension);
if(!isset($data['href'])) {
throw new \Exception($l->t("No href specified when installing app from http"));
}
diff --git a/lib/private/db/statementwrapper.php b/lib/private/legacy/db/statementwrapper.php
index 6422d8d5f1b..6422d8d5f1b 100644
--- a/lib/private/db/statementwrapper.php
+++ b/lib/private/legacy/db/statementwrapper.php
diff --git a/lib/private/log.php b/lib/private/log.php
index 9a2a2da906e..bbdad9cf166 100644
--- a/lib/private/log.php
+++ b/lib/private/log.php
@@ -270,12 +270,12 @@ class Log implements ILogger {
/**
* Logs an exception very detailed
*
- * @param \Exception $exception
+ * @param \Exception | \Throwable $exception
* @param array $context
* @return void
* @since 8.2.0
*/
- public function logException(\Exception $exception, array $context = array()) {
+ public function logException($exception, array $context = array()) {
$exception = array(
'Exception' => get_class($exception),
'Message' => $exception->getMessage(),
diff --git a/lib/private/log/errorhandler.php b/lib/private/log/errorhandler.php
index 27cde4aa242..8899bcfcb03 100644
--- a/lib/private/log/errorhandler.php
+++ b/lib/private/log/errorhandler.php
@@ -44,6 +44,9 @@ class ErrorHandler {
if ($debug) {
set_error_handler(array($handler, 'onAll'), E_ALL);
+ if (\OC::$CLI) {
+ set_exception_handler(array('OC_Template', 'printExceptionErrorPage'));
+ }
} else {
set_error_handler(array($handler, 'onError'));
}
diff --git a/lib/private/repair.php b/lib/private/repair.php
index 779f09d42ec..586e4e42b13 100644
--- a/lib/private/repair.php
+++ b/lib/private/repair.php
@@ -46,20 +46,26 @@ use OC\Repair\RepairMimeTypes;
use OC\Repair\SearchLuceneTables;
use OC\Repair\UpdateOutdatedOcsIds;
use OC\Repair\RepairInvalidShares;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\EventDispatcher\GenericEvent;
-class Repair extends BasicEmitter {
- /**
- * @var RepairStep[]
- **/
+class Repair extends BasicEmitter implements IOutput{
+ /* @var IRepairStep[] */
private $repairSteps;
+ /** @var EventDispatcher */
+ private $dispatcher;
/**
* Creates a new repair step runner
*
- * @param array $repairSteps array of RepairStep instances
+ * @param IRepairStep[] $repairSteps array of RepairStep instances
+ * @param EventDispatcher $dispatcher
*/
- public function __construct($repairSteps = array()) {
+ public function __construct($repairSteps = [], EventDispatcher $dispatcher = null) {
$this->repairSteps = $repairSteps;
+ $this->dispatcher = $dispatcher;
}
/**
@@ -84,24 +90,38 @@ class Repair extends BasicEmitter {
});
}
- $step->run();
+ $step->run($this);
}
}
/**
* Add repair step
*
- * @param RepairStep $repairStep repair step
+ * @param IRepairStep|string $repairStep repair step
+ * @throws \Exception
*/
public function addStep($repairStep) {
- $this->repairSteps[] = $repairStep;
+ if (is_string($repairStep)) {
+ if (class_exists($repairStep)) {
+ $s = new $repairStep();
+ if ($s instanceof IRepairStep) {
+ $this->repairSteps[] = $s;
+ } else {
+ throw new \Exception("Repair step '$repairStep' is not of type \\OCP\\Migration\\IRepairStep");
+ }
+ } else {
+ throw new \Exception("Repair step '$repairStep' is unknown");
+ }
+ } else {
+ $this->repairSteps[] = $repairStep;
+ }
}
/**
* Returns the default repair steps to be run on the
* command line or after an upgrade.
*
- * @return array of RepairStep instances
+ * @return IRepairStep[]
*/
public static function getRepairSteps() {
return [
@@ -123,7 +143,7 @@ class Repair extends BasicEmitter {
* Returns expensive repair steps to be run on the
* command line with a special option.
*
- * @return array of RepairStep instances
+ * @return IRepairStep[]
*/
public static function getExpensiveRepairSteps() {
return [
@@ -135,7 +155,7 @@ class Repair extends BasicEmitter {
* Returns the repair steps to be run before an
* upgrade.
*
- * @return array of RepairStep instances
+ * @return IRepairStep[]
*/
public static function getBeforeUpgradeRepairSteps() {
$connection = \OC::$server->getDatabaseConnection();
@@ -159,10 +179,49 @@ class Repair extends BasicEmitter {
/**
* {@inheritDoc}
- *
- * Re-declared as public to allow invocation from within the closure above in php 5.3
*/
- public function emit($scope, $method, array $arguments = array()) {
+ public function emit($scope, $method, array $arguments = []) {
parent::emit($scope, $method, $arguments);
+ if (!is_null($this->dispatcher)) {
+ $this->dispatcher->dispatch("$scope::$method",
+ new GenericEvent("$scope::$method", $arguments));
+ }
+ }
+
+ public function info($string) {
+ // for now just emit as we did in the past
+ $this->emit('\OC\Repair', 'info', array($string));
+ }
+
+ /**
+ * @param string $message
+ */
+ public function warning($message) {
+ // for now just emit as we did in the past
+ $this->emit('\OC\Repair', 'warning', [$message]);
+ }
+
+ /**
+ * @param int $max
+ */
+ public function startProgress($max = 0) {
+ // for now just emit as we did in the past
+ $this->emit('\OC\Repair', 'startProgress', [$max]);
+ }
+
+ /**
+ * @param int $step
+ */
+ public function advance($step = 1) {
+ // for now just emit as we did in the past
+ $this->emit('\OC\Repair', 'advance', [$step]);
+ }
+
+ /**
+ * @param int $max
+ */
+ public function finishProgress() {
+ // for now just emit as we did in the past
+ $this->emit('\OC\Repair', 'finishProgress', []);
}
}
diff --git a/lib/private/setup.php b/lib/private/setup.php
index 6303d0d47f3..196ae8a8bce 100644
--- a/lib/private/setup.php
+++ b/lib/private/setup.php
@@ -400,12 +400,21 @@ class Setup {
* Append the correct ErrorDocument path for Apache hosts
*/
public static function updateHtaccess() {
- // From CLI we don't know the defined web root. Thus we can't write any
- // directives into the .htaccess file.
+ $config = \OC::$server->getConfig();
+
+ // For CLI read the value from overwrite.cli.url
if(\OC::$CLI) {
- return;
+ $webRoot = $config->getSystemValue('overwrite.cli.url', '');
+ if($webRoot === '') {
+ return;
+ }
+ $webRoot = parse_url($webRoot, PHP_URL_PATH);
+ $webRoot = rtrim($webRoot, '/');
+ } else {
+ $webRoot = !empty(\OC::$WEBROOT) ? \OC::$WEBROOT : '/';
}
- $setupHelper = new \OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(),
+
+ $setupHelper = new \OC\Setup($config, \OC::$server->getIniWrapper(),
\OC::$server->getL10N('lib'), new \OC_Defaults(), \OC::$server->getLogger(),
\OC::$server->getSecureRandom());
@@ -413,16 +422,23 @@ class Setup {
$content = "#### DO NOT CHANGE ANYTHING ABOVE THIS LINE ####\n";
if(strpos($htaccessContent, $content) === false) {
//custom 403 error page
- $content.= "\nErrorDocument 403 ".\OC::$WEBROOT."/core/templates/403.php";
+ $content.= "\nErrorDocument 403 ".$webRoot."/core/templates/403.php";
//custom 404 error page
- $content.= "\nErrorDocument 404 ".\OC::$WEBROOT."/core/templates/404.php";
+ $content.= "\nErrorDocument 404 ".$webRoot."/core/templates/404.php";
+
+ // ownCloud may be configured to live at the root folder without a
+ // trailing slash being specified. In this case manually set the
+ // rewrite base to `/`
+ $rewriteBase = $webRoot;
+ if($webRoot === '') {
+ $rewriteBase = '/';
+ }
// Add rewrite base
- $webRoot = !empty(\OC::$WEBROOT) ? \OC::$WEBROOT : '/';
$content .= "\n<IfModule mod_rewrite.c>";
$content .= "\n RewriteRule . index.php [PT,E=PATH_INFO:$1]";
- $content .= "\n RewriteBase ".$webRoot;
+ $content .= "\n RewriteBase ".$rewriteBase;
$content .= "\n <IfModule mod_env.c>";
$content .= "\n SetEnv front_controller_active true";
$content .= "\n <IfModule mod_dir.c>";
diff --git a/lib/private/share/hooks.php b/lib/private/share/hooks.php
deleted file mode 100644
index 5faf81c5e9b..00000000000
--- a/lib/private/share/hooks.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Roeland Jago Douma <rullzer@owncloud.com>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Share;
-
-class Hooks extends \OC\Share\Constants {
- /**
- * Function that is called after a user is removed from a group. Shares are cleaned up.
- * @param array $arguments
- */
- public static function post_removeFromGroup($arguments) {
- $sql = 'SELECT `id`, `share_type` FROM `*PREFIX*share`'
- .' WHERE (`share_type` = ? AND `share_with` = ?) OR (`share_type` = ? AND `share_with` = ?)';
- $result = \OC_DB::executeAudited($sql, array(self::SHARE_TYPE_GROUP, $arguments['gid'],
- self::$shareTypeGroupUserUnique, $arguments['uid']));
- while ($item = $result->fetchRow()) {
- if ($item['share_type'] == self::SHARE_TYPE_GROUP) {
- // Delete all reshares by this user of the group share
- Helper::delete($item['id'], true, $arguments['uid']);
- } else {
- Helper::delete($item['id']);
- }
- }
- }
-}
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 3dcfa14079b..5b61f418a4d 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -90,6 +90,7 @@ class Share extends Constants {
\OC_Util::addScript('core', 'shareitemmodel');
\OC_Util::addScript('core', 'sharedialogresharerinfoview');
\OC_Util::addScript('core', 'sharedialoglinkshareview');
+ \OC_Util::addScript('core', 'sharedialogmailview');
\OC_Util::addScript('core', 'sharedialogexpirationview');
\OC_Util::addScript('core', 'sharedialogshareelistview');
\OC_Util::addScript('core', 'sharedialogview');
@@ -137,7 +138,7 @@ class Share extends Constants {
$publicShare = false;
$remoteShare = false;
$source = -1;
- $cache = false;
+ $cache = $mountPath = false;
$view = new \OC\Files\View('/' . $ownerUser . '/files');
$meta = $view->getFileInfo($path);
@@ -151,8 +152,14 @@ class Share extends Constants {
if($meta !== false) {
$source = $meta['fileid'];
$cache = new \OC\Files\Cache\Cache($meta['storage']);
+
+ $mountPath = $meta->getMountPoint()->getMountPoint();
+ if ($mountPath !== false) {
+ $mountPath = substr($mountPath, strlen('/' . $ownerUser . '/files'));
+ }
}
+ $paths = [];
while ($source !== -1) {
// Fetch all shares with another user
if (!$returnUserPaths) {
@@ -257,6 +264,7 @@ class Share extends Constants {
// let's get the parent for the next round
$meta = $cache->get((int)$source);
if ($recursive === true && $meta !== false) {
+ $paths[$source] = $meta['path'];
$source = (int)$meta['parent'];
} else {
$source = -1;
@@ -285,9 +293,15 @@ class Share extends Constants {
} else {
while ($row = $result->fetchRow()) {
foreach ($fileTargets[$row['fileid']] as $uid => $shareData) {
- $sharedPath = $shareData['file_target'];
- $sharedPath .= substr($path, strlen($row['path']) -5);
- $sharePaths[$uid] = $sharedPath;
+ if ($mountPath !== false) {
+ $sharedPath = $shareData['file_target'];
+ $sharedPath .= substr($path, strlen($mountPath) + strlen($paths[$row['fileid']]));
+ $sharePaths[$uid] = $sharedPath;
+ } else {
+ $sharedPath = $shareData['file_target'];
+ $sharedPath .= substr($path, strlen($row['path']) -5);
+ $sharePaths[$uid] = $sharedPath;
+ }
}
}
}
@@ -1265,7 +1279,7 @@ class Share extends Constants {
/**
* validate expiration date if it meets all constraints
*
- * @param string $expireDate well formate date string, e.g. "DD-MM-YYYY"
+ * @param string $expireDate well formatted date string, e.g. "DD-MM-YYYY"
* @param string $shareTime timestamp when the file was shared
* @param string $itemType
* @param string $itemSource
diff --git a/lib/private/template.php b/lib/private/template.php
index d39abdcd378..73725529702 100644
--- a/lib/private/template.php
+++ b/lib/private/template.php
@@ -34,6 +34,8 @@
*
*/
+use OC\TemplateLayout;
+
require_once __DIR__.'/template/functions.php';
/**
@@ -218,11 +220,11 @@ class OC_Template extends \OC\Template\Base {
* This function process the template. If $this->renderAs is set, it
* will produce a full page.
*/
- public function fetchPage() {
- $data = parent::fetchPage();
+ public function fetchPage($additionalParams = null) {
+ $data = parent::fetchPage($additionalParams);
if( $this->renderAs ) {
- $page = new \OC\TemplateLayout($this->renderAs, $this->app);
+ $page = new TemplateLayout($this->renderAs, $this->app);
// Add custom headers
$headers = '';
@@ -331,7 +333,7 @@ class OC_Template extends \OC\Template\Base {
/**
* print error page using Exception details
- * @param Exception $exception
+ * @param Exception | Throwable $exception
*/
public static function printExceptionErrorPage($exception, $fetchPage = false) {
try {
diff --git a/lib/private/template/base.php b/lib/private/template/base.php
index d06bcdc4b82..cfe629b5fbf 100644
--- a/lib/private/template/base.php
+++ b/lib/private/template/base.php
@@ -29,13 +29,17 @@ namespace OC\Template;
class Base {
private $template; // The template
private $vars; // Vars
- private $l10n; // The l10n-Object
- private $theme; // theme defaults
+
+ /** @var \OCP\IL10N */
+ private $l10n;
+
+ /** @var \OC_Defaults */
+ private $theme;
/**
* @param string $template
* @param string $requestToken
- * @param \OC_L10N $l10n
+ * @param \OCP\IL10N $l10n
* @param \OC_Defaults $theme
*/
public function __construct($template, $requestToken, $l10n, $theme ) {
@@ -47,34 +51,36 @@ class Base {
}
/**
- * @param string $serverroot
+ * @param string $serverRoot
* @param string|false $app_dir
* @param string $theme
* @param string $app
+ * @return string[]
*/
- protected function getAppTemplateDirs($theme, $app, $serverroot, $app_dir) {
+ protected function getAppTemplateDirs($theme, $app, $serverRoot, $app_dir) {
// Check if the app is in the app folder or in the root
if( file_exists($app_dir.'/templates/' )) {
- return array(
- $serverroot.'/themes/'.$theme.'/apps/'.$app.'/templates/',
+ return [
+ $serverRoot.'/themes/'.$theme.'/apps/'.$app.'/templates/',
$app_dir.'/templates/',
- );
+ ];
}
- return array(
- $serverroot.'/themes/'.$theme.'/'.$app.'/templates/',
- $serverroot.'/'.$app.'/templates/',
- );
+ return [
+ $serverRoot.'/themes/'.$theme.'/'.$app.'/templates/',
+ $serverRoot.'/'.$app.'/templates/',
+ ];
}
/**
- * @param string $serverroot
+ * @param string $serverRoot
* @param string $theme
+ * @return string[]
*/
- protected function getCoreTemplateDirs($theme, $serverroot) {
- return array(
- $serverroot.'/themes/'.$theme.'/core/templates/',
- $serverroot.'/core/templates/',
- );
+ protected function getCoreTemplateDirs($theme, $serverRoot) {
+ return [
+ $serverRoot.'/themes/'.$theme.'/core/templates/',
+ $serverRoot.'/core/templates/',
+ ];
}
/**
@@ -131,35 +137,44 @@ class Base {
/**
* Process the template
- * @return string
+ *
+ * @param array|null $additionalParams
+ * @return string This function processes the template.
*
* This function processes the template.
*/
- public function fetchPage() {
- return $this->load($this->template);
+ public function fetchPage($additionalParams = null) {
+ return $this->load($this->template, $additionalParams);
}
/**
* doing the actual work
+ *
* @param string $file
+ * @param array|null $additionalParams
* @return string content
*
* Includes the template file, fetches its output
*/
- protected function load( $file, $additionalparams = null ) {
+ protected function load($file, $additionalParams = null) {
// Register the variables
$_ = $this->vars;
$l = $this->l10n;
$theme = $this->theme;
- if( !is_null($additionalparams)) {
- $_ = array_merge( $additionalparams, $this->vars );
+ if( !is_null($additionalParams)) {
+ $_ = array_merge( $additionalParams, $this->vars );
}
// Include
ob_start();
- include $file;
- $data = ob_get_contents();
+ try {
+ include $file;
+ $data = ob_get_contents();
+ } catch (\Exception $e) {
+ @ob_end_clean();
+ throw $e;
+ }
@ob_end_clean();
// Return data
diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php
index fe7638f399d..88077b418a7 100644
--- a/lib/private/templatelayout.php
+++ b/lib/private/templatelayout.php
@@ -182,7 +182,7 @@ class TemplateLayout extends \OC_Template {
\OC::$server->getLogger(),
$theme,
array( \OC::$SERVERROOT => \OC::$WEBROOT ),
- array( \OC::$THIRDPARTYROOT => \OC::$THIRDPARTYWEBROOT ));
+ array( \OC::$SERVERROOT => \OC::$WEBROOT ));
$locator->find($styles);
return $locator->getResources();
}
@@ -199,7 +199,7 @@ class TemplateLayout extends \OC_Template {
\OC::$server->getLogger(),
$theme,
array( \OC::$SERVERROOT => \OC::$WEBROOT ),
- array( \OC::$THIRDPARTYROOT => \OC::$THIRDPARTYWEBROOT ));
+ array( \OC::$SERVERROOT => \OC::$WEBROOT ));
$locator->find($scripts);
return $locator->getResources();
}
diff --git a/lib/private/updater.php b/lib/private/updater.php
index 0d567b8dfb9..66f410b779f 100644
--- a/lib/private/updater.php
+++ b/lib/private/updater.php
@@ -37,10 +37,10 @@ use OC\Hooks\BasicEmitter;
use OC\IntegrityCheck\Checker;
use OC_App;
use OC_Installer;
-use OC_Util;
use OCP\IConfig;
use OC\Setup;
use OCP\ILogger;
+use Symfony\Component\EventDispatcher\GenericEvent;
/**
* Class that handles autoupdating of ownCloud
@@ -56,9 +56,6 @@ class Updater extends BasicEmitter {
/** @var ILogger $log */
private $log;
- /** @var \OC\HTTPHelper $helper */
- private $httpHelper;
-
/** @var IConfig */
private $config;
@@ -83,16 +80,13 @@ class Updater extends BasicEmitter {
];
/**
- * @param HTTPHelper $httpHelper
* @param IConfig $config
* @param Checker $checker
* @param ILogger $log
*/
- public function __construct(HTTPHelper $httpHelper,
- IConfig $config,
+ public function __construct(IConfig $config,
Checker $checker,
ILogger $log = null) {
- $this->httpHelper = $httpHelper;
$this->log = $log;
$this->config = $config;
$this->checker = $checker;
@@ -132,63 +126,6 @@ class Updater extends BasicEmitter {
}
/**
- * Check if a new version is available
- *
- * @param string $updaterUrl the url to check, i.e. 'http://apps.owncloud.com/updater.php'
- * @return array|bool
- */
- public function check($updaterUrl = null) {
-
- // Look up the cache - it is invalidated all 30 minutes
- if (((int)$this->config->getAppValue('core', 'lastupdatedat') + 1800) > time()) {
- return json_decode($this->config->getAppValue('core', 'lastupdateResult'), true);
- }
-
- if (is_null($updaterUrl)) {
- $updaterUrl = 'https://updates.owncloud.com/server/';
- }
-
- $this->config->setAppValue('core', 'lastupdatedat', time());
-
- if ($this->config->getAppValue('core', 'installedat', '') === '') {
- $this->config->setAppValue('core', 'installedat', microtime(true));
- }
-
- $version = \OCP\Util::getVersion();
- $version['installed'] = $this->config->getAppValue('core', 'installedat');
- $version['updated'] = $this->config->getAppValue('core', 'lastupdatedat');
- $version['updatechannel'] = \OC_Util::getChannel();
- $version['edition'] = \OC_Util::getEditionString();
- $version['build'] = \OC_Util::getBuild();
- $versionString = implode('x', $version);
-
- //fetch xml data from updater
- $url = $updaterUrl . '?version=' . $versionString;
-
- $tmp = [];
- $xml = $this->httpHelper->getUrlContent($url);
- if ($xml) {
- $loadEntities = libxml_disable_entity_loader(true);
- $data = @simplexml_load_string($xml);
- libxml_disable_entity_loader($loadEntities);
- if ($data !== false) {
- $tmp['version'] = (string)$data->version;
- $tmp['versionstring'] = (string)$data->versionstring;
- $tmp['url'] = (string)$data->url;
- $tmp['web'] = (string)$data->web;
- } else {
- libxml_clear_errors();
- }
- } else {
- $data = [];
- }
-
- // Cache the result
- $this->config->setAppValue('core', 'lastupdateResult', json_encode($data));
- return $tmp;
- }
-
- /**
* runs the update actions in maintenance mode, does not upgrade the source files
* except the main .htaccess file
*
@@ -425,6 +362,7 @@ class Updater extends BasicEmitter {
* @throws NeedsUpdateException
*/
protected function doAppUpgrade() {
+ $this->emitRepairEvents();
$apps = \OC_App::getEnabledApps();
$priorityTypes = array('authentication', 'filesystem', 'logging');
$pseudoOtherType = 'other';
@@ -449,9 +387,9 @@ class Updater extends BasicEmitter {
foreach ($stacks as $type => $stack) {
foreach ($stack as $appId) {
if (\OC_App::shouldUpgrade($appId)) {
- $this->emit('\OC\Updater', 'appUpgradeStarted', array($appId, \OC_App::getAppVersion($appId)));
+ $this->emit('\OC\Updater', 'appUpgradeStarted', [$appId, \OC_App::getAppVersion($appId)]);
\OC_App::updateApp($appId);
- $this->emit('\OC\Updater', 'appUpgrade', array($appId, \OC_App::getAppVersion($appId)));
+ $this->emit('\OC\Updater', 'appUpgrade', [$appId, \OC_App::getAppVersion($appId)]);
}
if($type !== $pseudoOtherType) {
// load authentication, filesystem and logging apps after
@@ -537,5 +475,33 @@ class Updater extends BasicEmitter {
}
}
}
+
+ /**
+ * Forward messages emitted by the repair routine
+ */
+ private function emitRepairEvents() {
+ $dispatcher = \OC::$server->getEventDispatcher();
+ $dispatcher->addListener('\OC\Repair::warning', function ($event) {
+ if ($event instanceof GenericEvent) {
+ $this->emit('\OC\Updater', 'repairWarning', $event->getArguments());
+ }
+ });
+ $dispatcher->addListener('\OC\Repair::error', function ($event) {
+ if ($event instanceof GenericEvent) {
+ $this->emit('\OC\Updater', 'repairError', $event->getArguments());
+ }
+ });
+ $dispatcher->addListener('\OC\Repair::info', function ($event) {
+ if ($event instanceof GenericEvent) {
+ $this->emit('\OC\Updater', 'repairInfo', $event->getArguments());
+ }
+ });
+ $dispatcher->addListener('\OC\Repair::step', function ($event) {
+ if ($event instanceof GenericEvent) {
+ $this->emit('\OC\Updater', 'repairStep', $event->getArguments());
+ }
+ });
+ }
+
}
diff --git a/lib/private/user.php b/lib/private/user.php
index 26062f503d2..11c35daa0de 100644
--- a/lib/private/user.php
+++ b/lib/private/user.php
@@ -203,6 +203,10 @@ class OC_User {
self::setUserId($uid);
self::setDisplayName($uid);
self::getUserSession()->setLoginName($uid);
+ // setup the filesystem
+ OC_Util::setupFS($uid);
+ //trigger creation of user home and /files folder
+ \OC::$server->getUserFolder($uid);
OC_Hook::emit("OC_User", "post_login", array("uid" => $uid, 'password' => ''));
}
@@ -268,15 +272,6 @@ class OC_User {
}
/**
- * Logs the current user out and kills all the session data
- *
- * Logout, destroys session
- */
- public static function logout() {
- self::getUserSession()->logout();
- }
-
- /**
* Tries to login the user with HTTP Basic Authentication
*/
public static function tryBasicAuthLogin() {
@@ -342,7 +337,14 @@ class OC_User {
return $backend->getLogoutAttribute();
}
- return 'href="' . link_to('', 'index.php') . '?logout=true&amp;requesttoken=' . urlencode(\OCP\Util::callRegister()) . '"';
+ $logoutUrl = \OC::$server->getURLGenerator()->linkToRouteAbsolute(
+ 'core.login.logout',
+ [
+ 'requesttoken' => \OCP\Util::callRegister(),
+ ]
+ );
+
+ return 'href="'.$logoutUrl.'"';
}
/**
diff --git a/lib/private/util.php b/lib/private/util.php
index 039bc7e9156..7caa1efcf54 100644
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -947,44 +947,6 @@ class OC_Util {
}
/**
- * @param array $errors
- * @param string[] $messages
- */
- public static function displayLoginPage($errors = array(), $messages = []) {
- $parameters = array();
- foreach ($errors as $value) {
- $parameters[$value] = true;
- }
- $parameters['messages'] = $messages;
- if (!empty($_REQUEST['user'])) {
- $parameters["username"] = $_REQUEST['user'];
- $parameters['user_autofocus'] = false;
- } else {
- $parameters["username"] = '';
- $parameters['user_autofocus'] = true;
- }
- if (isset($_REQUEST['redirect_url'])) {
- $parameters['redirect_url'] = $_REQUEST['redirect_url'];
- }
-
- $parameters['canResetPassword'] = true;
- if (!\OC::$server->getSystemConfig()->getValue('lost_password_link')) {
- if (isset($_REQUEST['user'])) {
- $user = \OC::$server->getUserManager()->get($_REQUEST['user']);
- if ($user instanceof IUser) {
- $parameters['canResetPassword'] = $user->canChangePassword();
- }
- }
- }
-
- $parameters['alt_login'] = OC_App::getAlternativeLogIns();
- $parameters['rememberLoginAllowed'] = self::rememberLoginAllowed();
- $parameters['rememberLoginState'] = isset($_POST['remember_login']) ? $_POST['remember_login'] : 0;
- \OC_Hook::emit('OC_Util', 'pre_displayLoginPage', array('parameters' => $parameters));
- OC_Template::printGuestPage("", "login", $parameters);
- }
-
- /**
* Check if the user is logged in, redirects to home if not. With
* redirect URL parameter to the request URI.
*
@@ -993,7 +955,8 @@ class OC_Util {
public static function checkLoggedIn() {
// Check if we are a user
if (!OC_User::isLoggedIn()) {
- header('Location: ' . \OCP\Util::linkToAbsolute('', 'index.php',
+ header('Location: ' . \OC::$server->getURLGenerator()->linkToRoute(
+ 'core.login.showLoginForm',
[
'redirect_url' => \OC::$server->getRequest()->getRequestUri()
]
diff --git a/lib/public/Share/IManager.php b/lib/public/Share/IManager.php
index c43011d3177..392c0471768 100644
--- a/lib/public/Share/IManager.php
+++ b/lib/public/Share/IManager.php
@@ -164,12 +164,22 @@ interface IManager {
* The group with $gid is deleted
* We need to clear up all shares to this group
*
- * @param $gid
+ * @param string $gid
* @since 9.1.0
*/
public function groupDeleted($gid);
/**
+ * The user $uid is deleted from the group $gid
+ * All user specific group shares have to be removed
+ *
+ * @param string $uid
+ * @param string $gid
+ * @since 9.1.0
+ */
+ public function userDeletedFromGroup($uid, $gid);
+
+ /**
* Instantiates a new share object. This is to be passed to
* createShare.
*
diff --git a/lib/public/Share/IShareProvider.php b/lib/public/Share/IShareProvider.php
index 24af36e0757..ac75a6f20b0 100644
--- a/lib/public/Share/IShareProvider.php
+++ b/lib/public/Share/IShareProvider.php
@@ -166,4 +166,15 @@ interface IShareProvider {
* @since 9.1.0
*/
public function groupDeleted($gid);
+
+ /**
+ * A user is deleted from a group
+ * We have to clean up all the related user specific group shares
+ * Providers not handling group shares should just return
+ *
+ * @param string $uid
+ * @param string $gid
+ * @since 9.1.0
+ */
+ public function userDeletedFromGroup($uid, $gid);
}
diff --git a/lib/public/appframework/app.php b/lib/public/appframework/app.php
index 09297d91ee8..e5069150765 100644
--- a/lib/public/appframework/app.php
+++ b/lib/public/appframework/app.php
@@ -29,7 +29,7 @@
*/
namespace OCP\AppFramework;
-use OC\AppFramework\routing\RouteConfig;
+use OC\AppFramework\Routing\RouteConfig;
/**
diff --git a/lib/public/encryption/iencryptionmodule.php b/lib/public/encryption/iencryptionmodule.php
index df30dd57cee..8d20a1ab57d 100644
--- a/lib/public/encryption/iencryptionmodule.php
+++ b/lib/public/encryption/iencryptionmodule.php
@@ -168,4 +168,16 @@ interface IEncryptionModule {
*/
public function prepareDecryptAll(InputInterface $input, OutputInterface $output, $user = '');
+ /**
+ * Check if the module is ready to be used by that specific user.
+ * In case a module is not ready - because e.g. key pairs have not been generated
+ * upon login this method can return false before any operation starts and might
+ * cause issues during operations.
+ *
+ * @param string $user
+ * @return boolean
+ * @since 9.1.0
+ */
+ public function isReadyForUser($user);
+
}
diff --git a/lib/public/files/cache/ipropagator.php b/lib/public/files/cache/ipropagator.php
index 9730601d573..5494ec9a54e 100644
--- a/lib/public/files/cache/ipropagator.php
+++ b/lib/public/files/cache/ipropagator.php
@@ -30,7 +30,6 @@ interface IPropagator {
/**
* @param string $internalPath
* @param int $time
- * @return array[] all propagated cache entries
* @since 9.0.0
*/
public function propagateChange($internalPath, $time);
diff --git a/lib/public/files/mount/imountpoint.php b/lib/public/files/mount/imountpoint.php
index 9ce1396c1d1..bc7bf81709f 100644
--- a/lib/public/files/mount/imountpoint.php
+++ b/lib/public/files/mount/imountpoint.php
@@ -94,4 +94,12 @@ interface IMountPoint {
* @since 8.1.0
*/
public function getOptions();
+
+ /**
+ * Get the file id of the root of the storage
+ *
+ * @return int
+ * @since 9.1.0
+ */
+ public function getStorageRootId();
}
diff --git a/lib/public/ilogger.php b/lib/public/ilogger.php
index 6a4163875a9..fa947612fcd 100644
--- a/lib/public/ilogger.php
+++ b/lib/public/ilogger.php
@@ -135,10 +135,10 @@ interface ILogger {
* ]);
* </code>
*
- * @param \Exception $exception
+ * @param \Exception | \Throwable $exception
* @param array $context
* @return void
* @since 8.2.0
*/
- public function logException(\Exception $exception, array $context = array());
+ public function logException($exception, array $context = array());
}
diff --git a/lib/public/irequest.php b/lib/public/irequest.php
index a0040aa464d..296c70f4ecc 100644
--- a/lib/public/irequest.php
+++ b/lib/public/irequest.php
@@ -129,7 +129,7 @@ interface IRequest {
* Shortcut for getting cookie variables
*
* @param string $key the key that will be taken from the $_COOKIE array
- * @return array the value in the $_COOKIE element
+ * @return string the value in the $_COOKIE element
* @since 6.0.0
*/
public function getCookie($key);
diff --git a/lib/public/mail/imailer.php b/lib/public/mail/imailer.php
index 61eb895752b..e3c751277ac 100644
--- a/lib/public/mail/imailer.php
+++ b/lib/public/mail/imailer.php
@@ -32,9 +32,10 @@ use OC\Mail\Message;
* $mailer = \OC::$server->getMailer();
* $message = $mailer->createMessage();
* $message->setSubject('Your Subject');
- * $message->setFrom(array('cloud@domain.org' => 'ownCloud Notifier');
- * $message->setTo(array('recipient@domain.org' => 'Recipient');
- * $message->setBody('The message text');
+ * $message->setFrom(['cloud@domain.org' => 'ownCloud Notifier']);
+ * $message->setTo(['recipient@domain.org' => 'Recipient']);
+ * $message->setPlainBody('The message text');
+ * $message->setHtmlBody('The <strong>message</strong> text');
* $mailer->send($message);
*
* This message can then be passed to send() of \OC\Mail\Mailer
diff --git a/lib/public/migration/ioutput.php b/lib/public/migration/ioutput.php
new file mode 100644
index 00000000000..c52f13b31dc
--- /dev/null
+++ b/lib/public/migration/ioutput.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OCP\Migration;
+
+/**
+ * Interface IOutput
+ *
+ * @package OCP\Migration
+ * @since 9.1.0
+ */
+interface IOutput {
+
+ /**
+ * @param string $message
+ * @since 9.1.0
+ */
+ public function info($message);
+
+ /**
+ * @param string $message
+ * @since 9.1.0
+ */
+ public function warning($message);
+
+ /**
+ * @param int $max
+ * @since 9.1.0
+ */
+ public function startProgress($max = 0);
+
+ /**
+ * @param int $step
+ * @since 9.1.0
+ */
+ public function advance($step = 1);
+
+ /**
+ * @param int $max
+ * @since 9.1.0
+ */
+ public function finishProgress();
+
+}
diff --git a/lib/private/repairstep.php b/lib/public/migration/irepairstep.php
index e1b8442fb8a..07830a935f9 100644
--- a/lib/private/repairstep.php
+++ b/lib/public/migration/irepairstep.php
@@ -18,17 +18,19 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
-namespace OC;
+namespace OCP\Migration;
/**
* Repair step
+ * @since 9.1.0
*/
-interface RepairStep {
+interface IRepairStep {
/**
* Returns the step's name
*
* @return string
+ * @since 9.1.0
*/
public function getName();
@@ -36,8 +38,9 @@ interface RepairStep {
* Run repair step.
* Must throw exception on error.
*
+ * @since 9.1.0
* @throws \Exception in case of failure
*/
- public function run();
+ public function run(IOutput $output);
}
diff --git a/lib/public/user.php b/lib/public/user.php
index 825e77aef6d..64ac92d2100 100644
--- a/lib/public/user.php
+++ b/lib/public/user.php
@@ -119,7 +119,7 @@ class User {
* @since 5.0.0
*/
public static function logout() {
- \OC_User::logout();
+ \OC::$server->getUserSession()->logout();
}
/**
diff --git a/ocs/routes.php b/ocs/routes.php
index b99aa5c7597..af9c3e74137 100644
--- a/ocs/routes.php
+++ b/ocs/routes.php
@@ -99,7 +99,8 @@ API::register(
// Server-to-Server Sharing
if (\OC::$server->getAppManager()->isEnabledForUser('files_sharing')) {
- $s2s = new \OCA\Files_Sharing\API\Server2Server();
+ $federatedSharingApp = new \OCA\FederatedFileSharing\AppInfo\Application('federatedfilesharing');
+ $s2s = new \OCA\Files_Sharing\API\Server2Server($federatedSharingApp->getFederatedShareProvider());
API::register('post',
'/cloud/shares',
array($s2s, 'createShare'),
diff --git a/public.php b/public.php
index 65257f1a46e..c4d96c06496 100644
--- a/public.php
+++ b/public.php
@@ -49,7 +49,7 @@ try {
$pathInfo = trim($pathInfo, '/');
list($service) = explode('/', $pathInfo);
}
- $file = OCP\CONFIG::getAppValue('core', 'public_' . strip_tags($service));
+ $file = OCP\Config::getAppValue('core', 'public_' . strip_tags($service));
if (is_null($file)) {
header('HTTP/1.0 404 Not Found');
exit;
@@ -73,14 +73,18 @@ try {
require_once OC_App::getAppPath($app) . '/' . $parts[1];
-} catch (\OC\ServiceUnavailableException $ex) {
+} catch (Exception $ex) {
+ if ($ex instanceof \OC\ServiceUnavailableException) {
+ OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
+ } else {
+ OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
+ }
//show the user a detailed error page
- OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
- \OCP\Util::writeLog('remote', $ex->getMessage(), \OCP\Util::FATAL);
+ \OC::$server->getLogger()->logException($ex, ['app' => 'public']);
OC_Template::printExceptionErrorPage($ex);
-} catch (Exception $ex) {
+} catch (Error $ex) {
//show the user a detailed error page
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
- \OCP\Util::writeLog('remote', $ex->getMessage(), \OCP\Util::FATAL);
+ \OC::$server->getLogger()->logException($ex, ['app' => 'public']);
OC_Template::printExceptionErrorPage($ex);
}
diff --git a/remote.php b/remote.php
index 86b47629d73..991ca0d2302 100644
--- a/remote.php
+++ b/remote.php
@@ -40,9 +40,9 @@ class RemoteException extends Exception {
}
/**
- * @param Exception $e
+ * @param Exception | Error $e
*/
-function handleException(Exception $e) {
+function handleException($e) {
$request = \OC::$server->getRequest();
// in case the request content type is text/xml - we assume it's a WebDAV request
$isXmlContentType = strpos($request->getHeader('Content-Type'), 'text/xml');
@@ -77,7 +77,7 @@ function handleException(Exception $e) {
OC_Response::setStatus($e->getCode());
OC_Template::printErrorPage($e->getMessage());
} else {
- \OCP\Util::writeLog('remote', $e->getMessage(), \OCP\Util::FATAL);
+ \OC::$server->getLogger()->logException($e, ['app' => 'remote']);
OC_Response::setStatus($statusCode);
OC_Template::printExceptionErrorPage($e);
}
@@ -108,6 +108,11 @@ function resolveService($service) {
try {
require_once 'lib/base.php';
+ // All resources served via the DAV endpoint should have the strictest possible
+ // policy. Exempted from this is the SabreDAV browser plugin which overwrites
+ // this policy with a softer one if debug mode is enabled.
+ header("Content-Security-Policy: default-src 'none';");
+
if (\OCP\Util::needUpgrade()) {
// since the behavior of apps or remotes are unpredictable during
// an upgrade, return a 503 directly
@@ -160,4 +165,6 @@ try {
} catch (Exception $ex) {
handleException($ex);
+} catch (Error $e) {
+ handleException($ex);
}
diff --git a/resources/config/mimetypealiases.dist.json b/resources/config/mimetypealiases.dist.json
index 545d4b0c399..6a47e3c9adf 100644
--- a/resources/config/mimetypealiases.dist.json
+++ b/resources/config/mimetypealiases.dist.json
@@ -4,7 +4,7 @@
"_comment3": "Put any custom mappings in a new file mimetypealiases.json in the config/ folder of ownCloud",
"_comment4": "After any change to mimetypealiases.json run:",
- "_comment5": "./occ maintenance:mimetypesjs",
+ "_comment5": "./occ occ maintenance:mimetype:update-js",
"_comment6": "Otherwise your update won't propagate through the system.",
diff --git a/settings/Controller/AppSettingsController.php b/settings/Controller/AppSettingsController.php
index cc69d3130d9..6c86cbf2cd3 100644
--- a/settings/Controller/AppSettingsController.php
+++ b/settings/Controller/AppSettingsController.php
@@ -259,6 +259,12 @@ class AppSettingsController extends Controller {
$apps = array_filter($apps, function ($app) use ($installedApps) {
return !in_array($app['id'], $installedApps);
});
+
+ // show tooltip if app is downloaded from remote server
+ $inactiveApps = $this->getInactiveApps();
+ foreach ($apps as &$app) {
+ $app['needsDownload'] = !in_array($app['id'], $inactiveApps);
+ }
}
// sort by score
@@ -319,4 +325,23 @@ class AppSettingsController extends Controller {
});
return $apps;
}
+
+ /**
+ * @return array
+ */
+ private function getInactiveApps() {
+ $inactiveApps = \OC_App::listAllApps(true, false, $this->ocsClient);
+ $inactiveApps = array_filter($inactiveApps,
+ function ($app) {
+ return !$app['active'];
+ });
+ $inactiveApps = array_map(function($app) {
+ if (isset($app['ocsid'])) {
+ return $app['ocsid'];
+ }
+ return $app['id'];
+ }, $inactiveApps);
+ return $inactiveApps;
+ }
+
}
diff --git a/settings/Middleware/SubadminMiddleware.php b/settings/Middleware/SubadminMiddleware.php
index 8e138bdc1a8..a860bdcfbf1 100644
--- a/settings/Middleware/SubadminMiddleware.php
+++ b/settings/Middleware/SubadminMiddleware.php
@@ -23,7 +23,7 @@
namespace OC\Settings\Middleware;
use OC\AppFramework\Http;
-use OC\Appframework\Middleware\Security\Exceptions\NotAdminException;
+use OC\AppFramework\Middleware\Security\Exceptions\NotAdminException;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Middleware;
diff --git a/settings/admin.php b/settings/admin.php
index e0d3a907f47..b67331b22eb 100644
--- a/settings/admin.php
+++ b/settings/admin.php
@@ -38,9 +38,10 @@ $template = new OC_Template('settings', 'admin', 'user');
$l = \OC::$server->getL10N('settings');
OC_Util::addScript('settings', 'certificates');
-OC_Util::addScript('files', 'jquery.iframe-transport');
OC_Util::addScript('files', 'jquery.fileupload');
+\OC::$server->getEventDispatcher()->dispatch('OC\Settings\Admin::loadAdditionalScripts');
+
$showLog = (\OC::$server->getConfig()->getSystemValue('log_type', 'owncloud') === 'owncloud');
$numEntriesToLoad = 3;
$entries = OC_Log_Owncloud::getEntries($numEntriesToLoad + 1);
diff --git a/settings/js/admin.js b/settings/js/admin.js
index 1bbb20efa00..34e258065ce 100644
--- a/settings/js/admin.js
+++ b/settings/js/admin.js
@@ -38,7 +38,7 @@ $(document).ready(function(){
$('#backgroundjobs span.crondate').tipsy({gravity: 's', live: true});
$('#backgroundjobs input').change(function(){
- if($(this).attr('checked')){
+ if($(this).is(':checked')){
var mode = $(this).val();
if (mode === 'ajax' || mode === 'webcron' || mode === 'cron') {
OC.AppConfig.setValue('core', 'backgroundjobs_mode', mode);
@@ -131,7 +131,7 @@ $(document).ready(function(){
$('#setting_smtphost').removeClass('hidden');
$('#mail_smtpsecure_label').removeClass('hidden');
$('#mail_smtpsecure').removeClass('hidden');
- if ($('#mail_smtpauth').attr('checked')) {
+ if ($('#mail_smtpauth').is(':checked')) {
$('#mail_credentials').removeClass('hidden');
}
}
diff --git a/settings/js/apps.js b/settings/js/apps.js
index e052a9ee9d3..015236f957d 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -119,6 +119,8 @@ OC.Settings.Apps = OC.Settings.Apps || {
$('#apps-list-empty').removeClass('hidden').find('h2').text(t('settings', 'No apps found for your version'));
}
+ $('.enable.needs-download').tipsy({fallback: t('settings', 'The app will be downloaded from the app store')});
+
$('.app-level .official').tipsy({fallback: t('settings', 'Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use.')});
$('.app-level .approved').tipsy({fallback: t('settings', 'Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use.')});
$('.app-level .experimental').tipsy({fallback: t('settings', 'This app is not checked for security issues and is new or known to be unstable. Install at your own risk.')});
@@ -191,15 +193,15 @@ OC.Settings.Apps = OC.Settings.Apps || {
OC.Settings.Apps.isType(app, 'authentication') || OC.Settings.Apps.isType(app, 'logging') ||
OC.Settings.Apps.isType(app, 'prevent_group_restriction')) {
page.find(".groups-enable").hide();
- page.find(".groups-enable__checkbox").attr('checked', null);
+ page.find(".groups-enable__checkbox").prop('checked', false);
} else {
page.find('#group_select').val((app.groups || []).join('|'));
if (app.active) {
if (app.groups.length) {
OC.Settings.Apps.setupGroupsSelect(page.find('#group_select'));
- page.find(".groups-enable__checkbox").attr('checked','checked');
+ page.find(".groups-enable__checkbox").prop('checked', true);
} else {
- page.find(".groups-enable__checkbox").attr('checked', null);
+ page.find(".groups-enable__checkbox").prop('checked', false);
}
page.find(".groups-enable").show();
} else {
@@ -287,7 +289,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
if (OC.Settings.Apps.isType(app, 'filesystem') || OC.Settings.Apps.isType(app, 'prelogin') ||
OC.Settings.Apps.isType(app, 'authentication') || OC.Settings.Apps.isType(app, 'logging')) {
- element.parent().find(".groups-enable").attr('checked', null);
+ element.parent().find(".groups-enable").prop('checked', true);
element.parent().find(".groups-enable").hide();
element.parent().find('#group_select').hide().val(null);
} else {
diff --git a/settings/js/certificates.js b/settings/js/certificates.js
index f2a8e6b0afb..7e62a4f5157 100644
--- a/settings/js/certificates.js
+++ b/settings/js/certificates.js
@@ -24,10 +24,10 @@ $(document).ready(function () {
},
success: function (data) {
if (typeof data === 'string') {
- data = $.parseJSON(data);
+ data = JSON.parse(data);
} else if (data && data.length) {
// fetch response from iframe
- data = $.parseJSON(data[0].body.innerText);
+ data = JSON.parse(data[0].body.innerText);
}
if (!data || typeof(data) === 'string') {
// IE8 iframe workaround comes here instead of fail()
diff --git a/settings/js/personal.js b/settings/js/personal.js
index bd13b7fd251..09f63f3f6af 100644
--- a/settings/js/personal.js
+++ b/settings/js/personal.js
@@ -110,8 +110,15 @@ function updateAvatar (hidedefault) {
}
$displaydiv.css({'background-color': ''});
$displaydiv.avatar(OC.currentUser, 145, true);
-
- $('#removeavatar').removeClass('hidden').addClass('inlineblock');
+ $.get(OC.generateUrl(
+ '/avatar/{user}/{size}',
+ {user: OC.currentUser, size: 1}
+ ), function (result) {
+ if (typeof(result) === 'string') {
+ // Show the delete button when the avatar is custom
+ $('#removeavatar').removeClass('hidden').addClass('inlineblock');
+ }
+ });
}
function showAvatarCropper () {
@@ -166,7 +173,7 @@ function cleanCropper () {
function avatarResponseHandler (data) {
if (typeof data === 'string') {
- data = $.parseJSON(data);
+ data = JSON.parse(data);
}
var $warning = $('#avatar .warning');
$warning.hide();
@@ -248,10 +255,10 @@ $(document).ready(function () {
done: function (e, data) {
var response = data;
if (typeof data.result === 'string') {
- response = $.parseJSON(data.result);
+ response = JSON.parse(data.result);
} else if (data.result && data.result.length) {
// fetch response from iframe
- response = $.parseJSON(data.result[0].body.innerText);
+ response = JSON.parse(data.result[0].body.innerText);
} else {
response = data.result;
}
diff --git a/settings/js/users/deleteHandler.js b/settings/js/users/deleteHandler.js
index b684aff1889..a66e8b07a72 100644
--- a/settings/js/users/deleteHandler.js
+++ b/settings/js/users/deleteHandler.js
@@ -191,7 +191,7 @@ DeleteHandler.prototype.deleteEntry = function(keepNotification) {
payload[dh.ajaxParamID] = dh.oidToDelete;
return $.ajax({
type: 'DELETE',
- url: OC.generateUrl(dh.ajaxEndpoint+'/'+this.oidToDelete),
+ url: OC.generateUrl(dh.ajaxEndpoint+'/{oid}',{oid: this.oidToDelete}),
// FIXME: do not use synchronous ajax calls as they block the browser !
async: false,
success: function (result) {
diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js
index 27c41884504..36ebbd2fa6e 100644
--- a/settings/js/users/groups.js
+++ b/settings/js/users/groups.js
@@ -31,7 +31,7 @@ GroupList = {
setUserCount: function (groupLiElement, usercount) {
if ($sortGroupBy !== 1) {
- // If we don't sort by group count we dont display them either
+ // If we don't sort by group count we don't display them either
return;
}
diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js
index e3c97191c0d..78d679fffbf 100644
--- a/settings/l10n/bg_BG.js
+++ b/settings/l10n/bg_BG.js
@@ -105,6 +105,7 @@ OC.L10N.register(
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Силно препоръчваме инсталиране на необходимите паките на системата, за поддръжка на следните местоположения: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталацията не е в основата на вашия домейн и използва системния cron, могат да възникнат проблеми с генерирането на URLи. За избягване на тези проблеми, моля настройте <code>overwrite.cli.url</code> опцията в config.php файла с мрежовия път към вашята инсталация (Вероятно : \\\"%s\\\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не бе възможно да изпълним cron задачата през команден интерфейс. Следните технически грешки се появиха:",
+ "Open documentation" : "Отвори документацията",
"Allow apps to use the Share API" : "Разреши приложенията да използват Share API.",
"Allow users to share via link" : "Разреши потребителите да споделят с връзка",
"Enforce password protection" : "Изискай защита с парола.",
diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json
index cb9e8d94f2e..0f3bb99ed1b 100644
--- a/settings/l10n/bg_BG.json
+++ b/settings/l10n/bg_BG.json
@@ -103,6 +103,7 @@
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Силно препоръчваме инсталиране на необходимите паките на системата, за поддръжка на следните местоположения: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ако инсталацията не е в основата на вашия домейн и използва системния cron, могат да възникнат проблеми с генерирането на URLи. За избягване на тези проблеми, моля настройте <code>overwrite.cli.url</code> опцията в config.php файла с мрежовия път към вашята инсталация (Вероятно : \\\"%s\\\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не бе възможно да изпълним cron задачата през команден интерфейс. Следните технически грешки се появиха:",
+ "Open documentation" : "Отвори документацията",
"Allow apps to use the Share API" : "Разреши приложенията да използват Share API.",
"Allow users to share via link" : "Разреши потребителите да споделят с връзка",
"Enforce password protection" : "Изискай защита с парола.",
diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js
index 1b5c3efaa86..f45c07d4f19 100644
--- a/settings/l10n/cs_CZ.js
+++ b/settings/l10n/cs_CZ.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimentální",
"All" : "Vše",
"No apps found for your version" : "Nebyly nalezeny aplikace pro vaši verzi",
+ "The app will be downloaded from the app store" : "Aplikace bude stažena z obchodu aplikací",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Oficiální aplikace jsou vyvíjeny komunitou ownCloud. Nabízejí funkce důležité pro ownCloud a jsou připraveny pro nasazení v produkčním prostředí.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Schválené aplikace jsou vyvíjeny důvěryhodnými vývojáři a prošly zběžným bezpečnostním prověřením. Jsou aktivně udržovány v repozitáři s otevřeným kódem a jejich správci je považují za stabilní pro občasné až normální použití.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "U této aplikace nebyla provedena kontrola na bezpečnostní problémy. Aplikace je nová nebo nestabilní. Instalujte pouze na vlastní nebezpečí.",
@@ -84,6 +85,7 @@ OC.L10N.register(
"Uninstall" : "Odinstalovat",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla povolena ale je třeba ji aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.",
"App update" : "Aktualizace aplikace",
+ "No apps found for {query}" : "Nebyly nalezeny žádné aplikace pro {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Došlo k chybě. Nahrajte prosím ASCII-kódovaný PEM certifikát.",
"Valid until {date}" : "Platný do {date}",
"Delete" : "Smazat",
diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json
index 1210640b7b3..70794c6f0b1 100644
--- a/settings/l10n/cs_CZ.json
+++ b/settings/l10n/cs_CZ.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimentální",
"All" : "Vše",
"No apps found for your version" : "Nebyly nalezeny aplikace pro vaši verzi",
+ "The app will be downloaded from the app store" : "Aplikace bude stažena z obchodu aplikací",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Oficiální aplikace jsou vyvíjeny komunitou ownCloud. Nabízejí funkce důležité pro ownCloud a jsou připraveny pro nasazení v produkčním prostředí.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Schválené aplikace jsou vyvíjeny důvěryhodnými vývojáři a prošly zběžným bezpečnostním prověřením. Jsou aktivně udržovány v repozitáři s otevřeným kódem a jejich správci je považují za stabilní pro občasné až normální použití.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "U této aplikace nebyla provedena kontrola na bezpečnostní problémy. Aplikace je nová nebo nestabilní. Instalujte pouze na vlastní nebezpečí.",
@@ -82,6 +83,7 @@
"Uninstall" : "Odinstalovat",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Aplikace byla povolena ale je třeba ji aktualizovat. Za 5 sekund budete přesměrování na stránku pro aktualizaci.",
"App update" : "Aktualizace aplikace",
+ "No apps found for {query}" : "Nebyly nalezeny žádné aplikace pro {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Došlo k chybě. Nahrajte prosím ASCII-kódovaný PEM certifikát.",
"Valid until {date}" : "Platný do {date}",
"Delete" : "Smazat",
diff --git a/settings/l10n/de.js b/settings/l10n/de.js
index a289b522bc3..4795f1535da 100644
--- a/settings/l10n/de.js
+++ b/settings/l10n/de.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimentell",
"All" : "Alle",
"No apps found for your version" : "Es wurden keine Apps für Deine Version gefunden",
+ "The app will be downloaded from the app store" : "Die App wird aus dem App-Store heruntergeladen",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der ownCloud-Community entwickelt. Sie stellen zentrale Funktionen von ownCloud bereit und sind auf den Produktiveinsatz vorbereitet.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.",
@@ -173,7 +174,7 @@ OC.L10N.register(
"This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Verschlüsselung wirklich aktivieren?",
"Enable encryption" : "Verschlüsselung aktivieren",
"No encryption module loaded, please enable an encryption module in the app menu." : "Kein Verschlüsselungs-Modul geladen, bitte aktiviere ein Verschlüsselungs-Modul im Anwendungs-Menü.",
- "Select default encryption module:" : "Bite Standard-Verschlüsselungs-Modul auswählen:",
+ "Select default encryption module:" : "Bitte Standard-Verschlüsselungs-Modul auswählen:",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Du musst Deine Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur Neuen migrieren. Bitte aktiviere das \"Default Encryption Module\" und rufe 'occ encryption:migrate' auf.",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Du musst Deine Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur Neuen migrieren.",
"Start migration" : "Migration beginnen",
diff --git a/settings/l10n/de.json b/settings/l10n/de.json
index 3909c15c91a..8c221a2f9ad 100644
--- a/settings/l10n/de.json
+++ b/settings/l10n/de.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimentell",
"All" : "Alle",
"No apps found for your version" : "Es wurden keine Apps für Deine Version gefunden",
+ "The app will be downloaded from the app store" : "Die App wird aus dem App-Store heruntergeladen",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der ownCloud-Community entwickelt. Sie stellen zentrale Funktionen von ownCloud bereit und sind auf den Produktiveinsatz vorbereitet.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.",
@@ -171,7 +172,7 @@
"This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Verschlüsselung wirklich aktivieren?",
"Enable encryption" : "Verschlüsselung aktivieren",
"No encryption module loaded, please enable an encryption module in the app menu." : "Kein Verschlüsselungs-Modul geladen, bitte aktiviere ein Verschlüsselungs-Modul im Anwendungs-Menü.",
- "Select default encryption module:" : "Bite Standard-Verschlüsselungs-Modul auswählen:",
+ "Select default encryption module:" : "Bitte Standard-Verschlüsselungs-Modul auswählen:",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the \"Default encryption module\" and run 'occ encryption:migrate'" : "Du musst Deine Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur Neuen migrieren. Bitte aktiviere das \"Default Encryption Module\" und rufe 'occ encryption:migrate' auf.",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Du musst Deine Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur Neuen migrieren.",
"Start migration" : "Migration beginnen",
diff --git a/settings/l10n/de_AT.js b/settings/l10n/de_AT.js
index 2f3af547bed..0739d2bfa5b 100644
--- a/settings/l10n/de_AT.js
+++ b/settings/l10n/de_AT.js
@@ -1,15 +1,24 @@
OC.L10N.register(
"settings",
{
+ "Email sent" : "E-Mail wurde verschickt",
"Invalid request" : "Fehlerhafte Anfrage",
"Delete" : "Löschen",
+ "Very weak password" : "Sehr schwaches Passwort",
+ "Weak password" : "Schwaches Passwort",
+ "So-so password" : "Durchschnittliches Passwort",
+ "Good password" : "Gutes Passwort",
+ "Strong password" : "Starkes Passwort",
"never" : "niemals",
"__language_name__" : "Deutsch (Österreich)",
"Server address" : "Adresse des Servers",
"Port" : "Port",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
+ "Cheers!" : "Noch einen schönen Tag!",
"Cancel" : "Abbrechen",
"Email" : "E-Mail",
"Password" : "Passwort",
+ "New password" : "Neues Passwort",
"Change password" : "Passwort ändern",
"Username" : "Benutzername",
"Other" : "Anderes"
diff --git a/settings/l10n/de_AT.json b/settings/l10n/de_AT.json
index bd2f8340856..a41420156e8 100644
--- a/settings/l10n/de_AT.json
+++ b/settings/l10n/de_AT.json
@@ -1,13 +1,22 @@
{ "translations": {
+ "Email sent" : "E-Mail wurde verschickt",
"Invalid request" : "Fehlerhafte Anfrage",
"Delete" : "Löschen",
+ "Very weak password" : "Sehr schwaches Passwort",
+ "Weak password" : "Schwaches Passwort",
+ "So-so password" : "Durchschnittliches Passwort",
+ "Good password" : "Gutes Passwort",
+ "Strong password" : "Starkes Passwort",
"never" : "niemals",
"__language_name__" : "Deutsch (Österreich)",
"Server address" : "Adresse des Servers",
"Port" : "Port",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.",
+ "Cheers!" : "Noch einen schönen Tag!",
"Cancel" : "Abbrechen",
"Email" : "E-Mail",
"Password" : "Passwort",
+ "New password" : "Neues Passwort",
"Change password" : "Passwort ändern",
"Username" : "Benutzername",
"Other" : "Anderes"
diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js
index 92b40968e93..b6dc30b4ac5 100644
--- a/settings/l10n/de_DE.js
+++ b/settings/l10n/de_DE.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimentell",
"All" : "Alle",
"No apps found for your version" : "Es wurden keine Apps für Ihre Version gefunden",
+ "The app will be downloaded from the app store" : "Die App wird aus dem App-Store heruntergeladen",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der ownCloud-Community entwickelt. Sie stellen zentrale Funktionen von ownCloud bereit und sind auf den Produktiveinsatz vorbereitet.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.",
diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json
index d25c73a63f4..cce90cf8b3f 100644
--- a/settings/l10n/de_DE.json
+++ b/settings/l10n/de_DE.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimentell",
"All" : "Alle",
"No apps found for your version" : "Es wurden keine Apps für Ihre Version gefunden",
+ "The app will be downloaded from the app store" : "Die App wird aus dem App-Store heruntergeladen",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Offizielle Apps werden von und innerhalb der ownCloud-Community entwickelt. Sie stellen zentrale Funktionen von ownCloud bereit und sind auf den Produktiveinsatz vorbereitet.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Geprüfte Apps werden von vertrauenswürdigen Entwicklern entwickelt und haben eine oberflächliche Sicherheitsprüfung durchlaufen. Sie werden innerhalb eines offenen Code-Repositorys aktiv gepflegt und ihre Betreuer erachten sie als stabil genug für für den gelegentlichen bis normalen Einsatz.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Diese App ist nicht auf Sicherheitsprobleme hin überprüft und ist neu oder bekanntermaßen instabil. Die Installation erfolgt auf eigenes Risiko.",
diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js
index ac4956d4699..b4a6681ccd2 100644
--- a/settings/l10n/en_GB.js
+++ b/settings/l10n/en_GB.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimental",
"All" : "All",
"No apps found for your version" : "No apps found for your version",
+ "The app will be downloaded from the app store" : "The app will be downloaded from the app store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "This app is not checked for security issues and is new or known to be unstable. Install at your own risk.",
@@ -84,6 +85,7 @@ OC.L10N.register(
"Uninstall" : "Uninstall",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.",
"App update" : "App update",
+ "No apps found for {query}" : "No apps found for {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "An error occurred. Please upload an ASCII-encoded PEM certificate.",
"Valid until {date}" : "Valid until {date}",
"Delete" : "Delete",
@@ -125,17 +127,20 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm.",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "The PHP module 'fileinfo' is missing. We strongly recommend enabling this module to get best results with mime-type detection.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information.",
"System locale can not be set to a one which supports UTF-8." : "System locale can not be set to a one which supports UTF-8.",
"This means that there might be problems with certain characters in file names." : "This means that there might be problems with certain characters in file names.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We strongly suggest installing the required packages on your system to support one of the following locales: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>.",
"All checks passed." : "All checks passed.",
"Open documentation" : "Open documentation",
"Allow apps to use the Share API" : "Allow apps to use the Share API",
@@ -148,6 +153,7 @@ OC.L10N.register(
"days" : "days",
"Enforce expiration date" : "Enforce expiry date",
"Allow resharing" : "Allow resharing",
+ "Allow sharing with groups" : "Allow sharing with groups",
"Restrict users to only share with users in their groups" : "Restrict users to only share with users in their groups",
"Allow users to send mail notification for shared files to other users" : "Allow users to send email notification for shared files to other users",
"Exclude groups from sharing" : "Exclude groups from sharing",
@@ -194,6 +200,7 @@ OC.L10N.register(
"What to log" : "What to log",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite is used as database. For larger installations, we recommend you switch to a different database backend.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especially when using the desktop client for file syncing, the use of SQLite is discouraged.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>.",
"How to do backups" : "How to do backups",
"Advanced monitoring" : "Advanced monitoring",
"Performance tuning" : "Performance tuning",
diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json
index 80a934215af..8a990886585 100644
--- a/settings/l10n/en_GB.json
+++ b/settings/l10n/en_GB.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimental",
"All" : "All",
"No apps found for your version" : "No apps found for your version",
+ "The app will be downloaded from the app store" : "The app will be downloaded from the app store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "This app is not checked for security issues and is new or known to be unstable. Install at your own risk.",
@@ -82,6 +83,7 @@
"Uninstall" : "Uninstall",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds.",
"App update" : "App update",
+ "No apps found for {query}" : "No apps found for {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "An error occurred. Please upload an ASCII-encoded PEM certificate.",
"Valid until {date}" : "Valid until {date}",
"Delete" : "Delete",
@@ -123,17 +125,20 @@
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm.",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "The PHP module 'fileinfo' is missing. We strongly recommend enabling this module to get best results with mime-type detection.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information.",
"System locale can not be set to a one which supports UTF-8." : "System locale can not be set to a one which supports UTF-8.",
"This means that there might be problems with certain characters in file names." : "This means that there might be problems with certain characters in file names.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We strongly suggest installing the required packages on your system to support one of the following locales: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>.",
"All checks passed." : "All checks passed.",
"Open documentation" : "Open documentation",
"Allow apps to use the Share API" : "Allow apps to use the Share API",
@@ -146,6 +151,7 @@
"days" : "days",
"Enforce expiration date" : "Enforce expiry date",
"Allow resharing" : "Allow resharing",
+ "Allow sharing with groups" : "Allow sharing with groups",
"Restrict users to only share with users in their groups" : "Restrict users to only share with users in their groups",
"Allow users to send mail notification for shared files to other users" : "Allow users to send email notification for shared files to other users",
"Exclude groups from sharing" : "Exclude groups from sharing",
@@ -192,6 +198,7 @@
"What to log" : "What to log",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite is used as database. For larger installations, we recommend you switch to a different database backend.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Especially when using the desktop client for file syncing, the use of SQLite is discouraged.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>.",
"How to do backups" : "How to do backups",
"Advanced monitoring" : "Advanced monitoring",
"Performance tuning" : "Performance tuning",
diff --git a/settings/l10n/es.js b/settings/l10n/es.js
index bb530a7e974..39431fc813e 100644
--- a/settings/l10n/es.js
+++ b/settings/l10n/es.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimental",
"All" : "Todos",
"No apps found for your version" : "No se han encontrado aplicaciones para su versión",
+ "The app will be downloaded from the app store" : "La app debe ser descargada desde una app store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplicaciones oficiales son desarrolladas por y dentro de la comunidad ownCloud. Estas ofrecen una funcionalidad central con ownCloud y están listas para su uso en producción. ",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Las aplicaciones aprobadas son desarrolladas por desarrolladores de confianza y han pasado un control de seguridad superficial. Estas se mantienen activamente en un repositorio de código abierto y sus mantenedores las consideran estables para un uso normal.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicación no está verificada por problemas de seguridad además de ser reciente o conocida por ser inestable. Instálela bajo su propio riesgo.",
@@ -84,6 +85,7 @@ OC.L10N.register(
"Uninstall" : "Desinstalar",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "La aplicación ha sido activada pero necesita ser actualizada. Seras redirigido a la pagina de actualizariones en 5 segundos.",
"App update" : "Actualización de aplicación",
+ "No apps found for {query}" : "No se han encontrado apps para {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ha ocurrido un error. Por favor, cargue un certificado PEM codificado en ASCII.",
"Valid until {date}" : "Válido hasta {date}",
"Delete" : "Eliminar",
diff --git a/settings/l10n/es.json b/settings/l10n/es.json
index 1d6b47a20bf..b135cbfdd72 100644
--- a/settings/l10n/es.json
+++ b/settings/l10n/es.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimental",
"All" : "Todos",
"No apps found for your version" : "No se han encontrado aplicaciones para su versión",
+ "The app will be downloaded from the app store" : "La app debe ser descargada desde una app store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplicaciones oficiales son desarrolladas por y dentro de la comunidad ownCloud. Estas ofrecen una funcionalidad central con ownCloud y están listas para su uso en producción. ",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Las aplicaciones aprobadas son desarrolladas por desarrolladores de confianza y han pasado un control de seguridad superficial. Estas se mantienen activamente en un repositorio de código abierto y sus mantenedores las consideran estables para un uso normal.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicación no está verificada por problemas de seguridad además de ser reciente o conocida por ser inestable. Instálela bajo su propio riesgo.",
@@ -82,6 +83,7 @@
"Uninstall" : "Desinstalar",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "La aplicación ha sido activada pero necesita ser actualizada. Seras redirigido a la pagina de actualizariones en 5 segundos.",
"App update" : "Actualización de aplicación",
+ "No apps found for {query}" : "No se han encontrado apps para {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ha ocurrido un error. Por favor, cargue un certificado PEM codificado en ASCII.",
"Valid until {date}" : "Válido hasta {date}",
"Delete" : "Eliminar",
diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js
index 3fe0d0711ac..0e438ae7445 100644
--- a/settings/l10n/fi_FI.js
+++ b/settings/l10n/fi_FI.js
@@ -62,6 +62,7 @@ OC.L10N.register(
"Experimental" : "Kokeellinen",
"All" : "Kaikki",
"No apps found for your version" : "Sovelluksia ei löytynyt versiollesi",
+ "The app will be downloaded from the app store" : "Sovellus ladataan sovelluskaupasta",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Viralliset sovellukset kehitetään ownCloud-yhteisön toimesta. Sovellukset tarjoavat lisäominaisuuksia ownCloudin keskeisiin toimintoihin liittyen ja ovat valmiita tuotantokäyttöön.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Hyväksytyt sovellukset on kehitetty luotettujen kehittäjien toimesta. Hyväksytyille sovelluksille on suoritettu pintapuolinen turvallisuustarkastus. Sovelluksia ylläpidetään avoimen koodin tietovarastoissa. Sovellusten kehittäjät mieltävät sovellukset vakaiksi ja valmiiksi tavalliseen käyttöön.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Tätä sovellusta ei ole tarkistettu tietoturvauhkien varalta. Sovellus on uusi ja mahdollisesti tiedostettu epävakaaksi. Asenna omalla vastuulla.",
diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json
index b638e0ff2f9..768f7e46b39 100644
--- a/settings/l10n/fi_FI.json
+++ b/settings/l10n/fi_FI.json
@@ -60,6 +60,7 @@
"Experimental" : "Kokeellinen",
"All" : "Kaikki",
"No apps found for your version" : "Sovelluksia ei löytynyt versiollesi",
+ "The app will be downloaded from the app store" : "Sovellus ladataan sovelluskaupasta",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Viralliset sovellukset kehitetään ownCloud-yhteisön toimesta. Sovellukset tarjoavat lisäominaisuuksia ownCloudin keskeisiin toimintoihin liittyen ja ovat valmiita tuotantokäyttöön.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Hyväksytyt sovellukset on kehitetty luotettujen kehittäjien toimesta. Hyväksytyille sovelluksille on suoritettu pintapuolinen turvallisuustarkastus. Sovelluksia ylläpidetään avoimen koodin tietovarastoissa. Sovellusten kehittäjät mieltävät sovellukset vakaiksi ja valmiiksi tavalliseen käyttöön.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Tätä sovellusta ei ole tarkistettu tietoturvauhkien varalta. Sovellus on uusi ja mahdollisesti tiedostettu epävakaaksi. Asenna omalla vastuulla.",
diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js
index b7ad7f70fb0..1bb3a4eb5ba 100644
--- a/settings/l10n/hu_HU.js
+++ b/settings/l10n/hu_HU.js
@@ -12,6 +12,7 @@ OC.L10N.register(
"Not enabled" : "Tiltva",
"installing and updating apps via the app store or Federated Cloud Sharing" : "alkalmazások telepítése és frissítése az alkalmazás tárból vagy Szövetséges Felhő Megosztásból",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL elavult %s verziót (%s) használ. Kérjük, frissítse az operációs rendszerét, vagy egyes funkciók (mint például a %s) megbízhatatlanul fognak működni.",
"A problem occurred, please check your log files (Error: %s)" : "Probléma történt, kérjük nézd meg a naplófájlokat (Hiba: %s).",
"Migration Completed" : "Migráció kész!",
"Group already exists." : "A csoport már létezik.",
@@ -62,21 +63,29 @@ OC.L10N.register(
"Experimental" : "Kísérleti",
"All" : "Mind",
"No apps found for your version" : "Nem található alkalmazás a verziód számára",
+ "The app will be downloaded from the app store" : "Az alkalmazás letöltésre kerül az alkalmazástárból",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "A hivatalos alkalmazásokat az ownCloud közösségen belül fejlesztik. \nAz általuk nyújtott központi ownCloud funkciók készen állnak a produktív használatra.",
+ "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "A jóváhagyott alkalmazásokat megbízható fejlesztők készítik, amik megfelelnek a felületes biztonsági ellenőrzésnek. Nyílt forráskódú tárolóban aktívan karbantartják és biztosítják a stabil használatot.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ez az alkalmazás még nincs biztonságilag ellenőrizve és vagy új, vagy ismert instabil. Telepítés csak saját felelősségre!",
"Update to %s" : "Frissítés erre: %s",
+ "_You have %n app update pending_::_You have %n app updates pending_" : ["%n alkalmazás frissítése függőben van","%n alkalmazás frissítése függőben van"],
"Please wait...." : "Kérjük várj...",
"Error while disabling app" : "Hiba az alkalmazás letiltása közben",
"Disable" : "Letiltás",
"Enable" : "Engedélyezés",
"Error while enabling app" : "Hiba az alkalmazás engedélyezése közben",
+ "Error: this app cannot be enabled because it makes the server unstable" : "Hiba: ezt az alkalmzást nem lehet engedélyezni, mert a szerver instabilitását eredményezné",
+ "Error: could not disable broken app" : "Hiba: nem lehet tiltani a megtört alkalmazást",
+ "Error while disabling broken app" : "Hiba történt a megtört alkalmazás tiltása közben",
"Updating...." : "Frissítés folyamatban...",
"Error while updating app" : "Hiba történt az alkalmazás frissítése közben",
"Updated" : "Frissítve",
"Uninstalling ...." : "Eltávolítás ...",
"Error while uninstalling app" : "Hiba történt az alkalmazás eltávolítása közben",
"Uninstall" : "Eltávolítás",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Ez az alkalmazás engedélyezve van, de frissíteni kell. A frissítő oldalra irányítjuk 5 másodpercen belül.",
"App update" : "Alkalmazás frissítése",
+ "No apps found for {query}" : "{query} keresésre nincs találat",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Hiba történt! Kérem töltsön fel egy, ASCII karakterekkel kódolt PEM tanusítványt!",
"Valid until {date}" : "Érvényes: {date}",
"Delete" : "Törlés",
@@ -89,6 +98,7 @@ OC.L10N.register(
"Strong password" : "Erős jelszó",
"Groups" : "Csoportok",
"Unable to delete {objName}" : "Ezt nem sikerült törölni: {objName}",
+ "Error creating group: {message}" : "Hiba történt a csoport létrehozásakor: {message}",
"A valid group name must be provided" : "Érvényes csoportnevet kell megadni",
"deleted {groupName}" : "törölve: {groupName}",
"undo" : "visszavonás",
@@ -98,6 +108,7 @@ OC.L10N.register(
"add group" : "csoport hozzáadása",
"Changing the password will result in data loss, because data recovery is not available for this user" : "A jelszó megváltoztatása adatvesztéssel jár, mert lehetséges az adatok visszaállítása ennek a felhasználónak",
"A valid username must be provided" : "Érvényes felhasználónevet kell megadnia",
+ "Error creating user: {message}" : "Hiba történt a felhasználó létrehozásakor: {message}",
"A valid password must be provided" : "Érvényes jelszót kell megadnia",
"A valid email must be provided" : "Érvényes e-mail címet kell megadni",
"__language_name__" : "__language_name__",
@@ -116,15 +127,19 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Úgy tűnik, hogy a PHP nem tudja olvasni a rendszer környezeti változóit. A getenv(\"PATH\") teszt visszatérési értéke üres.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Kérjük, ellenőrizze a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">telepítési dokumentációt ↗</a> a PHP konfigurációs beállításaival kapcsolatban, főleg ha PHP-FPM-et használ.",
+ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Csak olvasható beállítófájl engedélyezve. Ez meggátolja a beállítások módosítását a webes felületről. Továbbá, a fájlt kézzel kell írhatóvá tenni minden frissítés alkalmával.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Úgy tűnik, hogy a PHP úgy van beállítva, hogy eltávolítja programok belsejében elhelyezett szövegblokkokat. Emiatt a rendszer több alapvető fontosságú eleme működésképtelen lesz.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ezt valószínűleg egy gyorsítótár ill. kódgyorsító, mint pl, a Zend, OPcache vagy eAccelererator okozza.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "A szervered Microsoft Windowson fut. A legjobb felhasználói élményért erősen javasoljuk, hogy Linuxot használj.",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s %2$s verziója van telepítve, de a stabilitási és teljesítményi okok miatt javasoljuk az újabb, %1$s verzióra való frissítést.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "A 'fileinfo' PHP modul hiányzik. Erősen javasolt ennek a modulnak a telepítése, mert ezzel lényegesen jobb a MIME-típusok felismerése.",
"System locale can not be set to a one which supports UTF-8." : "A rendszer lokalizációs állományai között nem sikerült olyat beállítani, ami támogatja az UTF-8-at.",
"This means that there might be problems with certain characters in file names." : "Ez azt jelenti, hogy probléma lehet bizonyos karakterekkel a fájlnevekben.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Feltétlenül javasoljuk, hogy telepítse a szükséges csomagokat ahhoz, hogy a rendszere támogassa a következő lokalizációk valamelyikét: %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ha a telepítése nem a webkiszolgáló gyökerében van, és a rendszer cron szolgáltatását használja, akkor problémák lehetnek az URL-ek képzésével. Ezek elkerülése érdekében állítsa be a config.php-ban az \"overwrite.cli.url\" paramétert a telepítés által használt webútvonalra. (Javasolt beállítás: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Az ütemezett feladat (cronjob) nem futott le parancssorból. A következő hibák tűntek fel:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Kérjük, ellenőrizze a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">telepítési dokumentációt ↗</a> és ellenőrizze a <a href=\"#log-section\">naplófájlt</a>, hogy tartalmaz-e bármilyen hibát vagy figyelmeztetést.",
"All checks passed." : "Minden ellenőrzés sikeres.",
"Open documentation" : "Dokumentáció megnyitása",
"Allow apps to use the Share API" : "Lehetővé teszi, hogy a programmodulok is használhassák a megosztást",
@@ -137,6 +152,7 @@ OC.L10N.register(
"days" : "nap",
"Enforce expiration date" : "A beállított lejárati idő legyen kötelezően érvényes",
"Allow resharing" : "A megosztás továbbadásának engedélyezése",
+ "Allow sharing with groups" : "Megosztás engedélyezése a csoportokkal",
"Restrict users to only share with users in their groups" : "A csoporttagok csak a saját csoportjukon belül oszthassanak meg anyagokat",
"Allow users to send mail notification for shared files to other users" : "A felhasználók küldhessenek más felhasználóknak e-mail értesítést a megosztott fájlokról",
"Exclude groups from sharing" : "Csoportok megosztási jogának tiltása",
@@ -150,7 +166,10 @@ OC.L10N.register(
"Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.",
"Enable server-side encryption" : "Szerveroldali titkosítás engedélyezése",
"Please read carefully before activating server-side encryption: " : "Kérjük, ezt olvasd el figyelmesen mielőtt engedélyezed a szerveroldali titkosítást:",
+ "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Ha egyszer engedélyezve lett a titkosítás, akkor onnantól kezdve a szerveren az összes fájl titkosításra kerül, melyet később csak akkor lehet visszafordítani, ha azt az aktív titkosítási modul támogatja és minden elő-követelmény (például helyreállító kulcs) teljesül.",
+ "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "A titkosítás nem garantálja a rendszer biztonságát. Kérjük, bővebb információért keresse fel az ownCloud dokumentációját, ahol megtudhatja, hogy hogyan működik a titkosító alkalmazás és mikor érdemes használni.",
"Be aware that encryption always increases the file size." : "Ügyeljen arra, hogy a titkosítás mindig megnöveli a fájl méretét!",
+ "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Mindig jó ötlet rendszeres biztonsági mentést készíteni az adatokról. Titkosítás esetén a titkosító kulcsok biztonsági mentését elkülönítve tárolja az adatoktól!",
"This is the final warning: Do you really want to enable encryption?" : "Ez az utolsó figyelmeztetés: Biztosan szeretnéd engedélyezni a titkosítást?",
"Enable encryption" : "Titkosítás engedélyezése",
"No encryption module loaded, please enable an encryption module in the app menu." : "Nincs titkosítási modul betöltve, kérjük engedélyezd a titkosítási modult az alkalmazások menüben.",
@@ -180,6 +199,7 @@ OC.L10N.register(
"What to log" : "Mit naplózzon",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Adatbázisként az SQLite-ot fogjuk használni. Nagyobb telepítések esetén javasoljuk, hogy váltson másik adatbázis háttérkiszolgálóra",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Más adatbázisról való áttéréshez használja a parancssort: 'occ db:convert-type', vagy keresse fel a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentációt ↗</a>.",
"How to do backups" : "Hogyan csináljunk biztonsági mentéseket",
"Advanced monitoring" : "Haladó monitorozás",
"Performance tuning" : "Teljesítményi hangolás",
@@ -190,11 +210,14 @@ OC.L10N.register(
"Developer documentation" : "Fejlesztői dokumentáció",
"Experimental applications ahead" : "Kísérleti alkalmazások előre",
"Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "A kísérleti applikációk nincsenek biztonsági ellenőrizve, ismert vagy ismeretlen hibák lehetnek bennük és aktív fejlesztés alatt állnak. A telepítésük adatvesztéshez vezethet, vagy biztonsági kockázata lehet.",
+ "by %s" : "készítő: %s",
+ "%s-licensed" : "%s-licencelt",
"Documentation:" : "Dokumentációk:",
"User documentation" : "Felhasználói dokumentáció",
"Admin documentation" : "Adminisztrátori dokumentáció",
"Show description …" : "Leírás megjelenítése ...",
"Hide description …" : "Leírás elrejtése ...",
+ "This app has an update available." : "Frissítés érhető el az alkalmazáshoz.",
"This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Ennek az alkalmazásnak nincs minimális ownCloud verzió megadva. Ez hibát okoz majd az ownCloud 11-es és későbbi verziókban.",
"This app has no maximum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Ennek az alkalmazásnak nincs maximális ownCloud verzió megadva. Ez hibát okoz majd az ownCloud 11-es és későbbi verziókban.",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Ezt az applikációt nem lehet telepíteni, mert a következő függőségek hiányoznak:",
@@ -218,6 +241,7 @@ OC.L10N.register(
"You are using <strong>%s</strong> of <strong>%s</strong>" : "Jelenleg használt: <strong>%s</strong>, maximálisan elérhető: <strong>%s</strong>",
"Profile picture" : "Profilkép",
"Upload new" : "Új feltöltése",
+ "Select from Files" : "Kiválasztás a Fájlkból",
"Remove image" : "A kép eltávolítása",
"png or jpg, max. 20 MB" : "png vagy jpg, max. 20 MB",
"Cancel" : "Mégsem",
@@ -226,6 +250,7 @@ OC.L10N.register(
"No display name set" : "Nincs megjelenítési név beállítva",
"Email" : "E-mail",
"Your email address" : "Az Ön e-mail címe",
+ "For password recovery and notifications" : "Jelszó helyreállításhoz és értesítésekhez",
"No email address set" : "Nincs e-mail cím beállítva",
"You are member of the following groups:" : "Tagja vagy a következő csoport(ok)nak:",
"Password" : "Jelszó",
diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json
index 17a0ff0ca77..c43ecc9d9cf 100644
--- a/settings/l10n/hu_HU.json
+++ b/settings/l10n/hu_HU.json
@@ -10,6 +10,7 @@
"Not enabled" : "Tiltva",
"installing and updating apps via the app store or Federated Cloud Sharing" : "alkalmazások telepítése és frissítése az alkalmazás tárból vagy Szövetséges Felhő Megosztásból",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL elavult %s verziót (%s) használ. Kérjük, frissítse az operációs rendszerét, vagy egyes funkciók (mint például a %s) megbízhatatlanul fognak működni.",
"A problem occurred, please check your log files (Error: %s)" : "Probléma történt, kérjük nézd meg a naplófájlokat (Hiba: %s).",
"Migration Completed" : "Migráció kész!",
"Group already exists." : "A csoport már létezik.",
@@ -60,21 +61,29 @@
"Experimental" : "Kísérleti",
"All" : "Mind",
"No apps found for your version" : "Nem található alkalmazás a verziód számára",
+ "The app will be downloaded from the app store" : "Az alkalmazás letöltésre kerül az alkalmazástárból",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "A hivatalos alkalmazásokat az ownCloud közösségen belül fejlesztik. \nAz általuk nyújtott központi ownCloud funkciók készen állnak a produktív használatra.",
+ "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "A jóváhagyott alkalmazásokat megbízható fejlesztők készítik, amik megfelelnek a felületes biztonsági ellenőrzésnek. Nyílt forráskódú tárolóban aktívan karbantartják és biztosítják a stabil használatot.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ez az alkalmazás még nincs biztonságilag ellenőrizve és vagy új, vagy ismert instabil. Telepítés csak saját felelősségre!",
"Update to %s" : "Frissítés erre: %s",
+ "_You have %n app update pending_::_You have %n app updates pending_" : ["%n alkalmazás frissítése függőben van","%n alkalmazás frissítése függőben van"],
"Please wait...." : "Kérjük várj...",
"Error while disabling app" : "Hiba az alkalmazás letiltása közben",
"Disable" : "Letiltás",
"Enable" : "Engedélyezés",
"Error while enabling app" : "Hiba az alkalmazás engedélyezése közben",
+ "Error: this app cannot be enabled because it makes the server unstable" : "Hiba: ezt az alkalmzást nem lehet engedélyezni, mert a szerver instabilitását eredményezné",
+ "Error: could not disable broken app" : "Hiba: nem lehet tiltani a megtört alkalmazást",
+ "Error while disabling broken app" : "Hiba történt a megtört alkalmazás tiltása közben",
"Updating...." : "Frissítés folyamatban...",
"Error while updating app" : "Hiba történt az alkalmazás frissítése közben",
"Updated" : "Frissítve",
"Uninstalling ...." : "Eltávolítás ...",
"Error while uninstalling app" : "Hiba történt az alkalmazás eltávolítása közben",
"Uninstall" : "Eltávolítás",
+ "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Ez az alkalmazás engedélyezve van, de frissíteni kell. A frissítő oldalra irányítjuk 5 másodpercen belül.",
"App update" : "Alkalmazás frissítése",
+ "No apps found for {query}" : "{query} keresésre nincs találat",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Hiba történt! Kérem töltsön fel egy, ASCII karakterekkel kódolt PEM tanusítványt!",
"Valid until {date}" : "Érvényes: {date}",
"Delete" : "Törlés",
@@ -87,6 +96,7 @@
"Strong password" : "Erős jelszó",
"Groups" : "Csoportok",
"Unable to delete {objName}" : "Ezt nem sikerült törölni: {objName}",
+ "Error creating group: {message}" : "Hiba történt a csoport létrehozásakor: {message}",
"A valid group name must be provided" : "Érvényes csoportnevet kell megadni",
"deleted {groupName}" : "törölve: {groupName}",
"undo" : "visszavonás",
@@ -96,6 +106,7 @@
"add group" : "csoport hozzáadása",
"Changing the password will result in data loss, because data recovery is not available for this user" : "A jelszó megváltoztatása adatvesztéssel jár, mert lehetséges az adatok visszaállítása ennek a felhasználónak",
"A valid username must be provided" : "Érvényes felhasználónevet kell megadnia",
+ "Error creating user: {message}" : "Hiba történt a felhasználó létrehozásakor: {message}",
"A valid password must be provided" : "Érvényes jelszót kell megadnia",
"A valid email must be provided" : "Érvényes e-mail címet kell megadni",
"__language_name__" : "__language_name__",
@@ -114,15 +125,19 @@
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Úgy tűnik, hogy a PHP nem tudja olvasni a rendszer környezeti változóit. A getenv(\"PATH\") teszt visszatérési értéke üres.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Kérjük, ellenőrizze a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">telepítési dokumentációt ↗</a> a PHP konfigurációs beállításaival kapcsolatban, főleg ha PHP-FPM-et használ.",
+ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Csak olvasható beállítófájl engedélyezve. Ez meggátolja a beállítások módosítását a webes felületről. Továbbá, a fájlt kézzel kell írhatóvá tenni minden frissítés alkalmával.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Úgy tűnik, hogy a PHP úgy van beállítva, hogy eltávolítja programok belsejében elhelyezett szövegblokkokat. Emiatt a rendszer több alapvető fontosságú eleme működésképtelen lesz.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Ezt valószínűleg egy gyorsítótár ill. kódgyorsító, mint pl, a Zend, OPcache vagy eAccelererator okozza.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "A szervered Microsoft Windowson fut. A legjobb felhasználói élményért erősen javasoljuk, hogy Linuxot használj.",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s %2$s verziója van telepítve, de a stabilitási és teljesítményi okok miatt javasoljuk az újabb, %1$s verzióra való frissítést.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "A 'fileinfo' PHP modul hiányzik. Erősen javasolt ennek a modulnak a telepítése, mert ezzel lényegesen jobb a MIME-típusok felismerése.",
"System locale can not be set to a one which supports UTF-8." : "A rendszer lokalizációs állományai között nem sikerült olyat beállítani, ami támogatja az UTF-8-at.",
"This means that there might be problems with certain characters in file names." : "Ez azt jelenti, hogy probléma lehet bizonyos karakterekkel a fájlnevekben.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Feltétlenül javasoljuk, hogy telepítse a szükséges csomagokat ahhoz, hogy a rendszere támogassa a következő lokalizációk valamelyikét: %s",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Ha a telepítése nem a webkiszolgáló gyökerében van, és a rendszer cron szolgáltatását használja, akkor problémák lehetnek az URL-ek képzésével. Ezek elkerülése érdekében állítsa be a config.php-ban az \"overwrite.cli.url\" paramétert a telepítés által használt webútvonalra. (Javasolt beállítás: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Az ütemezett feladat (cronjob) nem futott le parancssorból. A következő hibák tűntek fel:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Kérjük, ellenőrizze a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">telepítési dokumentációt ↗</a> és ellenőrizze a <a href=\"#log-section\">naplófájlt</a>, hogy tartalmaz-e bármilyen hibát vagy figyelmeztetést.",
"All checks passed." : "Minden ellenőrzés sikeres.",
"Open documentation" : "Dokumentáció megnyitása",
"Allow apps to use the Share API" : "Lehetővé teszi, hogy a programmodulok is használhassák a megosztást",
@@ -135,6 +150,7 @@
"days" : "nap",
"Enforce expiration date" : "A beállított lejárati idő legyen kötelezően érvényes",
"Allow resharing" : "A megosztás továbbadásának engedélyezése",
+ "Allow sharing with groups" : "Megosztás engedélyezése a csoportokkal",
"Restrict users to only share with users in their groups" : "A csoporttagok csak a saját csoportjukon belül oszthassanak meg anyagokat",
"Allow users to send mail notification for shared files to other users" : "A felhasználók küldhessenek más felhasználóknak e-mail értesítést a megosztott fájlokról",
"Exclude groups from sharing" : "Csoportok megosztási jogának tiltása",
@@ -148,7 +164,10 @@
"Use system's cron service to call the cron.php file every 15 minutes." : "A rendszer cron szolgáltatását használjuk, mely a cron.php állományt futtatja le 15 percenként.",
"Enable server-side encryption" : "Szerveroldali titkosítás engedélyezése",
"Please read carefully before activating server-side encryption: " : "Kérjük, ezt olvasd el figyelmesen mielőtt engedélyezed a szerveroldali titkosítást:",
+ "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Ha egyszer engedélyezve lett a titkosítás, akkor onnantól kezdve a szerveren az összes fájl titkosításra kerül, melyet később csak akkor lehet visszafordítani, ha azt az aktív titkosítási modul támogatja és minden elő-követelmény (például helyreállító kulcs) teljesül.",
+ "Encryption alone does not guarantee security of the system. Please see ownCloud documentation for more information about how the encryption app works, and the supported use cases." : "A titkosítás nem garantálja a rendszer biztonságát. Kérjük, bővebb információért keresse fel az ownCloud dokumentációját, ahol megtudhatja, hogy hogyan működik a titkosító alkalmazás és mikor érdemes használni.",
"Be aware that encryption always increases the file size." : "Ügyeljen arra, hogy a titkosítás mindig megnöveli a fájl méretét!",
+ "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Mindig jó ötlet rendszeres biztonsági mentést készíteni az adatokról. Titkosítás esetén a titkosító kulcsok biztonsági mentését elkülönítve tárolja az adatoktól!",
"This is the final warning: Do you really want to enable encryption?" : "Ez az utolsó figyelmeztetés: Biztosan szeretnéd engedélyezni a titkosítást?",
"Enable encryption" : "Titkosítás engedélyezése",
"No encryption module loaded, please enable an encryption module in the app menu." : "Nincs titkosítási modul betöltve, kérjük engedélyezd a titkosítási modult az alkalmazások menüben.",
@@ -178,6 +197,7 @@
"What to log" : "Mit naplózzon",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Adatbázisként az SQLite-ot fogjuk használni. Nagyobb telepítések esetén javasoljuk, hogy váltson másik adatbázis háttérkiszolgálóra",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Amikor az asztali klienset használja fálj szinkronizációra, akkor az SQLite használata nem ajánlott.",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Más adatbázisról való áttéréshez használja a parancssort: 'occ db:convert-type', vagy keresse fel a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentációt ↗</a>.",
"How to do backups" : "Hogyan csináljunk biztonsági mentéseket",
"Advanced monitoring" : "Haladó monitorozás",
"Performance tuning" : "Teljesítményi hangolás",
@@ -188,11 +208,14 @@
"Developer documentation" : "Fejlesztői dokumentáció",
"Experimental applications ahead" : "Kísérleti alkalmazások előre",
"Experimental apps are not checked for security issues, new or known to be unstable and under heavy development. Installing them can cause data loss or security breaches." : "A kísérleti applikációk nincsenek biztonsági ellenőrizve, ismert vagy ismeretlen hibák lehetnek bennük és aktív fejlesztés alatt állnak. A telepítésük adatvesztéshez vezethet, vagy biztonsági kockázata lehet.",
+ "by %s" : "készítő: %s",
+ "%s-licensed" : "%s-licencelt",
"Documentation:" : "Dokumentációk:",
"User documentation" : "Felhasználói dokumentáció",
"Admin documentation" : "Adminisztrátori dokumentáció",
"Show description …" : "Leírás megjelenítése ...",
"Hide description …" : "Leírás elrejtése ...",
+ "This app has an update available." : "Frissítés érhető el az alkalmazáshoz.",
"This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Ennek az alkalmazásnak nincs minimális ownCloud verzió megadva. Ez hibát okoz majd az ownCloud 11-es és későbbi verziókban.",
"This app has no maximum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "Ennek az alkalmazásnak nincs maximális ownCloud verzió megadva. Ez hibát okoz majd az ownCloud 11-es és későbbi verziókban.",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Ezt az applikációt nem lehet telepíteni, mert a következő függőségek hiányoznak:",
@@ -216,6 +239,7 @@
"You are using <strong>%s</strong> of <strong>%s</strong>" : "Jelenleg használt: <strong>%s</strong>, maximálisan elérhető: <strong>%s</strong>",
"Profile picture" : "Profilkép",
"Upload new" : "Új feltöltése",
+ "Select from Files" : "Kiválasztás a Fájlkból",
"Remove image" : "A kép eltávolítása",
"png or jpg, max. 20 MB" : "png vagy jpg, max. 20 MB",
"Cancel" : "Mégsem",
@@ -224,6 +248,7 @@
"No display name set" : "Nincs megjelenítési név beállítva",
"Email" : "E-mail",
"Your email address" : "Az Ön e-mail címe",
+ "For password recovery and notifications" : "Jelszó helyreállításhoz és értesítésekhez",
"No email address set" : "Nincs e-mail cím beállítva",
"You are member of the following groups:" : "Tagja vagy a következő csoport(ok)nak:",
"Password" : "Jelszó",
diff --git a/settings/l10n/it.js b/settings/l10n/it.js
index f6e5535929f..09f49c21312 100644
--- a/settings/l10n/it.js
+++ b/settings/l10n/it.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Sperimentale",
"All" : "Tutti",
"No apps found for your version" : "Nessuna applicazione trovata per la tua versione",
+ "The app will be downloaded from the app store" : "L'applicazione sarà scaricata dallo store delle applicazioni",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Le applicazioni ufficiali sono sviluppate da e con la comunità di ownCloud. Offrono le funzioni fondamentali di ownCloud e sono pronte per l'utilizzo in produzione.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Le applicazioni approvate sono sviluppate da sviluppatori affidabili e hanno passato un rapido controllo di sicurezza. Sono attivamente mantenute in un deposito aperto del codice e i loro responsabili le ritengono pronte sia per un utilizzo casuale che per un utilizzo continuativo.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Questa applicazione non è stata sottoposta a controlli di sicurezza, è nuova o notoriamente instabile. Installala a tuo rischio.",
diff --git a/settings/l10n/it.json b/settings/l10n/it.json
index 780c2233e97..11a91a2ed4f 100644
--- a/settings/l10n/it.json
+++ b/settings/l10n/it.json
@@ -61,6 +61,7 @@
"Experimental" : "Sperimentale",
"All" : "Tutti",
"No apps found for your version" : "Nessuna applicazione trovata per la tua versione",
+ "The app will be downloaded from the app store" : "L'applicazione sarà scaricata dallo store delle applicazioni",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Le applicazioni ufficiali sono sviluppate da e con la comunità di ownCloud. Offrono le funzioni fondamentali di ownCloud e sono pronte per l'utilizzo in produzione.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Le applicazioni approvate sono sviluppate da sviluppatori affidabili e hanno passato un rapido controllo di sicurezza. Sono attivamente mantenute in un deposito aperto del codice e i loro responsabili le ritengono pronte sia per un utilizzo casuale che per un utilizzo continuativo.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Questa applicazione non è stata sottoposta a controlli di sicurezza, è nuova o notoriamente instabile. Installala a tuo rischio.",
diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js
index c0e5980ad74..88bc27bbc45 100644
--- a/settings/l10n/nb_NO.js
+++ b/settings/l10n/nb_NO.js
@@ -84,6 +84,7 @@ OC.L10N.register(
"Uninstall" : "Avinstaller",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Appen er aktivert men må oppdateres. Du vil bli omdirigert til oppdateringssiden om 5 sekunder.",
"App update" : "Oppdatering av applikasjon",
+ "No apps found for {query}" : "Ingen apper funnet for \"{query}\"",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.",
"Valid until {date}" : "Gyldig til {date}",
"Delete" : "Slett",
@@ -125,17 +126,20 @@ OC.L10N.register(
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ser ikke ut til å være satt opp riktig for å lese systemets miljøvariabler. Testen med getenv(\"PATH\") returnerer bare et tomt svar.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Vennligst sjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsdokumentasjonen ↗</a> etter php konfigurasjonsnotater og konfigurering av php på serveren din, særlig om du bruker php-fpm.",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Den skrivebeskyttede konfigurasjonen er blitt aktivert. Dette forhindrer setting av visse konfigureringer via web-grensesnittet. Videre må config-filen gjøres skrivbar manuelt for hver oppdatering.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Det ser ut for at PHP er satt opp til å fjerne innebygde doc blocks. Dette gjør at flere av kjerneapplikasjonene blir utilgjengelige.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dette forårsakes sannsynligvis av en bufrer/akselerator, som f.eks. Zend OPcache eller eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Serveren din kjører på Microsoft Windows. Vi anbefaler strekt Linux for en optimal brukeropplevelse.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s lavere enn versjon %2$s er installert. Vi anbefaler å oppgradere til en nyere %1$s-versjon for å få bedre stabilitet og ytelse.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modulen 'fileinfo' mangler. Vi anbefaler at du aktiverer denne modulen for å kunne detektere mime-typen korrekt.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Transaksjonsbasert fil-låsing er deaktivert. Dette kan føre til konflikt. Aktiver \"filelocking.enabled\" i config.php for å unngå disse problemene. Se <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentasjonen ↗</a> for mer informasjon.",
"System locale can not be set to a one which supports UTF-8." : "Kan ikke sette systemets nasjonale innstillinger til en som støtter UTF-8.",
"This means that there might be problems with certain characters in file names." : "Dette betyr at det kan forekomme problemer med visse tegn i filnavn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Vennligst dobbeltsjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsguidene ↗</a>, og se etter feil eller advarsler i <a href=\"#log-section\">loggen</a>.",
"All checks passed." : "Alle sjekker bestått.",
"Open documentation" : "Åpne dokumentasjonen",
"Allow apps to use the Share API" : "Tillat apper å bruke API for Deling",
@@ -148,6 +152,7 @@ OC.L10N.register(
"days" : "dager",
"Enforce expiration date" : "Krev utløpsdato",
"Allow resharing" : "TIllat videre deling",
+ "Allow sharing with groups" : "Tillat deling med grupper",
"Restrict users to only share with users in their groups" : "Begrens brukere til kun å dele med brukere i deres grupper",
"Allow users to send mail notification for shared files to other users" : "Tillat at brukere sender varsler om delte filer på e-post til andre brukere",
"Exclude groups from sharing" : "Utelukk grupper fra deling",
@@ -194,6 +199,7 @@ OC.L10N.register(
"What to log" : "Hva som skal logges",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite brukes som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.",
"How to do backups" : "Hvordan ta sikkerhetskopier",
"Advanced monitoring" : "Avansert overvåking",
"Performance tuning" : "Forbedre ytelsen",
diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json
index c53229c0d8c..2eb207b366a 100644
--- a/settings/l10n/nb_NO.json
+++ b/settings/l10n/nb_NO.json
@@ -82,6 +82,7 @@
"Uninstall" : "Avinstaller",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Appen er aktivert men må oppdateres. Du vil bli omdirigert til oppdateringssiden om 5 sekunder.",
"App update" : "Oppdatering av applikasjon",
+ "No apps found for {query}" : "Ingen apper funnet for \"{query}\"",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Det oppstod en feil. Vennligst last opp et ASCII-kodet PEM-sertifikat.",
"Valid until {date}" : "Gyldig til {date}",
"Delete" : "Slett",
@@ -123,17 +124,20 @@
"SSL" : "SSL",
"TLS" : "TLS",
"php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ser ikke ut til å være satt opp riktig for å lese systemets miljøvariabler. Testen med getenv(\"PATH\") returnerer bare et tomt svar.",
+ "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Vennligst sjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsdokumentasjonen ↗</a> etter php konfigurasjonsnotater og konfigurering av php på serveren din, særlig om du bruker php-fpm.",
"The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Den skrivebeskyttede konfigurasjonen er blitt aktivert. Dette forhindrer setting av visse konfigureringer via web-grensesnittet. Videre må config-filen gjøres skrivbar manuelt for hver oppdatering.",
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "Det ser ut for at PHP er satt opp til å fjerne innebygde doc blocks. Dette gjør at flere av kjerneapplikasjonene blir utilgjengelige.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dette forårsakes sannsynligvis av en bufrer/akselerator, som f.eks. Zend OPcache eller eAccelerator.",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Serveren din kjører på Microsoft Windows. Vi anbefaler strekt Linux for en optimal brukeropplevelse.",
"%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s lavere enn versjon %2$s er installert. Vi anbefaler å oppgradere til en nyere %1$s-versjon for å få bedre stabilitet og ytelse.",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP modulen 'fileinfo' mangler. Vi anbefaler at du aktiverer denne modulen for å kunne detektere mime-typen korrekt.",
+ "Transactional file locking is disabled, this might lead to issues with race conditions. Enable 'filelocking.enabled' in config.php to avoid these problems. See the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a> for more information." : "Transaksjonsbasert fil-låsing er deaktivert. Dette kan føre til konflikt. Aktiver \"filelocking.enabled\" i config.php for å unngå disse problemene. Se <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">dokumentasjonen ↗</a> for mer informasjon.",
"System locale can not be set to a one which supports UTF-8." : "Kan ikke sette systemets nasjonale innstillinger til en som støtter UTF-8.",
"This means that there might be problems with certain characters in file names." : "Dette betyr at det kan forekomme problemer med visse tegn i filnavn.",
"We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.",
"If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")",
"It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:",
+ "Please double check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Vennligst dobbeltsjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsguidene ↗</a>, og se etter feil eller advarsler i <a href=\"#log-section\">loggen</a>.",
"All checks passed." : "Alle sjekker bestått.",
"Open documentation" : "Åpne dokumentasjonen",
"Allow apps to use the Share API" : "Tillat apper å bruke API for Deling",
@@ -146,6 +150,7 @@
"days" : "dager",
"Enforce expiration date" : "Krev utløpsdato",
"Allow resharing" : "TIllat videre deling",
+ "Allow sharing with groups" : "Tillat deling med grupper",
"Restrict users to only share with users in their groups" : "Begrens brukere til kun å dele med brukere i deres grupper",
"Allow users to send mail notification for shared files to other users" : "Tillat at brukere sender varsler om delte filer på e-post til andre brukere",
"Exclude groups from sharing" : "Utelukk grupper fra deling",
@@ -192,6 +197,7 @@
"What to log" : "Hva som skal logges",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite brukes som database. For større installasjoner anbefaler vi å bytte til en annen database-server.",
"Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "SQLite er spesielt frarådet om man bruker desktopklienten til filsynkronisering",
+ "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.",
"How to do backups" : "Hvordan ta sikkerhetskopier",
"Advanced monitoring" : "Avansert overvåking",
"Performance tuning" : "Forbedre ytelsen",
diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js
index 10db457d3cf..3e1fa89cf4d 100644
--- a/settings/l10n/nl.js
+++ b/settings/l10n/nl.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimenteel",
"All" : "Alle",
"No apps found for your version" : "Geen apps gevonden voor uw versie",
+ "The app will be downloaded from the app store" : "De app zal worden gedownload van de app store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Officiële apps zijn ontwikkeld door en binnen de ownCloud community. Ze bieden functionaliteit binnen ownCloud en zijn klaar voor gebruik in een productie omgeving.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Goedgekeurde apps zijn ontwikkeld door vertrouwde ontwikkelaars en hebben een beveiligingscontrole ondergaan. Ze worden actief onderhouden in een open code repository en hun ontwikkelaars vinden ze stabiel genoeg voor informeel of normaal gebruik.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Deze app is niet gecontroleerd op beveiligingsproblemen en is nieuw is is bekend als onstabiel. Installeren op eigen risico.",
diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json
index c84492182e3..78b2cad9956 100644
--- a/settings/l10n/nl.json
+++ b/settings/l10n/nl.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimenteel",
"All" : "Alle",
"No apps found for your version" : "Geen apps gevonden voor uw versie",
+ "The app will be downloaded from the app store" : "De app zal worden gedownload van de app store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Officiële apps zijn ontwikkeld door en binnen de ownCloud community. Ze bieden functionaliteit binnen ownCloud en zijn klaar voor gebruik in een productie omgeving.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Goedgekeurde apps zijn ontwikkeld door vertrouwde ontwikkelaars en hebben een beveiligingscontrole ondergaan. Ze worden actief onderhouden in een open code repository en hun ontwikkelaars vinden ze stabiel genoeg voor informeel of normaal gebruik.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Deze app is niet gecontroleerd op beveiligingsproblemen en is nieuw is is bekend als onstabiel. Installeren op eigen risico.",
diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js
index ece7ecc3b93..80856cc52fa 100644
--- a/settings/l10n/pt_BR.js
+++ b/settings/l10n/pt_BR.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimental",
"All" : "Todos",
"No apps found for your version" : "Nenhum aplicativo encontrados para a sua versão",
+ "The app will be downloaded from the app store" : "O aplicativo será baixado na App Store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplicativos oficiais são desenvolvidos por e dentro da comunidade ownCloud. Eles oferecem funcionalidade central para ownCloud e estão prontos para uso em produção.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplicativos aprovados são desenvolvidos pelos desenvolvedores confiáveis e passaram por uma verificação de segurança superficial. Eles são ativamente mantidos em um repositório de código aberto e seus mantenedores consideram que eles para sejam estáveis para um casual uso normal.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Este aplicativo não foi verificado para as questões de segurança e é novo ou conhecido por ser instável. Instale por seu próprio risco.",
diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json
index 35374c52863..1a724f7c7a1 100644
--- a/settings/l10n/pt_BR.json
+++ b/settings/l10n/pt_BR.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimental",
"All" : "Todos",
"No apps found for your version" : "Nenhum aplicativo encontrados para a sua versão",
+ "The app will be downloaded from the app store" : "O aplicativo será baixado na App Store",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplicativos oficiais são desenvolvidos por e dentro da comunidade ownCloud. Eles oferecem funcionalidade central para ownCloud e estão prontos para uso em produção.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplicativos aprovados são desenvolvidos pelos desenvolvedores confiáveis e passaram por uma verificação de segurança superficial. Eles são ativamente mantidos em um repositório de código aberto e seus mantenedores consideram que eles para sejam estáveis para um casual uso normal.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Este aplicativo não foi verificado para as questões de segurança e é novo ou conhecido por ser instável. Instale por seu próprio risco.",
diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js
index 564e6b11263..32202c87d40 100644
--- a/settings/l10n/pt_PT.js
+++ b/settings/l10n/pt_PT.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Experimental",
"All" : "Todos",
"No apps found for your version" : "Nenhuma aplicação encontrada para a sua versão",
+ "The app will be downloaded from the app store" : "A aplicação será descarregada da loja de aplicações.",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "As apps oficiais são desenvolvidas por e na comunidade da ownCloud. Elas oferecem funcionalidade central para a ownCloud e está pronta para uma utilização na produção.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicações aprovadas são desenvolvidas por developers de confiança e passaram numa verificação de segurança. São mantidas ativamente num repositório de código aberto e quem as mantém considera-as estáveis para uso casual a normal.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicação não foi verificada por problemas de segurança e é nova ou conhecida por ser instável. Instale-a por sua conta e risco.",
diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json
index cc05e17409d..132ca5b992b 100644
--- a/settings/l10n/pt_PT.json
+++ b/settings/l10n/pt_PT.json
@@ -61,6 +61,7 @@
"Experimental" : "Experimental",
"All" : "Todos",
"No apps found for your version" : "Nenhuma aplicação encontrada para a sua versão",
+ "The app will be downloaded from the app store" : "A aplicação será descarregada da loja de aplicações.",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "As apps oficiais são desenvolvidas por e na comunidade da ownCloud. Elas oferecem funcionalidade central para a ownCloud e está pronta para uma utilização na produção.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "As aplicações aprovadas são desenvolvidas por developers de confiança e passaram numa verificação de segurança. São mantidas ativamente num repositório de código aberto e quem as mantém considera-as estáveis para uso casual a normal.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Esta aplicação não foi verificada por problemas de segurança e é nova ou conhecida por ser instável. Instale-a por sua conta e risco.",
diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js
index 2ad7a987fee..74f4a10d3a0 100644
--- a/settings/l10n/sl.js
+++ b/settings/l10n/sl.js
@@ -79,6 +79,7 @@ OC.L10N.register(
"Uninstall" : "Odstrani namestitev",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Vstavek je omogočen, vendar zahteva posodobitev. Samodejno bo izvedena preusmeritev na stran za posodobitev v 5 sekundah.",
"App update" : "Posodabljanje vstavkov",
+ "No apps found for {query}" : "Ni programov, skladnih z nizom \"{query}\".",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Prišlo je do napake. Uvoziti je treba ustrezno ASCII kodirano potrdilo PEM.",
"Valid until {date}" : "Veljavno do {date}",
"Delete" : "Izbriši",
@@ -169,6 +170,7 @@ OC.L10N.register(
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Dnevniškega datoteka je večja od 100 MB. Hitrost prejema je odvisna od širokopasovne povezave!",
"What to log" : "Kaj naj se beleži?",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Uporabljena zbirka je SQLite. Za obsežnejše sisteme je priporočljiv prehod na drugo vrsto zbirke.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Uporaba SQLite ni priporočljiva iz varnostnih razlogov, še posebej če se sistem krajevno usklajuje z namizjem prek odjemalca.",
"How to do backups" : "Kako ustvariti varnostne kopije",
"Advanced monitoring" : "Napredno sledenje",
"Performance tuning" : "Prilagajanje delovanja",
diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json
index 70cefaefc80..0b255cef767 100644
--- a/settings/l10n/sl.json
+++ b/settings/l10n/sl.json
@@ -77,6 +77,7 @@
"Uninstall" : "Odstrani namestitev",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Vstavek je omogočen, vendar zahteva posodobitev. Samodejno bo izvedena preusmeritev na stran za posodobitev v 5 sekundah.",
"App update" : "Posodabljanje vstavkov",
+ "No apps found for {query}" : "Ni programov, skladnih z nizom \"{query}\".",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Prišlo je do napake. Uvoziti je treba ustrezno ASCII kodirano potrdilo PEM.",
"Valid until {date}" : "Veljavno do {date}",
"Delete" : "Izbriši",
@@ -167,6 +168,7 @@
"The logfile is bigger than 100 MB. Downloading it may take some time!" : "Dnevniškega datoteka je večja od 100 MB. Hitrost prejema je odvisna od širokopasovne povezave!",
"What to log" : "Kaj naj se beleži?",
"SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "Uporabljena zbirka je SQLite. Za obsežnejše sisteme je priporočljiv prehod na drugo vrsto zbirke.",
+ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Uporaba SQLite ni priporočljiva iz varnostnih razlogov, še posebej če se sistem krajevno usklajuje z namizjem prek odjemalca.",
"How to do backups" : "Kako ustvariti varnostne kopije",
"Advanced monitoring" : "Napredno sledenje",
"Performance tuning" : "Prilagajanje delovanja",
diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js
index 9e3f9be212f..d2e5d1b6537 100644
--- a/settings/l10n/sq.js
+++ b/settings/l10n/sq.js
@@ -63,6 +63,7 @@ OC.L10N.register(
"Experimental" : "Eksperimentale",
"All" : "Krejt",
"No apps found for your version" : "S’u gjetën aplikacione për versionin tuaj",
+ "The app will be downloaded from the app store" : "Aplikacioni do të shkarkohet nga shitorja e aplikacioneve",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplikacionet zyrtare ndërtohen brenda bashkësisë ownCloud. Ato ofrojnë funksione qendrore për ownCloud dhe janë gati për t’u përdorur në prodhim.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikacionet e miratuara ndërtohen nga zhvillues të besuar dhe kanë kaluar një kontroll të përciptë sigurie. Mirëmbahen aktivisht në një depo të hapur kodi dhe mirëmbajtësit e tyre i konsiderojnë të qëndrueshme për përdorime nga të rastit deri në ato normale.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ky aplikacion s’është kontrolluar për probleme sigurie dhe është i ri ose i njohur si i paqëndrueshëm. Instalojeni duke e mbajtur vetë përgjegjësinë.",
diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json
index 50415cca870..e00f1f6560a 100644
--- a/settings/l10n/sq.json
+++ b/settings/l10n/sq.json
@@ -61,6 +61,7 @@
"Experimental" : "Eksperimentale",
"All" : "Krejt",
"No apps found for your version" : "S’u gjetën aplikacione për versionin tuaj",
+ "The app will be downloaded from the app store" : "Aplikacioni do të shkarkohet nga shitorja e aplikacioneve",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Aplikacionet zyrtare ndërtohen brenda bashkësisë ownCloud. Ato ofrojnë funksione qendrore për ownCloud dhe janë gati për t’u përdorur në prodhim.",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Aplikacionet e miratuara ndërtohen nga zhvillues të besuar dhe kanë kaluar një kontroll të përciptë sigurie. Mirëmbahen aktivisht në një depo të hapur kodi dhe mirëmbajtësit e tyre i konsiderojnë të qëndrueshme për përdorime nga të rastit deri në ato normale.",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ky aplikacion s’është kontrolluar për probleme sigurie dhe është i ri ose i njohur si i paqëndrueshëm. Instalojeni duke e mbajtur vetë përgjegjësinë.",
diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js
index 404e6319125..e3758adc2f5 100644
--- a/settings/l10n/sv.js
+++ b/settings/l10n/sv.js
@@ -84,6 +84,7 @@ OC.L10N.register(
"Uninstall" : "Avinstallera",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Applikationen har aktiverats men behöver uppdateras. Du kommer bli omdirigerad till uppdateringssidan inom 5 sekunder.",
"App update" : "Uppdatering av app",
+ "No apps found for {query}" : "Inga applikationer funna för {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ett fel uppstod. Var god ladda upp ett ASCII-kodad PEM certifikat.",
"Valid until {date}" : "Giltig t.o.m. {date}",
"Delete" : "Radera",
diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json
index 8aff721bd50..0a56fda47ec 100644
--- a/settings/l10n/sv.json
+++ b/settings/l10n/sv.json
@@ -82,6 +82,7 @@
"Uninstall" : "Avinstallera",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Applikationen har aktiverats men behöver uppdateras. Du kommer bli omdirigerad till uppdateringssidan inom 5 sekunder.",
"App update" : "Uppdatering av app",
+ "No apps found for {query}" : "Inga applikationer funna för {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "Ett fel uppstod. Var god ladda upp ett ASCII-kodad PEM certifikat.",
"Valid until {date}" : "Giltig t.o.m. {date}",
"Delete" : "Radera",
diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js
index 2a7c84ee132..84536fa4f00 100644
--- a/settings/l10n/th_TH.js
+++ b/settings/l10n/th_TH.js
@@ -6,13 +6,13 @@ OC.L10N.register(
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Please provide an admin recovery password, otherwise all user data will be lost" : "โปรดให้กู้คืนรหัสผ่านของผู้ดูแลระบบมิฉะนั้นข้อมูลของผู้ใช้ทั้งหมดจะหายไป",
"Wrong admin recovery password. Please check the password and try again." : "กู้คืนรหัสผ่านของผู้ดูแลระบบไม่ถูกต้อง กรุณาตรวจสอบรหัสผ่านและลองอีกครั้ง.",
- "Backend doesn't support password change, but the user's encryption key was successfully updated." : "แบ็กเอนด์ไม่สนับสนุนการเปลี่ยนแปลงรหัสผ่าน แต่คีย์การเข้ารหัสลับของผู้ใช้จะถูกอัพเดทสำเร็จ",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "แบ็กเอนด์ไม่สนับสนุนการเปลี่ยนแปลงรหัสผ่าน แต่คีย์ที่เข้ารหัสลับของผู้ใช้ได้ถูกอัพเดทแล้ว",
"Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน",
"Enabled" : "เปิดการใช้งาน",
"Not enabled" : "ใช้งานไม่ได้",
"installing and updating apps via the app store or Federated Cloud Sharing" : "กำลังติดตั้งและอัพเดทแอพพลิเคชันผ่าแอพสโตร์หรือคลาวด์ในเครือ",
"Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
- "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL รุ่น %s เป็นรุ่นเก่า (%s)โปรดอัพเดทระบบปฏิบัติการหรือคุณสมบัติเป็น %s เพื่อการทำงานที่มีประสิทธิภาพ",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "คุณกำลังใช้ cURL %s รุ่นเก่ากว่า (%s)โปรดอัพเดทระบบปฏิบัติการหรือคุณสมบัติเป็น %s เพื่อการทำงานที่มีประสิทธิภาพ",
"A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)",
"Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์",
"Group already exists." : "มีกลุ่มนี้อยู่แล้ว",
@@ -63,15 +63,20 @@ OC.L10N.register(
"Experimental" : "การทดลอง",
"All" : "ทั้งหมด",
"No apps found for your version" : "ไม่พบแอพพลิเคชันสำหรับรุ่นของคุณ",
+ "The app will be downloaded from the app store" : "แอพฯจะดาวน์โหลดได้จากแอพสโตร์",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "แอพพลิเคชันมีการพัฒนาอย่างเป็นทางการภายในชุมชน ownCloud พวกเขามีการทำงานเป็นศูนย์กลางของ ownCloud และพร้อมสำหรับการใช้งานผลิตภัณฑ์",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "แอพพลิเคชันได้รับการอนุมัติและพัฒนาโดยนักพัฒนาที่น่าเชื่อถือและได้ผ่านการตรวจสอบความปลอดภัยคร่าวๆ พวกเขาจะได้รับการบำรุงรักษาอย่างดีในการเก็บข้อมูลรหัสเปิด มันอาจยังไม่เสถียรพอสำหรับการเปิดใช้งานปกติ",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "แอพฯ นี้ไม่ได้ตรวจสอบปัญหาด้านความปลอดภัยและเป็นแอพฯใหม่หรือที่รู้จักกันคือจะไม่เสถียร ติดตั้งบนความเสี่ยงของคุณเอง",
"Update to %s" : "อัพเดทไปยัง %s",
+ "_You have %n app update pending_::_You have %n app updates pending_" : ["คุณมีอัพเดทแอพฯ n% รายการ อยู่ในระหว่างดำเนินการ"],
"Please wait...." : "กรุณารอสักครู่...",
"Error while disabling app" : "เกิดข้อผิดพลาดขณะปิดการใช้งานแอพพลิเคชัน",
"Disable" : "ปิดใช้งาน",
"Enable" : "เปิดใช้งาน",
"Error while enabling app" : "เกิดข้อผิดพลาดขณะกำลังตรวจสอบแอพฯ",
+ "Error: this app cannot be enabled because it makes the server unstable" : "ข้อผิดพลาด: ไม่สามารถเปิดใช้งานแอพฯนี้ เพราะมันอาจทำให้เซิร์ฟเวอร์มีปัญหา",
+ "Error: could not disable broken app" : "ข้อผิดพลาด: ไม่สามารถปิดการใช้งานแอพฯที่มีปัญหา",
+ "Error while disabling broken app" : "ข้อผิดพลาดขณะกำลังปิดการใช้งานแอพฯที่มีปัญหา",
"Updating...." : "กำลังอัพเดทข้อมูล...",
"Error while updating app" : "เกิดข้อผิดพลาดขณะกำลังอัพเดทแอพฯ",
"Updated" : "อัพเดทแล้ว",
@@ -80,6 +85,7 @@ OC.L10N.register(
"Uninstall" : "ถอนการติดตั้ง",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "แอพฯจะต้องเปิดใช้งานก่อนทำการอัพเดท คุณจะถูกนำไปยังหน้าอัพเดทใน 5 วินาที",
"App update" : "อัพเดทแอพฯ",
+ "No apps found for {query}" : "ไม่พบแอพฯสำหรับ {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "เกิดข้อผิดพลาด กรุณาอัพโหลดใบรับรองเข้ารหัส ASCII PEM",
"Valid until {date}" : "ใช้ได้จนถึงวันที่ {date}",
"Delete" : "ลบ",
@@ -123,6 +129,7 @@ OC.L10N.register(
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "เห็นได้ชัดว่าการตั้งค่า PHP จะตัดบล็อคเอกสารแบบอินไลน์ ซึ่งจะทำให้แอพพลิเคชันอีกหลายแกนไม่สามารถเข้าถึงได้",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "นี้อาจเกิดจาก cache/accelerator อย่างเช่น Zend OPcache หรือ eAccelerator",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "เซิร์ฟเวอร์ของคุณทำงานบน Microsoft Windows เราขอแนะนำให้ใช้ลินุกซ์หากคุณต้องการ การใช้งานที่ดีที่สุด",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s เป็นรุ่นที่ต่ำกว่า %2$s ได้ถูกติดตั้ง สำหรับเหตุผลด้านเสถียรภาพและประสิทธิภาพการทำงาน เราขอแนะนำให้อัพเดทไปเป็นรุ่น %1$s",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "โมดูล PHP 'fileinfo' หายไป เราขอแนะนำให้เปิดใช้งานโมดูลนี้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดกับการตรวจสอบชนิด mime",
"System locale can not be set to a one which supports UTF-8." : "ตำแหน่งที่ตั้งของระบบไม่สามารถตั้งค่าให้รองรับ UTF-8",
"This means that there might be problems with certain characters in file names." : "นี้หมายความว่าอาจจะมีปัญหากับตัวอักษรบางตัวในชื่อไฟล์",
@@ -137,7 +144,7 @@ OC.L10N.register(
"Allow public uploads" : "อนุญาตให้อัพโหลดสาธารณะ",
"Allow users to send mail notification for shared files" : "อนุญาตให้ผู้ใช้ส่งการแจ้งเตือนอีเมลสำหรับไฟล์ที่ถูกแชร์",
"Set default expiration date" : "ตั้งค่าเริ่มต้นวันหมดอายุ",
- "Expire after " : "หมดอายุหลังจาก",
+ "Expire after " : "หลังจากหมดอายุ",
"days" : "วัน",
"Enforce expiration date" : "บังคับให้มีวันที่หมดอายุ",
"Allow resharing" : "อนุญาตให้แชร์ข้อมูลซ้ำใหม่ได้",
@@ -204,7 +211,7 @@ OC.L10N.register(
"Admin documentation" : "เอกสารผู้ดูแลระบบ",
"Show description …" : "แสดงรายละเอียด ...",
"Hide description …" : "ซ่อนรายละเอียด ...",
- "This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "แอพฯนี้ได้ไม่บ่งบอกรุ่นต่ำสุดของ ownCloud นี้จะเป็นข้อผิดพลาดใน ownCloud ที่ 11 และรุ่นต่อมา",
+ "This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "แอพฯนี้ได้ไม่บ่งบอกรุ่นต่ำสุดของ ownCloud นี้จะเป็นปัญหาใน ownCloud รุ่น 11 และรุ่นต่อไป",
"This app has no maximum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "แอพฯนี้ได้ไม่บ่งบอกรุ่นสูงสุดของ ownCloud นี้จะเป็นข้อผิดพลาดใน ownCloud ที่ 11 และรุ่นต่อมา",
"This app cannot be installed because the following dependencies are not fulfilled:" : "ไม่สามารถติดตั้งแอพฯนี้เพราะไม่มีตัวอ้างอิงต่อไปนี้:",
"Enable only for specific groups" : "เปิดใช้งานเพียงเฉพาะกลุ่ม",
diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json
index 73aa6c6211f..5314f9809e8 100644
--- a/settings/l10n/th_TH.json
+++ b/settings/l10n/th_TH.json
@@ -4,13 +4,13 @@
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Please provide an admin recovery password, otherwise all user data will be lost" : "โปรดให้กู้คืนรหัสผ่านของผู้ดูแลระบบมิฉะนั้นข้อมูลของผู้ใช้ทั้งหมดจะหายไป",
"Wrong admin recovery password. Please check the password and try again." : "กู้คืนรหัสผ่านของผู้ดูแลระบบไม่ถูกต้อง กรุณาตรวจสอบรหัสผ่านและลองอีกครั้ง.",
- "Backend doesn't support password change, but the user's encryption key was successfully updated." : "แบ็กเอนด์ไม่สนับสนุนการเปลี่ยนแปลงรหัสผ่าน แต่คีย์การเข้ารหัสลับของผู้ใช้จะถูกอัพเดทสำเร็จ",
+ "Backend doesn't support password change, but the user's encryption key was successfully updated." : "แบ็กเอนด์ไม่สนับสนุนการเปลี่ยนแปลงรหัสผ่าน แต่คีย์ที่เข้ารหัสลับของผู้ใช้ได้ถูกอัพเดทแล้ว",
"Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน",
"Enabled" : "เปิดการใช้งาน",
"Not enabled" : "ใช้งานไม่ได้",
"installing and updating apps via the app store or Federated Cloud Sharing" : "กำลังติดตั้งและอัพเดทแอพพลิเคชันผ่าแอพสโตร์หรือคลาวด์ในเครือ",
"Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์",
- "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "cURL รุ่น %s เป็นรุ่นเก่า (%s)โปรดอัพเดทระบบปฏิบัติการหรือคุณสมบัติเป็น %s เพื่อการทำงานที่มีประสิทธิภาพ",
+ "cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably." : "คุณกำลังใช้ cURL %s รุ่นเก่ากว่า (%s)โปรดอัพเดทระบบปฏิบัติการหรือคุณสมบัติเป็น %s เพื่อการทำงานที่มีประสิทธิภาพ",
"A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)",
"Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์",
"Group already exists." : "มีกลุ่มนี้อยู่แล้ว",
@@ -61,15 +61,20 @@
"Experimental" : "การทดลอง",
"All" : "ทั้งหมด",
"No apps found for your version" : "ไม่พบแอพพลิเคชันสำหรับรุ่นของคุณ",
+ "The app will be downloaded from the app store" : "แอพฯจะดาวน์โหลดได้จากแอพสโตร์",
"Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "แอพพลิเคชันมีการพัฒนาอย่างเป็นทางการภายในชุมชน ownCloud พวกเขามีการทำงานเป็นศูนย์กลางของ ownCloud และพร้อมสำหรับการใช้งานผลิตภัณฑ์",
"Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "แอพพลิเคชันได้รับการอนุมัติและพัฒนาโดยนักพัฒนาที่น่าเชื่อถือและได้ผ่านการตรวจสอบความปลอดภัยคร่าวๆ พวกเขาจะได้รับการบำรุงรักษาอย่างดีในการเก็บข้อมูลรหัสเปิด มันอาจยังไม่เสถียรพอสำหรับการเปิดใช้งานปกติ",
"This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "แอพฯ นี้ไม่ได้ตรวจสอบปัญหาด้านความปลอดภัยและเป็นแอพฯใหม่หรือที่รู้จักกันคือจะไม่เสถียร ติดตั้งบนความเสี่ยงของคุณเอง",
"Update to %s" : "อัพเดทไปยัง %s",
+ "_You have %n app update pending_::_You have %n app updates pending_" : ["คุณมีอัพเดทแอพฯ n% รายการ อยู่ในระหว่างดำเนินการ"],
"Please wait...." : "กรุณารอสักครู่...",
"Error while disabling app" : "เกิดข้อผิดพลาดขณะปิดการใช้งานแอพพลิเคชัน",
"Disable" : "ปิดใช้งาน",
"Enable" : "เปิดใช้งาน",
"Error while enabling app" : "เกิดข้อผิดพลาดขณะกำลังตรวจสอบแอพฯ",
+ "Error: this app cannot be enabled because it makes the server unstable" : "ข้อผิดพลาด: ไม่สามารถเปิดใช้งานแอพฯนี้ เพราะมันอาจทำให้เซิร์ฟเวอร์มีปัญหา",
+ "Error: could not disable broken app" : "ข้อผิดพลาด: ไม่สามารถปิดการใช้งานแอพฯที่มีปัญหา",
+ "Error while disabling broken app" : "ข้อผิดพลาดขณะกำลังปิดการใช้งานแอพฯที่มีปัญหา",
"Updating...." : "กำลังอัพเดทข้อมูล...",
"Error while updating app" : "เกิดข้อผิดพลาดขณะกำลังอัพเดทแอพฯ",
"Updated" : "อัพเดทแล้ว",
@@ -78,6 +83,7 @@
"Uninstall" : "ถอนการติดตั้ง",
"The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "แอพฯจะต้องเปิดใช้งานก่อนทำการอัพเดท คุณจะถูกนำไปยังหน้าอัพเดทใน 5 วินาที",
"App update" : "อัพเดทแอพฯ",
+ "No apps found for {query}" : "ไม่พบแอพฯสำหรับ {query}",
"An error occurred. Please upload an ASCII-encoded PEM certificate." : "เกิดข้อผิดพลาด กรุณาอัพโหลดใบรับรองเข้ารหัส ASCII PEM",
"Valid until {date}" : "ใช้ได้จนถึงวันที่ {date}",
"Delete" : "ลบ",
@@ -121,6 +127,7 @@
"PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "เห็นได้ชัดว่าการตั้งค่า PHP จะตัดบล็อคเอกสารแบบอินไลน์ ซึ่งจะทำให้แอพพลิเคชันอีกหลายแกนไม่สามารถเข้าถึงได้",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "นี้อาจเกิดจาก cache/accelerator อย่างเช่น Zend OPcache หรือ eAccelerator",
"Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "เซิร์ฟเวอร์ของคุณทำงานบน Microsoft Windows เราขอแนะนำให้ใช้ลินุกซ์หากคุณต้องการ การใช้งานที่ดีที่สุด",
+ "%1$s below version %2$s is installed, for stability and performance reasons we recommend updating to a newer %1$s version." : "%1$s เป็นรุ่นที่ต่ำกว่า %2$s ได้ถูกติดตั้ง สำหรับเหตุผลด้านเสถียรภาพและประสิทธิภาพการทำงาน เราขอแนะนำให้อัพเดทไปเป็นรุ่น %1$s",
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "โมดูล PHP 'fileinfo' หายไป เราขอแนะนำให้เปิดใช้งานโมดูลนี้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดกับการตรวจสอบชนิด mime",
"System locale can not be set to a one which supports UTF-8." : "ตำแหน่งที่ตั้งของระบบไม่สามารถตั้งค่าให้รองรับ UTF-8",
"This means that there might be problems with certain characters in file names." : "นี้หมายความว่าอาจจะมีปัญหากับตัวอักษรบางตัวในชื่อไฟล์",
@@ -135,7 +142,7 @@
"Allow public uploads" : "อนุญาตให้อัพโหลดสาธารณะ",
"Allow users to send mail notification for shared files" : "อนุญาตให้ผู้ใช้ส่งการแจ้งเตือนอีเมลสำหรับไฟล์ที่ถูกแชร์",
"Set default expiration date" : "ตั้งค่าเริ่มต้นวันหมดอายุ",
- "Expire after " : "หมดอายุหลังจาก",
+ "Expire after " : "หลังจากหมดอายุ",
"days" : "วัน",
"Enforce expiration date" : "บังคับให้มีวันที่หมดอายุ",
"Allow resharing" : "อนุญาตให้แชร์ข้อมูลซ้ำใหม่ได้",
@@ -202,7 +209,7 @@
"Admin documentation" : "เอกสารผู้ดูแลระบบ",
"Show description …" : "แสดงรายละเอียด ...",
"Hide description …" : "ซ่อนรายละเอียด ...",
- "This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "แอพฯนี้ได้ไม่บ่งบอกรุ่นต่ำสุดของ ownCloud นี้จะเป็นข้อผิดพลาดใน ownCloud ที่ 11 และรุ่นต่อมา",
+ "This app has no minimum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "แอพฯนี้ได้ไม่บ่งบอกรุ่นต่ำสุดของ ownCloud นี้จะเป็นปัญหาใน ownCloud รุ่น 11 และรุ่นต่อไป",
"This app has no maximum ownCloud version assigned. This will be an error in ownCloud 11 and later." : "แอพฯนี้ได้ไม่บ่งบอกรุ่นสูงสุดของ ownCloud นี้จะเป็นข้อผิดพลาดใน ownCloud ที่ 11 และรุ่นต่อมา",
"This app cannot be installed because the following dependencies are not fulfilled:" : "ไม่สามารถติดตั้งแอพฯนี้เพราะไม่มีตัวอ้างอิงต่อไปนี้:",
"Enable only for specific groups" : "เปิดใช้งานเพียงเฉพาะกลุ่ม",
diff --git a/settings/personal.php b/settings/personal.php
index 62a718985f8..6c2fccbec9b 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -47,13 +47,14 @@ OC_Util::addScript('settings', 'certificates');
OC_Util::addStyle( 'settings', 'settings' );
\OC_Util::addVendorScript('strengthify/jquery.strengthify');
\OC_Util::addVendorStyle('strengthify/strengthify');
-\OC_Util::addScript('files', 'jquery.iframe-transport');
\OC_Util::addScript('files', 'jquery.fileupload');
if ($config->getSystemValue('enable_avatars', true) === true) {
\OC_Util::addVendorScript('jcrop/js/jquery.Jcrop');
\OC_Util::addVendorStyle('jcrop/css/jquery.Jcrop');
}
+\OC::$server->getEventDispatcher()->dispatch('OC\Settings\Personal::loadAdditionalScripts');
+
// Highlight navigation entry
OC::$server->getNavigationManager()->setActiveEntry('personal');
diff --git a/settings/templates/apps.php b/settings/templates/apps.php
index 47d1eff463e..ecb00fb27c3 100644
--- a/settings/templates/apps.php
+++ b/settings/templates/apps.php
@@ -25,7 +25,7 @@ script(
<script id="categories-template" type="text/x-handlebars-template">
{{#each this}}
<li id="app-category-{{ident}}" data-category-id="{{ident}}" tabindex="0">
- <a>{{displayName}}</a>
+ <a href="#">{{displayName}}</a>
</li>
{{/each}}
@@ -94,8 +94,8 @@ script(
</p>
{{/if}}
</div><!-- end app-description-container -->
- <div class="app-description-toggle-show"><?php p($l->t("Show description …"));?></div>
- <div class="app-description-toggle-hide hidden"><?php p($l->t("Hide description …"));?></div>
+ <div class="app-description-toggle-show" role="link"><?php p($l->t("Show description …"));?></div>
+ <div class="app-description-toggle-hide hidden" role="link"><?php p($l->t("Hide description …"));?></div>
<div class="app-dependencies update hidden">
<p><?php p($l->t('This app has an update available.')); ?></p>
@@ -134,7 +134,7 @@ script(
<br />
<input type="hidden" id="group_select" title="<?php p($l->t('All')); ?>" style="width: 200px">
{{else}}
- <input class="enable" type="submit" data-appid="{{id}}" data-active="false" {{#unless canInstall}}disabled="disabled"{{/unless}} value="<?php p($l->t("Enable"));?>"/>
+ <input class="enable{{#if needsDownload}} needs-download{{/if}}" type="submit" data-appid="{{id}}" data-active="false" {{#unless canInstall}}disabled="disabled"{{/unless}} value="<?php p($l->t("Enable"));?>"/>
{{/if}}
{{#if canUnInstall}}
<input class="uninstall" type="submit" value="<?php p($l->t('Uninstall App')); ?>" data-appid="{{id}}" />
diff --git a/settings/tests/js/users/deleteHandlerSpec.js b/settings/tests/js/users/deleteHandlerSpec.js
index 371eae5941d..3e7f768e519 100644
--- a/settings/tests/js/users/deleteHandlerSpec.js
+++ b/settings/tests/js/users/deleteHandlerSpec.js
@@ -132,6 +132,20 @@ describe('DeleteHandler tests', function() {
var request = fakeServer.requests[0];
expect(request.url).toEqual(OC.webroot + '/index.php/dummyendpoint.php/some_uid');
});
+ it('deletes when deleteEntry is called and escapes', function() {
+ fakeServer.respondWith(/\/index\.php\/dummyendpoint.php\/some_uid/, [
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify({status: 'success'})
+ ]);
+ var handler = init(markCallback, removeCallback, undoCallback);
+ handler.mark('some_uid<>/"..\\');
+
+ handler.deleteEntry();
+ expect(fakeServer.requests.length).toEqual(1);
+ var request = fakeServer.requests[0];
+ expect(request.url).toEqual(OC.webroot + '/index.php/dummyendpoint.php/some_uid%3C%3E%2F%22..%5C');
+ });
it('cancels deletion when undo is clicked', function() {
var handler = init(markCallback, removeCallback, undoCallback);
handler.setNotification(OC.Notification, 'dataid', 'removed %oid entry <span class="undo">Undo</span>', undoCallback);
diff --git a/tests/core/command/encryption/changekeystorageroottest.php b/tests/core/command/encryption/changekeystorageroottest.php
index 6cb52cdea99..2a1f48983f1 100644
--- a/tests/core/command/encryption/changekeystorageroottest.php
+++ b/tests/core/command/encryption/changekeystorageroottest.php
@@ -74,9 +74,9 @@ class ChangeKeyStorageRootTest extends TestCase {
$this->outputInterface = $this->getMock('Symfony\Component\Console\Output\OutputInterface');
$this->userInterface = $this->getMock('\OCP\UserInterface');
- $outputFormaterInterface = $this->getMock('Symfony\Component\Console\Formatter\OutputFormatterInterface');
+ $outputFormatterInterface = $this->getMock('Symfony\Component\Console\Formatter\OutputFormatterInterface');
$this->outputInterface->expects($this->any())->method('getFormatter')
- ->willReturn($outputFormaterInterface);
+ ->willReturn($outputFormatterInterface);
$this->changeKeyStorageRoot = new ChangeKeyStorageRoot(
$this->view,
diff --git a/tests/core/command/maintenance/datafingerprinttest.php b/tests/core/command/maintenance/datafingerprinttest.php
new file mode 100644
index 00000000000..4d661b5c027
--- /dev/null
+++ b/tests/core/command/maintenance/datafingerprinttest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace Tests\Core\Command\Maintenance;
+
+use OC\Core\Command\Maintenance\DataFingerprint;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\IConfig;
+use Test\TestCase;
+
+class DataFingerprintTest extends TestCase {
+ /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
+ protected $config;
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ protected $consoleInput;
+ /** @var \PHPUnit_Framework_MockObject_MockObject */
+ protected $consoleOutput;
+ /** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */
+ protected $timeFactory;
+
+ /** @var \Symfony\Component\Console\Command\Command */
+ protected $command;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->config = $this->getMock('OCP\IConfig');
+ $this->timeFactory = $this->getMock('OCP\AppFramework\Utility\ITimeFactory');
+ $this->consoleInput = $this->getMock('Symfony\Component\Console\Input\InputInterface');
+ $this->consoleOutput = $this->getMock('Symfony\Component\Console\Output\OutputInterface');
+
+ /** @var \OCP\IConfig $config */
+ $this->command = new DataFingerprint($this->config, $this->timeFactory);
+ }
+
+ public function testSetFingerPrint() {
+ $this->timeFactory->expects($this->once())
+ ->method('getTime')
+ ->willReturn(42);
+ $this->config->expects($this->once())
+ ->method('setSystemValue')
+ ->with('data-fingerprint', md5(42));
+
+ self::invokePrivate($this->command, 'execute', [$this->consoleInput, $this->consoleOutput]);
+ }
+}
diff --git a/tests/core/controller/LoginControllerTest.php b/tests/core/controller/LoginControllerTest.php
new file mode 100644
index 00000000000..f9a6080892b
--- /dev/null
+++ b/tests/core/controller/LoginControllerTest.php
@@ -0,0 +1,267 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Core\Controller;
+
+use OCP\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\TemplateResponse;
+use OCP\IConfig;
+use OCP\IRequest;
+use OCP\ISession;
+use OCP\IURLGenerator;
+use OCP\IUserManager;
+use OCP\IUserSession;
+use Test\TestCase;
+
+class LoginControllerTest extends TestCase {
+ /** @var LoginController */
+ private $loginController;
+ /** @var IRequest */
+ private $request;
+ /** @var IUserManager */
+ private $userManager;
+ /** @var IConfig */
+ private $config;
+ /** @var ISession */
+ private $session;
+ /** @var IUserSession */
+ private $userSession;
+ /** @var IURLGenerator */
+ private $urlGenerator;
+
+ public function setUp() {
+ parent::setUp();
+ $this->request = $this->getMock('\\OCP\\IRequest');
+ $this->userManager = $this->getMock('\\OCP\\IUserManager');
+ $this->config = $this->getMock('\\OCP\\IConfig');
+ $this->session = $this->getMock('\\OCP\\ISession');
+ $this->userSession = $this->getMock('\\OCP\\IUserSession');
+ $this->urlGenerator = $this->getMock('\\OCP\\IURLGenerator');
+
+ $this->loginController = new LoginController(
+ 'core',
+ $this->request,
+ $this->userManager,
+ $this->config,
+ $this->session,
+ $this->userSession,
+ $this->urlGenerator
+ );
+ }
+
+ public function testLogoutWithoutToken() {
+ $this->request
+ ->expects($this->once())
+ ->method('getCookie')
+ ->with('oc_token')
+ ->willReturn(null);
+ $this->config
+ ->expects($this->never())
+ ->method('deleteUserValue');
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRouteAbsolute')
+ ->with('core.login.showLoginForm')
+ ->willReturn('/login');
+
+ $expected = new RedirectResponse('/login');
+ $this->assertEquals($expected, $this->loginController->logout());
+ }
+
+ public function testLogoutWithToken() {
+ $this->request
+ ->expects($this->once())
+ ->method('getCookie')
+ ->with('oc_token')
+ ->willReturn('MyLoginToken');
+ $user = $this->getMock('\\OCP\\IUser');
+ $user
+ ->expects($this->once())
+ ->method('getUID')
+ ->willReturn('JohnDoe');
+ $this->userSession
+ ->expects($this->once())
+ ->method('getUser')
+ ->willReturn($user);
+ $this->config
+ ->expects($this->once())
+ ->method('deleteUserValue')
+ ->with('JohnDoe', 'login_token', 'MyLoginToken');
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('linkToRouteAbsolute')
+ ->with('core.login.showLoginForm')
+ ->willReturn('/login');
+
+ $expected = new RedirectResponse('/login');
+ $this->assertEquals($expected, $this->loginController->logout());
+ }
+
+ public function testShowLoginFormForLoggedInUsers() {
+ $this->userSession
+ ->expects($this->once())
+ ->method('isLoggedIn')
+ ->willReturn(true);
+
+ $expectedResponse = new RedirectResponse(\OC_Util::getDefaultPageUrl());
+ $this->assertEquals($expectedResponse, $this->loginController->showLoginForm('', '', ''));
+ }
+
+ public function testShowLoginFormWithErrorsInSession() {
+ $this->userSession
+ ->expects($this->once())
+ ->method('isLoggedIn')
+ ->willReturn(false);
+ $this->session
+ ->expects($this->once())
+ ->method('get')
+ ->with('loginMessages')
+ ->willReturn(
+ [
+ [
+ 'ErrorArray1',
+ 'ErrorArray2',
+ ],
+ [
+ 'MessageArray1',
+ 'MessageArray2',
+ ],
+ ]
+ );
+
+ $expectedResponse = new TemplateResponse(
+ 'core',
+ 'login',
+ [
+ 'ErrorArray1' => true,
+ 'ErrorArray2' => true,
+ 'messages' => [
+ 'MessageArray1',
+ 'MessageArray2',
+ ],
+ 'loginName' => '',
+ 'user_autofocus' => true,
+ 'canResetPassword' => true,
+ 'alt_login' => [],
+ 'rememberLoginAllowed' => \OC_Util::rememberLoginAllowed(),
+ 'rememberLoginState' => 0,
+ ],
+ 'guest'
+ );
+ $this->assertEquals($expectedResponse, $this->loginController->showLoginForm('', '', ''));
+ }
+
+ /**
+ * @return array
+ */
+ public function passwordResetDataProvider() {
+ return [
+ [
+ true,
+ true,
+ ],
+ [
+ false,
+ false,
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider passwordResetDataProvider
+ */
+ public function testShowLoginFormWithPasswordResetOption($canChangePassword,
+ $expectedResult) {
+ $this->userSession
+ ->expects($this->once())
+ ->method('isLoggedIn')
+ ->willReturn(false);
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValue')
+ ->with('lost_password_link')
+ ->willReturn(false);
+ $user = $this->getMock('\\OCP\\IUser');
+ $user
+ ->expects($this->once())
+ ->method('canChangePassword')
+ ->willReturn($canChangePassword);
+ $this->userManager
+ ->expects($this->once())
+ ->method('get')
+ ->with('LdapUser')
+ ->willReturn($user);
+
+ $expectedResponse = new TemplateResponse(
+ 'core',
+ 'login',
+ [
+ 'messages' => [],
+ 'loginName' => 'LdapUser',
+ 'user_autofocus' => false,
+ 'canResetPassword' => $expectedResult,
+ 'alt_login' => [],
+ 'rememberLoginAllowed' => \OC_Util::rememberLoginAllowed(),
+ 'rememberLoginState' => 0,
+ ],
+ 'guest'
+ );
+ $this->assertEquals($expectedResponse, $this->loginController->showLoginForm('LdapUser', '', ''));
+ }
+
+ public function testShowLoginFormForUserNamedNull() {
+ $this->userSession
+ ->expects($this->once())
+ ->method('isLoggedIn')
+ ->willReturn(false);
+ $this->config
+ ->expects($this->once())
+ ->method('getSystemValue')
+ ->with('lost_password_link')
+ ->willReturn(false);
+ $user = $this->getMock('\\OCP\\IUser');
+ $user
+ ->expects($this->once())
+ ->method('canChangePassword')
+ ->willReturn(false);
+ $this->userManager
+ ->expects($this->once())
+ ->method('get')
+ ->with('0')
+ ->willReturn($user);
+
+ $expectedResponse = new TemplateResponse(
+ 'core',
+ 'login',
+ [
+ 'messages' => [],
+ 'loginName' => '0',
+ 'user_autofocus' => false,
+ 'canResetPassword' => false,
+ 'alt_login' => [],
+ 'rememberLoginAllowed' => \OC_Util::rememberLoginAllowed(),
+ 'rememberLoginState' => 0,
+ ],
+ 'guest'
+ );
+ $this->assertEquals($expectedResponse, $this->loginController->showLoginForm('0', '', ''));
+ }
+}
diff --git a/tests/core/templates/templates.php b/tests/core/templates/templates.php
new file mode 100644
index 00000000000..338d80b276c
--- /dev/null
+++ b/tests/core/templates/templates.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Tests\Core\Templates;
+
+class Templates extends \Test\TestCase {
+
+ public function test403() {
+ $template = \OC::$SERVERROOT . '/core/templates/403.php';
+ $expectedHtml = "<ul><li class='error'>\n\t\tAccess forbidden<br><p class='hint'></p></li></ul>";
+ $this->assertTemplate($expectedHtml, $template);
+ }
+
+ public function test404() {
+ $template = \OC::$SERVERROOT . '/core/templates/404.php';
+ $href = \OC::$server->getURLGenerator()->linkTo('', 'index.php');
+ $expectedHtml = "<ul><li class='error'>\n\t\t\tFile not found<br><p class='hint'>The specified document has not been found on the server.</p>\n<p class='hint'><a href='$href'>You can click here to return to ownCloud.</a></p>\n\t\t</li></ul>";
+ $this->assertTemplate($expectedHtml, $template);
+ }
+
+}
diff --git a/tests/data/app/expected-info.json b/tests/data/app/expected-info.json
index d86ffed482b..e05d02f7641 100644
--- a/tests/data/app/expected-info.json
+++ b/tests/data/app/expected-info.json
@@ -67,5 +67,9 @@
"max-version": "8"
}
}
+ },
+ "repair-steps": {
+ "pre-migration": [],
+ "post-migration": []
}
}
diff --git a/tests/lib/app/codechecker/infocheckertest.php b/tests/lib/app/codechecker/infocheckertest.php
index b31c5fe3a7a..c6df5a715a1 100644
--- a/tests/lib/app/codechecker/infocheckertest.php
+++ b/tests/lib/app/codechecker/infocheckertest.php
@@ -43,7 +43,7 @@ class InfoCheckerTest extends TestCase {
protected function setUp() {
parent::setUp();
- $infoParser = new InfoParser(\OC::$server->getHTTPHelper(), \OC::$server->getURLGenerator());
+ $infoParser = new InfoParser(\OC::$server->getURLGenerator());
$this->infoChecker = new InfoChecker($infoParser);
}
diff --git a/tests/lib/app/infoparser.php b/tests/lib/app/infoparser.php
index 1e5257abec3..cb89dd0131c 100644
--- a/tests/lib/app/infoparser.php
+++ b/tests/lib/app/infoparser.php
@@ -10,35 +10,27 @@
namespace Test\App;
use OC;
+use OCP\IURLGenerator;
use Test\TestCase;
class InfoParser extends TestCase {
- /**
- * @var \OC\App\InfoParser
- */
+ /** @var \OC\App\InfoParser */
private $parser;
public function setUp() {
- $config = $this->getMockBuilder('\OCP\IConfig')
- ->disableOriginalConstructor()->getMock();
- $clientService = $this->getMock('\OCP\Http\Client\IClientService');
- $httpHelper = $this->getMockBuilder('\OC\HTTPHelper')
- ->setConstructorArgs([$config, $clientService])
- ->setMethods(['getHeaders'])
- ->getMock();
$urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator')
->disableOriginalConstructor()
->getMock();
- //linkToDocs
+ /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject $urlGenerator */
$urlGenerator->expects($this->any())
->method('linkToDocs')
->will($this->returnCallback(function ($url) {
return "https://docs.example.com/server/go.php?to=$url";
}));
- $this->parser = new \OC\App\InfoParser($httpHelper, $urlGenerator);
+ $this->parser = new \OC\App\InfoParser($urlGenerator);
}
/**
diff --git a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
index 9e71a3d0961..f70308dc731 100644
--- a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
+++ b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
@@ -26,10 +26,10 @@ namespace OC\AppFramework\Middleware\Security;
use OC\AppFramework\Http;
use OC\AppFramework\Http\Request;
-use OC\Appframework\Middleware\Security\Exceptions\AppNotEnabledException;
-use OC\Appframework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException;
-use OC\Appframework\Middleware\Security\Exceptions\NotAdminException;
-use OC\Appframework\Middleware\Security\Exceptions\NotLoggedInException;
+use OC\AppFramework\Middleware\Security\Exceptions\AppNotEnabledException;
+use OC\AppFramework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException;
+use OC\AppFramework\Middleware\Security\Exceptions\NotAdminException;
+use OC\AppFramework\Middleware\Security\Exceptions\NotLoggedInException;
use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OC\Security\CSP\ContentSecurityPolicy;
@@ -343,9 +343,14 @@ class SecurityMiddlewareTest extends \Test\TestCase {
$this->middleware = $this->getMiddleware(false, false);
$this->urlGenerator
->expects($this->once())
- ->method('getAbsoluteURL')
- ->with('index.php')
- ->will($this->returnValue('http://localhost/index.php'));
+ ->method('linkToRoute')
+ ->with(
+ 'core.login.showLoginForm',
+ [
+ 'redirect_url' => 'owncloud%2Findex.php%2Fapps%2Fspecialapp',
+ ]
+ )
+ ->will($this->returnValue('http://localhost/index.php/login?redirect_url=owncloud%2Findex.php%2Fapps%2Fspecialapp'));
$this->logger
->expects($this->once())
->method('debug')
@@ -356,7 +361,7 @@ class SecurityMiddlewareTest extends \Test\TestCase {
new NotLoggedInException()
);
- $expected = new RedirectResponse('http://localhost/index.php?redirect_url=owncloud%2Findex.php%2Fapps%2Fspecialapp');
+ $expected = new RedirectResponse('http://localhost/index.php/login?redirect_url=owncloud%2Findex.php%2Fapps%2Fspecialapp');
$this->assertEquals($expected , $response);
}
diff --git a/tests/lib/appframework/routing/RoutingTest.php b/tests/lib/appframework/routing/RoutingTest.php
index b063ef32835..3ceab1aac48 100644
--- a/tests/lib/appframework/routing/RoutingTest.php
+++ b/tests/lib/appframework/routing/RoutingTest.php
@@ -3,8 +3,6 @@
namespace OC\AppFramework\Routing;
use OC\AppFramework\DependencyInjection\DIContainer;
-use OC\AppFramework\routing\RouteConfig;
-
class RoutingTest extends \Test\TestCase
{
diff --git a/tests/lib/backgroundjob/joblist.php b/tests/lib/backgroundjob/joblist.php
index c0796d8253a..fcc3c440818 100644
--- a/tests/lib/backgroundjob/joblist.php
+++ b/tests/lib/backgroundjob/joblist.php
@@ -9,6 +9,7 @@
namespace Test\BackgroundJob;
use OCP\BackgroundJob\IJob;
+use OCP\IDBConnection;
use Test\TestCase;
/**
@@ -28,10 +29,17 @@ class JobList extends TestCase {
parent::setUp();
$connection = \OC::$server->getDatabaseConnection();
+ $this->clearJobsList($connection);
$this->config = $this->getMock('\OCP\IConfig');
$this->instance = new \OC\BackgroundJob\JobList($connection, $this->config);
}
+ protected function clearJobsList(IDBConnection $connection) {
+ $query = $connection->getQueryBuilder();
+ $query->delete('jobs');
+ $query->execute();
+ }
+
protected function getAllSorted() {
$jobs = $this->instance->getAll();
@@ -149,11 +157,11 @@ class JobList extends TestCase {
$this->config->expects($this->once())
->method('getAppValue')
->with('backgroundjob', 'lastjob', 0)
- ->will($this->returnValue($savedJob1->getId()));
+ ->will($this->returnValue($savedJob2->getId()));
$nextJob = $this->instance->getNext();
- $this->assertEquals($savedJob2, $nextJob);
+ $this->assertEquals($savedJob1, $nextJob);
$this->instance->remove($job, 1);
$this->instance->remove($job, 2);
@@ -166,16 +174,17 @@ class JobList extends TestCase {
$jobs = $this->getAllSorted();
+ $savedJob1 = $jobs[count($jobs) - 2];
$savedJob2 = $jobs[count($jobs) - 1];
$this->config->expects($this->once())
->method('getAppValue')
->with('backgroundjob', 'lastjob', 0)
- ->will($this->returnValue($savedJob2->getId()));
+ ->will($this->returnValue($savedJob1->getId()));
$nextJob = $this->instance->getNext();
- $this->assertEquals($jobs[0], $nextJob);
+ $this->assertEquals($savedJob2, $nextJob);
$this->instance->remove($job, 1);
$this->instance->remove($job, 2);
diff --git a/tests/lib/files/filesystem.php b/tests/lib/files/filesystem.php
index db1f22f894a..b5a3e147259 100644
--- a/tests/lib/files/filesystem.php
+++ b/tests/lib/files/filesystem.php
@@ -320,6 +320,50 @@ class Filesystem extends \Test\TestCase {
}
/**
+ * @expectedException \OC\User\NoUserException
+ */
+ public function testNullUserThrows() {
+ \OC\Files\Filesystem::initMountPoints(null);
+ }
+
+ public function testNullUserThrowsTwice() {
+ $thrown = 0;
+ try {
+ \OC\Files\Filesystem::initMountPoints(null);
+ } catch (NoUserException $e) {
+ $thrown++;
+ }
+ try {
+ \OC\Files\Filesystem::initMountPoints(null);
+ } catch (NoUserException $e) {
+ $thrown++;
+ }
+ $this->assertEquals(2, $thrown);
+ }
+
+ /**
+ * Tests that an exception is thrown when passed user does not exist.
+ */
+ public function testLocalMountWhenUserDoesNotExistTwice() {
+ $thrown = 0;
+ $userId = $this->getUniqueID('user_');
+
+ try {
+ \OC\Files\Filesystem::initMountPoints($userId);
+ } catch (NoUserException $e) {
+ $thrown++;
+ }
+
+ try {
+ \OC\Files\Filesystem::initMountPoints($userId);
+ } catch (NoUserException $e) {
+ $thrown++;
+ }
+
+ $this->assertEquals(2, $thrown);
+ }
+
+ /**
* Tests that the home storage is used for the user's mount point
*/
public function testHomeMount() {
diff --git a/tests/lib/files/storage/local.php b/tests/lib/files/storage/local.php
index 2583863b554..4cc6c6a842c 100644
--- a/tests/lib/files/storage/local.php
+++ b/tests/lib/files/storage/local.php
@@ -70,5 +70,19 @@ class Local extends Storage {
$etag2 = $this->instance->getETag('test.txt');
$this->assertNotEquals($etag1, $etag2);
}
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInvalidArgumentsEmptyArray() {
+ new \OC\Files\Storage\Local([]);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInvalidArgumentsNoArray() {
+ new \OC\Files\Storage\Local(null);
+ }
}
diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php
index 651299a3eab..21f7d9f09b9 100644
--- a/tests/lib/files/storage/wrapper/encryption.php
+++ b/tests/lib/files/storage/wrapper/encryption.php
@@ -5,6 +5,7 @@ namespace Test\Files\Storage\Wrapper;
use OC\Encryption\Util;
use OC\Files\Storage\Temporary;
use OC\Files\View;
+use OC\User\Manager;
use Test\Files\Storage\Storage;
class Encryption extends Storage {
@@ -118,7 +119,7 @@ class Encryption extends Storage {
$this->util = $this->getMock(
'\OC\Encryption\Util',
['getUidAndFilename', 'isFile', 'isExcluded'],
- [new View(), new \OC\User\Manager(), $this->groupManager, $this->config, $this->arrayCache]);
+ [new View(), new Manager(), $this->groupManager, $this->config, $this->arrayCache]);
$this->util->expects($this->any())
->method('getUidAndFilename')
->willReturnCallback(function ($path) {
@@ -200,7 +201,7 @@ class Encryption extends Storage {
protected function buildMockModule() {
$this->encryptionModule = $this->getMockBuilder('\OCP\Encryption\IEncryptionModule')
->disableOriginalConstructor()
- ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable', 'encryptAll', 'prepareDecryptAll'])
+ ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable', 'encryptAll', 'prepareDecryptAll', 'isReadyForUser'])
->getMock();
$this->encryptionModule->expects($this->any())->method('getId')->willReturn('UNIT_TEST_MODULE');
@@ -543,7 +544,7 @@ class Encryption extends Storage {
->setConstructorArgs(
[
new View(),
- new \OC\User\Manager(),
+ new Manager(),
$this->groupManager,
$this->config,
$this->arrayCache
@@ -608,7 +609,7 @@ class Encryption extends Storage {
->disableOriginalConstructor()->getMock();
$util = $this->getMockBuilder('\OC\Encryption\Util')
- ->setConstructorArgs([new View(), new \OC\User\Manager(), $this->groupManager, $this->config, $this->arrayCache])
+ ->setConstructorArgs([new View(), new Manager(), $this->groupManager, $this->config, $this->arrayCache])
->getMock();
$cache = $this->getMockBuilder('\OC\Files\Cache\Cache')
diff --git a/tests/lib/files/stream/encryption.php b/tests/lib/files/stream/encryption.php
index afb31f2822d..20a4100d2ff 100644
--- a/tests/lib/files/stream/encryption.php
+++ b/tests/lib/files/stream/encryption.php
@@ -311,7 +311,7 @@ class Encryption extends \Test\TestCase {
protected function buildMockModule() {
$encryptionModule = $this->getMockBuilder('\OCP\Encryption\IEncryptionModule')
->disableOriginalConstructor()
- ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable', 'encryptAll', 'prepareDecryptAll'])
+ ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable', 'encryptAll', 'prepareDecryptAll', 'isReadyForUser'])
->getMock();
$encryptionModule->expects($this->any())->method('getId')->willReturn('UNIT_TEST_MODULE');
diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php
index 7779e2778cb..1220c57e962 100644
--- a/tests/lib/files/utils/scanner.php
+++ b/tests/lib/files/utils/scanner.php
@@ -163,4 +163,28 @@ class Scanner extends \Test\TestCase {
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
$scanner->scan($invalidPath);
}
+
+ public function testPropagateEtag() {
+ $storage = new Temporary(array());
+ $mount = new MountPoint($storage, '');
+ Filesystem::getMountManager()->addMount($mount);
+ $cache = $storage->getCache();
+
+ $storage->mkdir('folder');
+ $storage->file_put_contents('folder/bar.txt', 'qwerty');
+ $storage->touch('folder/bar.txt', time() - 200);
+
+ $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
+ $scanner->addMount($mount);
+
+ $scanner->scan('');
+ $this->assertTrue($cache->inCache('folder/bar.txt'));
+ $oldRoot = $cache->get('');
+
+ $storage->file_put_contents('folder/bar.txt', 'qwerty');
+ $scanner->scan('');
+ $newRoot = $cache->get('');
+
+ $this->assertNotEquals($oldRoot->getEtag(), $newRoot->getEtag());
+ }
}
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index 3e88a5306f8..86413c61aa1 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -2424,4 +2424,24 @@ class View extends \Test\TestCase {
$this->assertEquals($expected, $files);
}
+
+ public function testFilePutContentsClearsChecksum() {
+ $storage = new Temporary(array());
+ $scanner = $storage->getScanner();
+ $storage->file_put_contents('foo.txt', 'bar');
+ \OC\Files\Filesystem::mount($storage, array(), '/test/');
+ $scanner->scan('');
+
+ $view = new \OC\Files\View('/test/foo.txt');
+ $view->putFileInfo('.', ['checksum' => '42']);
+
+ $this->assertEquals('bar', $view->file_get_contents(''));
+ $fh = tmpfile();
+ fwrite($fh, 'fooo');
+ rewind($fh);
+ $view->file_put_contents('', $fh);
+ $this->assertEquals('fooo', $view->file_get_contents(''));
+ $data = $view->getFileInfo('.');
+ $this->assertEquals('', $data->getChecksum());
+ }
}
diff --git a/tests/lib/group.php b/tests/lib/group.php
index 4bb888ed725..d3ac6d8d69e 100644
--- a/tests/lib/group.php
+++ b/tests/lib/group.php
@@ -32,7 +32,7 @@ class Test_Group extends \Test\TestCase {
public function testSingleBackend() {
$userBackend = new \Test\Util\User\Dummy();
\OC::$server->getUserManager()->registerBackend($userBackend);
- OC_Group::useBackend(new OC_Group_Dummy());
+ OC_Group::useBackend(new \Test\Util\Group\Dummy());
$group1 = $this->getUniqueID();
$group2 = $this->getUniqueID();
@@ -72,7 +72,7 @@ class Test_Group extends \Test\TestCase {
public function testNoEmptyGIDs() {
- OC_Group::useBackend(new OC_Group_Dummy());
+ OC_Group::useBackend(new \Test\Util\Group\Dummy());
$emptyGroup = null;
$this->assertFalse(OC_Group::createGroup($emptyGroup));
@@ -80,7 +80,7 @@ class Test_Group extends \Test\TestCase {
public function testNoGroupsTwice() {
- OC_Group::useBackend(new OC_Group_Dummy());
+ OC_Group::useBackend(new \Test\Util\Group\Dummy());
$group = $this->getUniqueID();
OC_Group::createGroup($group);
@@ -92,7 +92,7 @@ class Test_Group extends \Test\TestCase {
public function testDontDeleteAdminGroup() {
- OC_Group::useBackend(new OC_Group_Dummy());
+ OC_Group::useBackend(new \Test\Util\Group\Dummy());
$adminGroup = 'admin';
OC_Group::createGroup($adminGroup);
@@ -102,7 +102,7 @@ class Test_Group extends \Test\TestCase {
public function testDontAddUserToNonexistentGroup() {
- OC_Group::useBackend(new OC_Group_Dummy());
+ OC_Group::useBackend(new \Test\Util\Group\Dummy());
$groupNonExistent = 'notExistent';
$user = $this->getUniqueID();
@@ -111,7 +111,7 @@ class Test_Group extends \Test\TestCase {
}
public function testUsersInGroup() {
- OC_Group::useBackend(new OC_Group_Dummy());
+ OC_Group::useBackend(new \Test\Util\Group\Dummy());
$userBackend = new \Test\Util\User\Dummy();
\OC::$server->getUserManager()->registerBackend($userBackend);
@@ -143,8 +143,8 @@ class Test_Group extends \Test\TestCase {
public function testMultiBackend() {
$userBackend = new \Test\Util\User\Dummy();
\OC::$server->getUserManager()->registerBackend($userBackend);
- $backend1 = new OC_Group_Dummy();
- $backend2 = new OC_Group_Dummy();
+ $backend1 = new \Test\Util\Group\Dummy();
+ $backend2 = new \Test\Util\Group\Dummy();
OC_Group::useBackend($backend1);
OC_Group::useBackend($backend2);
diff --git a/tests/lib/group/dummy.php b/tests/lib/group/dummy.php
index 6836f89d3fe..eaa299c39af 100644
--- a/tests/lib/group/dummy.php
+++ b/tests/lib/group/dummy.php
@@ -28,6 +28,6 @@
class Test_Group_Dummy extends Test_Group_Backend {
protected function setUp() {
parent::setUp();
- $this->backend=new OC_Group_Dummy();
+ $this->backend=new \Test\Util\Group\Dummy();
}
}
diff --git a/tests/lib/group/manager.php b/tests/lib/group/manager.php
index 6cf473b9156..410e11114c4 100644
--- a/tests/lib/group/manager.php
+++ b/tests/lib/group/manager.php
@@ -65,7 +65,7 @@ class Manager extends \Test\TestCase {
}
public function testGetDeleted() {
- $backend = new \OC_Group_Dummy();
+ $backend = new \Test\Util\Group\Dummy();
$backend->createGroup('group1');
/**
diff --git a/tests/lib/repair.php b/tests/lib/repair.php
index 248db382140..a598d3c1a29 100644
--- a/tests/lib/repair.php
+++ b/tests/lib/repair.php
@@ -6,9 +6,9 @@
* See the COPYING-README file.
*/
-use OC\Hooks\BasicEmitter;
+use OCP\Migration\IRepairStep;
-class TestRepairStep extends BasicEmitter implements \OC\RepairStep{
+class TestRepairStep implements IRepairStep {
private $warning;
public function __construct($warning = false) {
@@ -19,12 +19,12 @@ class TestRepairStep extends BasicEmitter implements \OC\RepairStep{
return 'Test Name';
}
- public function run() {
+ public function run(\OCP\Migration\IOutput $out) {
if ($this->warning) {
- $this->emit('\OC\Repair', 'warning', array('Simulated warning'));
+ $out->warning('Simulated warning');
}
else {
- $this->emit('\OC\Repair', 'info', array('Simulated info'));
+ $out->info('Simulated info');
}
}
}
diff --git a/tests/lib/repair/cleantags.php b/tests/lib/repair/cleantags.php
index fa11a7f736e..214e2a17c94 100644
--- a/tests/lib/repair/cleantags.php
+++ b/tests/lib/repair/cleantags.php
@@ -8,6 +8,7 @@
namespace Test\Repair;
use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\Migration\IOutput;
/**
* Tests for the cleaning the tags tables
@@ -18,7 +19,7 @@ use OCP\DB\QueryBuilder\IQueryBuilder;
*/
class CleanTags extends \Test\TestCase {
- /** @var \OC\RepairStep */
+ /** @var \OC\Repair\CleanTags */
protected $repair;
/** @var \OCP\IDBConnection */
@@ -27,9 +28,16 @@ class CleanTags extends \Test\TestCase {
/** @var int */
protected $createdFile;
+ /** @var IOutput */
+ private $outputMock;
+
protected function setUp() {
parent::setUp();
+ $this->outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
$this->connection = \OC::$server->getDatabaseConnection();
$this->repair = new \OC\Repair\CleanTags($this->connection);
$this->cleanUpTables();
@@ -67,15 +75,15 @@ class CleanTags extends \Test\TestCase {
$this->assertEntryCount('vcategory_to_object', 4, 'Assert tag entries count before repair step');
$this->assertEntryCount('vcategory', 4, 'Assert tag categories count before repair step');
- self::invokePrivate($this->repair, 'deleteOrphanFileEntries');
+ self::invokePrivate($this->repair, 'deleteOrphanFileEntries', [$this->outputMock]);
$this->assertEntryCount('vcategory_to_object', 3, 'Assert tag entries count after cleaning file entries');
$this->assertEntryCount('vcategory', 4, 'Assert tag categories count after cleaning file entries');
- self::invokePrivate($this->repair, 'deleteOrphanTagEntries');
+ self::invokePrivate($this->repair, 'deleteOrphanTagEntries', [$this->outputMock]);
$this->assertEntryCount('vcategory_to_object', 2, 'Assert tag entries count after cleaning tag entries');
$this->assertEntryCount('vcategory', 4, 'Assert tag categories count after cleaning tag entries');
- self::invokePrivate($this->repair, 'deleteOrphanCategoryEntries');
+ self::invokePrivate($this->repair, 'deleteOrphanCategoryEntries', [$this->outputMock]);
$this->assertEntryCount('vcategory_to_object', 2, 'Assert tag entries count after cleaning category entries');
$this->assertEntryCount('vcategory', 2, 'Assert tag categories count after cleaning category entries');
}
diff --git a/tests/lib/repair/dropoldjobs.php b/tests/lib/repair/dropoldjobs.php
index a85c6506dbb..c8a4aa3f1c2 100644
--- a/tests/lib/repair/dropoldjobs.php
+++ b/tests/lib/repair/dropoldjobs.php
@@ -9,6 +9,7 @@
namespace Test\Repair;
use OCP\BackgroundJob\IJobList;
+use OCP\Migration\IOutput;
/**
* Tests for the dropping old tables
@@ -33,8 +34,13 @@ class DropOldJobs extends \Test\TestCase {
$this->assertTrue($this->jobList->has('OC\Cache\FileGlobalGC', null), 'Asserting that the job OC\Cache\FileGlobalGC exists before repairing');
$this->assertTrue($this->jobList->has('OC_Cache_FileGlobalGC', null), 'Asserting that the job OC_Cache_FileGlobalGC exists before repairing');
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
$repair = new \OC\Repair\DropOldJobs($this->jobList);
- $repair->run();
+ $repair->run($outputMock);
$this->assertFalse($this->jobList->has('OC\Cache\FileGlobalGC', null), 'Asserting that the job OC\Cache\FileGlobalGC does not exist after repairing');
$this->assertFalse($this->jobList->has('OC_Cache_FileGlobalGC', null), 'Asserting that the job OC_Cache_FileGlobalGC does not exist after repairing');
diff --git a/tests/lib/repair/dropoldtables.php b/tests/lib/repair/dropoldtables.php
index 6ece8cf04d5..d2e1d7c3449 100644
--- a/tests/lib/repair/dropoldtables.php
+++ b/tests/lib/repair/dropoldtables.php
@@ -7,6 +7,7 @@
*/
namespace Test\Repair;
+use OCP\Migration\IOutput;
/**
* Tests for the dropping old tables
@@ -31,8 +32,13 @@ class DropOldTables extends \Test\TestCase {
$this->assertFalse($this->connection->tableExists('sharing'), 'Asserting that the table oc_sharing does not exist before repairing');
$this->assertTrue($this->connection->tableExists('permissions'), 'Asserting that the table oc_permissions does exist before repairing');
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
$repair = new \OC\Repair\DropOldTables($this->connection);
- $repair->run();
+ $repair->run($outputMock);
$this->assertFalse($this->connection->tableExists('sharing'), 'Asserting that the table oc_sharing does not exist after repairing');
$this->assertFalse($this->connection->tableExists('permissions'), 'Asserting that the table oc_permissions does not exist after repairing');
diff --git a/tests/lib/repair/oldgroupmembershipsharestest.php b/tests/lib/repair/oldgroupmembershipsharestest.php
index f02babab21d..cc04a80eef9 100644
--- a/tests/lib/repair/oldgroupmembershipsharestest.php
+++ b/tests/lib/repair/oldgroupmembershipsharestest.php
@@ -10,6 +10,7 @@ namespace Test\Repair;
use OC\Repair\OldGroupMembershipShares;
use OC\Share\Constants;
+use OCP\Migration\IOutput;
/**
* Class OldGroupMembershipSharesTest
@@ -82,7 +83,12 @@ class OldGroupMembershipSharesTest extends \Test\TestCase {
$this->assertEquals([['id' => $parent], ['id' => $group2], ['id' => $user1], ['id' => $member], ['id' => $notAMember]], $rows);
$result->closeCursor();
- $repair->run();
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $repair->run($outputMock);
$query = $this->connection->getQueryBuilder();
$result = $query->select('id')
diff --git a/tests/lib/repair/removegetetagentriestest.php b/tests/lib/repair/removegetetagentriestest.php
index 12f0ae8a8d6..c00923228d0 100644
--- a/tests/lib/repair/removegetetagentriestest.php
+++ b/tests/lib/repair/removegetetagentriestest.php
@@ -22,6 +22,7 @@
namespace Test\Repair;
use OC\Repair\RemoveGetETagEntries;
+use OCP\Migration\IOutput;
use Test\TestCase;
/**
@@ -65,9 +66,14 @@ class RemoveGetETagEntriesTest extends TestCase {
$this->assertTrue(in_array($entry, $data), 'Asserts that the entries are the ones from the test data set');
}
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
// run repair step
$repair = new RemoveGetETagEntries($this->connection);
- $repair->run();
+ $repair->run($outputMock);
// check if test data is correctly modified in DB
$stmt = $this->connection->executeQuery($sqlToFetchProperties, [$userName]);
diff --git a/tests/lib/repair/repaircollation.php b/tests/lib/repair/repaircollation.php
index 8d609aeed38..4efa8ccc552 100644
--- a/tests/lib/repair/repaircollation.php
+++ b/tests/lib/repair/repaircollation.php
@@ -1,4 +1,6 @@
<?php
+use OCP\Migration\IOutput;
+
/**
* Copyright (c) 2014 Thomas Müller <deepdiver@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
@@ -70,7 +72,12 @@ class TestRepairCollation extends \Test\TestCase {
$tables = $this->repair->getAllNonUTF8BinTables($this->connection);
$this->assertGreaterThanOrEqual(1, count($tables));
- $this->repair->run();
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->repair->run($outputMock);
$tables = $this->repair->getAllNonUTF8BinTables($this->connection);
$this->assertCount(0, $tables);
diff --git a/tests/lib/repair/repairinnodb.php b/tests/lib/repair/repairinnodb.php
index 5c73b931367..9b02bc46e29 100644
--- a/tests/lib/repair/repairinnodb.php
+++ b/tests/lib/repair/repairinnodb.php
@@ -6,6 +6,8 @@
* See the COPYING-README file.
*/
namespace Test\Repair;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
/**
* Tests for the converting of MySQL tables to InnoDB engine
@@ -16,7 +18,7 @@ namespace Test\Repair;
*/
class RepairInnoDB extends \Test\TestCase {
- /** @var \OC\RepairStep */
+ /** @var IRepairStep */
private $repair;
/** @var \Doctrine\DBAL\Connection */
@@ -49,7 +51,12 @@ class RepairInnoDB extends \Test\TestCase {
$result = $this->countMyIsamTables();
$this->assertEquals(1, $result);
- $this->repair->run();
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->repair->run($outputMock);
$result = $this->countMyIsamTables();
$this->assertEquals(0, $result);
diff --git a/tests/lib/repair/repairinvalidsharestest.php b/tests/lib/repair/repairinvalidsharestest.php
index 9655e0eacbc..a1e871bcc80 100644
--- a/tests/lib/repair/repairinvalidsharestest.php
+++ b/tests/lib/repair/repairinvalidsharestest.php
@@ -11,6 +11,8 @@ namespace Test\Repair;
use OC\Repair\RepairInvalidShares;
use OC\Share\Constants;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
use Test\TestCase;
/**
@@ -22,7 +24,7 @@ use Test\TestCase;
*/
class RepairInvalidSharesTest extends TestCase {
- /** @var \OC\RepairStep */
+ /** @var IRepairStep */
private $repair;
/** @var \OCP\IDBConnection */
@@ -98,7 +100,12 @@ class RepairInvalidSharesTest extends TestCase {
'token' => $qb->expr()->literal('abcdefg')
])->execute();
- $this->repair->run();
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->repair->run($outputMock);
$results = $this->connection->getQueryBuilder()
->select('*')
@@ -167,7 +174,12 @@ class RepairInvalidSharesTest extends TestCase {
$this->assertEquals([['id' => $parent], ['id' => $validChild], ['id' => $invalidChild]], $rows);
$result->closeCursor();
- $this->repair->run();
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->repair->run($outputMock);
$query = $this->connection->getQueryBuilder();
$result = $query->select('id')
diff --git a/tests/lib/repair/repairlegacystorage.php b/tests/lib/repair/repairlegacystorage.php
index 3ae6578f7ec..5b560458e76 100644
--- a/tests/lib/repair/repairlegacystorage.php
+++ b/tests/lib/repair/repairlegacystorage.php
@@ -10,6 +10,8 @@ namespace Test\Repair;
use OC\Files\Cache\Cache;
use OC\Files\Cache\Storage;
+use OCP\Migration\IOutput;
+use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
/**
@@ -34,7 +36,8 @@ class RepairLegacyStorages extends TestCase {
private $legacyStorageId;
private $newStorageId;
- private $warnings;
+ /** @var IOutput | PHPUnit_Framework_MockObject_MockObject */
+ private $outputMock;
protected function setUp() {
parent::setUp();
@@ -45,11 +48,9 @@ class RepairLegacyStorages extends TestCase {
$this->repair = new \OC\Repair\RepairLegacyStorages($this->config, $this->connection);
- $this->warnings = [];
-
- $this->repair->listen('\OC\Repair', 'warning', function ($description){
- $this->warnings[] = $description;
- });
+ $this->outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
}
protected function tearDown() {
@@ -141,7 +142,7 @@ class RepairLegacyStorages extends TestCase {
$this->prepareSettings($dataDir, $userId);
$newStorageNumId = $this->createStorage($this->newStorageId);
- $this->repair->run();
+ $this->repair->run($this->outputMock);
$this->assertNull($this->getStorageId($this->legacyStorageId));
$this->assertEquals($newStorageNumId, $this->getStorageId($this->newStorageId));
@@ -160,7 +161,7 @@ class RepairLegacyStorages extends TestCase {
$this->prepareSettings($dataDir, $userId);
$legacyStorageNumId = $this->createStorage($this->legacyStorageId);
- $this->repair->run();
+ $this->repair->run($this->outputMock);
$this->assertNull($this->getStorageId($this->legacyStorageId));
$this->assertEquals($legacyStorageNumId, $this->getStorageId($this->newStorageId));
@@ -182,7 +183,7 @@ class RepairLegacyStorages extends TestCase {
$this->createData($this->legacyStorageId);
- $this->repair->run();
+ $this->repair->run($this->outputMock);
$this->assertNull($this->getStorageId($this->legacyStorageId));
$this->assertEquals($legacyStorageNumId, $this->getStorageId($this->newStorageId));
@@ -205,7 +206,7 @@ class RepairLegacyStorages extends TestCase {
$this->createData($this->newStorageId);
- $this->repair->run();
+ $this->repair->run($this->outputMock);
$this->assertNull($this->getStorageId($this->legacyStorageId));
$this->assertEquals($newStorageNumId, $this->getStorageId($this->newStorageId));
@@ -228,10 +229,8 @@ class RepairLegacyStorages extends TestCase {
$this->createData($this->legacyStorageId);
$this->createData($this->newStorageId);
- $this->repair->run();
-
- $this->assertEquals(2, count($this->warnings));
- $this->assertEquals('Could not repair legacy storage ', substr(current($this->warnings), 0, 32));
+ $this->outputMock->expects($this->exactly(2))->method('warning');
+ $this->repair->run($this->outputMock);
// storages left alone
$this->assertEquals($legacyStorageNumId, $this->getStorageId($this->legacyStorageId));
@@ -254,7 +253,7 @@ class RepairLegacyStorages extends TestCase {
$storageId = 'local::' . $this->dataDir;
$numId = $this->createStorage($storageId);
- $this->repair->run();
+ $this->repair->run($this->outputMock);
$this->assertEquals($numId, $this->getStorageId($storageId));
}
@@ -272,7 +271,7 @@ class RepairLegacyStorages extends TestCase {
$storageId = 'local::/tmp/somedir/' . $this->user;
$numId = $this->createStorage($storageId);
- $this->repair->run();
+ $this->repair->run($this->outputMock);
$this->assertEquals($numId, $this->getStorageId($storageId));
}
@@ -290,7 +289,7 @@ class RepairLegacyStorages extends TestCase {
$storageId = 'smb::user@password/tmp/somedir/' . $this->user;
$numId = $this->createStorage($storageId);
- $this->repair->run();
+ $this->repair->run($this->outputMock);
$this->assertEquals($numId, $this->getStorageId($storageId));
}
@@ -322,21 +321,15 @@ class RepairLegacyStorages extends TestCase {
* Only run the repair once
*/
public function testOnlyRunOnce() {
- $output = array();
- $this->repair->listen('\OC\Repair', 'info', function ($description) use (&$output) {
- $output[] = 'info: ' . $description;
- });
+ $this->outputMock->expects($this->exactly(1))->method('info');
$this->prepareSettings('/tmp/oc-autotest/datadir', $this->getUniqueID('user_'));
$this->assertNotEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone'));
- $this->repair->run();
- $this->assertEquals(1, count($output));
+ $this->repair->run($this->outputMock);
$this->assertEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone'));
- $output = array();
- $this->repair->run();
- // no output which means it did not run
- $this->assertEquals(0, count($output));
+ $this->outputMock->expects($this->never())->method('info');
+ $this->repair->run($this->outputMock);
$this->assertEquals('yes', $this->config->getAppValue('core', 'repairlegacystoragesdone'));
}
}
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index a9ebb7bc88a..d8ef95e9546 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -8,6 +8,12 @@
*/
namespace Test\Repair;
+use OC\Files\Storage\Temporary;
+use OCP\Files\IMimeTypeLoader;
+use OCP\IConfig;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
/**
* Tests for the converting of legacy storages to home storages.
*
@@ -17,17 +23,22 @@ namespace Test\Repair;
*/
class RepairMimeTypes extends \Test\TestCase {
- /** @var \OC\RepairStep */
+ /** @var IRepairStep */
private $repair;
+ /** @var Temporary */
private $storage;
+ /** @var IMimeTypeLoader */
+ private $mimetypeLoader;
+
protected function setUp() {
parent::setUp();
$this->savedMimetypeLoader = \OC::$server->getMimeTypeLoader();
$this->mimetypeLoader = \OC::$server->getMimeTypeLoader();
+ /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject $config */
$config = $this->getMockBuilder('OCP\IConfig')
->disableOriginalConstructor()
->getMock();
@@ -96,7 +107,12 @@ class RepairMimeTypes extends \Test\TestCase {
private function renameMimeTypes($currentMimeTypes, $fixedMimeTypes) {
$this->addEntries($currentMimeTypes);
- $this->repair->run();
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->repair->run($outputMock);
// force mimetype reload
$this->mimetypeLoader->reset();
diff --git a/tests/lib/repair/repairsharepropagation.php b/tests/lib/repair/repairsharepropagation.php
index 6ec8b98ec56..34b47397a53 100644
--- a/tests/lib/repair/repairsharepropagation.php
+++ b/tests/lib/repair/repairsharepropagation.php
@@ -9,6 +9,7 @@
namespace Test\Repair;
use OC\Repair\SharePropagation;
+use OCP\Migration\IOutput;
class RepairSharePropagation extends \Test\TestCase {
public function keyProvider() {
@@ -40,8 +41,13 @@ class RepairSharePropagation extends \Test\TestCase {
$removedKeys[] = $key;
}));
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
$step = new SharePropagation($config);
- $step->run();
+ $step->run($outputMock);
sort($expectedRemovedKeys);
sort($removedKeys);
diff --git a/tests/lib/repair/repairsqliteautoincrement.php b/tests/lib/repair/repairsqliteautoincrement.php
index 6f0c2cb8d28..581857ebfc9 100644
--- a/tests/lib/repair/repairsqliteautoincrement.php
+++ b/tests/lib/repair/repairsqliteautoincrement.php
@@ -7,6 +7,7 @@
*/
namespace Test\Repair;
+use OCP\Migration\IOutput;
/**
* Tests for fixing the SQLite id recycling
@@ -76,7 +77,12 @@ class RepairSqliteAutoincrement extends \Test\TestCase {
public function testConvertIdColumn() {
$this->assertFalse($this->checkAutoincrement());
- $this->repair->run();
+ /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $outputMock */
+ $outputMock = $this->getMockBuilder('\OCP\Migration\IOutput')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->repair->run($outputMock);
$this->assertTrue($this->checkAutoincrement());
}
diff --git a/tests/lib/repair/updateoutdatedocsids.php b/tests/lib/repair/updateoutdatedocsids.php
index 3669a64371f..06e2cb1d610 100644
--- a/tests/lib/repair/updateoutdatedocsids.php
+++ b/tests/lib/repair/updateoutdatedocsids.php
@@ -30,7 +30,7 @@ use Test\TestCase;
* @package Test\Repair
*/
class UpdateOutdatedOcsIds extends TestCase {
- /** @var IConfig */
+ /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
private $config;
/** @var \OC\Repair\UpdateOutdatedOcsIds */
private $updateOutdatedOcsIds;
diff --git a/tests/lib/security/certificate.php b/tests/lib/security/certificate.php
index 81d159ebd52..82e91c71733 100644
--- a/tests/lib/security/certificate.php
+++ b/tests/lib/security/certificate.php
@@ -50,6 +50,14 @@ class CertificateTest extends \Test\TestCase {
$certificate->getIssueDate();
}
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Certificate could not get parsed.
+ */
+ function testCertificateStartingWithFileReference() {
+ new Certificate('file://'.__DIR__ . '/../../data/certificates/goodCertificate.crt', 'bar');
+ }
+
public function testGetName() {
$this->assertSame('GoodCertificate', $this->goodCertificate->getName());
$this->assertSame('BadCertificate', $this->invalidCertificate->getName());
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index 4519c33f9d1..a07e90effc3 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -63,7 +63,7 @@ class Test_Share extends \Test\TestCase {
\OC::$server->getUserManager()->createUser($this->groupAndUser, 'pass');
OC_User::setUserId($this->user1);
OC_Group::clearBackends();
- OC_Group::useBackend(new OC_Group_Dummy);
+ OC_Group::useBackend(new \Test\Util\Group\Dummy());
$this->group1 = $this->getUniqueID('group1_');
$this->group2 = $this->getUniqueID('group2_');
OC_Group::createGroup($this->group1);
@@ -611,162 +611,6 @@ class Test_Share extends \Test\TestCase {
);
}
- public function testShareWithGroup() {
- // Invalid shares
- $message = 'Sharing test.txt failed, because the group foobar does not exist';
- try {
- OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, 'foobar', \OCP\Constants::PERMISSION_READ);
- $this->fail('Exception was expected: '.$message);
- } catch (Exception $exception) {
- $this->assertEquals($message, $exception->getMessage());
- }
- $policy = \OC::$server->getAppConfig()->getValue('core', 'shareapi_only_share_with_group_members', 'no');
- \OC::$server->getAppConfig()->setValue('core', 'shareapi_only_share_with_group_members', 'yes');
- $message = 'Sharing test.txt failed, because '.$this->user1.' is not a member of the group '.$this->group2;
- try {
- OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group2, \OCP\Constants::PERMISSION_READ);
- $this->fail('Exception was expected: '.$message);
- } catch (Exception $exception) {
- $this->assertEquals($message, $exception->getMessage());
- }
- \OC::$server->getAppConfig()->setValue('core', 'shareapi_only_share_with_group_members', $policy);
-
- // Valid share
- $this->shareUserOneTestFileWithGroupOne();
-
- // check if only the group share was created and not a single db-entry for each user
- $statement = \OCP\DB::prepare('select `id` from `*PREFIX*share`');
- $query = $statement->execute();
- $result = $query->fetchAll();
- $this->assertSame(1, count($result));
-
-
- // Attempt to share again
- OC_User::setUserId($this->user1);
- $message = 'Sharing test.txt failed, because this item is already shared with '.$this->group1;
- try {
- OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ);
- $this->fail('Exception was expected: '.$message);
- } catch (Exception $exception) {
- $this->assertEquals($message, $exception->getMessage());
- }
-
- // Attempt to share back to owner of group share
- OC_User::setUserId($this->user2);
- $message = 'Sharing failed, because the user '.$this->user1.' is the original sharer';
- try {
- OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, \OCP\Constants::PERMISSION_READ);
- $this->fail('Exception was expected: '.$message);
- } catch (Exception $exception) {
- $this->assertEquals($message, $exception->getMessage());
- }
-
- // Attempt to share back to group
- $message = 'Sharing test.txt failed, because this item is already shared with '.$this->group1;
- try {
- OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ);
- $this->fail('Exception was expected: '.$message);
- } catch (Exception $exception) {
- $this->assertEquals($message, $exception->getMessage());
- }
-
- // Attempt to share back to member of group
- $message ='Sharing test.txt failed, because this item is already shared with '.$this->user3;
- try {
- OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, \OCP\Constants::PERMISSION_READ);
- $this->fail('Exception was expected: '.$message);
- } catch (Exception $exception) {
- $this->assertEquals($message, $exception->getMessage());
- }
-
- // Unshare
- OC_User::setUserId($this->user1);
- $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1));
-
- // Valid share with same person - user then group
- $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_SHARE));
- $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE));
- OC_User::setUserId($this->user2);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
- $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_SHARE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
- OC_User::setUserId($this->user3);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
- $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
-
- // Valid reshare
- OC_User::setUserId($this->user2);
- $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_READ));
- OC_User::setUserId($this->user4);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
-
- // Unshare from user only
- OC_User::setUserId($this->user1);
- $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2));
- OC_User::setUserId($this->user2);
- $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
- OC_User::setUserId($this->user4);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
-
- // Valid share with same person - group then user
- OC_User::setUserId($this->user1);
- $this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE));
- OC_User::setUserId($this->user2);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
- $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
-
- // Unshare from group only
- OC_User::setUserId($this->user1);
- $this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1));
- OC_User::setUserId($this->user2);
- $this->assertEquals(array(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE), OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS));
-
- // Attempt user specific target conflict
- OC_User::setUserId($this->user3);
- \OCP\Util::connectHook('OCP\\Share', 'post_shared', 'DummyHookListener', 'listen');
-
- $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
- $this->assertEquals(OCP\Share::SHARE_TYPE_GROUP, DummyHookListener::$shareType);
- OC_User::setUserId($this->user2);
- $to_test = OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET);
- $this->assertEquals(2, count($to_test));
- $this->assertTrue(in_array('test.txt', $to_test));
- $this->assertTrue(in_array('test1.txt', $to_test));
-
- // Valid reshare
- $this->assertTrue(OCP\Share::shareItem('test', 'share.txt', OCP\Share::SHARE_TYPE_USER, $this->user4, \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE));
- OC_User::setUserId($this->user4);
- $this->assertEquals(array('test1.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
-
- // Remove user from group
- OC_Group::removeFromGroup($this->user2, $this->group1);
- OC_User::setUserId($this->user2);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
- OC_User::setUserId($this->user4);
- $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
-
- // Add user to group
- OC_Group::addToGroup($this->user4, $this->group1);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
-
- // Unshare from self
- $this->assertTrue(OCP\Share::unshareFromSelf('test', 'test.txt'));
- $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
- OC_User::setUserId($this->user2);
- $this->assertEquals(array('test.txt'), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
-
- // Unshare from self via source
- OC_User::setUserId($this->user1);
- $this->assertTrue(OCP\Share::unshareFromSelf('test', 'share.txt', true));
- $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
-
- // Remove group
- OC_Group::deleteGroup($this->group1);
- OC_User::setUserId($this->user4);
- $this->assertEquals(array(), OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET));
- OC_User::setUserId($this->user3);
- $this->assertEquals(array(), OCP\Share::getItemsShared('test'));
- }
-
/**
* Test that unsharing from group will also delete all
* child entries
diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php
index 6acc81ccee5..44a48535b9b 100644
--- a/tests/lib/share20/defaultshareprovidertest.php
+++ b/tests/lib/share20/defaultshareprovidertest.php
@@ -2093,4 +2093,62 @@ class DefaultShareProviderTest extends \Test\TestCase {
$this->assertCount($shouldBeDeleted ? 0 : count($ids), $data);
}
+
+ public function dataUserDeletedFromGroup() {
+ return [
+ ['group1', 'user1', true],
+ ['group1', 'user2', false],
+ ['group2', 'user1', false],
+ ];
+ }
+
+ /**
+ * Given a group share with 'group1'
+ * And a user specific group share with 'user1'.
+ * User $user is deleted from group $gid.
+ *
+ * @dataProvider dataUserDeletedFromGroup
+ *
+ * @param string $group
+ * @param string $user
+ * @param bool $toDelete
+ */
+ public function testUserDeletedFromGroup($group, $user, $toDelete) {
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->insert('share')
+ ->setValue('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))
+ ->setValue('uid_owner', $qb->createNamedParameter('owner'))
+ ->setValue('uid_initiator', $qb->createNamedParameter('initiator'))
+ ->setValue('share_with', $qb->createNamedParameter('group1'))
+ ->setValue('item_type', $qb->createNamedParameter('file'))
+ ->setValue('item_source', $qb->createNamedParameter(42))
+ ->setValue('file_source', $qb->createNamedParameter(42));
+ $qb->execute();
+ $id1 = $qb->getLastInsertId();
+
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->insert('share')
+ ->setValue('share_type', $qb->createNamedParameter(2))
+ ->setValue('uid_owner', $qb->createNamedParameter('owner'))
+ ->setValue('uid_initiator', $qb->createNamedParameter('initiator'))
+ ->setValue('share_with', $qb->createNamedParameter('user1'))
+ ->setValue('item_type', $qb->createNamedParameter('file'))
+ ->setValue('item_source', $qb->createNamedParameter(42))
+ ->setValue('file_source', $qb->createNamedParameter(42))
+ ->setValue('parent', $qb->createNamedParameter($id1));
+ $qb->execute();
+ $id2 = $qb->getLastInsertId();
+
+ $this->provider->userDeletedFromGroup($user, $group);
+
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->select('*')
+ ->from('share')
+ ->where($qb->expr()->eq('id', $qb->createNamedParameter($id2)));
+ $cursor = $qb->execute();
+ $data = $cursor->fetchAll();
+ $cursor->closeCursor();
+
+ $this->assertCount($toDelete ? 0 : 1, $data);
+ }
}
diff --git a/tests/lib/share20/managertest.php b/tests/lib/share20/managertest.php
index d173f86f091..7d79150449c 100644
--- a/tests/lib/share20/managertest.php
+++ b/tests/lib/share20/managertest.php
@@ -647,7 +647,7 @@ class ManagerTest extends \Test\TestCase {
$data[] = [$this->createShare(null, \OCP\Share::SHARE_TYPE_GROUP, $limitedPermssions, $group0, $user0, $user0, 17, null, null), 'Cannot increase permissions of path', true];
$data[] = [$this->createShare(null, \OCP\Share::SHARE_TYPE_LINK, $limitedPermssions, null, $user0, $user0, 3, null, null), 'Cannot increase permissions of path', true];
- $nonMoveableMountPermssions = $this->getMock('\OCP\Files\File');
+ $nonMoveableMountPermssions = $this->getMock('\OCP\Files\Folder');
$nonMoveableMountPermssions->method('isShareable')->willReturn(true);
$nonMoveableMountPermssions->method('getPermissions')->willReturn(\OCP\Constants::PERMISSION_READ);
$nonMoveableMountPermssions->method('getPath')->willReturn('path');
@@ -2042,6 +2042,46 @@ class ManagerTest extends \Test\TestCase {
$this->assertSame($share, $ret);
}
+ public function testGetShareByTokenWithException() {
+ $factory = $this->getMock('\OCP\Share\IProviderFactory');
+
+ $manager = new Manager(
+ $this->logger,
+ $this->config,
+ $this->secureRandom,
+ $this->hasher,
+ $this->mountManager,
+ $this->groupManager,
+ $this->l,
+ $factory,
+ $this->userManager,
+ $this->rootFolder
+ );
+
+ $share = $this->getMock('\OCP\Share\IShare');
+
+ $factory->expects($this->at(0))
+ ->method('getProviderForType')
+ ->with(\OCP\Share::SHARE_TYPE_LINK)
+ ->willReturn($this->defaultProvider);
+ $factory->expects($this->at(1))
+ ->method('getProviderForType')
+ ->with(\OCP\Share::SHARE_TYPE_REMOTE)
+ ->willReturn($this->defaultProvider);
+
+ $this->defaultProvider->expects($this->at(0))
+ ->method('getShareByToken')
+ ->with('token')
+ ->will($this->throwException(new ShareNotFound()));
+ $this->defaultProvider->expects($this->at(1))
+ ->method('getShareByToken')
+ ->with('token')
+ ->willReturn($share);
+
+ $ret = $manager->getShareByToken('token');
+ $this->assertSame($share, $ret);
+ }
+
/**
* @expectedException \OCP\Share\Exceptions\ShareNotFound
*/
@@ -2437,7 +2477,9 @@ class ManagerTest extends \Test\TestCase {
public function testMoveShareUser() {
$share = $this->manager->newShare();
- $share->setShareType(\OCP\Share::SHARE_TYPE_USER);
+ $share->setShareType(\OCP\Share::SHARE_TYPE_USER)
+ ->setId('42')
+ ->setProviderId('foo');
$share->setSharedWith('recipient');
@@ -2468,7 +2510,9 @@ class ManagerTest extends \Test\TestCase {
public function testMoveShareGroup() {
$share = $this->manager->newShare();
- $share->setShareType(\OCP\Share::SHARE_TYPE_GROUP);
+ $share->setShareType(\OCP\Share::SHARE_TYPE_GROUP)
+ ->setId('42')
+ ->setProviderId('foo');
$group = $this->getMock('\OCP\IGroup');
$share->setSharedWith('group');
diff --git a/tests/lib/testcase.php b/tests/lib/testcase.php
index fb0db8cd86c..d7573337f87 100644
--- a/tests/lib/testcase.php
+++ b/tests/lib/testcase.php
@@ -22,10 +22,15 @@
namespace Test;
+use DOMDocument;
+use DOMNode;
use OC\Command\QueueBus;
use OC\Files\Filesystem;
+use OC\Template\Base;
+use OC_Defaults;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
+use OCP\IL10N;
use OCP\Security\ISecureRandom;
abstract class TestCase extends \PHPUnit_Framework_TestCase {
@@ -34,6 +39,8 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase {
/** @var IDBConnection */
static protected $realDatabase = null;
+
+ /** @var bool */
static private $wasDatabaseAllowed = false;
/** @var array */
@@ -408,4 +415,65 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase {
return false;
}
+
+ /**
+ * @param string $expectedHtml
+ * @param string $template
+ * @param array $vars
+ */
+ protected function assertTemplate($expectedHtml, $template, $vars = []) {
+
+ require_once __DIR__.'/../../lib/private/template/functions.php';
+
+ $requestToken = 12345;
+ $theme = new OC_Defaults();
+ /** @var IL10N | \PHPUnit_Framework_MockObject_MockObject $l10n */
+ $l10n = $this->getMockBuilder('\OCP\IL10N')
+ ->disableOriginalConstructor()->getMock();
+ $l10n
+ ->expects($this->any())
+ ->method('t')
+ ->will($this->returnCallback(function($text, $parameters = array()) {
+ return vsprintf($text, $parameters);
+ }));
+
+ $t = new Base($template, $requestToken, $l10n, $theme);
+ $buf = $t->fetchPage($vars);
+ $this->assertHtmlStringEqualsHtmlString($expectedHtml, $buf);
+ }
+
+ /**
+ * @param string $expectedHtml
+ * @param string $actualHtml
+ * @param string $message
+ */
+ protected function assertHtmlStringEqualsHtmlString($expectedHtml, $actualHtml, $message = '') {
+ $expected = new DOMDocument();
+ $expected->preserveWhiteSpace = false;
+ $expected->formatOutput = true;
+ $expected->loadHTML($expectedHtml);
+
+ $actual = new DOMDocument();
+ $actual->preserveWhiteSpace = false;
+ $actual->formatOutput = true;
+ $actual->loadHTML($actualHtml);
+ $this->removeWhitespaces($actual);
+
+ $expectedHtml1 = $expected->saveHTML();
+ $actualHtml1 = $actual->saveHTML();
+ self::assertEquals($expectedHtml1, $actualHtml1, $message);
+ }
+
+
+ private function removeWhitespaces(DOMNode $domNode) {
+ foreach ($domNode->childNodes as $node) {
+ if($node->hasChildNodes()) {
+ $this->removeWhitespaces($node);
+ } else {
+ if ($node instanceof \DOMText && $node->isWhitespaceInElementContent() ) {
+ $domNode->removeChild($node);
+ }
+ }
+ }
+ }
}
diff --git a/tests/lib/traits/encryptiontrait.php b/tests/lib/traits/encryptiontrait.php
index 2c1c585d6d4..5e2ca4e561f 100644
--- a/tests/lib/traits/encryptiontrait.php
+++ b/tests/lib/traits/encryptiontrait.php
@@ -63,7 +63,7 @@ trait EncryptionTrait {
$keyManager = $container->query('KeyManager');
/** @var Setup $userSetup */
$userSetup = $container->query('UserSetup');
- $userSetup->setupServerSide($name, $password);
+ $userSetup->setupUser($name, $password);
$keyManager->init($name, $password);
}
diff --git a/tests/lib/updater.php b/tests/lib/updater.php
index 8ee77b9f81e..f97eb3ac139 100644
--- a/tests/lib/updater.php
+++ b/tests/lib/updater.php
@@ -29,8 +29,6 @@ use OC\IntegrityCheck\Checker;
class UpdaterTest extends \Test\TestCase {
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
private $config;
- /** @var HTTPHelper */
- private $httpHelper;
/** @var ILogger */
private $logger;
/** @var Updater */
@@ -43,9 +41,6 @@ class UpdaterTest extends \Test\TestCase {
$this->config = $this->getMockBuilder('\\OCP\\IConfig')
->disableOriginalConstructor()
->getMock();
- $this->httpHelper = $this->getMockBuilder('\\OC\\HTTPHelper')
- ->disableOriginalConstructor()
- ->getMock();
$this->logger = $this->getMockBuilder('\\OCP\\ILogger')
->disableOriginalConstructor()
->getMock();
@@ -54,7 +49,6 @@ class UpdaterTest extends \Test\TestCase {
->getMock();
$this->updater = new Updater(
- $this->httpHelper,
$this->config,
$this->checker,
$this->logger
@@ -184,237 +178,4 @@ class UpdaterTest extends \Test\TestCase {
$this->assertSame(false, $this->invokePrivate($this->updater, 'skip3rdPartyAppsDisable'));
}
- public function testCheckInCache() {
- $expectedResult = [
- 'version' => '8.0.4.2',
- 'versionstring' => 'ownCloud 8.0.4',
- 'url' => 'https://download.owncloud.org/community/owncloud-8.0.4.zip',
- 'web' => 'http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html',
- ];
-
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue(time()));
- $this->config
- ->expects($this->at(1))
- ->method('getAppValue')
- ->with('core', 'lastupdateResult')
- ->will($this->returnValue(json_encode($expectedResult)));
-
- $this->assertSame($expectedResult, $this->updater->check());
- }
-
- public function testCheckWithoutUpdateUrl() {
- $expectedResult = [
- 'version' => '8.0.4.2',
- 'versionstring' => 'ownCloud 8.0.4',
- 'url' => 'https://download.owncloud.org/community/owncloud-8.0.4.zip',
- 'web' => 'http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html',
- ];
-
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue(0));
- $this->config
- ->expects($this->at(1))
- ->method('setAppValue')
- ->with('core', 'lastupdatedat', $this->isType('integer'));
- $this->config
- ->expects($this->at(3))
- ->method('getAppValue')
- ->with('core', 'installedat')
- ->will($this->returnValue('installedat'));
- $this->config
- ->expects($this->at(4))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue('lastupdatedat'));
- $this->config
- ->expects($this->at(5))
- ->method('setAppValue')
- ->with('core', 'lastupdateResult', json_encode($expectedResult));
-
- $updateXml = '<?xml version="1.0"?>
-<owncloud>
- <version>8.0.4.2</version>
- <versionstring>ownCloud 8.0.4</versionstring>
- <url>https://download.owncloud.org/community/owncloud-8.0.4.zip</url>
- <web>http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html</web>
-</owncloud>';
- $this->httpHelper
- ->expects($this->once())
- ->method('getUrlContent')
- ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
- ->will($this->returnValue($updateXml));
-
- $this->assertSame($expectedResult, $this->updater->check());
- }
-
- public function testCheckWithInvalidXml() {
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue(0));
- $this->config
- ->expects($this->at(1))
- ->method('setAppValue')
- ->with('core', 'lastupdatedat', $this->isType('integer'));
- $this->config
- ->expects($this->at(3))
- ->method('getAppValue')
- ->with('core', 'installedat')
- ->will($this->returnValue('installedat'));
- $this->config
- ->expects($this->at(4))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue('lastupdatedat'));
- $this->config
- ->expects($this->at(5))
- ->method('setAppValue')
- ->with('core', 'lastupdateResult', 'false');
-
- $updateXml = 'Invalid XML Response!';
- $this->httpHelper
- ->expects($this->once())
- ->method('getUrlContent')
- ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
- ->will($this->returnValue($updateXml));
-
- $this->assertSame([], $this->updater->check());
- }
-
- public function testCheckWithUpdateUrl() {
- $expectedResult = [
- 'version' => '8.0.4.2',
- 'versionstring' => 'ownCloud 8.0.4',
- 'url' => 'https://download.owncloud.org/community/owncloud-8.0.4.zip',
- 'web' => 'http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html',
- ];
-
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue(0));
- $this->config
- ->expects($this->at(1))
- ->method('setAppValue')
- ->with('core', 'lastupdatedat', $this->isType('integer'));
- $this->config
- ->expects($this->at(3))
- ->method('getAppValue')
- ->with('core', 'installedat')
- ->will($this->returnValue('installedat'));
- $this->config
- ->expects($this->at(4))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue('lastupdatedat'));
- $this->config
- ->expects($this->at(5))
- ->method('setAppValue')
- ->with('core', 'lastupdateResult', json_encode($expectedResult));
-
- $updateXml = '<?xml version="1.0"?>
-<owncloud>
- <version>8.0.4.2</version>
- <versionstring>ownCloud 8.0.4</versionstring>
- <url>https://download.owncloud.org/community/owncloud-8.0.4.zip</url>
- <web>http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html</web>
-</owncloud>';
- $this->httpHelper
- ->expects($this->once())
- ->method('getUrlContent')
- ->with($this->buildUpdateUrl('https://myupdater.com/'))
- ->will($this->returnValue($updateXml));
-
- $this->assertSame($expectedResult, $this->updater->check('https://myupdater.com/'));
- }
-
- public function testCheckWithEmptyValidXmlResponse() {
- $expectedResult = [
- 'version' => '',
- 'versionstring' => '',
- 'url' => '',
- 'web' => '',
- ];
-
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue(0));
- $this->config
- ->expects($this->at(1))
- ->method('setAppValue')
- ->with('core', 'lastupdatedat', $this->isType('integer'));
- $this->config
- ->expects($this->at(3))
- ->method('getAppValue')
- ->with('core', 'installedat')
- ->will($this->returnValue('installedat'));
- $this->config
- ->expects($this->at(4))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue('lastupdatedat'));
-
- $updateXml = '<?xml version="1.0"?>
-<owncloud>
- <version></version>
- <versionstring></versionstring>
- <url></url>
- <web></web>
-</owncloud>';
- $this->httpHelper
- ->expects($this->once())
- ->method('getUrlContent')
- ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
- ->will($this->returnValue($updateXml));
-
- $this->assertSame($expectedResult, $this->updater->check());
- }
-
- public function testCheckWithEmptyInvalidXmlResponse() {
- $expectedResult = [];
-
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue(0));
- $this->config
- ->expects($this->at(1))
- ->method('setAppValue')
- ->with('core', 'lastupdatedat', $this->isType('integer'));
- $this->config
- ->expects($this->at(3))
- ->method('getAppValue')
- ->with('core', 'installedat')
- ->will($this->returnValue('installedat'));
- $this->config
- ->expects($this->at(4))
- ->method('getAppValue')
- ->with('core', 'lastupdatedat')
- ->will($this->returnValue('lastupdatedat'));
- $this->config
- ->expects($this->at(5))
- ->method('setAppValue')
- ->with('core', 'lastupdateResult', json_encode($expectedResult));
-
- $updateXml = '';
- $this->httpHelper
- ->expects($this->once())
- ->method('getUrlContent')
- ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
- ->will($this->returnValue($updateXml));
-
- $this->assertSame($expectedResult, $this->updater->check());
- }
}
diff --git a/tests/lib/updater/versioncheck.php b/tests/lib/updater/versioncheck.php
new file mode 100644
index 00000000000..4613581a75f
--- /dev/null
+++ b/tests/lib/updater/versioncheck.php
@@ -0,0 +1,289 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ * @author Victor Dubiniuk <dubiniuk@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC;
+
+use OC\Updater\VersionCheck;
+use OCP\IConfig;
+use OCP\Util;
+
+class VersionCheckTest extends \Test\TestCase {
+ /** @var IConfig| \PHPUnit_Framework_MockObject_MockObject */
+ private $config;
+ /** @var VersionCheck | \PHPUnit_Framework_MockObject_MockObject*/
+ private $updater;
+
+ public function setUp() {
+ parent::setUp();
+ $this->config = $this->getMockBuilder('\OCP\IConfig')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $clientService = $this->getMockBuilder('\OCP\Http\Client\IClientService')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->updater = $this->getMock('\OC\Updater\VersionCheck',
+ ['getUrlContent'], [$clientService, $this->config]);
+ }
+
+ /**
+ * @param string $baseUrl
+ * @return string
+ */
+ private function buildUpdateUrl($baseUrl) {
+ return $baseUrl . '?version='.implode('x', Util::getVersion()).'xinstalledatxlastupdatedatx'.\OC_Util::getChannel().'x'.\OC_Util::getEditionString().'x';
+ }
+
+ public function testCheckInCache() {
+ $expectedResult = [
+ 'version' => '8.0.4.2',
+ 'versionstring' => 'ownCloud 8.0.4',
+ 'url' => 'https://download.owncloud.org/community/owncloud-8.0.4.zip',
+ 'web' => 'http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html',
+ ];
+
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue(time()));
+ $this->config
+ ->expects($this->at(1))
+ ->method('getAppValue')
+ ->with('core', 'lastupdateResult')
+ ->will($this->returnValue(json_encode($expectedResult)));
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testCheckWithoutUpdateUrl() {
+ $expectedResult = [
+ 'version' => '8.0.4.2',
+ 'versionstring' => 'ownCloud 8.0.4',
+ 'url' => 'https://download.owncloud.org/community/owncloud-8.0.4.zip',
+ 'web' => 'http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html',
+ ];
+
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue(0));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('core', 'lastupdatedat', $this->isType('integer'));
+ $this->config
+ ->expects($this->at(3))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->will($this->returnValue('installedat'));
+ $this->config
+ ->expects($this->at(4))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue('lastupdatedat'));
+ $this->config
+ ->expects($this->at(5))
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', json_encode($expectedResult));
+
+ $updateXml = '<?xml version="1.0"?>
+<owncloud>
+ <version>8.0.4.2</version>
+ <versionstring>ownCloud 8.0.4</versionstring>
+ <url>https://download.owncloud.org/community/owncloud-8.0.4.zip</url>
+ <web>http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html</web>
+</owncloud>';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
+ ->will($this->returnValue($updateXml));
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testCheckWithInvalidXml() {
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue(0));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('core', 'lastupdatedat', $this->isType('integer'));
+ $this->config
+ ->expects($this->at(3))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->will($this->returnValue('installedat'));
+ $this->config
+ ->expects($this->at(4))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue('lastupdatedat'));
+ $this->config
+ ->expects($this->at(5))
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', 'false');
+
+ $updateXml = 'Invalid XML Response!';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
+ ->will($this->returnValue($updateXml));
+
+ $this->assertSame([], $this->updater->check());
+ }
+
+ public function testCheckWithUpdateUrl() {
+ $expectedResult = [
+ 'version' => '8.0.4.2',
+ 'versionstring' => 'ownCloud 8.0.4',
+ 'url' => 'https://download.owncloud.org/community/owncloud-8.0.4.zip',
+ 'web' => 'http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html',
+ ];
+
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue(0));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('core', 'lastupdatedat', $this->isType('integer'));
+ $this->config
+ ->expects($this->at(3))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->will($this->returnValue('installedat'));
+ $this->config
+ ->expects($this->at(4))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue('lastupdatedat'));
+ $this->config
+ ->expects($this->at(5))
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', json_encode($expectedResult));
+
+ $updateXml = '<?xml version="1.0"?>
+<owncloud>
+ <version>8.0.4.2</version>
+ <versionstring>ownCloud 8.0.4</versionstring>
+ <url>https://download.owncloud.org/community/owncloud-8.0.4.zip</url>
+ <web>http://doc.owncloud.org/server/8.0/admin_manual/maintenance/upgrade.html</web>
+</owncloud>';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://myupdater.com/'))
+ ->will($this->returnValue($updateXml));
+
+ $this->assertSame($expectedResult, $this->updater->check('https://myupdater.com/'));
+ }
+
+ public function testCheckWithEmptyValidXmlResponse() {
+ $expectedResult = [
+ 'version' => '',
+ 'versionstring' => '',
+ 'url' => '',
+ 'web' => '',
+ ];
+
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue(0));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('core', 'lastupdatedat', $this->isType('integer'));
+ $this->config
+ ->expects($this->at(3))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->will($this->returnValue('installedat'));
+ $this->config
+ ->expects($this->at(4))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue('lastupdatedat'));
+
+ $updateXml = '<?xml version="1.0"?>
+<owncloud>
+ <version></version>
+ <versionstring></versionstring>
+ <url></url>
+ <web></web>
+</owncloud>';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
+ ->will($this->returnValue($updateXml));
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+
+ public function testCheckWithEmptyInvalidXmlResponse() {
+ $expectedResult = [];
+
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue(0));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('core', 'lastupdatedat', $this->isType('integer'));
+ $this->config
+ ->expects($this->at(3))
+ ->method('getAppValue')
+ ->with('core', 'installedat')
+ ->will($this->returnValue('installedat'));
+ $this->config
+ ->expects($this->at(4))
+ ->method('getAppValue')
+ ->with('core', 'lastupdatedat')
+ ->will($this->returnValue('lastupdatedat'));
+ $this->config
+ ->expects($this->at(5))
+ ->method('setAppValue')
+ ->with('core', 'lastupdateResult', json_encode($expectedResult));
+
+ $updateXml = '';
+ $this->updater
+ ->expects($this->once())
+ ->method('getUrlContent')
+ ->with($this->buildUpdateUrl('https://updates.owncloud.com/server/'))
+ ->will($this->returnValue($updateXml));
+
+ $this->assertSame($expectedResult, $this->updater->check());
+ }
+}
diff --git a/lib/private/group/dummy.php b/tests/lib/util/group/dummy.php
index 74a19a90592..e72be827d8a 100644
--- a/lib/private/group/dummy.php
+++ b/tests/lib/util/group/dummy.php
@@ -27,10 +27,14 @@
*
*/
+namespace Test\Util\Group;
+
+use OC_Group_Backend;
+
/**
* dummy group backend, does not keep state, only for testing use
*/
-class OC_Group_Dummy extends OC_Group_Backend {
+class Dummy extends OC_Group_Backend {
private $groups=array();
/**
* Try to create a new group
diff --git a/tests/phpunit-autotest-external.xml b/tests/phpunit-autotest-external.xml
index 31d2e395a01..1b48c4dc11e 100644
--- a/tests/phpunit-autotest-external.xml
+++ b/tests/phpunit-autotest-external.xml
@@ -8,7 +8,7 @@
<testsuite name='ownCloud files external'>
<directory suffix=".php">../apps/files_external/tests</directory>
<!-- exclude backends as they are called separately -->
- <exclude>../apps/files_external/tests/backends/</exclude>
+ <exclude>../apps/files_external/tests/storage/</exclude>
</testsuite>
<!-- filters for code coverage -->
<filter>
diff --git a/tests/settings/middleware/subadminmiddlewaretest.php b/tests/settings/middleware/subadminmiddlewaretest.php
index 2b76e4beaa9..c16c21c9c10 100644
--- a/tests/settings/middleware/subadminmiddlewaretest.php
+++ b/tests/settings/middleware/subadminmiddlewaretest.php
@@ -10,7 +10,7 @@
namespace OC\Settings\Middleware;
-use OC\Appframework\Middleware\Security\Exceptions\NotAdminException;
+use OC\AppFramework\Middleware\Security\Exceptions\NotAdminException;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\TemplateResponse;
@@ -42,7 +42,7 @@ class SubadminMiddlewareTest extends \Test\TestCase {
}
/**
- * @expectedException \OC\Appframework\Middleware\Security\Exceptions\NotAdminException
+ * @expectedException \OC\AppFramework\Middleware\Security\Exceptions\NotAdminException
*/
public function testBeforeControllerAsUserWithExemption() {
$this->reflector