From d0e47d475cd7efd7541d51e02ab216a966da8b1f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Fri, 11 Dec 2015 03:31:55 +0100 Subject: [PATCH] mw.ForeignStructuredUpload.BookletLayout: A/B test of 4 different interfaces It turns out that people click the checkbox affirming that they are they author of the file and that they release it under CC BY-SA even when neither of those is true. So we're trying some interfaces that require a modicum of thought rather than just a click on "I agree". Option 1: The form we have right now, with a single checkbox. Option 2: Four checkboxes, each with a label explaining one facet of the requirements (own work; no pictures of copyrighted work; educational/useful; irrevocably released as CC BY-SA). Option 3: Some Yes/No questions structured so that 'Yes' is not always the right answer to continue uploading. Option 4: Longer introduction before a single checkbox (as in option 1), with examples of good and unacceptable content. As only logged in users are able to upload files, we're able to bucket them into four groups by user ID number. When the user completes a file upload, the bucket number is saved server-side in a change tag by the companion patch I90cb12c505b2581f36113ec6b4f7bf732f0971b7 (we could match the user IDs cross-wiki by username, but that sounds painful). For testing and debugging, add '?uploadbucket=N' to the URL to force given interface option to appear. Any completed upload won't count towards the bucket. Note that for expediency, the tested options all assume uploads to 'shared' repository (that is, Wikimedia Commons). The winner's messages will be tweaked to work with 'local' and other targets too. This patch DOES NOT ENABLE THE TEST yet, it just implements the options. Enabling it on specific wikis can be done via config: * $wgForeignUploadTestEnabled = true/false (defaults to 'false') Whether the test is running. * $wgForeignUploadTestDefault = 1/2/3/4 (defaults to '1') Interface to use when the test is not running (and for anons). Bug: T120867 Bug: T121021 Change-Id: I557056b867c6a55ef2c9af321eb48893312632a3 --- includes/DefaultSettings.php | 6 + .../ResourceLoaderStartUpModule.php | 2 + languages/i18n/en.json | 15 + languages/i18n/qqq.json | 23 +- resources/Resources.php | 18 + .../bookletlayout/option2/ccbysa.png | Bin 0 -> 4513 bytes .../bookletlayout/option2/noderiv.png | Bin 0 -> 7297 bytes .../bookletlayout/option2/ownwork.png | Bin 0 -> 3532 bytes .../bookletlayout/option2/useful.png | Bin 0 -> 4267 bytes .../bookletlayout/option4/camera.png | Bin 0 -> 8460 bytes .../bookletlayout/option4/graphics.png | Bin 0 -> 19658 bytes .../bookletlayout/option4/guide.html | 12 + .../bookletlayout/option4/search.png | Bin 0 -> 7453 bytes .../bookletlayout/option4/website.png | Bin 0 -> 7446 bytes ....ForeignStructuredUpload.BookletLayout.css | 136 +++++++ ...i.ForeignStructuredUpload.BookletLayout.js | 337 +++++++++++++++++- .../mediawiki.Upload.BookletLayout.js | 4 + resources/src/mediawiki/mediawiki.Upload.js | 1 + 18 files changed, 540 insertions(+), 14 deletions(-) create mode 100644 resources/src/mediawiki/bookletlayout/option2/ccbysa.png create mode 100644 resources/src/mediawiki/bookletlayout/option2/noderiv.png create mode 100644 resources/src/mediawiki/bookletlayout/option2/ownwork.png create mode 100644 resources/src/mediawiki/bookletlayout/option2/useful.png create mode 100644 resources/src/mediawiki/bookletlayout/option4/camera.png create mode 100644 resources/src/mediawiki/bookletlayout/option4/graphics.png create mode 100644 resources/src/mediawiki/bookletlayout/option4/guide.html create mode 100644 resources/src/mediawiki/bookletlayout/option4/search.png create mode 100644 resources/src/mediawiki/bookletlayout/option4/website.png diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 1642c0966a..39b133b4c8 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -535,6 +535,12 @@ $wgUseInstantCommons = false; */ $wgForeignUploadTargets = array(); +/** + * Cross-wiki upload A/B test configuration. + */ +$wgForeignUploadTestEnabled = false; +$wgForeignUploadTestDefault = 1; + /** * File backend structure configuration. * diff --git a/includes/resourceloader/ResourceLoaderStartUpModule.php b/includes/resourceloader/ResourceLoaderStartUpModule.php index 39e4e0bc6f..fc128fb7d0 100644 --- a/includes/resourceloader/ResourceLoaderStartUpModule.php +++ b/includes/resourceloader/ResourceLoaderStartUpModule.php @@ -104,6 +104,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule { 'wgResourceLoaderLegacyModules' => self::getLegacyModules(), 'wgForeignUploadTargets' => $conf->get( 'ForeignUploadTargets' ), 'wgEnableUploads' => $conf->get( 'EnableUploads' ), + 'wgForeignUploadTestEnabled' => $conf->get( 'ForeignUploadTestEnabled' ), + 'wgForeignUploadTestDefault' => $conf->get( 'ForeignUploadTestDefault' ), ); Hooks::run( 'ResourceLoaderGetConfigVars', array( &$vars ) ); diff --git a/languages/i18n/en.json b/languages/i18n/en.json index 62405c8320..a1fff73067 100644 --- a/languages/i18n/en.json +++ b/languages/i18n/en.json @@ -1443,6 +1443,21 @@ "foreign-structured-upload-form-label-own-work-message-shared": "I attest that I own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license, and I agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].", "foreign-structured-upload-form-label-not-own-work-message-shared": "If you do not own the copyright on this file, or you wish to release it under a different license, consider using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].", "foreign-structured-upload-form-label-not-own-work-local-shared": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if the site allows the upload of this file under their policies.", + "foreign-structured-upload-form-2-label-intro": "Thank you for donating an image to be used on {{SITENAME}}. You should only continue if it meets several conditions:", + "foreign-structured-upload-form-2-label-ownwork": "It must be entirely your own creation, not just taken from the Internet", + "foreign-structured-upload-form-2-label-noderiv": "It has to contain no work by anyone else, or inspired by them", + "foreign-structured-upload-form-2-label-useful": "It should be educational and useful for teaching others", + "foreign-structured-upload-form-2-label-ccbysa": "It must be OK to publish forever on the Internet under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license", + "foreign-structured-upload-form-2-label-alternative": "If not all of the above are true, you may still be able to upload this file using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], as long as it's available under a free license.", + "foreign-structured-upload-form-2-label-termsofuse": "By uploading the file, you attest that you own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the Creative Commons Attribution-ShareAlike 4.0 license, and you agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].", + "foreign-structured-upload-form-3-label-question-website": "Did you download this image from a website, or get it from an image search?", + "foreign-structured-upload-form-3-label-question-ownwork": "Did you create this image (take the photo, sketch the drawing, etc.) yourself?", + "foreign-structured-upload-form-3-label-question-noderiv": "Does it contain, or is it inspired by, work owned by anyone else, like a logo?", + "foreign-structured-upload-form-3-label-yes": "Yes", + "foreign-structured-upload-form-3-label-no": "No", + "foreign-structured-upload-form-3-label-alternative": "Unfortunately, in this case, this tool does not support uploading this file. You may still be able to upload it using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], as long as it's available under a free license.", + "foreign-structured-upload-form-4-label-good": "Using this tool, you can upload educational graphics you've created and photographs you've taken, that don't contain work owned by someone else.", + "foreign-structured-upload-form-4-label-bad": "You can not upload images found on a search engine or downloaded from other websites.", "backend-fail-stream": "Could not stream file \"$1\".", "backend-fail-backup": "Could not backup file \"$1\".", "backend-fail-notexists": "The file $1 does not exist.", diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json index 837c75f83c..e809e1073e 100644 --- a/languages/i18n/qqq.json +++ b/languages/i18n/qqq.json @@ -1607,7 +1607,7 @@ "upload-form-label-infoform-description": "Label for the file description input\n{{Identical|Description}}", "upload-form-label-usage-title": "Title for the insert form showing how to use the uploaded item.\n{{Identical|Usage}}", "upload-form-label-usage-filename": "Label for the file name input\n{{Identical|Filename}}", - "foreign-structured-upload-form-label-own-work": "Label for own work toggle", + "foreign-structured-upload-form-label-own-work": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Label for own work confirmation checkbox", "foreign-structured-upload-form-label-infoform-categories": "Label for category selector input\n{{Identical|Category}}", "foreign-structured-upload-form-label-infoform-date": "Label for date input\n{{Identical|Date}}", "foreign-structured-upload-form-label-own-work-message-local": "Message shown by local when a user affirms that they are allowed to upload a file to the local wiki.", @@ -1616,9 +1616,24 @@ "foreign-structured-upload-form-label-own-work-message-default": "Message shown by default when a user affirms that they are allowed to upload a file to a remote wiki.", "foreign-structured-upload-form-label-not-own-work-message-default": "Message shown by default when a user cannot upload a file to a remote wiki.", "foreign-structured-upload-form-label-not-own-work-local-default": "Suggests uploading a file locally instead of to a remote wiki.", - "foreign-structured-upload-form-label-own-work-message-shared": "Legal message to show when the work is made by the uploader.", - "foreign-structured-upload-form-label-not-own-work-message-shared": "Message to show when the work isn't owned by the uploader.", - "foreign-structured-upload-form-label-not-own-work-local-shared": "Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons. $1 is the name of the local wiki.", + "foreign-structured-upload-form-label-own-work-message-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Legal message, confirming that the user is allowed to upload the file. Almost identical to {{msg-mw|foreign-structured-upload-form-2-label-termsofuse}}.", + "foreign-structured-upload-form-label-not-own-work-message-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.", + "foreign-structured-upload-form-label-not-own-work-local-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons.", + "foreign-structured-upload-form-2-label-intro": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Introductory text in cross-wiki upload dialog.", + "foreign-structured-upload-form-2-label-ownwork": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.", + "foreign-structured-upload-form-2-label-noderiv": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.", + "foreign-structured-upload-form-2-label-useful": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.", + "foreign-structured-upload-form-2-label-ccbysa": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.", + "foreign-structured-upload-form-2-label-alternative": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.", + "foreign-structured-upload-form-2-label-termsofuse": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Legal message, confirming that the user is allowed to upload the file. Almost identical to {{msg-mw|foreign-structured-upload-form-label-own-work-message-shared}}.", + "foreign-structured-upload-form-3-label-question-website": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.", + "foreign-structured-upload-form-3-label-question-ownwork": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.", + "foreign-structured-upload-form-3-label-question-noderiv": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.", + "foreign-structured-upload-form-3-label-yes": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] {{Identical|Yes}}", + "foreign-structured-upload-form-3-label-no": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] {{Identical|No}}", + "foreign-structured-upload-form-3-label-alternative": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.", + "foreign-structured-upload-form-4-label-good": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 4.png|thumb]] Gives examples of good content that is welcome. There is limited space for this text in the interface, please keep it short.", + "foreign-structured-upload-form-4-label-bad": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 4.png|thumb]] Gives examples of bad content that is unacceptable. There is limited space for this text in the interface, please keep it short.", "backend-fail-stream": "Parameters:\n* $1 - a filename", "backend-fail-backup": "Parameters:\n* $1 - a filename", "backend-fail-notexists": "Parameters:\n* $1 - a filename", diff --git a/resources/Resources.php b/resources/Resources.php index 3d5a563798..02d87d4406 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -1267,6 +1267,24 @@ return array( 'foreign-structured-upload-form-label-own-work-message-local', 'foreign-structured-upload-form-label-not-own-work-message-local', 'foreign-structured-upload-form-label-not-own-work-local-local', + 'foreign-structured-upload-form-2-label-intro', + 'foreign-structured-upload-form-2-label-ownwork', + 'foreign-structured-upload-form-2-label-noderiv', + 'foreign-structured-upload-form-2-label-useful', + 'foreign-structured-upload-form-2-label-ccbysa', + 'foreign-structured-upload-form-2-label-alternative', + 'foreign-structured-upload-form-2-label-termsofuse', + 'foreign-structured-upload-form-3-label-question-website', + 'foreign-structured-upload-form-3-label-question-ownwork', + 'foreign-structured-upload-form-3-label-question-noderiv', + 'foreign-structured-upload-form-3-label-yes', + 'foreign-structured-upload-form-3-label-no', + 'foreign-structured-upload-form-3-label-alternative', + 'foreign-structured-upload-form-4-label-good', + 'foreign-structured-upload-form-4-label-bad', + ), + 'templates' => array( + 'guide.html' => 'resources/src/mediawiki/bookletlayout/option4/guide.html', ), ), 'mediawiki.toc' => array( diff --git a/resources/src/mediawiki/bookletlayout/option2/ccbysa.png b/resources/src/mediawiki/bookletlayout/option2/ccbysa.png new file mode 100644 index 0000000000000000000000000000000000000000..507e62db3826be9b67ef71e78a865a5bfb8cceee GIT binary patch literal 4513 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 R+41B>qoZknexZ(y`VYtutZx7S literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki/bookletlayout/option2/useful.png b/resources/src/mediawiki/bookletlayout/option2/useful.png new file mode 100644 index 0000000000000000000000000000000000000000..1309eb3b9e8eeabc15768887bc2758aee9a570cd GIT binary patch literal 4267 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 N002ovPDHLkV1g>3B})JR literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki/bookletlayout/option4/camera.png b/resources/src/mediawiki/bookletlayout/option4/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..f52391f20aa9568335d726318135197a96cd4bcc GIT binary patch literal 8460 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 literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki/bookletlayout/option4/graphics.png b/resources/src/mediawiki/bookletlayout/option4/graphics.png new file mode 100644 index 0000000000000000000000000000000000000000..6fcc2c5f989b2a241a63598c1d69d7e9c637fe29 GIT binary patch literal 19658 zcmV*QKwrO!P)zt_0sw%S;|n1KGkfoa5W_zZUdI{2R1- zSm76$fEfN#cpW7Euaq)c!tk$&U$oX5V@CIVBv-P8BObu8JviqUDST9H6~E-1^WGCt z@DEY%opVA6@4fdvNs{4@2%oN$T4XaL8OfCIMx7G#=nV6Vx z&h>h|U>iiFwa&6EDD#40c<+P8$IM}DY|MLKRaL*=4~CT_NeG+@Avz|33HMp3x*M0M6jFTS83qu20Q zYi&%Oqe%%Nk|YUM6(FgAO=+!T3Ln9*@M~hZ<6K~PNyJ(k{_Nm1gIf!?=2FM9;a524 z0`4*VI(|1?-sQX%@p*+OwOoM2i#)GzGebCZZXxd6&k02ZAw)uOLR!YSu;+&%h z=*CLlaN02Zn1}U#*oVX@>mpjRgeli>)^r&zCe)A4{dG|tFMoM-7@!QA^v3Y;i~g?R zXMLeZ6V&zGnsu;{U^cIzQr6mjzh6~VG{NxB;29RF{)N(s;U7M?*0EG4jkPvrO2bIn zrG8rBHV!|q;CqM7MoJkj?^54~==Otecg`uLs;XKpArM|)g;;dvhCeXe?QmBw@@T@R zg{Kgb@1W}O%u14^R;wwcUgt5QxrBGdWaF=|Ojl-~NIY7Wlpa!JeGW1RPC ze$6{M{8tY@k@$L%2`s?1;q)rYG8O`ZuL;MD);gpdMNuqr3o$hx8yl;tDtyAQ16itP z5bj-?rc%oJ`S~o%s;as?Mf&J(LrP<u}|l+Au;&7yoc(F3Yl3 zt5sE1RaLm}A%cnlz@^T-g%DL$rD+-rV|lrY;eaI^%~e%JOsOb}2&ja9r3)Db5rscL z9N#eji@_BU<$11@3Quq$6Cd{M@jb%{&7#bEQM4Csx7M17(liZ^e`#|JX6|%4TI-+? ztyU|>hnM<6hT9zuws68}t;6BeY&OHm7t2hS!DC1%+wFFI#NkSoOBc_g_P+S|!kH41 zgqUo^)b6~W6T_t8peDX?ICobew1_?>esnly!WW0j8s`m9V|Wm&<9|)K?NUosRpC#F z81&`2p6Ki2neDw_)QYw!9lX?MgfS+z$1ShMwxIgMCFa?Gs3m-jPCOr2ShvPX`Jh0R?zIbxSQ~9!?K=HR&Yva)~d>NP7qs9Yk znc`7VOJk#VymgBLfr}LQLMSz?oB^MW-->=o2%&=Zgm@!>Br$1@<_#>9%&@IYSB|B$hG@6~YV`C4nC5K_uu7|}pO&HUm8l;KMs?ul5E8yY=W zgs3lr#RfOKC|L~J8SilL`ur9P( z4)-Zt21qJCvS6;m&tkd6RKs{_EFQ%4Y#2L@vFk;i%cA5P=QNzZW<|r_2vw&z$uZo8 z63*R=CyP?bqA2F)=VRy9b6}472Is{!~?!Wm&A87-Iq|)$8>l zLK1HHr9Lzpemt&3*1F8sfpKCm^zvChYM9|FPX13rx;%vriWxA;7AuCr(MXYwX z%_hsTfHq#}(vu_^9*+ufS1_j~JZZvd9sV>SM8M`QwLuCYLg6W(dCVM2OCivY?jk7b zrM^GmpbgUjF~kjp@MUBY@lY;`BDQP2@*51#xQ=8bm*~Jc_o!Ohl2@pTga(E2@$m(gkZ`tz zs3Yd-%f;1>WO+%fhQ&5`ENN5raJev~d!q@a*zptrTtp_qb4}u#jQK`{IwLu+7J2XY@85su z(4jC;85xt8>NpPBc8Hr+ty*>a?Y9SX_<}7VBh4PkwCDq^u2ZOddO7Q2EhTn{ zSZmd}o+b45tXZ=r_MZ(m+X^Apty>q#6o!+hFMa7t%WgnyBuf%sIp;$D9Y6LBhEQG=a>-vMzEQ$Ic6ALO+2^* zK~bO!3JxdurAW(i9s|Q`BdbZ0BuTPBHg&Ec#v!RVr5TlenBQ}erwcYWdhjFpnkbME zqSARkfwzFW1$Cew90iPUsHk#_51w;2Mz=u;=K={RJ~qbv0}v&PdpK4CoXi_ z1~m(ve?h;uZrz$?*`Y&+0?ZY(9KgDD>uR;yh17C*1V8+)g?|^JQqeFL1ynJD3f?U` ziV%>+DZi0bjO1%(-r+1SisI9w8z(0xJDpCe)e78}7pkWPxHiO2 zgTY{GYAO^J_U_%AWm(*hm*;u-s0-yP=b};w-Bag{0>hltxj9N0k32VG3(##Cp&I4i zBe{sgfL?1I<{X1^JN6NE6++x`#~mSuzKCJO;vh5c*s%j=$LIsd8|I5HUJSudi&U&` z2R%PeOGsIkv$L~1ckYaYNU^hJW@hHpsZ)FQ>?w*O{CotDvn-pNn;TihNWP|o$@`!@ zaT`%tmaSGRP}BwTW&nZn_d*IC(t`*W<$2z0Hox;bzY}KxTp|k2=iGz-Yl=FrEiQt$ zhRLdehYF>=VIqu+GwY0GB*O_t^`}p|yx4qSfY-Ai2K(-IyTg<9(V#lj~!-y4@;E7_@V%Tz`RSa|c#h#Io zRgC1X155>E_U4;!4(k~JIQAiF)>_|v_uT<&x`;Xjn&)6wflNNYS@+(1FV2?FLyj>v zHWvKJHx)`P0$zt%HzV=wurG`6TEufcl95~_`L@=E=JU|{gpruY2g)n=h%y2&IO@hYy!!85*LjcS@;^8#iv) zuwiOy>c$&yoSdAz2$~d|M?$S|Fc=g?k*4Y1y?f&*M5uL)kB?7IPJUCNRLqKEGYE#b zhZiwB7-Iq^5EH31O_zMU>30r3`}yg^iWKvb^=>gUF;r;t^z5y()}|rR1OxB{A_`~P zX=N1&1))8J^}@68kVKVQno_9|{@wizm(DPPUWH!05G;l8Bx-rD*HcPu-@birZZ0&l zUMNwCw7j)i?Q@^|9L_fEg#;$}qA*AF4KO~w&M?9yh6$2Ism1WWaq%n8mSbYW)?hFQ zgClQR(GEm{3C{b*J#lBnc|Ro5@PrU1EZPpd-J$h66c2(0hGpE}lwk-V zCMPG8B)R|o`{SPx#y*H>YHI5F=bwM*p@$YZrjYA=_`@F_^-9&+l>;+@l$1(AkX7C} zXBS#=yaN*vX(5D^M76%P3=cR7FW}%U*s-tS4co&X;veVS%9SgF!Wd&zqC-eh6vf!s zSWy&%!QdjHR7fF0c%LLmtyT-6*Xq@)!;u{tZ^MX1u#j)uFhbT6d&q}FtQc8^4G$4Z z9`2hTSp|S9BM9LLCA*4@1yiDgk}KLa!Peg%G0jZ`fND`~T83jnmjce~O|Atrf9Ccai!-T>TMT zO?Vv@IAp?cH}^N2W5hvqoGn>I*lT!iSe)~Y9k|i7-sB!*%!oCO@olTFxo>jQJu5fd zl#Y*kzyP(ghup%6gOEfhhmOPU`O{CGIkaQ;@C)sehfI6U_Qyr-4S9bSwofP(ctAo5 z9<~mJp1fA-RpEg#ZD^p}c5X-xzh(c>>uON5yLzUM7nnRznPJGz$fnB`@%O z%Vn@K!>RdkBWhW#1K)#HDv_4QD%ECVG6BtAdOsLkh8Ncd7>Yg)H?l`vhxx;&Z_4o^8dA%GIUJ?;; zW$S6pGg~REL6K;wwJv>Scwyc^FO!01#G`N)>kkGH7bE@kPuQqzaabs}NW~Q}_*y## zhS!wE+8r~W2bBu@UNJPL7k9h{LkzJ~=!}Z#$MD|QH#bHVo=Vc-cJ?@Lz2O~XJc>nOmUYu>O3SST9@HdiS zY{~JrcTn=naaHS zhu1#vp0zjr&WUILbk{Ss)AzY9**HZ4uvMj*bfQQqwr&|2#xUW=f^96F2OBomn2nr= z)VbU3PEAcc{P4rkZ-k4=X*>XG z)&~7vt55G-z3Jay_s;dJ*Je8D!qy;LJ^_4Lm181z5~s-SoI3oM2VQ=5=IF7iGgb6k zS=Jf!lPuMFRuqNstflgmu_>;vt$1kF_20I3%WV@^uaGHectAoYV9QntY!egzVf{P5 zdu;PRdFoSB-T8rZHq8KmY9OICiLx+4Et?=Vwt>VGnutg&(e=OHB%`gKr|n#8o#**2 zx7-p_nYi|IdV2c6fdgB%YzY`bEGP!Rc=ztzZ#=_jrMW3eOYBqS%HE`-AJ}-?-@N^y zTSTKIkh6_S0qAp~vNZMi?^pYteE#{T_V1qdMNv)^a|*f8$|LG+uriiTOV9yFfV-zf`oD@B%>y> zPaJ#s*Pi>_nX>Fwh0CRAwkps4!9bF%Wto~Un^Fo$FNi5qAXsL@-O40cn&ma;-0{KS z&GGb8Vw*d0+oTruiW;YKd!C#gFRn;xjRdVfCn@3TB9=k zOnE1XUoRAoDg zD3KmqIzvRMR3sos)_o4^*?0xYM2-vtcHLg*r=R)LyLV6iz1!aTzRC5{g0(L+7?|uN zfAfY1I;~`G=U>hgrPf)+u2&57GHE#ogVR}-EozeROVl^XZeb90(K1SP?sbP2`DoC? zpi>B_LV^)D=Jk5-)JaePKVPz)s%_krJ^odtzrOQn+F`t$Q`$vQ(QpP)HDnV7IlS;7hOb{f&VB^>`1C_2q zIW4mSHHMsw#NqE6-wvE5eamhIvfV<;7!$*{EqsB2jh zo-?3Gkn<3*U`MPHRh3m=@IQIzhktx*vt;yz^wx-qQOkbo=#!s&dFPW;M|z4{Sxb=c z*08P8J_efG3aO_RmGpw9WHp_c8fTIr8Nw4YTfv6B5v)sMrd+5jt65uB&brc*6efW$ zDrVOoPyWK5*!QK6erU^Ee(r_`l0I{dGOz%C>c)5IwEmk8vG&B4L=F zB%`416_;ZiKYskgi4(DC9cC()@JNjCw&C0CG7 zE!RufMAjK(VTErC=e=)u%3Q54E9IdbvME(M>G?`Xon}c&S!$fC%v8gz zs3+(YiI=W5vG3%m|MK$VG}idLtG0E4CX2$CEuVhq>U;LgPJQIa3sOo-lw~IzCk(|< zf-38-w89?|O;1n1^2#fryCS-drP|sWa^|4M8#ZiMzkYpaR$ok?6O4E;7z{g*XbDQG zz!(=g8Hef3L(O~nS_NUD*~mDfGR@XxJ$Lt}8-DfXcQ*=yOv57edS2iohoAkOou8k} zOsdjUXZ^CWuF7h8qBM*lcE&kJELcoHU90Q&Pi(kt#WlCAylO0~Pu5$R1T)Tbx<_Zv zO!qsV?;P8G;_#mSOt(%0*x6no8O^+zxWa>yMB9O(qMEFYPZ9mw$Np^m0r5j?Z>b2G zB``zL|FZSLSBkkENA{P3eIm)Rt6aha(3Lst6lU&XGpsRY33H5a)<+JWcp2w`YXf)f z(@#Gg$q>Q>UnuaMI(6#RS6}V*dZ9-$B;SE@G@8@045gTpL_1?G`&|(D|ENGmc?K}Wb!^Mu+aK1nRbQY3|BUF)rbom+vc@H5Sd!4GP zDAy-@GOkt6wG)*!QmRv?^DmzH?4-)?z504%`(v_J5bl?&KDh0HPdxY7;i|F;AOI;# zYe4c!n;wr*cRZ&f)VWkh0EURs0+^(=KF@xPz+HRSU3a|}e4p)`nwpxj)^6Fd<=l|T zTKnRQFD~C9zJ;Yeg0fmZb?WrG)ob2=(*t7`Qwfdr2U_L_`)B^!i(h_Ob}~INK4&@& zomfr_S9sgWgsh2%%df7De{|dXCni@Z$P!)&v#_s_jI{z`bBm!>5p71dbR z-P>y2bngegaNVt++WFX@lt%!UKuAZW5ADpX~kIAGE&z#$;7TRAZFD zkkON(d5txo4(XB@6I1Wv=(8YeMA zf8nrI#3V#Y8D_7pa093`v;#96V(GYMpoJ{R&*)@@rMf_WwsXC%|HNHyU4aThH6gTW zbQ1d2XLf$6Grfvh3sHHl)tj@fugdZlZn*!S-SjT7u+~Be2@p~k0FY2F zfdwicq{A7IFu~K9Rgh$*p;bA6%=!;ZT>Cxm+xU;4`Q#t(f9{|{tF}Ux-Vua1ERIdqu%Hl(Je8(;8 zHvi6!M|Mn~5o67oqr^JL-1ml+nC^96I(p!Jo-?_gt=KVBs#IuGTC(AXv+Gq`tyUPt4yP~?4ay?4ibO)4%X7%u%4n^} z#>Q}VR(4@?-+2>}P>YSliU{Ba5*@sLh%fvNalZBnUr|YpL9B%&=M7*IVFcUCu^TjX zf?j{i_~Z}XaL;DZM7KhwG-DUqf3W+p{kEMn8|YP}l~ROII(7> z(m%cBzQ4HzUErztqaWM5^RxS&MI)=&A(3po^3sv8;3bS&Li(B{Nt&j|j~|ctewZ-n zcDu1?HoSl05(ZJuODR{bTp4-=;#SM^&tnX;bjGF2;VZ-6igeRB+e>ogFK$hkm_Q8e z;3Sn2Y)oQ3rSk0)>wn^b`|n=4z6K-=WYQ{DB|Ws9+4J5yzSm2viQ$0e|cWPE1`u-C9BdU&0IG4 zujUV(n4P*UpVUIS8iQ?G*j!{y#s|i(S--7uqsV`E-&6CjXl1@vDeHxjmKb1Ky4)k^ z%$YN1zVel?gdn`CDwSyGT(8$_wORo}4Tf>4(W*r0s;X|k{q~I;HwMaCoOe(u%pS$) zXpwUOkY!n@X#{(S+i_we$rUb&!~kA_6+;U-01M-;5smj>bK}q5{;th7K@Ug(_S1uo z8f%Raa+R!~Tyva6RSxQTX1yoR9_;3OAKY@=&)@uDy@V4MwFDMU;8Ume{O1E-ef-ox zYwfyxf`m9e=r+=ND3>tU6ETAs9+X2=HFY4fzkBTIr#^f5r*41icVBZ$&H{A>b}8hK zZ@%l)nUkNI-Zz_(bH45ssLCEC`ov7d6vLx0kE zoq6>1zKU20k+A4{?}!tj+!DdK0gO^gHJi;wqp@Ynmes3Q6Or|9et!PcsZ*ObZw|{G zBagwQ_88AU|9qb3ffg}_cH&&p3LpzyxU_x$wshpy^@JZH^%DAvwtTr)QD zgLk}jjY!b%Nl8KP|I^8rerxB$UwHK;M`9u$bN#B{?F*S$a+aKjBVs1+g*Va{(hUX! z6h?xkYT^ri>Nj_P`6IiYWKxyFyynuCn^gXj+aJ8CHZC1k02`a61s~()$F|wXibREL!RB~ zbQbB`WeDxU;w1oK6;ntG7Nb((8*_7Wiwq{HQIaHK$t=zx6Y2GOwOXxSuV3MY;k|bW zvF8LV8N&IEwUyt0<9+Y|!N68fS*~TtDD6a^4urkRs~^2;+tal@r@99_gFZVaognA` z#?ANMp;iDE4GGVEVIQ42@K3+;$+{EQ)mM2I9mhqkv`51Vg!Vq709;t_414c=z0uIl zJL~F6R%v|o#1YJx*4p*oF}^N?lHNf2nCpZ4Ks2!xXWpCL-3IdUFOV}wAI_`oc#A%;EHh{APQ^8|= z14LoM_Li zskMx^8`H5L+kF3uiaJSOX^~q#?FRq!@&A$PRBG8Tjjx)k#52!4^X=dM z?Te@i!|UJsz292~hLLdIuQU{D*{rLY*1vWArj`p6WWtk|o?6JF8MO-IS4dG})5?`@ zP_$&)cLs`nX7i03oHGfUuGW>9SNOY+ee@)A%ZWm9p}8p%-8HFqgPJN5CksK$36mlr znY{7df}}VlMO~-1-C5CSmE~Z7fg@kB`;jL;_8;HzQ`Z*IwTW!bUN@fq@a+$Lb^qsC zWi8dPz20V(l^$uLdhqqi_7hh_(g#?eK083O-dD)96b?E|4bMr(<06|Wsv;G-k;3~W zJe%Um-&bCFCGaupGy%}#UtM_D^>|`N8$Kt^`4WJhrzcx29uz z`g0vu8A%6S=egdQwUG-a4c@ik#$USc{r_gmyFNH}-3lArH|`x@_b=~!->2XE^V`SPq`k_Q zl@rWbGC?qL<*1QA-8uE*;0!FhWLU0yJg{PY50%u4OH+lsbGj4G7L|{QI;C#t`&;04%H1Z9P}zp>_Lx8C;yS8W-ju*v}zl_Bdh z_y+Xq=J?Ot_s+Z4tk=e}AOmN-Q$lK;RzjR2^T?6iU^eU_2oCRFe^WcA(tR;)SyI#*A@s^Es6v?I>$e^|M?!5ISz4+{YN10S)V9x@IrHqZ&xYJrCAzArUaxoJ#ED+77x2@sxgX=3 zmsBU6PG{Y^b+uY8)~uzJZ#u*9f*2rA$_eK!H_|Cve)0I8wa?~1cKf@o*IA%}t%wM4 zuIS|1M-D&x@dHnvP2M5TfVsRu|p;Au0Z(uAq-aT&W9pf%0nf~x_|3;Z^W^N2Y;sZ>B!-EJ znMsfk!YnE361uy!)~#0Sy6dj1*XvSBq2%oB?D6BrH*ek?dW*tH-KFkKCC2XEyTeRK zY+J0V>P=@Dq@?psIG^goIA=)|shFzFpFH!}y*F)Jo35`ZSV9Hzz--a^PftJm>65$n zx}F$oW&^Soja3axNC6ap0s|+685e0mY}v9C!l^V%d#O=2y(U?Kfvs{uU=7l&5vI8W zSiniBHny~`8cT9=Z3vJQrm|9M5NXSErW~-ZF+&Io4ePch6KyTqz5Y0>vM}`x>t38{ zzjFMg+SJUg@BazX3Jf?D-BnE7;s5Z%3u{CoC|Dei)X$g!|uU@2Tz_n8Llbp`3nWU zPN&o9bRK^A;m|Z6IjaNn+OimJW$RNAq#vM=0-wzm2R5Num(mt?fe+j_dNNL zr%oMnwzNX5b$PpIr%mM<)!3OP9Q;uMP+^fw{U6xSgDf^qN+DZx!Q0l7YDJ+FM)_cg<92_jc>=)jhmU!6UE`^4Is6D%28RjVh) zPxNO?DpNTw5~2F9?E&Ace4%>GgU+xg9|&8ITbNZ4G>p5qk_-g)j)fpetYwyE!igm;N6CfcR$VviOLsX@ivmGZO00&4yvsGWk$*gl$FbVC+3rne| zj&p|x?c;Epl0;P&WFSaNkq4;MS&&c+==?B>!>;c=Ye+|6DOjK|W+3${saItU;RVPi z5D;RvJ@42{tvr$Uj+wQP#8{IyA)tf|;}%n8Pk^koR~jH6$K8mi*XtcRbm-v0gJEl{ z_x||t<4UPcrxSTDFEz59D1GYGsV!T!3{xVUr-?99<6wxiFy!eGI}28E?wsz@(q?_L z{@wG5L0baMfPe$8&RU*81V;<|@-&IU`yQ8VpoIl+Gyyir`mCKdfF^H^k(`)8HQt&y zKG*ro-luCfN@Xe~q?8g2SPPXra%}g3qAinDYgu?}oYh)-$9-F^OIu?i zg@sp8fF;*223`;gv9L55#LVpZD#}0$`++>;Pk<+zehWe=tqxZ61cYV~$GjmO zWA8!iBPq9MQgT2zQnhbMT47I;By6j%etveg04pc8mayQ;NaXV{UpTnyZR@w*J~mdu z2|$5Ty}&PK;3<*&`rSW&^@Se0F{O-QNI|CZsnklT%G|Z)ngvisko0bUIcL}ll8(J6 z2qB08>*4)6-6)*PNV0?wI9YbI*2aTz#ZhzyMe^QfS+;iV+LbF;5)l(lojO$%#m0>r z<2XYIs4j6}$7jx*!O%XvaE0RBi^dQqXYdkn>0Y#|82rWS4ypYzhHT0s}!-CeRG|`!7GX^W>q1&ZVV}uZTGJ!g}MJoAk-sR%{X>0RkzA9lhfa zhqEc;IBw5kyxYp;6GkC~@W|gdst%LX~a!O3}{D|RUre(dEvha3)cRDP<@?a&z*49;xB$JLc2|=VtSZlo!g~F2u zUm@nOoPs>=U%z=(V=PfxGnszBVnbRAMw+Has?JAuJ@L;U``BZ1$EOk$848U-hAEBz zd3xV3|Ia`C#EF+@m2V=Y%9onFwJiu{7LK>5l> z3u9R{nho9eg>z^oZmyS!R0)}9+19JBUYpk(P=b|pN~o_MdDTORa7ewz$fVLVtwVSK z3=eqkXS!|A{>tQS33?Jxpi`$#&CJYr?}d_8RZUM%A3S)lD2lLz=rVAHND}RK8$(T8 zAy5*F5QBijo(q%3Js4W+Fxnb>OCoX=Dl*H|Fq(PVpYJ?2IOT*E(6aI%``u$J=Cf=~ znOlL=sZ)tu(RSlDeKZ|Ba`XTokkhQHr1c-){{7d=>{MDfuUzS&CWZaIALD_vM7&ULD#a?WvOH3_Ly zDLC=I=oe!XtwQ_Rs;@oSPJhtQ&8|Lae>cKp|IoVo+4zg#6vNI6gNl8g9?YgRKE0JZjS}oN{&5+7d2bR4G*3a^wCDaF3Zv7iK-PZv63k$rH zFP+-^rOqLghPBoMuas&l@3nN+tgbcQwsK=g3Q;%!4HRYV!x^-)$=8e@1W6V=eJ+*udLql|3_5AeF zBfftN)nF~OTm|)>>u!B@-(v%B$4R$^w~ACjfE?81|M|ifA9(vuXeJA843KE?ps~PTlI!zfB5u?qo+?!xBFARCss5E&Iq7Rs^|@*l%_IBrLO5jryVY< z`N4fFuKn%1zdMJ|D?bCSIWddsclLg@DoU?h#)(U$GnQ(y1D9L8W6kDq04xe;GNq?{ z_3YfSZjJN4)p>pe=HHD*BhT{yJuNwAGt68buVgXXc_hNA)oP32DV!x@3zR44B2l4p zWceR)jMOdWM!IDd*Hm` zdS0%|>GWKp^sE^)2G!rY@$G;6rnlA^#uQp)D>!!=zy8c4&vZ^@rSIk{DY$5+u2YVs z$&@c{)Qun7cn81$K}e_Y)kCiycYTODOer#nE6*?@sW^tn#+T4A;$>i{s4dQg(n3R3 z2&fj-9V2P`qCY9t`IqnFn9AFR&brcn;m}KS03@7qV6nZi@@*3vCcGGMB|xII5Xuv1 zz^Tms?Y>99Ftd+=Dlw|oV2=&DwsqxItLrs#fCC&7hnA#Y-2RSVxc@yjrsKL-2+xlF zSZjj4ADlRojWw%&@5X8V_qTobKimGkHM-WON(Z~yl-NigM)(>Vix$^!51nZXCaBI!d#(MqqC}Y8R!naW{wdvg<&dMaqiCr zEnk#l48M8U)Zz~ee``64m82b663?|yJUe$3fDj52b;kE>x^2t&WLMgRWLmK&7|#GT zDLq+s{^Rpsd~*KS8DAiS_daDL*1>zQ135@AJUmZ$e8%wX_^{_)>@{x93E5~cGB>@5VLv`Ca=zdc|1 zeK*_<>lw@h3GA3V^wpUoiPl-cB(=ZtItUjX)$#RGNi1G3#?8*XTq$KJLq^*eep^gg z;=au|t{xYJFGo>n!u`@qnj-u3zTH*jNx%_c@!*>4Hm+J@6ltXr4+pNiBO$D{<0AiZ z@Az*&@~1VGoTN%I0g!3pq!=g+6qSTZQY8o#RyzFPb@yy(tm?Dvx03l@ciWn4-?sg( z|Nevj@c-KO-i>IKnJD4qV1NoRhB||P`SfRYc1|?Jy=zxzk17iU;X0Ioo;?z zmZya)$CVYFPglO7(~kd(R{!=#{?jM!|IszP(rN%?;6f7zJ1am^NTe{{CXWC8JAd$> z&(5bLueoj2Seo@^B}ld5q?QWMj%3n=;V)6~zyH}scbd~~Rbxi`an=MaO7xoAwEL@i zZnMh&w{36B4CZQS0|4VOJNKtYUg~+5=BgYNnz`pIeT7Xg$67&*FRlcgiB}cuWHEPb zh@b*R`*7eCu`QgX>jV(G3Bv&p5C&t+@?FDcGnMDLnCaEC)^yqX`0gjBB*S3>DZHP| z8Xvm<+t+l_A=61Q&bpYMCkZ3KTEaLx-|JT;G%JtD5P)npB_OYXEXeaTIc%-Y^6 znF~!ndFMOVHCN7SjC&}?8N%mZc=AlIU8~i~q97nudRcd`EpZ8Qk=+FPkaoKr_g%!q zI&jyvTCJ+8LV+)u8i1lG>h*eHJz0*@C&L8YDX;R$Jlv;_zVw$f`=KEXBT*>K_paFb z3)|ja*XcmI#F}QFbEX{_iL#ZE6+5kCy0IR)idY)iv0eJw+ z+YAF=OOX%+o;`W=|9$q0|M1CA9ILyNEgUK4Y`4Fu)EoP9+=+r*-Y!|;=WcrI2R7Wn zKmzWU1`eO^9QxdzXJ@_9N#Y8tg=FSM2j57(j?nsCxL{^x=H$tfyLRnb_=&UQM@p%g znVGUIXJ%$XK_e#R-uq^=dGzSf<$EK@xJq#?O>MsrS$dSrCtull&wbZ!Gz=vZtrLr% zz4f72=FWWX%&SIPPHDc=QA*3S?zE6X&6WeCKsclsQUL5jwU9}GeN~l;gpetWhh>#W zCD9v`8Q?q~n?3r6hn{-)=&nIoO|m{oy~OhxRe$iB&D-i%rJiP$J6O&i*>|YXsQ=XU z_l$XO1@azoU7rB{=!M4*QGr%&t(PRU&{bt9QD7cv`M1C@gbAmO%MouK7arT_|Sz*7`UXC_kjwW zNJ1+6Ko@R*f9koD2OmAQ_r>`Wv%YjBkm`Al#(eQ3+u!>Ao9^7+T0=mG|Tz%%L|w5z%l{WYFthrYYD+#dgEkqPWt7aM^2K?)@Uk3`HbEQcGe74IwGr# zO~3jC{sLKD|9&(32r?9GMD3Kx>9*9iLD+!M^E(6ey^ zdiJOYuYU*u=&wYThkcYK$9+iF>kLu&-TM37?ln`Z87tw2$#Mt9-$(5<&v)9*UR0p% zY^%{Z=$44z1c6HTvd!zsr}t!Ew7MpP+?ZoEi>-b?^1_^W-vU`*o|Ak=>j8%l*Dpx* zcc@yv_@e5m$oM#8#Or&~u6@(l`l7CS)&jPChjuK-8QWDAjPZ!K8GxSH*1ObW3i5v^ zak^bvSI~Ie<&|#Pkhj}XNP3i4p`*5iK$h)rZ%_~~yZz^}Gf$uOgQlK~1Z8NTzejT? z?*vobh|8`P)mDVg#;Jj8s5wSb`{ojcmMO?@D=M>Y+2O(Au?LIyw(EWG_ie>0=QG8P z87C`#xJ*Jq0`ncoP1zqp&O0rCN(~@=HiyF=YN%WL0`;=W%mDIEW8ih{Q(cFJ8Z>2P zi@a-xfoE+rB3sS+wQdV3!R^isRj2;QAJuv^QeFP@TiZ)i2>sTDES0a`Tv3Z*n|%38 z2s06^V7%ddZ0Tb0kOC97fkFS~utKeENo^3}$ii=;wE8DQcF;ojda`?E>BB^BN5e(#Zd0DN&K?wtCE4rtwi zb5~+IO2Y>1WqB|6G)KHN{qkJPo8;4m1dpy|AN|>=yRth2SRDl@MK^kNy#3FqXrfME zCsqAw!NfQYy_xr!l|Q}C)8DITztT*P>`nSWZXw*wGuU_4+P4sevRtaaxgnQ`> zK5BdP{Al8q2q!FEHFw#@){K=?GvMu-FK?lVG(QPAD(>1GKKy%)a<`gfHIouBhm$pt zc_S1`q(@=rCD%QO67+is5~cE70kWw;Y|2ov0y<%4f2f6Ma3P#6^TMHPMe0I$H1(U4 z!f$Fs@$^<70k$!*ovy6o2hWbWl<}p~&+nFL+%h8ELO{_R0*+5p>>OHO2$0h@vbvm6 z!FiM-d@=r?6Yp}WtH(e_on6Y1^B7Di37U~Z&%G}Kx@g#&?Anb3z58sV!2DgteuKpY5zG|a|NyZmz+8%=q2E!;OWEL<`o z-TO&eHEwsoOVFn*kf5D)w1#AYG#61W*q;qL2o^5SCn==FDq~yV;L6HMI-Q;YI?zti zp&GwG`!}bY(&O}!Z&=~*KnmQ)Fh!?02g;R8MThg)m9f9@#Lm51q@iT_c7Ppl$1-TQ z`~Av}$W`|%q?JLn9qK2j{v8fwCmB#{2Z+lm=@3+bbw4H)t~kjRexZ7flP}Yddy{g6 z#;5>3*OG)dzR?obQ%`1f(IoioOvgpA3EzYYTc$J>GP>38CKo;{SR4LtBR_ah`)AVJ z?RW_v=QSE-??uEjmm&zu^$ZAuS5n@}uHno-)8nH2cQh#rWU3M2#^T`oy||Po~XTLQDQ0~ znE$mPtl@f6BsbuNhPz5x{znDYujPV70rF~1_B6?hphHGlW(d`ABuk*5~JBs4gRNa1J>&WyjO zAZ`vIlzdzQW;0j*t@`|94{hl<_+YYGz1ewJF>UVO3}y8CPhXC`uRvIsw6MEgjFat2yNBtC{&_vuB29hF zdmxM1IXA_LSy(TM@$zF*^NH^5{(*L&Y9uqa6&)7Ux4IfI^=CzOU3j%PJ+yvDG!_0h zd*TAW6#0Qf@Vl#$?K)p%rA5Fc4#7CN6DKu%%FN8WQMF%x{pF@t{H1+w$__o+d+sZh zokCt%7QPPUvqW5p6usdQf(`9Wq^U7R48I13lNYTGkjT*!sm$2NyYY2C%uZA{U2`=k z)V8$owasb_A@?9w`rJ2>an}UtC+hX_#p(NEVycp@0!a^PorZW;=9sSH*#yv)6}T^^ zUl%t%Qe3_0-!IOL;o6aliX<4XdI#<})l>ZbCWWy#Ocwg`>$2)LGOG|}<155H%2;0E z#XhTT`c9KI%g?&Fk#b00SS4(6dg{)tF@Jmw{}DAaJ9E$nh6zg_<^{u9Je27aKbt42 zu!t19WtU!X%;?yBaP?!Y@3j(!5}95?X{wWB@MW!xq=bTySL20IR0D@oQ7zk!Y8XX? zB@Ozp&NmT{04vMzY27v&Fm6m!Luoovd{X-u;_B$6UP$;tP|kI+x?yE~s(h9G zG+QcY_l!TiK?G7l+_=+u`k*Zc?-N`kX9@=@dk7%{D9ycx5osUc4C4n#nk-BIaXRGO zc%!;h#$j;U7)JRDC*kdZHU&ojL4^SMX=vo}ymF~djbokpkOF5oLt@1Q*pTqfDkYJ9 zzQQBk-;FR8z00WVu3wOVC-i+-Vc+-ljbPDE%>emx!|E)76vA_l8I=l{j1yGU&;9Efg6BGF>8+g*R2A(7HEde*+r>Bk8 zb-C7ne>+?jOJeQ5SKs8Cc#pTa80768er~!AIcU9VE!|u?eh|4=?v{CPW|F9dOUH_M zfs_w|Ze}Lh+Sqigx3|mztp9?EHZI-czXJakGyZ?sf8McKhvO+E +
+ +
+
+ +
+
+
+
+ + diff --git a/resources/src/mediawiki/bookletlayout/option4/search.png b/resources/src/mediawiki/bookletlayout/option4/search.png new file mode 100644 index 0000000000000000000000000000000000000000..5dca7fa3f5e15fd035184f8dd4086ea5d99a0404 GIT binary patch literal 7453 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 literal 0 HcmV?d00001 diff --git a/resources/src/mediawiki/bookletlayout/option4/website.png b/resources/src/mediawiki/bookletlayout/option4/website.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1914fba62505289e1acd21d642de810fbe6d63 GIT binary patch literal 7446 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
T*q)_YTUxw#qy}YnQUZ)P_jcH<(B-d zw)+^ac3c|53ZXujEWuWeUxf(ltT*5U4pxm-c#u@(@OA&j1TtnVZEP zvPbJg%wiwKSm@T8n^7eR*PHEc86EKBqoz4bNmykx0p#};NNtVSH5kli3w{rtl+IBm zESmC%`^HhrH&^JaD(XP<;GQUqNGsJ!5xSZ0gn z-K$4Wp9e(VcU}IZ=f0Ur9x?eLZc~pjF=CqR2yXG?!HsfVgx*r|Y(;GNg#SCE*YGc# zk2_z{*#XD*(1IAax^bHlXR~J&SPwkbCH<^6&h9(z*E;k!b!Qu+^N*81e705pr#!?& zLh#)LXWL+Ec z8k%irT(rZ<7N_^`C4E}htc=!ehP^Zx**tsc=D)saOYoz5%D_MSCZF(?%~cpc_d%_X ze1bYMM+%|-z~h7-f+2zfaGl8Y0GG!qaFBfS%}@YLj!8zGK53XG62kxU7HN_(L4?Zq z<13OD;aJ7PG3xpU$D%oYCw1?=YMhDJvNn7;FjrNTU_PIzpPD6d)O!c$MQ4U@DJ+OHgkO(gSTb z8L5P%s;OOSxwASxmt?%6ur7Ig{uRDSrHUkX1ie@INdymFit(o%zys^RB|_we73-R; z;-3b!v8V)A-i<8rP96e&s{M(D?7zUtd|g>%;02)NXMK6b6?9Tw#H4+H2O&iZza)E%b%jz#cfo$uNv6hWSlUCm6suXou zxiVi4NrJCwtWW3h-cO^ON8&u;juU<{ep|5nlE*czelDL_=Ytpv7s#pc9^D#ApEJLS z&Iws8Gvc|K@?3Hcc#=|*^JsUVv{&{M(B3a1$J$G# z3?uPdtd6Ce|IujInWZ-$X0@7zXICEG@IlvfW^3Tj{s%bMhi_sQcyDbbDts`VFXKK( zqoO0*{{k(|7!d~<9c8o}8s-1WP0ix#L%%0rKu%ugY4n>xzrU8_x7@0~@8riF0Znh0 zcQ&ZwYsb7j!mDozWAra5kTh6WFyK~zgfKmsySgTRFO>sf&?10M5|xAmj!yaw;B54n z0s|)|_e-K;TJySUJ>mK8sZ+}5h3BT7|9gQOR)u`cZsjcH;yTVymUbn44}7#ZFK(RZ z{7@j{>ec1uXIwqXBuaf`cQGJM}7qy0xtL#>80c|KQLQ z>4X&f^LQhG4a0}x`k)T82B*|mc_IBOht$joIqnfx-SLWf`A=m01q~$??*X-2Je`c~ z+UzO7KE2A7$HRyW6>yi%+JyaVc@<9=&pN}3;H7R&8!Cem8$0{vlkKzZe%QRQc|#a} zgsc4THpkBmf(~_R>1~8+Ft_hx@n0j`w6};3%*(-~iAb?yuke+%Izzv!>CaWnx~Bfy{GhZX)h`LqwA%u@eKsjYm6m^7A+8I=xC4}eK~IEw;|$&cm}_Zv$~ zc`KsVBddgxdOdnR#U8{v5qmHHTped9Ro`dM&FBdonB>p5ghPyYz^AkapX|cm`M+9z zm9X=gKJ-qn`{`x0v<>pad}zVU&e>K!M*2nVa&ld9>yMN7s9Zk0N!Wi#b{e|^7z0ne z?HCJXCwgCVuvbv|1weS3JXUdRi$nw`(f-N?knPv47_Cckf;UoO!6H)9y5^^NB}{EhL-y6)< zoSd3{*%8sGSl8r}dDd*x>%|^EvdhT)}|cZr$57Lg|C}5w?+j zyQ=#|N}cv~Yo~%(um~-As>ap9@w4Gl8X^sRNozV?Ci058e@jn&=Yh}qd^eu(QdJYi z&~-jh&t_2L4ZCD)pMAr&n3?DHCj>)l+tEDyyPqoVE`HSZ*NMOqiOs9zK&MXGD?`cm zfM)y5LT%NWO?b^ld(F+p($TZTrk{#F*UjcDqML&H*5cqC+09e`$?O&fyUl9t^ZnFq zzBx#4`C?buS{oV8crK)g;6CO$ zx+!Vdu1;7V0nfQfmR6>^8QRT%b~k#!&e z`6BZ|dS(EBBc93vkS(vZUm_e~WE#WG$AjEzc?N{_^eH@>4Fp3L4_4gRXg4|cxgeOv zTh$wzwy6|`8{Z)DJPt)nmveS3E&N?kKdNabE%}umgAe?bkr4}d>))kffT%D9a98bY zS=-=n*kA{L7hO6e?#K>r`p@zZC$DgW?}&;rV3aF*&dtA&XZ2ygPLKqmjGz!%Se%Kr z;iQ^;>vHo7DV7%~7hYMQ?8dRA66AUZI5PG~Pl;#OBC&s{w`1t{&$YFaBO_ydh~c_{ zQT$J#M#G|S<{u$EXh^U@M>`E*BCS0SmV%K7m?4-|S++uyF3q~sow#c#6Q zoXIPeJo=NF0=+G7V#dHup-l5SGuCgaKX}`}6%MR;axgKI_rsXTM zo%g6@wDp`AAi8`6gOfD$wMj@Hf!O=9nAf7xvAjQAg^O4O7?tkud7K>`wFc#a&Phl^ zclo>RMnZu!Id8qe44J71GI%bupf{WQnw9^ebs+SNAjL1ePi6=XeOD;+Cfu9zPo#du z76MSV0+4pbL{1bZb3>!her7z-BA2bYRLv(7WJZ4If=~EGKwM^FTG1CiQPVY~p>i0aCEs{V#fv;9L>$oz z8Ul?`C-FK8#@vy20Kw(S3^Y{psO7qCa9zy)^6Ehg|G`yqc(Va_#3JJJ?$!MQle@}w zqvLvWqA=#Vk>hVKcW<8kL}ldSVC;*iVC(j#Cb`VpKUD7DIIga)rb@oWX>q3FhRc?J zmZ>p-QLkIMZxZIBD!ZxTKn2lB&;=e{xH!h%tSI3ZUa>3z1apC2_H1C*u$J?B1WQ0S zKm1~7iGoT7_ClJ3L)AvrX#}%seaOuvx~IY3_P%H_nRw7rN| zUduKxLQ^nC5W^%d&Y>IUQf^z=R;GMZykb6Eaj`Sw~z^$Ai_ztH`bBE9&|Zqyt8 z+Oso8*XdTcw$P}%HsI3De+ndJ!(II%vrMlR5#KilO!9d;XA$>o_wQDeDMC7~7>TKR z*EZ?FHWEALs(N8er*z(ff&AKYbtX$M(N=pzj-hD?kO-f64Bg6~exkNZocVxQ!M`$3 z_%uthoEd9CAYFBaUxuRtVT8*oN)l!OcU{nLl3H~ ze8HDaUj#}lF%!91U9RzzO|qI6(0Vu+tJKbZihUzbrX;I01YC;iRdz=T;If$)x zLej{*cMY%Pa|y2~uHfrYGHD`{o(VqawCm#&uLjs9tZ8tdG^WNbrZ1vJSdx{}tW@OR z35$sIOE}R(Pd2hxVCU!sEih@7xnKZ-*oS7s`ZS}#&%QE$}xCYpRomN3w6ECS}v5E0idPMJLC!}HSKZ_ z2ihZPVT*&|aoPbn!lsO?l1IBP@twdsY2YRrS_ts}-yI{KUvT5*OOF$M|AhSCiJ~O0 KE>|OK7V .oo-ui-fieldLayout-body { + /* Together with 'display: table' above, and FieldLayout styles, this aligns the text */ + /* vertically to the middle. Don't try this at home, kids. */ + display: table-row; +} + +.mw-foreignStructuredUpload-bookletLayout-ownwork { + /* @embed */ + background-image: url(bookletlayout/option2/ownwork.png); + background-position: left center; + padding-left: 4.5em; +} + +.mw-foreignStructuredUpload-bookletLayout-noderiv { + /* @embed */ + background-image: url(bookletlayout/option2/noderiv.png); + background-position: right center; + padding-right: 4.5em; +} + +.mw-foreignStructuredUpload-bookletLayout-useful { + /* @embed */ + background-image: url(bookletlayout/option2/useful.png); + background-position: left center; + padding-left: 4.5em; +} + +.mw-foreignStructuredUpload-bookletLayout-ccbysa { + /* @embed */ + background-image: url(bookletlayout/option2/ccbysa.png); + background-position: right center; + padding-right: 4.5em; +} + +/* Option 3 */ + +.mw-foreignStructuredUpload-bookletLayout-question .oo-ui-radioOptionWidget { + display: inline-block; + margin-right: 2em; +} + +.mw-foreignStructuredUpload-bookletLayout-checkbox.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label { + /* No unreadable greys, please. This is the lightest WCAG AA compliant grey. */ + color: #707070; +} + +/* Option 4 */ + +.mw-foreignStructuredUpload-bookletLayout-guide { + position: relative; + height: 315px; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good, +.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad { + display: table; + width: 150px; + height: 140px; + position: absolute; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good span, +.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad span { + display: table-cell; + vertical-align: middle; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good { + top: 0; + left: 0; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad { + bottom: 0; + right: 0; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-image { + position: absolute; + width: 200px; + height: 122px; + background-size: 200px; + background-repeat: no-repeat; + border: 1px solid #ccc; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-image-camera { + /* @embed */ + background-image: url(bookletlayout/option4/camera.png); + top: 0; + right: 80px; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-image-graphics { + /* @embed */ + background-image: url(bookletlayout/option4/graphics.png); + top: 50px; + right: 0; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-image-website { + /* @embed */ + background-image: url(bookletlayout/option4/website.png); + left: 0; + bottom: 50px; +} + +.mw-foreignStructuredUpload-bookletLayout-guide-image-search { + /* @embed */ + background-image: url(bookletlayout/option4/search.png); + left: 80px; + bottom: 0; +} + +.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.mw-foreignStructuredUpload-bookletLayout-guide-checkbox { + /* We're really tight on vertical space. */ + margin-bottom: 0; +} diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js index 859538615c..7ba73bf2f8 100644 --- a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js +++ b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js @@ -72,12 +72,45 @@ * @inheritdoc */ mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm = function () { + var + query = /[?&]uploadbucket=(\d)/.exec( location.search ), + isTestEnabled = !!mw.config.get( 'wgForeignUploadTestEnabled' ), + defaultBucket = mw.config.get( 'wgForeignUploadTestDefault' ) || 1, + userId = mw.config.get( 'wgUserId' ); + + if ( query && query[ 1 ] ) { + // Testing and debugging + this.shouldRecordBucket = false; + this.bucket = Number( query[ 1 ] ); + } else if ( !userId || !isTestEnabled ) { + // a) Anonymous user. This can actually happen, because our software sucks. + // b) Test is not enabled on this wiki. + // In either case, display the old interface and don't record bucket on uploads. + this.shouldRecordBucket = false; + this.bucket = defaultBucket; + } else { + // Regular logged in user on a wiki where the test is running + this.shouldRecordBucket = true; + this.bucket = ( userId % 4 ) + 1; // 1, 2, 3, 4 + } + + return this[ 'renderUploadForm' + this.bucket ](); + }; + + /** + * Test option 1, the original one. See T120867. + */ + mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm1 = function () { var fieldset, $ownWorkMessage, $notOwnWorkMessage, + onUploadFormChange, ownWorkMessage, notOwnWorkMessage, notOwnWorkLocal, validTargets = mw.config.get( 'wgForeignUploadTargets' ), target = this.target || validTargets[ 0 ] || 'local', layout = this; + // Temporary override to make my life easier during A/B test + target = 'shared'; + // foreign-structured-upload-form-label-own-work-message-local // foreign-structured-upload-form-label-own-work-message-shared ownWorkMessage = mw.message( 'foreign-structured-upload-form-label-own-work-message-' + target ); @@ -104,7 +137,13 @@ $( '

' ).html( notOwnWorkMessage.parse() ), $( '

' ).html( notOwnWorkLocal.parse() ) ); - $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' ).attr( 'target', '_blank' ); + $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' ) + .attr( 'target', '_blank' ) + .on( 'click', function ( e ) { + // Some stupid code is trying to prevent default on all clicks, which causes the links to + // not be openable, don't let it + e.stopPropagation(); + } ); this.selectFileWidget = new OO.ui.SelectFileWidget(); this.messageLabel = new OO.ui.LabelWidget( { @@ -133,23 +172,285 @@ ] ); this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } ); + onUploadFormChange = function () { + var file = this.selectFileWidget.getValue(), + ownWork = this.ownWorkCheckbox.isSelected(), + valid = !!file && ownWork; + this.emit( 'uploadValid', valid ); + }; + // Validation - this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) ); - this.ownWorkCheckbox.on( 'change', this.onUploadFormChange.bind( this ) ); + this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) ); + this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) ); return this.uploadForm; }; /** - * @inheritdoc + * Test option 2, idea A from T121021. See T120867. + */ + mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm2 = function () { + var fieldset, checkboxes, fields, onUploadFormChange; + + this.selectFileWidget = new OO.ui.SelectFileWidget(); + this.licenseCheckboxes = checkboxes = [ + new OO.ui.CheckboxInputWidget(), + new OO.ui.CheckboxInputWidget(), + new OO.ui.CheckboxInputWidget(), + new OO.ui.CheckboxInputWidget() + ]; + + fields = [ + new OO.ui.FieldLayout( this.selectFileWidget, { + align: 'top', + label: mw.msg( 'upload-form-label-select-file' ) + } ), + new OO.ui.FieldLayout( new OO.ui.LabelWidget( { + label: mw.message( 'foreign-structured-upload-form-2-label-intro' ).parseDom() + } ), { + align: 'top' + } ), + new OO.ui.FieldLayout( checkboxes[ 0 ], { + align: 'inline', + classes: [ + 'mw-foreignStructuredUpload-bookletLayout-withicon', + 'mw-foreignStructuredUpload-bookletLayout-ownwork' + ], + label: mw.message( 'foreign-structured-upload-form-2-label-ownwork' ).parseDom() + } ), + new OO.ui.FieldLayout( checkboxes[ 1 ], { + align: 'inline', + classes: [ + 'mw-foreignStructuredUpload-bookletLayout-withicon', + 'mw-foreignStructuredUpload-bookletLayout-noderiv' + ], + label: mw.message( 'foreign-structured-upload-form-2-label-noderiv' ).parseDom() + } ), + new OO.ui.FieldLayout( checkboxes[ 2 ], { + align: 'inline', + classes: [ + 'mw-foreignStructuredUpload-bookletLayout-withicon', + 'mw-foreignStructuredUpload-bookletLayout-useful' + ], + label: mw.message( 'foreign-structured-upload-form-2-label-useful' ).parseDom() + } ), + new OO.ui.FieldLayout( checkboxes[ 3 ], { + align: 'inline', + classes: [ + 'mw-foreignStructuredUpload-bookletLayout-withicon', + 'mw-foreignStructuredUpload-bookletLayout-ccbysa' + ], + label: mw.message( 'foreign-structured-upload-form-2-label-ccbysa' ).parseDom() + } ), + new OO.ui.FieldLayout( new OO.ui.LabelWidget( { + label: $() + .add( $( '

' ).msg( 'foreign-structured-upload-form-2-label-alternative' ) ) + .add( $( '

' ).msg( 'foreign-structured-upload-form-2-label-termsofuse' ) + .addClass( 'mw-foreignStructuredUpload-bookletLayout-license' ) ) + } ), { + align: 'top' + } ) + ]; + + fieldset = new OO.ui.FieldsetLayout( { items: fields } ); + this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } ); + + this.uploadForm.$element.find( 'a' ) + .attr( 'target', '_blank' ) + .on( 'click', function ( e ) { + // Some stupid code is trying to prevent default on all clicks, which causes the links to + // not be openable, don't let it + e.stopPropagation(); + } ); + + onUploadFormChange = function () { + var file = this.selectFileWidget.getValue(), + checks = checkboxes.every( function ( checkbox ) { + return checkbox.isSelected(); + } ), + valid = !!file && checks; + this.emit( 'uploadValid', valid ); + }; + + // Validation + this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) ); + checkboxes[ 0 ].on( 'change', onUploadFormChange.bind( this ) ); + checkboxes[ 1 ].on( 'change', onUploadFormChange.bind( this ) ); + checkboxes[ 2 ].on( 'change', onUploadFormChange.bind( this ) ); + checkboxes[ 3 ].on( 'change', onUploadFormChange.bind( this ) ); + + return this.uploadForm; + }; + + /** + * Test option 3, idea D from T121021. See T120867. + */ + mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm3 = function () { + var ownWorkCheckbox, fieldset, yesMsg, noMsg, selects, selectFields, + alternativeField, fields, onUploadFormChange; + + this.selectFileWidget = new OO.ui.SelectFileWidget(); + this.ownWorkCheckbox = ownWorkCheckbox = new OO.ui.CheckboxInputWidget(); + + yesMsg = mw.message( 'foreign-structured-upload-form-3-label-yes' ).text(); + noMsg = mw.message( 'foreign-structured-upload-form-3-label-no' ).text(); + selects = [ + new OO.ui.RadioSelectWidget( { + items: [ + new OO.ui.RadioOptionWidget( { data: false, label: yesMsg } ), + new OO.ui.RadioOptionWidget( { data: true, label: noMsg } ) + ] + } ), + new OO.ui.RadioSelectWidget( { + items: [ + new OO.ui.RadioOptionWidget( { data: true, label: yesMsg } ), + new OO.ui.RadioOptionWidget( { data: false, label: noMsg } ) + ] + } ), + new OO.ui.RadioSelectWidget( { + items: [ + new OO.ui.RadioOptionWidget( { data: false, label: yesMsg } ), + new OO.ui.RadioOptionWidget( { data: true, label: noMsg } ) + ] + } ) + ]; + + this.licenseSelectFields = selectFields = [ + new OO.ui.FieldLayout( selects[ 0 ], { + align: 'top', + classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ], + label: mw.message( 'foreign-structured-upload-form-3-label-question-website' ).parseDom() + } ), + new OO.ui.FieldLayout( selects[ 1 ], { + align: 'top', + classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ], + label: mw.message( 'foreign-structured-upload-form-3-label-question-ownwork' ).parseDom() + } ).toggle( false ), + new OO.ui.FieldLayout( selects[ 2 ], { + align: 'top', + classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ], + label: mw.message( 'foreign-structured-upload-form-3-label-question-noderiv' ).parseDom() + } ).toggle( false ) + ]; + + alternativeField = new OO.ui.FieldLayout( new OO.ui.LabelWidget( { + label: mw.message( 'foreign-structured-upload-form-3-label-alternative' ).parseDom() + } ), { + align: 'top' + } ).toggle( false ); + + // Choosing the right answer to each question shows the next question. + // Switching to wrong answer hides all subsequent questions. + selects.forEach( function ( select, i ) { + select.on( 'choose', function ( selectedOption ) { + var isRightAnswer = !!selectedOption.getData(); + alternativeField.toggle( !isRightAnswer ); + if ( i + 1 === selectFields.length ) { + // Last question + return; + } + if ( isRightAnswer ) { + selectFields[ i + 1 ].toggle( true ); + } else { + selectFields.slice( i + 1 ).forEach( function ( field ) { + field.fieldWidget.selectItem( null ); + field.toggle( false ); + } ); + } + } ); + } ); + + fields = [ + new OO.ui.FieldLayout( this.selectFileWidget, { + align: 'top', + label: mw.msg( 'upload-form-label-select-file' ) + } ), + selectFields[ 0 ], + selectFields[ 1 ], + selectFields[ 2 ], + alternativeField, + new OO.ui.FieldLayout( ownWorkCheckbox, { + classes: [ 'mw-foreignStructuredUpload-bookletLayout-checkbox' ], + align: 'inline', + label: mw.message( 'foreign-structured-upload-form-label-own-work-message-shared' ).parseDom() + } ) + ]; + + // Must be done late, after it's been associated with the FieldLayout + ownWorkCheckbox.setDisabled( true ); + + fieldset = new OO.ui.FieldsetLayout( { items: fields } ); + this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } ); + + this.uploadForm.$element.find( 'a' ) + .attr( 'target', '_blank' ) + .on( 'click', function ( e ) { + // Some stupid code is trying to prevent default on all clicks, which causes the links to + // not be openable, don't let it + e.stopPropagation(); + } ); + + onUploadFormChange = function () { + var file = this.selectFileWidget.getValue(), + checkbox = ownWorkCheckbox.isSelected(), + rightAnswers = selects.every( function ( select ) { + return select.getSelectedItem() && !!select.getSelectedItem().getData(); + } ), + valid = !!file && checkbox && rightAnswers; + ownWorkCheckbox.setDisabled( !rightAnswers ); + if ( !rightAnswers ) { + ownWorkCheckbox.setSelected( false ); + } + this.emit( 'uploadValid', valid ); + }; + + // Validation + this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) ); + this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) ); + selects[ 0 ].on( 'choose', onUploadFormChange.bind( this ) ); + selects[ 1 ].on( 'choose', onUploadFormChange.bind( this ) ); + selects[ 2 ].on( 'choose', onUploadFormChange.bind( this ) ); + + return this.uploadForm; + }; + + /** + * Test option 4, idea E from T121021. See T120867. */ - mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () { - var file = this.selectFileWidget.getValue(), - ownWork = this.ownWorkCheckbox.isSelected(), - valid = !!file && ownWork; - this.emit( 'uploadValid', valid ); + mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm4 = function () { + var fieldset, $guide; + this.renderUploadForm1(); + fieldset = this.uploadForm.getItems()[ 0 ]; + + $guide = mw.template.get( 'mediawiki.ForeignStructuredUpload.BookletLayout', 'guide.html' ).render(); + $guide.find( '.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good span' ) + .msg( 'foreign-structured-upload-form-4-label-good' ); + $guide.find( '.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad span' ) + .msg( 'foreign-structured-upload-form-4-label-bad' ); + + // Note the index, we insert after the SelectFileWidget field + fieldset.addItems( [ + new OO.ui.FieldLayout( new OO.ui.Widget( { + $content: $guide + } ), { + align: 'top' + } ) + ], 1 ); + + // Hook for custom styles + fieldset.getItems()[ 2 ].$element.addClass( 'mw-foreignStructuredUpload-bookletLayout-guide-checkbox' ); + + // Streamline: remove mention of local Special:Upload + fieldset.getItems()[ 3 ].$element.find( 'p' ).last().remove(); + + return this.uploadForm; }; + /** + * @inheritdoc + */ + mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () {}; + /** * @inheritdoc */ @@ -247,7 +548,23 @@ mw.ForeignStructuredUpload.BookletLayout.prototype.clear = function () { mw.ForeignStructuredUpload.BookletLayout.parent.prototype.clear.call( this ); - this.ownWorkCheckbox.setSelected( false ); + if ( this.ownWorkCheckbox ) { + this.ownWorkCheckbox.setSelected( false ); + } + if ( this.licenseCheckboxes ) { + this.licenseCheckboxes.forEach( function ( checkbox ) { + checkbox.setSelected( false ); + } ); + } + if ( this.licenseSelectFields ) { + this.licenseSelectFields.forEach( function ( field, i ) { + field.fieldWidget.selectItem( null ); + if ( i !== 0 ) { + field.toggle( false ); + } + } ); + } + this.categoriesWidget.setItemsFromData( [] ); this.dateWidget.setValue( '' ).setValidityFlag( true ); }; diff --git a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js index 740144502c..47f438863f 100644 --- a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js +++ b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js @@ -186,6 +186,10 @@ this.filenameWidget.setValue( file.name ); this.setPage( 'info' ); + if ( this.shouldRecordBucket ) { + this.upload.bucket = this.bucket; + } + this.upload.setFile( file ); // Explicitly set the filename so that the old filename isn't used in case of retry this.upload.setFilenameFromFile(); diff --git a/resources/src/mediawiki/mediawiki.Upload.js b/resources/src/mediawiki/mediawiki.Upload.js index 4f8789de7a..d80b4ebcc7 100644 --- a/resources/src/mediawiki/mediawiki.Upload.js +++ b/resources/src/mediawiki/mediawiki.Upload.js @@ -321,6 +321,7 @@ upload.setState( Upload.State.UPLOADING ); return finishStash( { + bucket: upload.bucket, // Automatically ignored if undefined watchlist: ( upload.getWatchlist() ) ? 1 : undefined, comment: upload.getComment(), filename: upload.getFilename(), -- 2.20.1