NinjaFirewall (WP Edition) - Version 4.1

Version Description

  • Added a new feature that will alert you by email if there were an important security update available for your themes, plugins or WordPress. It is enabled by default and can be found in the "Event Notifications > Security updates > Send me an alert whenever an important security update is available for a plugin, theme or WordPress".
  • Fixed an issue with the "Block user accounts creation" policy: when using the WordPress "Lost your password" link, some users were wrongly blocked.
  • On old PHP installations (<5.4.8), it is now possible to update the security rules: NinjaFirewall will not verify their digital signature anymore because of the missing OPENSSL_ALGO_SHA256 algo required by the openssl_verify function.
  • Fixed "Date Range Processed" wrong timezone in the daily report.
  • The contextual help was reformatted and is now easier to read.
  • Added a dismissible welcome banner to the "Dashboard" page to explain how to use the contextual help.
  • Many small fixes and adjustments.
  • WP+ Edition (Premium): Updated IPv4/IPv6/ASN GeoIP databases.
Download this release

Release Info

Developer nintechnet
Plugin Icon 128x128 NinjaFirewall (WP Edition)
Version 4.1
Comparing to
See all releases

Code changes from version 4.0.4 to 4.1

images/ns_integration.png CHANGED
Binary file
images/welcome.png ADDED
Binary file
languages/ninjafirewall-fr_FR.mo CHANGED
Binary file
languages/ninjafirewall-fr_FR.po CHANGED
@@ -4,8 +4,8 @@ msgid ""
4
  msgstr ""
5
  "Project-Id-Version: Stable (latest release)\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ninjafirewall\n"
7
- "POT-Creation-Date: 2019-09-20 17:35+0700\n"
8
- "PO-Revision-Date: 2019-09-20 17:37+0700\n"
9
  "Last-Translator: NinTechNet <contact@nintechnet.com>\n"
10
  "Language-Team: NinTechNet <nintechnet.com>\n"
11
  "Language: fr_FR\n"
@@ -16,7 +16,7 @@ msgstr ""
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "Plural-Forms: nplurals=2; plural=(n > 1);\n"
18
 
19
- #: lib/anti_malware.php:24 ninjafirewall.php:756
20
  msgid "Anti-Malware"
21
  msgstr "Anti-Malware"
22
 
@@ -92,7 +92,7 @@ msgstr "Oops! Le mode Full WAF n'est pas encore activé."
92
  msgid "NinjaFirewall (WP Edition)"
93
  msgstr "NinjaFirewall (WP Edition)"
94
 
95
- #: lib/dashboard.php:120 ninjafirewall.php:734
96
  msgid "Dashboard"
97
  msgstr "Tableau de Bord"
98
 
@@ -104,11 +104,34 @@ msgstr "Statistiques"
104
  msgid "About..."
105
  msgstr "À Propos..."
106
 
107
- #: lib/dashboard.php:130 lib/help.php:36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  msgid "Firewall Dashboard"
109
  msgstr "Tableau de Bord du Pare-feu"
110
 
111
- #: lib/dashboard.php:139
112
  msgid ""
113
  "It seems that you may have another instance of NinjaFirewall running in a "
114
  "parent directory. Make sure to follow these instructions:"
@@ -116,7 +139,7 @@ msgstr ""
116
  "Il semble qu'une autre instance de NinjaFirewall est installée dans un "
117
  "répertoire parent. Assurez-vous de suivre ces instructions:"
118
 
119
- #: lib/dashboard.php:141
120
  msgid ""
121
  "Temporarily disable the firewall in the parent folder by renaming its PHP "
122
  "INI or .htaccess file."
@@ -124,11 +147,11 @@ msgstr ""
124
  "Désactivez temporairement le pare-feu dans le répertoire parent en renommant "
125
  "son fichier PHP INI ou .htaccess."
126
 
127
- #: lib/dashboard.php:143
128
  msgid "Install NinjaFirewall on this site in Full WAF mode."
129
  msgstr "Installez NinjaFirewall sur ce site, en mode Full WAF."
130
 
131
- #: lib/dashboard.php:145
132
  msgid ""
133
  "Restore the PHP INI or .htaccess in the parent folder to re-enable the "
134
  "firewall."
@@ -136,34 +159,34 @@ msgstr ""
136
  "Restaurez le fichier PHP INI ou .htaccess dans le dossier parent pour "
137
  "réactiver le pare-feu."
138
 
139
- #: lib/dashboard.php:151
140
  msgid "Unknown error"
141
  msgstr "Erreur inconnue"
142
 
143
- #: lib/dashboard.php:155 lib/dashboard.php:163
144
  msgid "Firewall"
145
  msgstr "Pare-feu"
146
 
147
- #: lib/dashboard.php:164 lib/dashboard.php:300 lib/firewall_options.php:64
148
  #: lib/login_protection.php:203 lib/logs_live_log.php:101
149
- #: lib/monitoring_file_guard.php:70 lib/security_rules_update.php:137
150
  msgid "Enabled"
151
  msgstr "Activé"
152
 
153
- #: lib/dashboard.php:171
154
  msgid "Mode"
155
  msgstr "Mode"
156
 
157
- #: lib/dashboard.php:176 lib/dashboard.php:182
158
  #, php-format
159
  msgid "NinjaFirewall is running in %s mode."
160
  msgstr "NinjaFirewall fonctionne en mode %s."
161
 
162
- #: lib/dashboard.php:176
163
  msgid "WordPress WAF"
164
  msgstr "WordPress WAF"
165
 
166
- #: lib/dashboard.php:178
167
  #, php-format
168
  msgid ""
169
  "For better protection, <a %s>click here</a> to enable its Full WAF mode."
@@ -171,55 +194,59 @@ msgstr ""
171
  "Pour une meilleure protection, <a %s>cliquez ici</a> pour activer son mode "
172
  "Full WAF."
173
 
174
- #: lib/dashboard.php:178
175
  msgid "Click to install NinjaFirewall in Full WAF mode."
176
  msgstr "Cliquez pour installer NinjaFirewall en mode Full WAF."
177
 
178
- #: lib/dashboard.php:182
179
  msgid "Full WAF"
180
  msgstr "Full WAF"
181
 
182
- #: lib/dashboard.php:195 lib/firewall_options.php:76 lib/help.php:77
183
  msgid "Debugging mode"
184
  msgstr "Mode débogage"
185
 
186
- #: lib/dashboard.php:196
187
  msgid "Enabled."
188
  msgstr "Activé."
189
 
190
- #: lib/dashboard.php:196
191
  msgid "Click here to turn Debugging Mode off"
192
  msgstr "Cliquez ici pour désactiver le mode Débogage"
193
 
194
- #: lib/dashboard.php:202
195
  msgid "Edition"
196
  msgstr "Édition"
197
 
198
- #: lib/dashboard.php:203
199
- msgid "Need more security? Get Premium!"
200
- msgstr "Besoin de plus de sécurité ? Découvrez NinjaFirewall WP+ Edition !"
 
 
 
 
201
 
202
- #: lib/dashboard.php:206 lib/utils.php:724
203
  msgid "Version"
204
  msgstr "Version"
205
 
206
- #: lib/dashboard.php:207
207
  msgid "Security rules:"
208
  msgstr "Règles de sécurité&nbsp;:"
209
 
210
- #: lib/dashboard.php:211
211
  msgid "PHP SAPI"
212
  msgstr "PHP SAPI"
213
 
214
- #: lib/dashboard.php:229
215
  msgid "Updates"
216
  msgstr "Mises à Jour"
217
 
218
- #: lib/dashboard.php:230
219
  msgid "Security rules updates are disabled."
220
  msgstr "La mise à jour automatique des règles de sécurité est désactivée."
221
 
222
- #: lib/dashboard.php:230
223
  msgid ""
224
  "If you want your blog to be protected against the latest threats, enable "
225
  "automatic security rules updates."
@@ -227,11 +254,11 @@ msgstr ""
227
  "Pour garder votre WordPress protégé contre les dernières vulnérabilités, "
228
  "pensez à l'activer."
229
 
230
- #: lib/dashboard.php:238 lib/dashboard.php:246
231
  msgid "Admin user"
232
  msgstr "Administrateur"
233
 
234
- #: lib/dashboard.php:239
235
  #, php-format
236
  msgid ""
237
  "You are not whitelisted. Ensure that the \"Do not block WordPress "
@@ -244,23 +271,23 @@ msgstr ""
244
  "\"%s\">Politiques du Pare-feu</a>, sinon vous pourriez être bloqué par le "
245
  "pare-feu lorsque vous travaillez depuis votre Tableau de bord."
246
 
247
- #: lib/dashboard.php:247
248
  msgid "You are whitelisted by the firewall."
249
  msgstr "Vous êtes dans la liste blanche du pare-feu."
250
 
251
- #: lib/dashboard.php:254
252
  msgid "Restrictions"
253
  msgstr "Restrictions"
254
 
255
- #: lib/dashboard.php:255
256
  msgid "Access to NinjaFirewall is restricted to specific users."
257
  msgstr "L'accès à NinjaFirewall est restreint à certains utilisateurs."
258
 
259
- #: lib/dashboard.php:266
260
  msgid "User session"
261
  msgstr "Session utilisateur"
262
 
263
- #: lib/dashboard.php:267
264
  msgid ""
265
  "It seems that the user session set by NinjaFirewall was not found by the "
266
  "firewall script."
@@ -268,7 +295,7 @@ msgstr ""
268
  "Il semble que la session d'utilisateur définie par NinjaFirewall n'a pas été "
269
  "trouvé par le script du pare-feu."
270
 
271
- #: lib/dashboard.php:275
272
  #, php-format
273
  msgid ""
274
  "the public key is invalid. Please <a href=\"%s\">check your configuration</"
@@ -277,18 +304,18 @@ msgstr ""
277
  "la clé publique est invalide. Veuillez vérifier <a href=\"%s\">votre "
278
  "configuration</a>."
279
 
280
- #: lib/dashboard.php:279
281
  msgid "No IP address restriction."
282
  msgstr "Aucune restriction d'accès par adresse IP."
283
 
284
- #: lib/dashboard.php:282
285
  #, php-format
286
  msgid "IP address %s is allowed to access NinjaFirewall's log on this server."
287
  msgstr ""
288
  "L'adresse IP %s est autorisée à accéder au journal du pare-feu de "
289
  "NinjaFirewall."
290
 
291
- #: lib/dashboard.php:285
292
  #, php-format
293
  msgid ""
294
  "the whitelisted IP is not valid. Please <a href=\"%s\">check your "
@@ -297,26 +324,26 @@ msgstr ""
297
  "l'adresse IP est invalide. Veuillez vérifier <a href=\"%s\">votre "
298
  "configuration</a>."
299
 
300
- #: lib/dashboard.php:290 lib/help.php:422 lib/logs_firewall_log.php:194
301
  #: lib/wpplus.php:170
302
  msgid "Centralized Logging"
303
  msgstr "Centralisation des Logs"
304
 
305
- #: lib/dashboard.php:294
306
  #, php-format
307
  msgid "Error: %s"
308
  msgstr "Erreur : %s"
309
 
310
- #: lib/dashboard.php:309
311
  msgid "Source IP"
312
  msgstr "IP source"
313
 
314
- #: lib/dashboard.php:310
315
  #, php-format
316
  msgid "You have a private IP : %s"
317
  msgstr "Vous avez l'adresse IP d'un réseau privé : %s"
318
 
319
- #: lib/dashboard.php:310
320
  #, php-format
321
  msgid ""
322
  "If your site is behind a reverse proxy or a load balancer, ensure that you "
@@ -328,11 +355,11 @@ msgstr ""
328
  "la bonne adresse IP, sinon utilisez le fichier de configuration %s de "
329
  "NinjaFirewall. "
330
 
331
- #: lib/dashboard.php:318 lib/dashboard.php:328
332
  msgid "CDN detection"
333
  msgstr "Détection CDN"
334
 
335
- #: lib/dashboard.php:319
336
  #, php-format
337
  msgid ""
338
  "%s detected: you seem to be using Cloudflare CDN services. Ensure that you "
@@ -343,7 +370,7 @@ msgstr ""
343
  "vous d'avoir configuré votre serveur HTTP afin qu'il fasse suivre la bonne "
344
  "adresse IP, sinon utilisez le fichier de configuration %s de NinjaFirewall."
345
 
346
- #: lib/dashboard.php:329
347
  #, php-format
348
  msgid ""
349
  "%s detected: you seem to be using Incapsula CDN services. Ensure that you "
@@ -354,32 +381,32 @@ msgstr ""
354
  "vous d'avoir configuré votre serveur HTTP afin qu'il fasse suivre la bonne "
355
  "adresse IP, sinon utilisez le fichier de configuration %s de NinjaFirewall."
356
 
357
- #: lib/dashboard.php:338 lib/dashboard.php:347
358
  msgid "Log dir"
359
  msgstr "Répertoire du Journal"
360
 
361
- #: lib/dashboard.php:339 lib/dashboard.php:348
362
  #, php-format
363
  msgid "%s directory is not writable! Please chmod it to 0777 or equivalent."
364
  msgstr ""
365
  "Le répertoire %s est en lecture seule ! Veuillez changer ses permissions "
366
  "(0777 ou équivalent)."
367
 
368
- #: lib/dashboard.php:356
369
  msgid "Optional configuration file"
370
  msgstr "Fichier de configuration"
371
 
372
- #: lib/dashboard.php:363
373
  msgid "MySQLi link identifier"
374
  msgstr "Identifiant de lien MySQLi"
375
 
376
- #: lib/dashboard.php:364
377
  msgid "A MySQLi link identifier was detected in your <code>.htninja</code>."
378
  msgstr ""
379
  "Un identifiant de lien MySQLi a été détecté dans votre fichier <code>."
380
  "htninja</code>."
381
 
382
- #: lib/dashboard.php:370
383
  msgid "Help &amp; configuration"
384
  msgstr "Aide &amp; configuration"
385
 
@@ -395,7 +422,7 @@ msgstr ""
395
  "Soyez informé des dernières vulnérabilités dans les extensions et thèmes de "
396
  "WordPress :"
397
 
398
- #: lib/dashboard_about.php:31 lib/help.php:470
399
  msgid "GDPR Compliance"
400
  msgstr "Conformité RGPD"
401
 
@@ -465,7 +492,7 @@ msgstr "Moyen"
465
  msgid "Select monthly stats to view..."
466
  msgstr "Sélectionnez les statistiques à afficher"
467
 
468
- #: lib/event_notifications.php:34 lib/help.php:332 ninjafirewall.php:764
469
  msgid "Event Notifications"
470
  msgstr "Notifications d'Événement"
471
 
@@ -481,7 +508,8 @@ msgstr "Les modifications ont été enregistrées."
481
  msgid "WordPress admin dashboard"
482
  msgstr "Connexion"
483
 
484
- #: lib/event_notifications.php:55 lib/event_notifications.php:124
 
485
  msgid "Send me an alert whenever"
486
  msgstr "Envoyer une alerte quand"
487
 
@@ -558,11 +586,23 @@ msgstr "WordPress"
558
  msgid "Updates WordPress (default)"
559
  msgstr "Met à jour WordPress (défaut)"
560
 
561
- #: lib/event_notifications.php:121
 
 
 
 
 
 
 
 
 
 
 
 
562
  msgid "Administrator account"
563
  msgstr "Compte administrateur"
564
 
565
- #: lib/event_notifications.php:126
566
  msgid ""
567
  "An administrator account is created, modified or deleted in the database "
568
  "(default)"
@@ -570,21 +610,15 @@ msgstr ""
570
  "Un compte Administrateur est crée, modifié ou supprimé dans la base de "
571
  "données (défaut)"
572
 
573
- #: lib/event_notifications.php:127
574
- msgid "A user attempts to gain administrative privileges (default)"
575
- msgstr ""
576
- "Un utilisateur a essayé d'élever ses privilèges pour devenir administrateur "
577
- "du blog (défaut)"
578
-
579
- #: lib/event_notifications.php:134
580
  msgid "Daily report"
581
  msgstr "Rapport quotidien"
582
 
583
- #: lib/event_notifications.php:137
584
  msgid "Send me a daily activity report"
585
  msgstr "Envoyer un rapport d'activité quotidien"
586
 
587
- #: lib/event_notifications.php:139 lib/event_notifications.php:151
588
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
589
  #: lib/firewall_policies.php:25 lib/login_protection.php:309
590
  #: lib/login_protection.php:324 lib/login_protection.php:345
@@ -592,7 +626,7 @@ msgstr "Envoyer un rapport d'activité quotidien"
592
  msgid "Yes"
593
  msgstr "Oui"
594
 
595
- #: lib/event_notifications.php:139 lib/event_notifications.php:151
596
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
597
  #: lib/firewall_policies.php:26 lib/login_protection.php:309
598
  #: lib/login_protection.php:324 lib/login_protection.php:345
@@ -600,55 +634,55 @@ msgstr "Oui"
600
  msgid "No"
601
  msgstr "Non"
602
 
603
- #: lib/event_notifications.php:146
604
  msgid "Log"
605
  msgstr "Journal"
606
 
607
- #: lib/event_notifications.php:149
608
  msgid "Write all events to the firewall log"
609
  msgstr "Enregistrer les événements dans le journal du pare-feu"
610
 
611
- #: lib/event_notifications.php:163
612
  msgid "PHP backtrace"
613
  msgstr "Pile d'exécution de PHP"
614
 
615
- #: lib/event_notifications.php:166
616
  msgid "Attach a PHP backtrace to important notifications"
617
  msgstr ""
618
  "Ajouter aux notifications importantes la pile d'exécution de PHP en pièce "
619
  "jointe"
620
 
621
- #: lib/event_notifications.php:169
622
  msgid "Disable backtrace"
623
  msgstr "Désactiver la pile d'exécution"
624
 
625
- #: lib/event_notifications.php:170
626
  msgid "Low verbosity"
627
  msgstr "Faible verbosité"
628
 
629
- #: lib/event_notifications.php:171
630
  msgid "Medium verbosity (default)"
631
  msgstr "Verbosité moyenne (par défaut)"
632
 
633
- #: lib/event_notifications.php:172
634
  msgid "High verbosity"
635
  msgstr "Verbosité élevée"
636
 
637
- #: lib/event_notifications.php:174
638
  #, php-format
639
  msgid "<a href=\"%s\">Consult our blog</a> for more info."
640
  msgstr ""
641
  "<a href=\"%s\">Consultez notre blog pour plus d'informations à ce sujet</a>."
642
 
643
- #: lib/event_notifications.php:184 lib/event_notifications.php:214
644
  msgid "Contact email"
645
  msgstr "Adresse e-mail du contact"
646
 
647
- #: lib/event_notifications.php:187 lib/event_notifications.php:217
648
  msgid "Alerts should be sent to"
649
  msgstr "Envoyer les alertes à"
650
 
651
- #: lib/event_notifications.php:196 lib/event_notifications.php:222
652
  msgid ""
653
  "Multiple recipients must be comma-separated (e.g., <code>joe@example.org,"
654
  "alice@example.org</code>)."
@@ -656,60 +690,60 @@ msgstr ""
656
  "Plusieurs destinataires doivent être séparés par des virgules (par ex. "
657
  "<code>joe@example.org,alice@example.org</code>)."
658
 
659
- #: lib/event_notifications.php:219
660
  msgid "Only to me, the Super Admin"
661
  msgstr "Moi uniquement, le Super Admin"
662
 
663
- #: lib/event_notifications.php:219
664
  msgid "default"
665
  msgstr "défaut"
666
 
667
- #: lib/event_notifications.php:220
668
  msgid "To the administrator of the site where originated the alert"
669
  msgstr "L'Administrateur du site d’où provient l'alerte"
670
 
671
- #: lib/event_notifications.php:221
672
  msgid "Other(s):"
673
  msgstr "Autre(s) :"
674
 
675
- #: lib/event_notifications.php:233
676
  msgid "Save Event Notifications"
677
  msgstr "Sauvegarder les options"
678
 
679
- #: lib/event_notifications.php:461
680
  msgid "[NinjaFirewall] Daily Activity Report"
681
  msgstr "[NinjaFirewall] Rapport d'activité quotidien"
682
 
683
- #: lib/event_notifications.php:471
684
  #, php-format
685
  msgid "Daily activity report for: %s"
686
  msgstr "Rapport d'activité quotidien pour : %s"
687
 
688
- #: lib/event_notifications.php:472
689
  msgid "Date Range Processed: Yesterday"
690
  msgstr "Plage de date traitée : Hier"
691
 
692
- #: lib/event_notifications.php:474
693
  msgid "Blocked threats:"
694
  msgstr "Menaces bloquées :"
695
 
696
- #: lib/event_notifications.php:476
697
  msgid "critical:"
698
  msgstr "Critique :"
699
 
700
- #: lib/event_notifications.php:477
701
  msgid "high:"
702
  msgstr "Élevé :"
703
 
704
- #: lib/event_notifications.php:478
705
  msgid "medium:"
706
  msgstr "Moyen :"
707
 
708
- #: lib/event_notifications.php:480
709
  msgid "Blocked brute-force attacks:"
710
  msgstr "Attaques par force brute bloquées :"
711
 
712
- #: lib/event_notifications.php:481 lib/utils.php:851 lib/utils.php:1029
713
  msgid ""
714
  "This notification can be turned off from NinjaFirewall \"Event Notifications"
715
  "\" page."
@@ -717,16 +751,17 @@ msgstr ""
717
  "Cette notification peut être désactivée depuis la page \"Notifications "
718
  "d’Événement\" de NinjaFirewall."
719
 
720
- #: lib/event_notifications.php:485 lib/firewall_options.php:525
721
- #: lib/monitoring_file_check.php:773 lib/monitoring_file_check.php:794
722
- #: lib/security_rules_update.php:556 lib/utils.php:746
723
  msgid "Support forum:"
724
  msgstr "Forum :"
725
 
726
- #: lib/event_notifications.php:488 lib/firewall_options.php:528
727
- #: lib/monitoring_file_check.php:776 lib/monitoring_file_check.php:797
728
- #: lib/security_rules_update.php:559 lib/utils.php:235 lib/utils.php:578
729
- #: lib/utils.php:749 lib/utils.php:856 lib/utils.php:1034 lib/utils.php:1347
 
730
  #, php-format
731
  msgid ""
732
  "Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): "
@@ -735,7 +770,134 @@ msgstr ""
735
  "Besoin de plus de sécurité ? Venez découvrir NinjaFirewall (WP+ Edition), "
736
  "une version encore plus musclée de notre pare-feu applicatif : %s "
737
 
738
- #: lib/firewall_options.php:29 ninjafirewall.php:738
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
739
  msgid "Firewall Options"
740
  msgstr "Options du Pare-feu"
741
 
@@ -745,7 +907,7 @@ msgstr "Pare-feu"
745
 
746
  #: lib/firewall_options.php:64 lib/login_protection.php:203
747
  #: lib/logs_live_log.php:101 lib/monitoring_file_guard.php:70
748
- #: lib/security_rules_update.php:137
749
  msgid "Disabled"
750
  msgstr "Désactivé"
751
 
@@ -794,7 +956,7 @@ msgstr ""
794
  "Ne s'applique pas aux adresses IP privées, ni à la <a href=\"%s\">Page de "
795
  "Connexion</a>."
796
 
797
- #: lib/firewall_options.php:128
798
  msgid "Blocked user message"
799
  msgstr "Message pour les utilisateurs bloqués"
800
 
@@ -875,8 +1037,7 @@ msgstr ""
875
  msgid "[NinjaFirewall] Alert: Firewall is disabled"
876
  msgstr "[NinjaFirewall] Alerte : Le pare-feu a été désactivé"
877
 
878
- #: lib/firewall_options.php:501 lib/firewall_options.php:503 lib/utils.php:734
879
- #: lib/utils.php:736
880
  msgid "-Blog :"
881
  msgstr "- Blog :"
882
 
@@ -905,15 +1066,15 @@ msgstr ""
905
  "Quelqu'un a importé une nouvelle configuration qui a modifié tous les "
906
  "paramètres du pare-feu :"
907
 
908
- #: lib/firewall_options.php:520 lib/utils.php:741
909
  msgid "-User :"
910
  msgstr "- Nom :"
911
 
912
- #: lib/firewall_options.php:521 lib/utils.php:742
913
  msgid "-IP :"
914
  msgstr "- IP :"
915
 
916
- #: lib/firewall_options.php:522 lib/utils.php:743
917
  msgid "-Date :"
918
  msgstr "- Date :"
919
 
@@ -925,7 +1086,7 @@ msgstr ""
925
  "Cette option ne peut être activée que lorsque NinjaFirewall fonctionne en "
926
  "mode %s."
927
 
928
- #: lib/firewall_policies.php:62 lib/help.php:155 ninjafirewall.php:742
929
  msgid "Firewall Policies"
930
  msgstr "Politiques du Pare-feu"
931
 
@@ -937,15 +1098,15 @@ msgstr "Les valeurs par défaut ont été restaurées."
937
  msgid "No action taken."
938
  msgstr "Aucune mesure prise."
939
 
940
- #: lib/firewall_policies.php:85 lib/help.php:160
941
  msgid "Basic Policies"
942
  msgstr "Politiques de base"
943
 
944
- #: lib/firewall_policies.php:86 lib/help.php:186
945
  msgid "Intermediate Policies"
946
  msgstr "Politiques intermédiaires"
947
 
948
- #: lib/firewall_policies.php:87 lib/help.php:217
949
  msgid "Advanced Policies"
950
  msgstr "Politiques avancées"
951
 
@@ -965,11 +1126,11 @@ msgstr "Trafic HTTP uniquement"
965
  msgid "HTTPS traffic only"
966
  msgstr "Trafic HTTPS uniquement"
967
 
968
- #: lib/firewall_policies.php:141 lib/help.php:165
969
  msgid "Uploads"
970
  msgstr "Téléchargements"
971
 
972
- #: lib/firewall_policies.php:144
973
  msgid "File Uploads"
974
  msgstr "Autoriser les téléchargements (uploads)"
975
 
@@ -985,7 +1146,7 @@ msgstr "(défaut)"
985
  msgid "Disallow uploads"
986
  msgstr "Interdire"
987
 
988
- #: lib/firewall_policies.php:152
989
  msgid "Sanitise filenames"
990
  msgstr "Nettoyer le nom des fichiers"
991
 
@@ -993,12 +1154,12 @@ msgstr "Nettoyer le nom des fichiers"
993
  msgid "substitution character:"
994
  msgstr "caractère de substitution&nbsp;:"
995
 
996
- #: lib/firewall_policies.php:276
997
  msgid "Block direct access to any PHP file located in one of these directories"
998
  msgstr ""
999
  "Bloquer l'accès direct à un fichier PHP situé dans l'un de ces répertoires"
1000
 
1001
- #: lib/firewall_policies.php:306
1002
  msgid ""
1003
  "NinjaFirewall will not block access to the TinyMCE WYSIWYG editor even if "
1004
  "this option is enabled."
@@ -1006,7 +1167,7 @@ msgstr ""
1006
  "NinjaFirewall ne bloquera pas l'accès à l'éditeur WYSIWYG TinyMCE même si "
1007
  "cette option est activée."
1008
 
1009
- #: lib/firewall_policies.php:321
1010
  msgid ""
1011
  "Unless you have PHP scripts in a \"/cache/\" folder that need to be accessed "
1012
  "by your visitors, we recommend to enable this option."
@@ -1015,29 +1176,42 @@ msgstr ""
1015
  "pouvant être consultés par vos visiteurs, nous vous recommandons d'activer "
1016
  "cette option."
1017
 
1018
- #: lib/firewall_policies.php:330
1019
  msgid "General"
1020
  msgstr "Général"
1021
 
1022
- #: lib/firewall_policies.php:332 lib/help.php:171
1023
  msgid "Block attempts to modify important WordPress settings"
1024
  msgstr ""
1025
  "Bloquer les tentatives de modification des paramètres importants de WordPress"
1026
 
1027
- #: lib/firewall_policies.php:333 lib/help.php:172
1028
  msgid "Block user accounts creation"
1029
  msgstr "Bloquer la création de comptes utilisateur"
1030
 
1031
- #: lib/firewall_policies.php:345 lib/help.php:173
 
 
 
 
 
 
 
 
 
 
 
 
 
1032
  msgid "WordPress AJAX"
1033
  msgstr "WordPress AJAX"
1034
 
1035
- #: lib/firewall_policies.php:347
1036
  msgid "Protect <code>admin-ajax.php</code> against suspicious bots"
1037
  msgstr ""
1038
  "Proteger <code>admin-ajax.php</code> contre les bots et scanners malveillants"
1039
 
1040
- #: lib/firewall_policies.php:348
1041
  #, php-format
1042
  msgid ""
1043
  "Your server IP (%s), localhost and private IP addresses will not be affected "
@@ -1046,43 +1220,43 @@ msgstr ""
1046
  "L'adresse IP de votre serveur (%s), localhost et toute adresse IP privée ne "
1047
  "seront pas affectées par cette politique."
1048
 
1049
- #: lib/firewall_policies.php:353
1050
  msgid "Protect against username enumeration"
1051
  msgstr "Protéger contre l'énumération des comptes utilisateurs"
1052
 
1053
- #: lib/firewall_policies.php:355
1054
  msgid "Through the author archives"
1055
  msgstr "Via la page d'archive d'un auteur"
1056
 
1057
- #: lib/firewall_policies.php:356
1058
  msgid "Through the login page"
1059
  msgstr "Via la page de connexion"
1060
 
1061
- #: lib/firewall_policies.php:357
1062
  msgid "Through the WordPress REST API"
1063
  msgstr "Via l'API REST de WordPress"
1064
 
1065
- #: lib/firewall_policies.php:362
1066
  msgid "WordPress REST API"
1067
  msgstr "API REST de WordPress"
1068
 
1069
- #: lib/firewall_policies.php:364 lib/firewall_policies.php:370
1070
  msgid "Block any access to the API"
1071
  msgstr "Bloquer tout accès à l'API"
1072
 
1073
- #: lib/firewall_policies.php:368
1074
  msgid "WordPress XML-RPC API"
1075
  msgstr "API XML-RPC de WordPress"
1076
 
1077
- #: lib/firewall_policies.php:371
1078
  msgid "Block <code>system.multicall</code> method"
1079
  msgstr "Bloquer la méthode <code>system.multicall</code>"
1080
 
1081
- #: lib/firewall_policies.php:372
1082
  msgid "Block Pingbacks"
1083
  msgstr "Bloquer les Pingbacks"
1084
 
1085
- #: lib/firewall_policies.php:374
1086
  msgid ""
1087
  "Disabling access to the REST or XML-RPC API may break some functionality on "
1088
  "your blog, its themes or plugins (e.g., Gutenberg editor, Jetpack, Contact "
@@ -1092,43 +1266,43 @@ msgstr ""
1092
  "blog, ses thèmes ou ses extensions (ex.: Éditeur Gutenberg, Jetpack, Contact "
1093
  "Form 7 etc)."
1094
 
1095
- #: lib/firewall_policies.php:379
1096
  msgid "Block <code>POST</code> requests in the themes folder"
1097
  msgstr "Bloquer les requêtes <code>POST</code> dans le dossier des thèmes"
1098
 
1099
- #: lib/firewall_policies.php:389
1100
- msgid "Force SSL for admin and logins"
1101
  msgstr "Forcer la connexion sécurisée au Tableau de bord"
1102
 
1103
- #: lib/firewall_policies.php:395
1104
  msgid "Disable the plugin and theme editor"
1105
  msgstr "Désactiver l’éditeur de thème et d'extension"
1106
 
1107
- #: lib/firewall_policies.php:401
1108
  msgid "Disable plugin and theme update/installation"
1109
  msgstr "Désactiver l'installation et mise à jour des thèmes et extensions"
1110
 
1111
- #: lib/firewall_policies.php:407
1112
  msgid "Disable the fatal error handler"
1113
  msgstr "Désactiver le gestionnaire d'erreurs fatales"
1114
 
1115
- #: lib/firewall_policies.php:429 lib/help.php:259
1116
  msgid "Users Whitelist"
1117
  msgstr "Liste Blanche"
1118
 
1119
- #: lib/firewall_policies.php:431
1120
  msgid "Add the Administrator to the whitelist (default)."
1121
  msgstr "Ajouter l'Administrateur à la liste blanche (défaut)."
1122
 
1123
- #: lib/firewall_policies.php:432
1124
  msgid "Add all logged in users to the whitelist."
1125
  msgstr "Ajouter tous les utilisateurs connectés à la liste blanche."
1126
 
1127
- #: lib/firewall_policies.php:433
1128
  msgid "Disable users whitelist."
1129
  msgstr "Désactiver la liste blanche."
1130
 
1131
- #: lib/firewall_policies.php:434
1132
  msgid ""
1133
  "Note: This feature does not apply to <code>FORCE_SSL_ADMIN</code>, "
1134
  "<code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> and "
@@ -1140,90 +1314,90 @@ msgstr ""
1140
  "<code>WP_DISABLE_FATAL_ERROR_HANDLER</code> qui, si elles sont activées, "
1141
  "seront toujours appliquées."
1142
 
1143
- #: lib/firewall_policies.php:459 lib/help.php:188
1144
  msgid "HTTP GET variable"
1145
  msgstr "Variable HTTP GET"
1146
 
1147
- #: lib/firewall_policies.php:462
1148
  msgid "Scan <code>GET</code> variable"
1149
  msgstr "Filtrer la variable <code>GET</code>"
1150
 
1151
- #: lib/firewall_policies.php:468
1152
  msgid "Sanitise <code>GET</code> variable"
1153
  msgstr "Nettoyer la variable <code>GET</code>"
1154
 
1155
- #: lib/firewall_policies.php:494 lib/help.php:191
1156
  msgid "HTTP POST variable"
1157
  msgstr "Variable HTTP POST"
1158
 
1159
- #: lib/firewall_policies.php:497
1160
  msgid "Scan <code>POST</code> variable"
1161
  msgstr "Filtrer la variable <code>POST</code>"
1162
 
1163
- #: lib/firewall_policies.php:503
1164
  msgid "Sanitise <code>POST</code> variable"
1165
  msgstr "Nettoyer la variable <code>POST</code>"
1166
 
1167
- #: lib/firewall_policies.php:506 lib/firewall_policies.php:531
1168
  msgid "Do not enable this option unless you know what you are doing!"
1169
  msgstr ""
1170
  "N'activez pas cette option si vous n'êtes pas sûr de ce que vous "
1171
  "faites&nbsp;!"
1172
 
1173
- #: lib/firewall_policies.php:510
1174
  msgid "Decode Base64-encoded <code>POST</code> variable"
1175
  msgstr ""
1176
  "Décoder les chaîne encodées en Base64 dans la variable <code>POST</code>"
1177
 
1178
- #: lib/firewall_policies.php:525 lib/help.php:195
1179
  msgid "HTTP REQUEST variable"
1180
  msgstr "Variable HTTP REQUEST"
1181
 
1182
- #: lib/firewall_policies.php:528
1183
  msgid "Sanitise <code>REQUEST</code> variable"
1184
  msgstr "Nettoyer la variable <code>REQUEST</code>"
1185
 
1186
- #: lib/firewall_policies.php:550 lib/help.php:198
1187
  msgid "Cookies"
1188
  msgstr "Cookies"
1189
 
1190
- #: lib/firewall_policies.php:553
1191
  msgid "Scan cookies"
1192
  msgstr "Filtrer les cookies"
1193
 
1194
- #: lib/firewall_policies.php:559
1195
  msgid "Sanitise cookies"
1196
  msgstr "Nettoyer les cookies"
1197
 
1198
- #: lib/firewall_policies.php:585 lib/help.php:201
1199
  msgid "HTTP_USER_AGENT server variable"
1200
  msgstr "Variable HTTP_USER_AGENT"
1201
 
1202
- #: lib/firewall_policies.php:588
1203
  msgid "Scan <code>HTTP_USER_AGENT</code>"
1204
  msgstr "Filtrer <code>HTTP_USER_AGENT</code>"
1205
 
1206
- #: lib/firewall_policies.php:594
1207
  msgid "Sanitise <code>HTTP_USER_AGENT</code>"
1208
  msgstr "Nettoyer <code>HTTP_USER_AGENT</code>"
1209
 
1210
- #: lib/firewall_policies.php:600
1211
  msgid "Block suspicious bots/scanners"
1212
  msgstr "Bloquer les requêtes provenant de bots/scanners malveillants"
1213
 
1214
- #: lib/firewall_policies.php:626 lib/help.php:205
1215
  msgid "HTTP_REFERER server variable"
1216
  msgstr "Variable HTTP_REFERER"
1217
 
1218
- #: lib/firewall_policies.php:629
1219
  msgid "Scan <code>HTTP_REFERER</code>"
1220
  msgstr "Filtrer <code>HTTP_REFERER</code>"
1221
 
1222
- #: lib/firewall_policies.php:635
1223
  msgid "Sanitise <code>HTTP_REFERER</code>"
1224
  msgstr "Nettoyer <code>HTTP_REFERER</code>"
1225
 
1226
- #: lib/firewall_policies.php:641
1227
  msgid ""
1228
  "Block <code>POST</code> requests that do not have an <code>HTTP_REFERER</"
1229
  "code> header"
@@ -1231,7 +1405,7 @@ msgstr ""
1231
  "Bloquer les requêtes <code>POST</code> qui n'ont pas d'en-tête "
1232
  "<code>HTTP_REFERER</code>"
1233
 
1234
- #: lib/firewall_policies.php:644
1235
  msgid ""
1236
  "Keep this option disabled if you are using scripts like Paypal IPN, "
1237
  "WordPress WP-Cron etc"
@@ -1239,21 +1413,21 @@ msgstr ""
1239
  "N'activez pas cette option si vous utilisez des scripts comme Paypal IPN, "
1240
  "WordPress WP-Cron etc"
1241
 
1242
- #: lib/firewall_policies.php:671
1243
  msgid "Block localhost IP in <code>GET/POST</code> request"
1244
  msgstr "Bloquer les requêtes <code>GET/POST</code> contenant l'IP localhost"
1245
 
1246
- #: lib/firewall_policies.php:677
1247
  msgid "Block HTTP requests with an IP in the <code>HTTP_HOST</code> header"
1248
  msgstr ""
1249
  "Bloquer les requêtes HTTP dont l'en-tête <code>HTTP_HOST</code> contient une "
1250
  "IP"
1251
 
1252
- #: lib/firewall_policies.php:683
1253
  msgid "Scan traffic coming from localhost and private IP address spaces"
1254
  msgstr "Filtrer les connexions provenant de localhost et d'adresses IP privées"
1255
 
1256
- #: lib/firewall_policies.php:713
1257
  #, php-format
1258
  msgid ""
1259
  "The \"HTTP response headers\" options below are disabled because the %s PHP "
@@ -1262,25 +1436,25 @@ msgstr ""
1262
  "Les politiques \"En-têtes de réponse HTTP\" ci-dessous sont désactivées car "
1263
  "la fonction PHP %s n'est pas disponible sur votre serveur."
1264
 
1265
- #: lib/firewall_policies.php:733 lib/help.php:219
1266
  msgid "HTTP response headers"
1267
  msgstr "En-têtes de réponse HTTP"
1268
 
1269
- #: lib/firewall_policies.php:741
1270
  #, php-format
1271
  msgid "Set %s to protect against MIME type confusion attacks"
1272
  msgstr ""
1273
  "Activer %s pour protéger contre les attaques basées sur la confusion du type "
1274
  "MIME"
1275
 
1276
- #: lib/firewall_policies.php:747
1277
  #, php-format
1278
  msgid "Set %s to protect against clickjacking attempts"
1279
  msgstr ""
1280
  "Activer %s pour protéger contre les attaques de détournement de clic "
1281
  "(clickjacking)"
1282
 
1283
- #: lib/firewall_policies.php:754
1284
  msgid ""
1285
  "Setting this option to <code>DENY</code> may break some functionality on "
1286
  "your blog, its themes or plugins."
@@ -1288,32 +1462,32 @@ msgstr ""
1288
  "Activer cette fonction avec <code>DENY</code> pourrait bloquer certaines "
1289
  "fonctionnalités de votre blog, ses thèmes ou ses extensions."
1290
 
1291
- #: lib/firewall_policies.php:759
1292
  #, php-format
1293
  msgid "Set %s (IE/Edge, Chrome, Opera and Safari browsers)"
1294
  msgstr "Activer %s (IE/Edge, Opera, Chrome et Safari)"
1295
 
1296
- #: lib/firewall_policies.php:763 lib/firewall_policies.php:764
1297
- #: lib/firewall_policies.php:765
1298
  #, php-format
1299
  msgid "Set to %s"
1300
  msgstr "Régler sur %s"
1301
 
1302
- #: lib/firewall_policies.php:770
1303
  #, php-format
1304
  msgid "Force %s flag on all cookies to mitigate CSRF attacks"
1305
  msgstr ""
1306
  "Activer la propriété %s pour tous les cookies afin d'atténuer les attaques "
1307
  "CSRF"
1308
 
1309
- #: lib/firewall_policies.php:780
1310
  #, php-format
1311
  msgid "Force %s flag on all cookies to mitigate XSS attacks"
1312
  msgstr ""
1313
  "Activer la propriété %s pour tous les cookies afin d'atténuer les menaces "
1314
  "XSS qui génèrent des vols de cookies"
1315
 
1316
- #: lib/firewall_policies.php:783
1317
  msgid ""
1318
  "If your PHP scripts use cookies that need to be accessed from JavaScript, "
1319
  "you should not enable this option."
@@ -1321,65 +1495,65 @@ msgstr ""
1321
  "Si vos scripts PHP envoient des cookies qui doivent être accessibles à "
1322
  "partir de JavaScript, vous ne devriez pas activer cette option."
1323
 
1324
- #: lib/firewall_policies.php:792
1325
  msgid ""
1326
  "HSTS headers can only be set when you are accessing your site over HTTPS."
1327
  msgstr ""
1328
  "Les en-têtes HSTS ne peuvent être utilisés que lorsque vous vous connectez à "
1329
  "votre site en HTTPS (connexion sécurisée)."
1330
 
1331
- #: lib/firewall_policies.php:800
1332
  #, php-format
1333
  msgid "Set %s (HSTS) to enforce secure connections to the server"
1334
  msgstr ""
1335
  "Activer %s (HSTS) pour forcer les connexions sécurisées vers le serveur"
1336
 
1337
- #: lib/firewall_policies.php:804
1338
  msgid "Set \"max-age\" to 0"
1339
  msgstr "Régler \"max-age\" à 0"
1340
 
1341
- #: lib/firewall_policies.php:805
1342
  msgid "1 month"
1343
  msgstr "1 mois"
1344
 
1345
- #: lib/firewall_policies.php:806
1346
  msgid "6 months"
1347
  msgstr "6 mois"
1348
 
1349
- #: lib/firewall_policies.php:807
1350
  msgid "1 year"
1351
  msgstr "1 année"
1352
 
1353
- #: lib/firewall_policies.php:809
1354
  msgid "Apply to subdomains"
1355
  msgstr "Appliquer aux sous-domaines"
1356
 
1357
- #: lib/firewall_policies.php:833
1358
  #, php-format
1359
  msgid "Set %s for the website frontend"
1360
  msgstr "Activer %s pour le site"
1361
 
1362
- #: lib/firewall_policies.php:838
1363
  msgid "This CSP header will apply to the website frontend only."
1364
  msgstr "Cet en-tête CSP ne s'appliquera qu'au site."
1365
 
1366
- #: lib/firewall_policies.php:842
1367
  #, php-format
1368
  msgid "Set %s for the WordPress admin dashboard"
1369
  msgstr "Activer %s pour la console d'administration de WordPress"
1370
 
1371
- #: lib/firewall_policies.php:847
1372
  msgid "This CSP header will apply to the WordPress admin dashboard only."
1373
  msgstr ""
1374
  "Cet en-tête CSP ne s'appliquera qu'à la console d'administration de "
1375
  "WordPress."
1376
 
1377
- #: lib/firewall_policies.php:863
1378
  #, php-format
1379
  msgid "Set %s (Chrome, Opera and Firefox browsers)"
1380
  msgstr "Activer %s (Chrome, Opera et Firefox)"
1381
 
1382
- #: lib/firewall_policies.php:913
1383
  msgid ""
1384
  "Block PHP built-in wrappers in <code>GET</code>, <code>POST</code>, "
1385
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> and cookies"
@@ -1388,54 +1562,54 @@ msgstr ""
1388
  "<code>GET</code>, <code>POST</code>, <code>HTTP_USER_AGENT</code>, "
1389
  "<code>HTTP_REFERER</code> et les cookies"
1390
 
1391
- #: lib/firewall_policies.php:952
1392
  msgid "Block serialized PHP objects in the following global variables"
1393
  msgstr ""
1394
  "Bloquer les objets PHP sérialisés dans les variables globales suivantes"
1395
 
1396
- #: lib/firewall_policies.php:962
1397
  msgid "Hide PHP notice and error messages"
1398
  msgstr "Masquer les messages d'erreur de PHP"
1399
 
1400
- #: lib/firewall_policies.php:968
1401
  msgid "Sanitise <code>PHP_SELF</code>"
1402
  msgstr "Nettoyer <code>PHP_SELF</code>"
1403
 
1404
- #: lib/firewall_policies.php:974
1405
  msgid "Sanitise <code>PATH_TRANSLATED</code>"
1406
  msgstr "Nettoyer <code>PATH_TRANSLATED</code>"
1407
 
1408
- #: lib/firewall_policies.php:980
1409
  msgid "Sanitise <code>PATH_INFO</code>"
1410
  msgstr "Nettoyer <code>PATH_INFO</code>"
1411
 
1412
- #: lib/firewall_policies.php:994
1413
  msgid "This option is not compatible with your actual configuration."
1414
  msgstr ""
1415
  "Cette option n'est pas compatible avec la configuration de votre serveur."
1416
 
1417
- #: lib/firewall_policies.php:1016 lib/help.php:250
1418
  msgid "Various"
1419
  msgstr "Divers"
1420
 
1421
- #: lib/firewall_policies.php:1019
1422
  msgid "Block the <code>DOCUMENT_ROOT</code> server variable in HTTP request"
1423
  msgstr ""
1424
  "Bloquer les requêtes HTTP contenant la variable <code>DOCUMENT_ROOT</code>"
1425
 
1426
- #: lib/firewall_policies.php:1026
1427
  msgid "Block ASCII character 0x00 (NULL byte)"
1428
  msgstr "Bloquer le caractère ASCII 0x00 (NULL byte)"
1429
 
1430
- #: lib/firewall_policies.php:1032
1431
  msgid "Block ASCII control characters 1 to 8 and 14 to 31"
1432
  msgstr "Bloquer les caractères de contrôle ASCII 1 à 8 et 14 à 31"
1433
 
1434
- #: lib/firewall_policies.php:1045
1435
  msgid "Save Firewall Policies"
1436
  msgstr "Sauvegarder les options"
1437
 
1438
- #: lib/firewall_policies.php:1047
1439
  msgid "Restore Default Values"
1440
  msgstr "Rétablir les valeurs par défaut"
1441
 
@@ -1447,7 +1621,7 @@ msgid ""
1447
  msgstr ""
1448
  "Le Tableau de Bord affiche toutes les informations relatives au bon "
1449
  "fonctionnement du pare-feu ainsi que les mises à jour; il vous est conseillé "
1450
- "de la consulter fréquemment car, en cas de problèmes, ceux-ci seront "
1451
  "indiqués ici."
1452
 
1453
  #: lib/help.php:45
@@ -1471,8 +1645,8 @@ msgid ""
1471
  "Benchmarks show the time NinjaFirewall took, in seconds, to process each "
1472
  "request it has blocked."
1473
  msgstr ""
1474
- "Indique le temps qu'il a fallu à NinjaFirewall pour intercepter, analyser et "
1475
- "bloquer les requêtes dangereuses."
1476
 
1477
  #: lib/help.php:56
1478
  msgid "Everything you ever wanted to know about NinjaFirewall."
@@ -1551,10 +1725,6 @@ msgstr ""
1551
  "En outre, si vous redirigez les événements vers le serveur syslog, les "
1552
  "adresses IP y seront également anonymisées."
1553
 
1554
- #: lib/help.php:90
1555
- msgid "Error code and message to return"
1556
- msgstr "Code HTTP et Message à retourner"
1557
-
1558
  #: lib/help.php:92
1559
  msgid ""
1560
  "Lets you customize the HTTP error code returned by NinjaFirewall when "
@@ -1618,7 +1788,7 @@ msgstr ""
1618
  "restaurer sa configuration à une date antérieure, sélectionnez le fichier "
1619
  "correspondant dans la liste."
1620
 
1621
- #: lib/help.php:126
1622
  #, php-format
1623
  msgid ""
1624
  "Keep in mind, however, that the Firewall Policies apply to any PHP scripts "
@@ -1629,11 +1799,11 @@ msgstr ""
1629
  "scripts PHP</b> situés à l'intérieur du répertoire %s ainsi que ses sous-"
1630
  "répertoires, et non pas seulement à la page d'index de WordPress."
1631
 
1632
- #: lib/help.php:131
1633
  msgid "Policies overview"
1634
  msgstr "Politiques du pare-feu"
1635
 
1636
- #: lib/help.php:133
1637
  #, php-format
1638
  msgid ""
1639
  "Because NinjaFirewall sits in front of WordPress, it can hook, scan and "
@@ -1652,7 +1822,7 @@ msgstr ""
1652
  "adresses IP, avant que celles-ci n'atteignent votre application, que ce soit "
1653
  "en mode HTTP ou HTTPS."
1654
 
1655
- #: lib/help.php:135
1656
  msgid ""
1657
  "Use the options below to enable, disable or to tweak these rules according "
1658
  "to your needs."
@@ -1660,11 +1830,11 @@ msgstr ""
1660
  "Utilisez les options ci-dessous pour configurer NinjaFirewall suivant vos "
1661
  "besoins."
1662
 
1663
- #: lib/help.php:142
1664
  msgid "Scan and Sanitise"
1665
  msgstr "Filtrer et Nettoyer"
1666
 
1667
- #: lib/help.php:144
1668
  msgid ""
1669
  "You can choose to scan and reject dangerous content but also to sanitise "
1670
  "requests and variables. Those two actions are different and can be combined "
@@ -1674,9 +1844,9 @@ msgstr ""
1674
  "mais aussi de les nettoyer. Ces deux actions sont différentes et peuvent "
1675
  "être combinées pour plus de sécurité."
1676
 
1677
- #: lib/help.php:145
1678
  msgid ""
1679
- "Scan : if anything suspicious is detected, NinjaFirewall will block the "
1680
  "request and return an HTTP error code and message (defined in the \"Firewall "
1681
  "Options\" page). The user request will fail and the connection will be "
1682
  "closed immediately."
@@ -1686,10 +1856,10 @@ msgstr ""
1686
  "du Pare-feu\"). La requête ne pourra pas aboutir et la connexion sera fermée "
1687
  "immédiatement."
1688
 
1689
- #: lib/help.php:146
1690
  #, php-format
1691
  msgid ""
1692
- "Sanitise : this option will not block but sanitise the user request by "
1693
  "escaping characters that can be used to exploit vulnerabilities (%s) and "
1694
  "replacing <code>&lt;</code> and <code>&gt;</code> with their corresponding "
1695
  "HTML entities (<code>&amp;lt;</code>, <code>&amp;gt;</code>). If it is a "
@@ -1704,7 +1874,7 @@ msgstr ""
1704
  "HTML correspondantes. S'il s'agit d'une variable et de sa valeur (<code>?"
1705
  "variable=valeur</code>), les deux éléments seront nettoyés."
1706
 
1707
- #: lib/help.php:148
1708
  msgid ""
1709
  "This action will be performed when the filtering process is over, right "
1710
  "before NinjaFirewall forwards the request to your PHP script."
@@ -1713,7 +1883,7 @@ msgstr ""
1713
  "juste avant que NinjaFirewall fasse suivre la requête à votre application "
1714
  "PHP."
1715
 
1716
- #: lib/help.php:151
1717
  msgid ""
1718
  "If you enabled <code>POST</code> requests sanitising, articles and messages "
1719
  "posted by your visitors could be corrupted with excessive backslashes or "
@@ -1723,38 +1893,30 @@ msgstr ""
1723
  "commentaires et messages de vos visiteurs pourraient être endommagés par "
1724
  "cette option."
1725
 
1726
- #: lib/help.php:163
1727
  msgid "Whether to filter HTTP and/or HTTPS traffic"
1728
  msgstr ""
1729
  "Sélectionnez le type de trafic filtré par le pare-feu (HTTP et/ou HTTPS)."
1730
 
1731
- #: lib/help.php:166
1732
- msgid "File Uploads:"
1733
- msgstr "Autoriser les téléchargements&nbsp;:"
1734
-
1735
- #: lib/help.php:166
1736
- msgid "whether to allow/disallow file uploads."
1737
  msgstr ""
1738
- "vous pouvez autoriser ou interdire tout téléchargement de fichiers vers "
1739
  "votre site."
1740
 
1741
- #: lib/help.php:167
1742
- msgid "Sanitise filenames:"
1743
- msgstr "Nettoyer le nom des fichiers&nbsp;:"
1744
-
1745
- #: lib/help.php:167
1746
  msgid ""
1747
- "any character that is not a letter <code>a-zA-Z</code>, a digit <code>0-9</"
1748
  "code>, a dot <code>.</code>, a hyphen <code>-</code> or an underscore "
1749
  "<code>_</code> will be removed from the filename and replaced with the "
1750
  "substitution character."
1751
  msgstr ""
1752
- "si le nom du fichier contient un caractère qui n'est pas une lettre <code>a-"
1753
- "zA-Z</code>, un chiffre <code>0-9</code>, un point <code>.</code>, un trait "
1754
- "d'union <code>-</code> ou un caractère de soulignement <code>_</code>, celui-"
1755
- "si sera remplacé par le caractère de substitution."
1756
 
1757
- #: lib/help.php:170
1758
  msgid ""
1759
  "Whether to block direct access to PHP files located in specific WordPress "
1760
  "directories."
@@ -1762,51 +1924,55 @@ msgstr ""
1762
  "S'il faut bloquer l’accès direct à tout fichier PHP se trouvant dans l'un de "
1763
  "ces répertoires."
1764
 
1765
- #: lib/help.php:171
1766
  msgid ""
1767
- "enabling this policy will block any attempt (e.g., exploiting a "
1768
  "vulnerability, using a backdoor etc) to modify some important WordPress "
1769
  "settings. This policy will also send you an alert by email with all details "
1770
  "regarding the issue. It is enabled by default."
1771
  msgstr ""
1772
- "l'activation de cette politique bloquera toute tentative (par exemple, "
1773
  "l'exploitation d'une vulnérabilité, l'utilisation d'une porte dérobée, etc) "
1774
  "de modifier certains paramètres WordPress importants. Cette politique vous "
1775
  "enverra également une alerte par e-mail avec tous les détails concernant le "
1776
  "problème. Elle est activée par défaut."
1777
 
1778
- #: lib/help.php:172
1779
  msgid ""
1780
- "enabling this policy will block any attempt (e.g., exploiting a "
1781
  "vulnerability, using a backdoor etc) to create a user account. If you allow "
1782
  "user registration, you should not enable it."
1783
  msgstr ""
1784
- "l'activation de cette politique bloquera toute tentative (par exemple, "
1785
  "l'exploitation d'une vulnérabilité, l'utilisation d'une porte dérobée, etc) "
1786
  "de création d'un compte d'utilisateur. Si vous autorisez l'inscription des "
1787
  "utilisateurs, vous ne devez pas l'activer."
1788
 
1789
- #: lib/help.php:173
 
 
 
 
 
 
 
 
1790
  #, php-format
1791
  msgid ""
1792
- "many vulnerabilities in plugins are exploited via the admin-ajax.php script. "
1793
  "This policy will try to detect and immediately block bots and malicious "
1794
  "scanners trying to access it. The server IP address (%s) and private IP "
1795
  "addresses will not be blocked."
1796
  msgstr ""
1797
- "de nombreuses vulnérabilités dans les extensions WordPress sont exploitées "
1798
  "via le script admin-ajax.php. Cette politique essaiera de détecter et de "
1799
  "bloquer immédiatement les robots et les scanners malveillants qui tentent "
1800
  "d’y accéder. L'adresse IP du serveur (%s) et les adresses IP privées ne "
1801
  "seront pas bloquées."
1802
 
1803
- #: lib/help.php:174
1804
- msgid "Protect against username enumeration:"
1805
- msgstr "Protéger contre l'énumération des comptes utilisateurs&nbsp;:"
1806
-
1807
- #: lib/help.php:174
1808
  msgid ""
1809
- "it is possible to enumerate usernames either through the WordPress author "
1810
  "archives, the REST API or the login page. Although this is not a "
1811
  "vulnerability but a WordPress feature, some hackers use it to retrieve "
1812
  "usernames in order to launch more accurate brute-force attacks. If it is a "
@@ -1815,31 +1981,23 @@ msgid ""
1815
  "redirect the user to the blog index page. Regarding the WP REST API, it will "
1816
  "block the request immediately."
1817
  msgstr ""
1818
- "il est possible d'énumérer les noms des utilisateurs de votre blog via l'API "
1819
  "REST, la page d'archive d'un auteur ou la page de connexion au Tableau de "
1820
  "bord. Bien que ce ne soit pas une vulnérabilité, mais une caractéristique de "
1821
  "WordPress, certains hackers utilisent ces astuces pour récupérer les noms "
1822
  "d'utilisateur afin de lancer des attaques par force brute plus précises."
1823
 
1824
- #: lib/help.php:175
1825
- msgid "WordPress REST API:"
1826
- msgstr "API REST de WordPress :"
1827
-
1828
- #: lib/help.php:175
1829
  msgid ""
1830
- "it allows you to access your WordPress site's data through an easy-to-use "
1831
  "HTTP REST API. Since WordPress 4.7, it is enabled by default. NinjaFirewall "
1832
  "allows you to block any access to that API if you do not intend to use it."
1833
  msgstr ""
1834
- "elle vous permet d'accéder aux données de votre blog via l'API HTTP REST. "
1835
  "Depuis WordPress 4.7, cette elle est activée par défaut. NinjaFirewall vous "
1836
  "permet de bloquer tout accès a cette API si vous ne l'utilisez pas."
1837
 
1838
- #: lib/help.php:176
1839
- msgid "WordPress XML-RPC API:"
1840
- msgstr "API XML-RPC de WordPress :"
1841
-
1842
- #: lib/help.php:176
1843
  msgid ""
1844
  "XML-RPC is a remote procedure call (RPC) protocol which uses XML to encode "
1845
  "its calls and HTTP as a transport mechanism. WordPress has an XMLRPC API "
@@ -1859,105 +2017,108 @@ msgstr ""
1859
  "requêtes qui utilisent la méthode <code>system.multicall</code> ou les "
1860
  "Pingbacks."
1861
 
1862
- #: lib/help.php:177
1863
  msgid ""
1864
  "Block <code>POST</code> requests in the themes folder <code>/wp-content/"
1865
- "themes</code>:"
1866
  msgstr ""
1867
  "Bloquer les requêtes <code>POST</code> dans le dossier des thèmes <code>/wp-"
1868
- "content/themes</code>&nbsp;:"
1869
 
1870
- #: lib/help.php:177
1871
  msgid ""
1872
- "this option can be useful to block hackers from installing backdoor in the "
1873
  "PHP theme files. However, because some custom themes may include an HTML "
1874
  "form (contact, search form etc), this option is not enabled by default."
1875
  msgstr ""
1876
- "cette option peut être utile afin de bloquer l'exploitation de "
1877
  "vulnérabilités dans les fichiers PHP de vos thèmes. Toutefois, parce que "
1878
  "certains thèmes personnalisés peuvent inclure un formulaire HTML (formulaire "
1879
  "de recherche ou de contact etc) nécessitant des requêtes <code>POST</code> , "
1880
  "cette option n'est pas activée par défaut."
1881
 
1882
- #: lib/help.php:178
1883
- msgid "Force SSL for admin and logins <code>FORCE_SSL_ADMIN</code>:"
1884
  msgstr ""
1885
- "Forcer la connexion sécurisée au Tableau de bord <code>FORCE_SSL_ADMIN</"
1886
- "code>&nbsp;:"
1887
 
1888
- #: lib/help.php:178
1889
  msgid ""
1890
- "enable this option when you want to secure logins and the admin area so that "
1891
  "both passwords and cookies are never sent in the clear. Ensure that you can "
1892
  "access your admin console from HTTPS before enabling this option, otherwise "
1893
  "you will lock yourself out of your site!"
1894
  msgstr ""
1895
- "activez cette option lorsque vous souhaitez sécuriser les connexions à votre "
1896
  "Tableau de bord. Assurez-vous que vous pouvez accéder à votre page de "
1897
  "connexion via HTTPS avant d'activer cette option, sinon vous risquez de "
1898
- "bloquer l’accès à votre site&nbsp;!"
1899
 
1900
- #: lib/help.php:179
1901
- msgid "Disable the plugin and theme editor <code>DISALLOW_FILE_EDIT</code>:"
1902
  msgstr ""
1903
- "Désactiver l’éditeur de thème et d'extension <code>DISALLOW_FILE_EDIT</"
1904
- "code>&nbsp;:"
1905
 
1906
- #: lib/help.php:179
1907
  msgid ""
1908
- "disabling the plugin and theme editor provides an additional layer of "
1909
  "security if a hacker gains access to a well-privileged user account."
1910
  msgstr ""
1911
- "désactiver l’éditeur de thème et d'extension fournit une couche de sécurité "
1912
  "supplémentaire. Si un pirate accédait a votre compte administrateur, il ne "
1913
  "pourrait pas l'utiliser pour insérer une porte dérobée dans l'un de vos "
1914
  "scripts PHP."
1915
 
1916
- #: lib/help.php:180
1917
  msgid ""
1918
- "Disable plugin and theme update/installation <code>DISALLOW_FILE_MODS</code>:"
1919
  msgstr ""
1920
  "Désactiver l'installation et mise à jour des thèmes et extensions "
1921
- "<code>DISALLOW_FILE_MODS</code>&nbsp;:"
1922
 
1923
- #: lib/help.php:180
1924
  msgid ""
1925
- "this option will block users being able to use the plugin and theme "
1926
  "installation/update functionality from the WordPress admin area. Setting "
1927
  "this constant also disables the Plugin and Theme editor."
1928
  msgstr ""
1929
- "cette option permet de bloquer les utilisateurs voulant lancer une "
1930
  "installation ou mise à jour d'une extension ou d'un thème. Elle désactive "
1931
  "aussi l’éditeur de thème et d'extension."
1932
 
1933
- #: lib/help.php:181
1934
  msgid ""
1935
- "Disable the fatal error handler <code>WP_DISABLE_FATAL_ERROR_HANDLER</code>:"
1936
  msgstr ""
1937
  "Désactiver le gestionnaire d'erreurs fatales "
1938
- "<code>WP_DISABLE_FATAL_ERROR_HANDLER</code> :"
 
 
 
 
 
 
1939
 
1940
- #: lib/help.php:181
1941
  msgid ""
1942
- "this option will disable the WSOD protection introduced in WordPress 5.1."
 
 
1943
  msgstr ""
1944
- "cette option désactivera la protection WSOD introduite dans WordPress 5.1."
 
 
 
1945
 
1946
- #: lib/help.php:189
1947
  msgid "Whether to scan and/or sanitise the <code>GET</code> variable."
1948
  msgstr "S'il faut filtrer / nettoyer la variable <code>GET</code>."
1949
 
1950
- #: lib/help.php:192
1951
  msgid "Whether to scan and/or sanitise the <code>POST</code> variable."
1952
  msgstr "S'il faut filtrer / nettoyer la variable <code>POST</code>."
1953
 
1954
- #: lib/help.php:193
1955
- msgid "Decode Base64-encoded <code>POST</code> variable:"
1956
- msgstr ""
1957
- "Décoder les chaîne encodées en Base64 dans la variable <code>POST</"
1958
- "code>&nbsp;:"
1959
-
1960
- #: lib/help.php:193
1961
  msgid ""
1962
  "NinjaFirewall will decode and scan base64 encoded values in order to detect "
1963
  "obfuscated malicious code. This option is only available for the <code>POST</"
@@ -1966,43 +2127,38 @@ msgstr ""
1966
  "NinjaFirewall peut décoder et filtrer les chaînes de caractères encodées en "
1967
  "Base64 afin d'y détecter du code malveillant caché."
1968
 
1969
- #: lib/help.php:196
1970
  msgid "Whether to sanitise the <code>REQUEST</code> variable."
1971
  msgstr "S'il faut filtrer / nettoyer la variable <code>REQUEST</code>."
1972
 
1973
- #: lib/help.php:199
1974
  msgid "Whether to scan and/or sanitise cookies."
1975
  msgstr "S'il faut filtrer / nettoyer les cookies."
1976
 
1977
- #: lib/help.php:202
1978
  msgid "Whether to scan and/or sanitise <code>HTTP_USER_AGENT</code> requests."
1979
  msgstr "S'il faut filtrer / nettoyer la variable <code>HTTP_USER_AGENT</code>."
1980
 
1981
- #: lib/help.php:203
1982
- msgid "Block suspicious bots/scanners:"
1983
- msgstr "Bloquer les requêtes provenant de bots/scanners malveillants :"
1984
-
1985
- #: lib/help.php:203
1986
  msgid ""
1987
- "rejects some known bots, scanners and various malicious scripts attempting "
1988
  "to access your blog."
1989
  msgstr ""
1990
- "cette option peut bloquer de nombreux crawlers, spambots et autres scrappers."
1991
 
1992
- #: lib/help.php:206
1993
  msgid "Whether to scan and/or sanitise <code>HTTP_REFERER</code> requests."
1994
  msgstr "S'il faut filtrer / nettoyer la variable <code>HTTP_REFERER</code>."
1995
 
1996
- #: lib/help.php:207
1997
  msgid ""
1998
- "Block POST requests that do not have an <code>HTTP_REFERER</code> header:"
1999
  msgstr ""
2000
- "Bloquer les requêtes POST qui n'ont pas d'en-tête <code>HTTP_REFERER</"
2001
- "code>&nbsp;:"
2002
 
2003
- #: lib/help.php:207
2004
  msgid ""
2005
- "this option will block any <code>POST</code> request that does not have a "
2006
  "Referrer header (<code>HTTP_REFERER</code> variable). If you need external "
2007
  "applications to post to your scripts (e.g. Paypal IPN, WordPress WP-"
2008
  "Cron...), you are advised to keep this option disabled otherwise they will "
@@ -2010,19 +2166,18 @@ msgid ""
2010
  "have a Referrer header and, for that reason, this option is disabled by "
2011
  "default."
2012
  msgstr ""
2013
- "cette option bloque toutes les requêtes POST qui n'incluent pas le Referrer "
2014
  "<code>HTTP_REFERER</code> (adresse de la page -si elle existe- qui a conduit "
2015
  "le client à la page courante). Puisque les requêtes POST ne sont pas "
2016
  "obligées d'avoir un Referrer, cette option n'est pas activée par défaut. Si "
2017
  "vous utilisez des scripts comme Paypal IPN, WordPress WP-Cron etc, "
2018
  "désactivez cette fonction."
2019
 
2020
- #: lib/help.php:210
2021
- msgid "Block localhost IP in <code>GET/POST</code> requests:"
2022
- msgstr ""
2023
- "Bloquer les requêtes <code>GET/POST</code> contenant l'IP localhost&nbsp;:"
2024
 
2025
- #: lib/help.php:210
2026
  msgid ""
2027
  "this option will block any <code>GET</code> or <code>POST</code> request "
2028
  "containing the localhost IP (127.0.0.1). It can be useful to block SQL "
@@ -2033,34 +2188,23 @@ msgstr ""
2033
  "les programmes malveillants. Attention toutefois à ne pas bloquer certains "
2034
  "scripts d'installation ou de configuration si vous l'activez. "
2035
 
2036
- #: lib/help.php:211
2037
- msgid "Block HTTP requests with an IP in the <code>HTTP_HOST</code> header:"
2038
- msgstr ""
2039
- "Bloquer les requêtes HTTP dont l'en-tête <code>HTTP_HOST</code> contient une "
2040
- "IP&nbsp;:"
2041
-
2042
- #: lib/help.php:211
2043
  #, php-format
2044
  msgid ""
2045
- "this option will reject any request using an IP instead of a domain name in "
2046
  "the <code>Host</code> header of the HTTP request. Unless you need to connect "
2047
  "to your site using its IP address, (e.g. %s), enabling this option will "
2048
  "block a lot of hackers scanners because such applications scan IPs rather "
2049
  "than domain names."
2050
  msgstr ""
2051
- "cette option rejette toute requête HTTP contenant une adresse IP au lieu "
2052
  "d'un nom de domaine dans son en-tête <code>Host</code>. Sauf si vous avez "
2053
  "besoin de vous connecter à votre site en utilisant son adresse IP (ex: %s), "
2054
  "activer cette option bloquera de nombreux scanners de vulnérabilité car ces "
2055
  "application trouvent les sites en scannant les plages d'adresses IP plutôt "
2056
- "que les noms de domaine. "
2057
-
2058
- #: lib/help.php:212
2059
- msgid "Scan traffic coming from localhost and private IP address spaces:"
2060
- msgstr ""
2061
- "Filtrer les connexions provenant de localhost et d'adresses IP privées&nbsp;:"
2062
 
2063
- #: lib/help.php:212
2064
  msgid ""
2065
  "this option will allow the firewall to scan traffic from all non-routable "
2066
  "private IPs (IPv4 and IPv6) as well as the localhost IP. We recommend to "
@@ -2071,7 +2215,7 @@ msgstr ""
2071
  "Nous vous recommandons de le garder activé si vous avez 2 ou plusieurs "
2072
  "serveurs reliés entre eux."
2073
 
2074
- #: lib/help.php:221
2075
  msgid ""
2076
  "In addition to filtering incoming requests, NinjaFirewall can also hook the "
2077
  "HTTP response in order to alter its headers. Those modifications can help to "
@@ -2082,73 +2226,73 @@ msgstr ""
2082
  "peuvent aider à atténuer les menaces telles que les attaques XSS, phishing "
2083
  "et clickjacking."
2084
 
2085
- #: lib/help.php:223
2086
  msgid ""
2087
  "Set <code>X-Content-Type-Options</code> to protect against MIME type "
2088
- "confusion attacks:"
2089
  msgstr ""
2090
- "Activer <code>X-Content-Type-Options</code> pour protéger contre les "
2091
- "attaques basées sur la confusion du type MIME&nbsp;:"
2092
 
2093
- #: lib/help.php:223
2094
  msgid ""
2095
- "this header will send the nosniff value to instruct the browser to disable "
2096
  "content or MIME sniffing and to use the content-type returned by the server. "
2097
  "Some browsers try to guess (sniff) and override the content-type by looking "
2098
  "at the content itself which, in some cases, could lead to security issues "
2099
  "such as MIME Confusion Attacks."
2100
  msgstr ""
2101
- "cet en-tête enverra la valeur \"nosniff\" pour indiquer au navigateur de "
2102
  "désactiver le reniflage de contenu ou type MIME et d'utiliser le type "
2103
  "retourné par le serveur. Certains navigateurs tentent de deviner (sniff) et "
2104
  "de contourner le type de contenu en regardant le contenu lui-même ce qui, "
2105
  "dans certains cas, peut entraîner des problèmes de sécurité tels que les "
2106
  "attaques basées sur la confusion du type MIME."
2107
 
2108
- #: lib/help.php:224
2109
  msgid ""
2110
- "Set <code>X-Frame-Options</code> to protect against clickjacking attempts:"
2111
  msgstr ""
2112
  "Activer <code>X-Frame-Options</code> pour protéger contre les attaques de "
2113
- "détournement de clic (clickjacking)&nbsp;:"
2114
 
2115
- #: lib/help.php:224
2116
  msgid ""
2117
- "this header indicates a policy whether a browser must not allow to render a "
2118
  "page in a &lt;frame&gt; or &lt;iframe&gt;. Hosts can declare this policy in "
2119
  "the header of their HTTP responses to prevent clickjacking attacks, by "
2120
  "ensuring that their content is not embedded into other pages or frames. "
2121
  "NinjaFirewall accepts two different values:"
2122
  msgstr ""
2123
- "cet en-tête informe le navigateur s'il doit autoriser ou non l'affichage "
2124
  "d'une page dans une &lt;frame&gt; ou &lt;iframe&gt;. Cela permet d'empêcher "
2125
  "les attaques de clickjacking, en veillant à ce que le contenu d'une page ne "
2126
  "sont pas intégré dans d'autres pages ou cadres, notamment d'un autre site. "
2127
- "NinjaFirewall accepte deux valeurs différentes&nbsp;:"
2128
 
2129
- #: lib/help.php:226
2130
  msgid ""
2131
- "a browser receiving content with this header must not display this content "
2132
  "in any frame from a page of different origin than the content itself."
2133
  msgstr ""
2134
- "un navigateur ne doit pas afficher le contenu dans une &lt;frame&gt; ou &lt;"
2135
  "iframe&gt; d'une page d'origine différente que le contenu lui-même."
2136
 
2137
- #: lib/help.php:227
2138
  msgid ""
2139
- "a browser receiving content with this header must not display this content "
2140
  "in any frame."
2141
  msgstr ""
2142
- "un navigateur ne doit jamais afficher le contenu dans une &lt;frame&gt; ou "
2143
  "&lt;iframe&gt;"
2144
 
2145
- #: lib/help.php:230
2146
  msgid "NinjaFirewall does not support the <code>ALLOW-FROM</code> value."
2147
  msgstr ""
2148
  "La valeur <code>ALLOW-FROM</code> n'est pas prise en charge par "
2149
  "NinjaFirewall."
2150
 
2151
- #: lib/help.php:232
2152
  msgid ""
2153
  "Since v3.1.3, WordPress sets this value to <code>SAMEORIGIN</code> for the "
2154
  "administrator and the login page only."
@@ -2156,24 +2300,24 @@ msgstr ""
2156
  "Depuis la version 3.1.3, WordPress active <code>SAMEORIGIN</code> pour "
2157
  "l'administrateur et la page de connexion uniquement."
2158
 
2159
- #: lib/help.php:233
2160
  msgid ""
2161
  "Set <code>X-XSS-Protection</code> (IE/Edge, Chrome, Opera and Safari "
2162
- "browsers):"
2163
  msgstr ""
2164
  "Activer <code>X-XSS-Protection</code> (IE/Edge, Opera, Chrome et Safari)"
2165
 
2166
- #: lib/help.php:233
2167
  msgid ""
2168
- "this header allows browsers to identify and block XSS attacks by preventing "
2169
  "malicious scripts from executing. It is enabled by default on all compatible "
2170
  "browsers."
2171
  msgstr ""
2172
- "cet en-tête permet aux navigateurs compatibles d'identifier et bloquer les "
2173
  "attaques XSS en empêchant un script malveillant de s'exécuter. Notez que "
2174
  "cette option est activée par défaut sur ces navigateurs."
2175
 
2176
- #: lib/help.php:234
2177
  msgid ""
2178
  "If a visitor disabled their browser's XSS filter, you cannot re-enable it "
2179
  "with that option."
@@ -2181,33 +2325,32 @@ msgstr ""
2181
  "Si un visiteur désactive le filtre XSS de son navigateur, vous ne pouvez pas "
2182
  "le réactiver avec cette option."
2183
 
2184
- #: lib/help.php:236
2185
  msgid ""
2186
- "Force <code>SameSite</code> flag on all cookies to mitigate CSRF attacks:"
2187
  msgstr ""
2188
  "Activer la propriété <code>SameSite</code> pour tous les cookies afin "
2189
- "d'atténuer les attaques CSRF :"
2190
 
2191
- #: lib/help.php:236
2192
  msgid ""
2193
- "adding this flag to cookies helps to mitigate the risk of CSRF (cross-site "
2194
  "request forgery) attacks because cookies can only be sent in requests "
2195
  "originating from the same origin as the target domain."
2196
  msgstr ""
2197
- "cette protection permet de diminuer les risques d'attaques CSRF (injection "
2198
  "de requête illégitime par rebond), car les cookies ne peuvent être envoyés "
2199
  "que dans des requêtes provenant de la même origine que le domaine cible."
2200
 
2201
- #: lib/help.php:237
2202
- msgid ""
2203
- "Force <code>HttpOnly</code> flag on all cookies to mitigate XSS attacks:"
2204
  msgstr ""
2205
  "Activer la propriété <code>HttpOnly</code> pour tous les cookies afin "
2206
- "d'atténuer les menaces XSS qui génèrent des vols de cookies&nbsp;:"
2207
 
2208
- #: lib/help.php:237
2209
  msgid ""
2210
- "adding this flag to cookies helps to mitigate the risk of cross-site "
2211
  "scripting by preventing them from being accessed through client-side "
2212
  "scripts. NinjaFirewall can hook all cookies sent by your blog, its plugins "
2213
  "or any other PHP script, add the <code>HttpOnly</code> flag if it is "
@@ -2215,14 +2358,14 @@ msgid ""
2215
  "headers right before they are sent to your visitors. Note that WordPress "
2216
  "sets that flag on the logged in user cookies only."
2217
  msgstr ""
2218
- "cette protection permet de diminuer les risques d'attaques XSS en empêchant "
2219
  "JavaScript d'accéder aux cookies de l'utilisateur. NinjaFirewall peut "
2220
  "intercepter les cookies envoyés par vos scripts PHP, activer la propriété "
2221
  "<code>HttpOnly</code> si elle est manquante, puis réinjecter les cookies "
2222
  "dans la réponse HTTP juste avant que celle-ci ne soit envoyée à vos "
2223
  "visiteurs."
2224
 
2225
- #: lib/help.php:238
2226
  msgid ""
2227
  "If your PHP scripts send cookies that need to be accessed from JavaScript, "
2228
  "you should keep that option disabled."
@@ -2230,42 +2373,42 @@ msgstr ""
2230
  "Si vos scripts PHP envoient des cookies qui doivent être accessibles à "
2231
  "partir de JavaScript, vous devez garder cette option désactivée."
2232
 
2233
- #: lib/help.php:239
2234
  msgid ""
2235
  "Set <code>Strict-Transport-Security</code> (HSTS) to enforce secure "
2236
- "connections to the server:"
2237
  msgstr ""
2238
  "Activer <code>Strict-Transport-Security</code> (HSTS) pour forcer les "
2239
- "connexions sécurisées vers le serveur&nbsp;"
2240
 
2241
- #: lib/help.php:239
2242
  msgid ""
2243
- "this policy enforces secure HTTPS connections to the server. Web browsers "
2244
  "will not allow the user to access the web application over insecure HTTP "
2245
  "protocol. It helps to defend against cookie hijacking and Man-in-the-middle "
2246
  "attacks. Most recent browsers support HSTS headers."
2247
  msgstr ""
2248
- "cette politique force les connexions HTTPS sécurisées vers le serveur. Les "
2249
  "navigateurs n'accepteront pas de se connecter au site si la connexion n'est "
2250
  "pas sécurisée (HTTPS). Cela permet de se défendre contre les détournements "
2251
  "de cookies ou les attaques du type \"Man-in-the-middle\". La plupart des "
2252
  "navigateurs récents sont compatibles avec cette politique."
2253
 
2254
- #: lib/help.php:240
2255
- msgid "Set <code>Content-Security-Policy</code>:"
2256
- msgstr "Activer <code>Content-Security-Policy</code> :"
2257
 
2258
- #: lib/help.php:240
2259
  msgid ""
2260
- "this policy helps to mitigate threats such as XSS, phishing and clickjacking "
2261
  "attacks. It covers JavaScript, CSS, HTML frames, web workers, fonts, images, "
2262
  "objects (Java, ActiveX, audio and video files), and other HTML5 features."
2263
  msgstr ""
2264
- "cette politique aide pour bloquer les attaques XSS notamment. Elle couvre le "
2265
  "code JavaScript, les styles CSS, frames/iframes HTML, polices, images, "
2266
  "objets (Java, ActiveX, fichiers audio et video), mais aussi les WebSocket."
2267
 
2268
- #: lib/help.php:240
2269
  msgid ""
2270
  "NinjaFirewall lets you configure the CSP policy separately for the frontend "
2271
  "(blog, website) and the backend (WordPress admin dashboard)."
@@ -2273,23 +2416,23 @@ msgstr ""
2273
  "NinjaFirewall vous permet de configurer CSP séparément pour le site et "
2274
  "l'interface d'administration de WordPress."
2275
 
2276
- #: lib/help.php:241
2277
- msgid "Set <code>Referrer-Policy</code>:"
2278
- msgstr "Activer <code>Referrer-Policy</code> :"
2279
 
2280
- #: lib/help.php:241
2281
  msgid ""
2282
- "this HTTP header governs which referrer information, sent in the Referer "
2283
  "header, should be included with requests made."
2284
  msgstr ""
2285
- "cet en-tête HTTP détermine quelles informations de provenance doivent être "
2286
  "incluses dans l'en-tête Referer."
2287
 
2288
- #: lib/help.php:245
2289
- msgid "Block PHP built-in wrappers:"
2290
- msgstr "Bloquer les gestionnaires (wrappers) PHP dangereux&nbsp;:"
2291
 
2292
- #: lib/help.php:245
2293
  msgid ""
2294
  "PHP has several wrappers for use with the filesystem functions. It is "
2295
  "possible for an attacker to use them to bypass firewalls and various IDS to "
@@ -2309,11 +2452,11 @@ msgstr ""
2309
  "requête <code>GET</code> ou <code>POST</code>, des cookies, ou dans les "
2310
  "variables <code>HTTP_REFERER</code> et <code>HTTP_USER_AGENT</code>."
2311
 
2312
- #: lib/help.php:246
2313
- msgid "Block serialized PHP objects:"
2314
- msgstr "Bloquer les objets PHP sérialisés :"
2315
 
2316
- #: lib/help.php:246
2317
  #, php-format
2318
  msgid ""
2319
  "Object Serialization is a PHP feature used by many applications to generate "
@@ -2332,209 +2475,112 @@ msgstr ""
2332
  "<code>POST</code>, les cookies, ou dans les variables <code>HTTP_REFERER</"
2333
  "code> et <code>HTTP_USER_AGENT</code>."
2334
 
2335
- #: lib/help.php:247
2336
- msgid "Hide PHP notice and error messages:"
2337
- msgstr "Masquer les messages d'erreur de PHP&nbsp;:"
2338
-
2339
- #: lib/help.php:247
2340
  msgid ""
2341
- "this option lets you hide errors returned by your scripts. Such errors can "
2342
  "leak sensitive informations which can be exploited by hackers."
2343
  msgstr ""
2344
- "vous permet de masquer les erreurs retournées par PHP. Ces erreurs peuvent "
2345
  "afficher des informations sensibles qui peuvent être exploitées "
2346
  "ultérieurement par des pirates."
2347
 
2348
- #: lib/help.php:248
2349
  msgid ""
2350
  "Sanitise <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
2351
- "<code>PATH_INFO</code>:"
2352
  msgstr ""
2353
  "Nettoyer <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
2354
- "<code>PATH_INFO</code>&nbsp;:"
2355
 
2356
- #: lib/help.php:248
2357
  msgid ""
2358
- "this option can sanitise any dangerous characters found in those 3 server "
2359
  "variables to prevent various XSS and database injection attempts."
2360
  msgstr ""
2361
- "activez ces options si vous souhaitez que le pare-feu nettoie ces trois "
2362
  "variables."
2363
 
2364
- #: lib/help.php:251
2365
  #, php-format
2366
  msgid ""
2367
- "Block the <code>DOCUMENT_ROOT</code> server variable (%s) in HTTP requests:"
2368
  msgstr ""
2369
  "Bloquer les requêtes HTTP contenant la variable <code>DOCUMENT_ROOT</code> "
2370
- "(%s)&nbsp;:"
2371
 
2372
- #: lib/help.php:251
2373
  msgid ""
2374
- "this option will block scripts attempting to pass the <code>DOCUMENT_ROOT</"
2375
  "code> server variable in a <code>GET</code> or <code>POST</code> request. "
2376
  "Hackers use shell scripts that often need to pass this value, but most "
2377
  "legitimate programs do not."
2378
  msgstr ""
2379
- "cette option bloque toute tentative de passer la variable "
2380
  "<code>DOCUMENT_ROOT</code> dans une requête <code>GET</code> ou <code>POST</"
2381
  "code>. Les pirates utilisent souvent des scripts qui nécessitent d'utiliser "
2382
  "cette variable, mais pas la plupart des applications légitimes (hormis "
2383
  "certains scripts d'installation ou de configuration)."
2384
 
2385
- #: lib/help.php:252
2386
- msgid "Block ASCII character 0x00 (NULL byte):"
2387
- msgstr "Bloquer le caractère ASCII 0x00 (NULL byte)&nbsp;:"
2388
-
2389
- #: lib/help.php:252
2390
  msgid ""
2391
- "this option will reject any <code>GET</code> or <code>POST</code> request, "
2392
  "<code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, <code>PHP_SELF</"
2393
  "code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> variables "
2394
  "containing the ASCII character 0x00 (NULL byte). Such a character is "
2395
  "dangerous and should always be rejected."
2396
  msgstr ""
2397
- "toute requête <code>GET</code> ou <code>POST</code>, ainsi que toute "
2398
- "variable <code>HTTP_REFERER</code>, <code>HTTP_USER_AGENT</code>, "
2399
- "<code>REQUEST_URI</code>, <code>PHP_SELF</code>, <code>PATH_INFO</code> "
2400
  "contenant le caractère ASCI 0x00 (NULL byte) sera bloquée immédiatement. Ce "
2401
  "caractère est dangereux et devrait toujours être rejeté."
2402
 
2403
- #: lib/help.php:253
2404
- msgid "Block ASCII control characters 1 to 8 and 14 to 31:"
2405
- msgstr "Bloquer les caractères de contrôle ASCII 1 à 8 et 14 à 31&nbsp;:"
2406
-
2407
- #: lib/help.php:253
2408
  msgid ""
2409
- "this option will reject any <code>GET</code> or <code>POST</code> request, "
2410
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> variables containing "
2411
  "ASCII characters from 1 to 8 and 14 to 31."
2412
  msgstr ""
2413
- "toute requête <code>GET</code> ou <code>POST</code>, ainsi que toute "
2414
  "variable <code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> contenant "
2415
  "des caractères ASCII 1 à 8 et 14 à 31 sera bloquée."
2416
 
2417
- #: lib/help.php:261
2418
- #, php-format
 
 
 
2419
  msgid ""
2420
- "By default, any logged in WordPress administrator will not be blocked by "
2421
- "NinjaFirewall. You can also add any logged in users to the whitelist (make "
2422
- "sure you trust them all before doing so).<br />This feature applies to all "
2423
- "Firewall Policies listed below, except <code>FORCE_SSL_ADMIN</code>, "
2424
- "<code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> options and "
2425
- "the <a href=\"%s\">Login Protection</a> which, if enabled, are always "
2426
- "enforced."
2427
  msgstr ""
2428
- "Par défaut, tout administrateur connecté à WordPress ne sera pas bloqué par "
2429
- "NinjaFirewall. Vous pouvez aussi ajouter à la liste blanche tous les autres "
2430
- "utilisateurs connectés (avant de le faire, assurez-vous que ce sont tous des "
2431
- "utilisateurs de confiance).<br />Cela vaut pour toutes les politiques de "
2432
- "pare-feu énumérées ci-dessous, à l'exception de <code>FORCE_SSL_ADMIN</"
2433
- "code>, <code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> et "
2434
- "les options de la <a href=\"%s\">Page de Connexion</a> qui, si elle sont "
2435
- "activées, seront toujours appliquées."
2436
-
2437
- #: lib/help.php:273 lib/monitoring.php:46
2438
- msgid "File Guard"
2439
- msgstr "File Guard"
2440
 
2441
- #: lib/help.php:275
2442
  msgid ""
2443
- "File Guard can detect, in real-time, any access to a PHP file that was "
2444
- "recently modified or created, and alert you about this."
 
 
2445
  msgstr ""
2446
- "File Guard peut détecter, en temps réel, tout accès à un fichier PHP qui a "
2447
- "été récemment modifié ou créé, et vous alerter à ce sujet."
 
 
 
2448
 
2449
- #: lib/help.php:277
 
2450
  msgid ""
2451
- "If a hacker uploaded a shell script to your site (or injected a backdoor "
2452
- "into an already existing file) and tried to directly access that file using "
2453
- "his browser or a script, NinjaFirewall would hook the HTTP request and "
2454
- "immediately detect that the file was recently modified/created. It would "
2455
- "send you a detailed alert (script name, IP, request, date and time). Alerts "
2456
- "will be sent to the contact email address defined in the \"Event "
2457
- "Notifications\" menu."
2458
  msgstr ""
2459
- "Si un pirate téléchargeait un script PHP sur votre site (ou injectait une "
2460
- "porte dérobée dans un fichier existant) et essayait d'accéder directement à "
2461
- "ce fichier en utilisant son navigateur ou un autre script, NinjaFirewall "
2462
- "intercepterait la requête HTTP et détecterait immédiatement que le fichier a "
2463
- "été récemment modifié ou créé. Il vous enverrait une alerte détaillée (nom "
2464
- "du script, adresse IP, requête HTTP, la date et l'heure). Les alertes seront "
2465
- "envoyées à l'adresse e-mail de contact définie dans le menu \"Notifications "
2466
- "d’Événement\"."
2467
 
2468
- #: lib/help.php:278
2469
- msgid ""
2470
- "If you do not want to monitor a folder, you can exclude its full path or a "
2471
- "part of it (e.g., <code>/var/www/public_html/cache/</code> or <code>/cache/</"
2472
- "code> etc). NinjaFirewall will compare this value to the <code>"
2473
- "$_SERVER[\"SCRIPT_FILENAME\"]</code> server variable and, if it matches, "
2474
- "will ignore it."
2475
- msgstr ""
2476
- "Pour exclure un répertoire, vous pouvez entrer son chemin complet ou une "
2477
- "partie de celui-ci (par ex. <code>/var/www/public_html/cache/</code> ou "
2478
- "simplement <code>/cache/</code>). NinjaFirewall comparera cette valeur à la "
2479
- "variable <code>$_SERVER[\"SCRIPT_FILENAME\"]</code> et, si elle correspond, "
2480
- "l'ignorera."
2481
-
2482
- #: lib/help.php:279
2483
- msgid ""
2484
- "Multiple values must be comma-separated (e.g., <code>/foo/bar/,/cache/</"
2485
- "code>)."
2486
- msgstr ""
2487
- "Plusieurs valeurs doivent être séparées par des virgules (par ex. <code>/foo/"
2488
- "bar/,/cache/</code>)."
2489
-
2490
- #: lib/help.php:280
2491
- msgid ""
2492
- "File Guard real-time detection is a totally unique feature, because "
2493
- "NinjaFirewall is the only plugin for WordPress that can hook HTTP requests "
2494
- "sent to any PHP script, even if that script is not part of the WordPress "
2495
- "package (third-party software, shell script, backdoor etc)."
2496
- msgstr ""
2497
- "La détection en temps réel de File Guard est une caractéristique tout à fait "
2498
- "unique, parce NinjaFirewall est la seule extension pour WordPress pouvant "
2499
- "intercepter les requêtes HTTP envoyées à tout script PHP, même si ce dernier "
2500
- "ne fait pas partie de WordPress (logiciel tiers, backdoor, etc)."
2501
-
2502
- #: lib/help.php:286 lib/monitoring.php:47
2503
- msgid "File Check"
2504
- msgstr "File Check"
2505
-
2506
- #: lib/help.php:287
2507
- msgid ""
2508
- "File Check lets you perform file integrity monitoring upon request or on a "
2509
- "specific interval."
2510
- msgstr ""
2511
- "File Check vous permet d'effectuer une analyse de l'intégrité de vos "
2512
- "fichiers sur demande ou à un intervalle spécifique défini."
2513
-
2514
- #: lib/help.php:289
2515
- msgid ""
2516
- "You need to create a snapshot of all your files and then, at a later time, "
2517
- "you can scan your system to compare it with the previous snapshot. Any "
2518
- "modification will be immediately detected: file content, file permissions, "
2519
- "file ownership, timestamp as well as file creation and deletion."
2520
- msgstr ""
2521
- "Vous devez créer un instantané de tous vos fichiers, puis, ultérieurement, "
2522
- "vous pouvez scanner votre système pour le comparer avec l'instantané "
2523
- "précédent. Toute modification sera immédiatement détectée&nbsp;: contenu, "
2524
- "permissions et propriétés des fichiers, leur création et suppression ainsi "
2525
- "que l'horodatage."
2526
-
2527
- #: lib/help.php:291
2528
- #, php-format
2529
- msgid ""
2530
- "Create a snapshot of all files stored in that directory: by default, the "
2531
- "directory is set to WordPress <code>ABSPATH</code> (%s)"
2532
- msgstr ""
2533
- "Créer un instantané de tous les fichiers se trouvant dans ce "
2534
- "répertoire&nbsp;: par défaut, le repertoire est l'<code>ABSPATH</code> de "
2535
- "WordPress (%s)"
2536
-
2537
- #: lib/help.php:292
2538
  msgid ""
2539
  "Exclude the following files/folders: you can enter a directory or a file "
2540
  "name (e.g., <code>/foo/bar/</code>), or a part of it (e.g., <code>foo</"
@@ -2545,7 +2591,7 @@ msgstr ""
2545
  "partie de celui-ci (par ex. <code>foo</code>), ou même exclure une extension "
2546
  "de fichier (par ex. <code>.css</code>)."
2547
 
2548
- #: lib/help.php:294
2549
  msgid ""
2550
  "Multiple values must be comma-separated (e.g., <code>/foo/bar/,.css,.png</"
2551
  "code>)."
@@ -2553,7 +2599,7 @@ msgstr ""
2553
  "Plusieurs valeurs doivent être séparées par des virgules (par ex. <code>/foo/"
2554
  "bar/,.css,.png</code>)."
2555
 
2556
- #: lib/help.php:295
2557
  msgid ""
2558
  "Do not follow symbolic links: by default, NinjaFirewall will not follow "
2559
  "symbolic links."
@@ -2561,11 +2607,11 @@ msgstr ""
2561
  "Ne pas suivre les liens symboliques&nbsp;: par défaut, NinjaFirewall ignore "
2562
  "les liens symboliques lors de son analyse des fichiers."
2563
 
2564
- #: lib/help.php:298
2565
  msgid "Scheduled scans"
2566
  msgstr "Analyses planifiées"
2567
 
2568
- #: lib/help.php:299
2569
  msgid ""
2570
  "NinjaFirewall can scan your system on a specific interval (hourly, "
2571
  "twicedaily or daily)."
@@ -2573,7 +2619,7 @@ msgstr ""
2573
  "NinjaFirewall peut scanner votre système à intervalle régulier (une fois par "
2574
  "heure, deux fois par jour ou tous les jours)."
2575
 
2576
- #: lib/help.php:301
2577
  msgid ""
2578
  "It can either send you a scan report only if changes are detected, or always "
2579
  "send you one after each scan."
@@ -2582,7 +2628,7 @@ msgstr ""
2582
  "été détectés, ou bien vous en envoyer un systématiquement après chaque "
2583
  "analyse."
2584
 
2585
- #: lib/help.php:303
2586
  msgid ""
2587
  "Reports will be sent to the contact email address defined in the \"Event "
2588
  "Notifications\" menu."
@@ -2590,7 +2636,7 @@ msgstr ""
2590
  "Les rapports seront envoyés à l'adresse e-mail définie dans la page "
2591
  "\"Notifications d'Événement\"."
2592
 
2593
- #: lib/help.php:305
2594
  #, php-format
2595
  msgid ""
2596
  "Scheduled scans rely on <a href=\"%s\">WordPress pseudo cron</a> which works "
@@ -2599,11 +2645,76 @@ msgstr ""
2599
  "Les analyses planifiées utilisent le <a href=\"%s\">pseudo cron de "
2600
  "WordPress</a> qui ne fonctionne que si votre site reçoit un trafic suffisant."
2601
 
2602
- #: lib/help.php:315 lib/network.php:32 ninjafirewall.php:760
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2603
  msgid "Network"
2604
  msgstr "Réseau"
2605
 
2606
- #: lib/help.php:317
2607
  msgid ""
2608
  "Even if NinjaFirewall administration menu is only available to the Super "
2609
  "Admin (from the main site), you can still display its status to all sites in "
@@ -2615,7 +2726,7 @@ msgstr ""
2615
  "du réseau en ajoutant une petite icône à leur barre d'administration. Elle "
2616
  "ne sera visible que par les administrateurs de ces sites."
2617
 
2618
- #: lib/help.php:319
2619
  msgid ""
2620
  "It is recommended to enable this feature as it is the only way to know "
2621
  "whether the sites in your network are protected and if NinjaFirewall "
@@ -2625,7 +2736,7 @@ msgstr ""
2625
  "si les sites de votre réseau sont protégés et si l'installation de "
2626
  "NinjaFirewall a réussi."
2627
 
2628
- #: lib/help.php:321
2629
  msgid ""
2630
  "Note that when it is disabled, the icon still remains visible to you, the "
2631
  "Super Admin."
@@ -2633,7 +2744,7 @@ msgstr ""
2633
  "Notez que même lorsqu'il est désactivé, l'icône reste visible pour vous, le "
2634
  "Super Administrateur."
2635
 
2636
- #: lib/help.php:333
2637
  msgid ""
2638
  "NinjaFirewall can alert you by email on specific events triggered within "
2639
  "your blog. They include installations, updates, activations etc, as well as "
@@ -2652,11 +2763,11 @@ msgstr ""
2652
  "après avoir pénétré dans votre Tableau de bord de WordPress, d'y installer "
2653
  "une porte dérobée (backdoor) afin de prendre le contrôle de votre blog."
2654
 
2655
- #: lib/help.php:344 lib/login_protection.php:21 ninjafirewall.php:768
2656
  msgid "Login Protection"
2657
  msgstr "Page de Connexion"
2658
 
2659
- #: lib/help.php:348
2660
  msgid ""
2661
  "By processing incoming HTTP requests before your blog and any of its "
2662
  "plugins, NinjaFirewall is the only plugin for WordPress able to protect it "
@@ -2669,7 +2780,7 @@ msgstr ""
2669
  "compris les attaques distribuées provenant de plusieurs milliers d'adresses "
2670
  "IP différentes."
2671
 
2672
- #: lib/help.php:350
2673
  msgid ""
2674
  "You can choose two different types of protection: a password or a captcha. "
2675
  "You can enable the protection only if an attack is detected or to keep it "
@@ -2679,11 +2790,11 @@ msgstr ""
2679
  "captcha. Vous pouvez choisir d'activer la protection uniquement lorsqu'une "
2680
  "attaque est détectée ou bien l'activer en permanence."
2681
 
2682
- #: lib/help.php:352
2683
  msgid "Yes, if under attack:"
2684
  msgstr "Oui, si attaque en cours :"
2685
 
2686
- #: lib/help.php:354
2687
  msgid ""
2688
  "The protection will be triggered when too many login attempts are detected, "
2689
  "regardless of the offending IP. It blocks the attack instantly and prevents "
@@ -2698,11 +2809,11 @@ msgstr ""
2698
  "utilisant soit une combinaison nom d'utilisateur / mot de passe prédéfinie, "
2699
  "soit un code captcha."
2700
 
2701
- #: lib/help.php:356
2702
  msgid "Always ON:"
2703
  msgstr "Toujours activée :"
2704
 
2705
- #: lib/help.php:358
2706
  msgid ""
2707
  "NinjaFirewall will always enforce the HTTP authentication or captcha "
2708
  "implementation each time you access the login page."
@@ -2710,11 +2821,11 @@ msgstr ""
2710
  "Vous serez toujours invité à saisir votre nom d'utilisateur / mot de passe, "
2711
  "ou le code du captcha, chaque fois que vous accéderez à la page de connexion."
2712
 
2713
- #: lib/help.php:361
2714
  msgid "Type of protection:"
2715
  msgstr "Type de protection :"
2716
 
2717
- #: lib/help.php:362
2718
  msgid ""
2719
  "<b>Password:</b> It password-protects the login page. NinjaFirewall uses its "
2720
  "own very fast authentication scheme and it is compatible with any HTTP "
@@ -2724,15 +2835,15 @@ msgstr ""
2724
  "utilise son propre système d'authentification, rapide et compatible avec "
2725
  "n'importe quel serveur HTTP (Apache, Nginx, Lighttpd etc)."
2726
 
2727
- #: lib/help.php:363
2728
  msgid "<b>Captcha:</b> It will display a 5-character captcha code."
2729
  msgstr "<b>Captcha :</b> Affichera un code captcha à 5 caractères."
2730
 
2731
- #: lib/help.php:364
2732
  msgid "Bot protection:"
2733
  msgstr "Protection contre les bots :"
2734
 
2735
- #: lib/help.php:365
2736
  msgid ""
2737
  "NinjaFirewall will attempt to block bots and scripts immediately, i.e., even "
2738
  "before they start a brute-force attack."
@@ -2740,11 +2851,11 @@ msgstr ""
2740
  "NinjaFirewall tentera de bloquer les bots et les scripts immédiatement, "
2741
  "c'est-à-dire avant même qu'ils ne commencent une attaque par force brute."
2742
 
2743
- #: lib/help.php:373
2744
  msgid "AUTH log"
2745
  msgstr "Journal d'authentification"
2746
 
2747
- #: lib/help.php:376
2748
  msgid ""
2749
  "NinjaFirewall can write to the server Authentication log when the brute-"
2750
  "force protection is triggered. This can be useful to the system "
@@ -2756,7 +2867,7 @@ msgstr ""
2756
  "surveillance ou pour bloquer l'IP incriminée au niveau du pare-feu du "
2757
  "serveur."
2758
 
2759
- #: lib/help.php:378
2760
  msgid ""
2761
  "If you have a shared hosting account, keep this option disabled as you do "
2762
  "not have any access to the server's logs."
@@ -2764,7 +2875,7 @@ msgstr ""
2764
  "Si vous avez un hébergement mutualisé, laissez cette option désactivée car "
2765
  "vous n'avez pas accès aux journaux du serveur."
2766
 
2767
- #: lib/help.php:380
2768
  msgid ""
2769
  "On Debian-based systems, the log is located in <code>/var/log/auth.log</"
2770
  "code>, and on Red Hat-based systems in <code>/var/log/secure</code>. The "
@@ -2774,19 +2885,19 @@ msgstr ""
2774
  "sous Red Hat, dans <code>/var/log/secure</code>. Le format utilisé est le "
2775
  "suivant&nbsp;:"
2776
 
2777
- #: lib/help.php:383
2778
  msgid "AA: the process ID (PID)."
2779
  msgstr "AA : l'identifiant de processus (PID)."
2780
 
2781
- #: lib/help.php:384
2782
  msgid "BB: the user IPv4 or IPv6 address."
2783
  msgstr "BB : L'adresse IPv4 ou IPv6 de l'utilisateur."
2784
 
2785
- #: lib/help.php:385
2786
  msgid "CC: the blog (sub-)domain name."
2787
  msgstr "CC : le nom de (sous-)domaine du blog."
2788
 
2789
- #: lib/help.php:386
2790
  msgid ""
2791
  "DD: the target: it can be either <code>wp-login.php</code> or <code>XML-RPC "
2792
  "API</code>."
@@ -2794,16 +2905,16 @@ msgstr ""
2794
  "DD : la cible; il peut s'agir soit de <code>wp-login.php</code>, soit de "
2795
  "<code>XML-RPC API</code>."
2796
 
2797
- #: lib/help.php:387
2798
  msgid "EE: the time, in minutes, the protection will remain active."
2799
  msgstr ""
2800
  "EE : le temps, en minutes, pendant lequel la protection restera active."
2801
 
2802
- #: lib/help.php:389
2803
  msgid "Sample loglines:"
2804
  msgstr "Exemple :"
2805
 
2806
- #: lib/help.php:392
2807
  #, php-format
2808
  msgid ""
2809
  "Be careful if you are behind a load balancer, reverse-proxy or CDN because "
@@ -2823,11 +2934,11 @@ msgstr ""
2823
  "Alternativement, vous pouvez utiliser le fichier <code><a href=\"%s\">."
2824
  "htninja</a></code>."
2825
 
2826
- #: lib/help.php:406 lib/logs.php:39 lib/wpplus.php:206
2827
  msgid "Firewall Log"
2828
  msgstr "Journal du Pare-feu"
2829
 
2830
- #: lib/help.php:409
2831
  msgid ""
2832
  "The firewall log displays blocked and sanitised requests as well as some "
2833
  "useful information. It has 6 columns:"
@@ -2835,18 +2946,18 @@ msgstr ""
2835
  "Le journal du pare-feu affiche les requêtes HTTP qui ont été bloquées ou "
2836
  "nettoyées ainsi que d'autres informations utiles. Il a six colonnes&nbsp;:"
2837
 
2838
- #: lib/help.php:410
2839
  msgid "DATE : date and time of the incident."
2840
  msgstr "DATE : date et heure de l'incident."
2841
 
2842
- #: lib/help.php:411
2843
  msgid ""
2844
  "INCIDENT : unique incident number/ID as it was displayed to the blocked user."
2845
  msgstr ""
2846
  "INCIDENT : le numéro d'incident (ID) unique. Par défaut, il sera aussi "
2847
  "affiché à l'utilisateur dont la requête aura été bloquée par le pare-feu."
2848
 
2849
- #: lib/help.php:412
2850
  msgid ""
2851
  "LEVEL : level of severity (<code>CRITICAL</code>, <code>HIGH</code> or "
2852
  "<code>MEDIUM</code>), information (<code>INFO</code>, <code>UPLOAD</code>) "
@@ -2856,7 +2967,7 @@ msgstr ""
2856
  "<code>MEDIUM</code>), information (<code>INFO</code>, <code>UPLOAD</code>) "
2857
  "et mode débogage (<code>DEBUG_ON</code>)."
2858
 
2859
- #: lib/help.php:413
2860
  msgid ""
2861
  "RULE : reference of the NinjaFirewall built-in security rule that triggered "
2862
  "the action. A hyphen (<code>-</code>) instead of a number means it was a "
@@ -2867,11 +2978,11 @@ msgstr ""
2867
  "d'un numéro signifie que la règle provient de votre configuration "
2868
  "personnelle de la page \"Politiques du Pare-feu\"."
2869
 
2870
- #: lib/help.php:414
2871
  msgid "IP : the user IPv4 or IPv6 address."
2872
  msgstr "BB : L'adresse IPv4 ou IPv6 de l'utilisateur."
2873
 
2874
- #: lib/help.php:415
2875
  msgid ""
2876
  "REQUEST : the HTTP request including offending variables and values as well "
2877
  "as the reason the action was logged."
@@ -2879,11 +2990,11 @@ msgstr ""
2879
  "REQUEST : la requête HTTP avec ses variables et valeurs, ainsi que la raison "
2880
  "qui a déclenché l'incident."
2881
 
2882
- #: lib/help.php:418 lib/logs_firewall_log.php:165
2883
  msgid "Auto-delete log"
2884
  msgstr "Suppression automatique des journaux"
2885
 
2886
- #: lib/help.php:419
2887
  msgid ""
2888
  "This options lets you configure NinjaFirewall to delete its old logs "
2889
  "automatically. By default, logs are never deleted, <b>even when uninstall "
@@ -2896,7 +3007,7 @@ msgstr ""
2896
  "cette valeur à <code>0</code> si vous ne voulez pas supprimer les anciens "
2897
  "journaux."
2898
 
2899
- #: lib/help.php:423
2900
  msgid ""
2901
  "Centralized Logging lets you remotely access the firewall log of all your "
2902
  "NinjaFirewall protected websites from one single installation. You do not "
@@ -2907,13 +3018,13 @@ msgstr ""
2907
  "NinjaFirewall. Vous n'avez plus besoin de vous connecter à chaque site pour "
2908
  "analyser vos journaux."
2909
 
2910
- #: lib/help.php:423
2911
  #, php-format
2912
  msgid "<a href=\"%s\">Consult our blog</a> for more info about it."
2913
  msgstr ""
2914
  "<a href=\"%s\">Consultez notre blog pour plus d'informations à ce sujet</a>."
2915
 
2916
- #: lib/help.php:424
2917
  msgid ""
2918
  "Enter your public key (optional): This is the public key that was created "
2919
  "from your main server."
@@ -2921,7 +3032,7 @@ msgstr ""
2921
  "Entrez votre clé publique (optionnel) : Il s'agit de la clé qui a été créée "
2922
  "depuis le serveur principal."
2923
 
2924
- #: lib/help.php:428
2925
  msgid ""
2926
  "Centralized Logging will keep working even if NinjaFirewall is disabled. "
2927
  "Delete your public key below if you want to disable it."
@@ -2930,11 +3041,11 @@ msgstr ""
2930
  "NinjaFirewall. Si vous souhaitez complètement désactiver cette option, "
2931
  "supprimez votre clé publique ci-dessous. "
2932
 
2933
- #: lib/help.php:435 lib/logs.php:40 lib/logs_live_log.php:37
2934
  msgid "Live Log"
2935
  msgstr "Live Log"
2936
 
2937
- #: lib/help.php:438
2938
  msgid ""
2939
  "Live Log lets you watch your blog traffic in real time, just like the Unix "
2940
  "<code>tail -f</code> command. Note that requests sent to static elements "
@@ -2946,7 +3057,7 @@ msgstr ""
2946
  "statiques comme les fichiers JS/CSS ou les images ne sont pas traitées par "
2947
  "NinjaFirewall."
2948
 
2949
- #: lib/help.php:440
2950
  msgid ""
2951
  "You can enable/disable the monitoring process, change the refresh rate, "
2952
  "clear the screen, enable automatic vertical scrolling, change the log "
@@ -2957,7 +3068,7 @@ msgstr ""
2957
  "effacer l'écran, changer le format d'affichage, le fuseau horaire et choisir "
2958
  "le type de trafic à visualiser (HTTP/HTTPS)."
2959
 
2960
- #: lib/help.php:440
2961
  msgid ""
2962
  "You can also apply filters to include or exclude files and folders "
2963
  "(REQUEST_URI)."
@@ -2965,7 +3076,7 @@ msgstr ""
2965
  "Vous pouvez également appliquer des filtres pour inclure ou exclure des "
2966
  "fichiers et des dossiers (REQUEST_URI)."
2967
 
2968
- #: lib/help.php:443
2969
  msgid ""
2970
  "Live Log does not make use of any WordPress core file (e.g., <code>admin-"
2971
  "ajax.php</code>). It communicates directly with the firewall without loading "
@@ -2979,7 +3090,7 @@ msgstr ""
2979
  "serveur, même si vous ajustez son intervalle de rafraîchissement de la page "
2980
  "sur la fréquence la plus rapide (5 secondes)."
2981
 
2982
- #: lib/help.php:445
2983
  msgid ""
2984
  "If you are using the optional <code>.htninja</code> configuration file to "
2985
  "whitelist your IP, the Live Log feature will not work."
@@ -2988,27 +3099,27 @@ msgstr ""
2988
  "pour toujours accepter les requêtes provenant de votre adresse IP, Live Log "
2989
  "ne fonctionnera pas."
2990
 
2991
- #: lib/help.php:449
2992
  msgid "Log Format"
2993
  msgstr "Format d'affichage"
2994
 
2995
- #: lib/help.php:450
2996
  msgid "You can easily customize the log format. Possible values are:"
2997
  msgstr ""
2998
  "Vous pouvez facilement changer le format d'affichage en combinant une ou "
2999
  "plusieurs des valeurs suivantes&nbsp;:"
3000
 
3001
- #: lib/help.php:451
3002
  msgid "<code>%time</code>: the server date, time and timezone."
3003
  msgstr "<code>%time</code> : la date, heure et fuseau horaire du serveur."
3004
 
3005
- #: lib/help.php:452
3006
  msgid "<code>%name</code>: authenticated user (HTTP basic auth), if any."
3007
  msgstr ""
3008
  "<code>%name</code> : le nom de l'utilisateur (Authentification HTTP), s'il "
3009
  "existe."
3010
 
3011
- #: lib/help.php:453
3012
  #, php-format
3013
  msgid ""
3014
  "<code>%client</code>: the client REMOTE_ADDR. If you are behind a load "
@@ -3018,28 +3129,28 @@ msgstr ""
3018
  "serveur est derrière un CDN ou un proxy, cette variable retournera l'adresse "
3019
  "IP de celui-ci."
3020
 
3021
- #: lib/help.php:454
3022
  msgid "<code>%method</code>: HTTP method (e.g., GET, POST)."
3023
  msgstr "<code>%method</code> : la méthode HTTP (ex. GET, POST)."
3024
 
3025
- #: lib/help.php:455
3026
  #, php-format
3027
  msgid ""
3028
  "<code>%uri</code>: the URI which was given in order to access the page "
3029
  "(REQUEST_URI)."
3030
  msgstr "<code>%uri</code> : l'URI donnée pour accéder à la page (REQUEST_URI)."
3031
 
3032
- #: lib/help.php:456
3033
  msgid "<code>%referrer</code>: the referrer (HTTP_REFERER), if any."
3034
  msgstr "<code>%referrer</code> : le referrer (HTTP_REFERER), s'il existe."
3035
 
3036
- #: lib/help.php:457
3037
  #, php-format
3038
  msgid "<code>%ua</code>: the user-agent (HTTP_USER_AGENT), if any."
3039
  msgstr ""
3040
  "<code>%ua</code> : l'en-tête User-Agent (HTTP_USER_AGENT), s'il existe."
3041
 
3042
- #: lib/help.php:458
3043
  #, php-format
3044
  msgid ""
3045
  "<code>%forward</code>: HTTP_X_FORWARDED_FOR, if any. If you are behind a "
@@ -3049,13 +3160,13 @@ msgstr ""
3049
  "votre serveur est derrière un CDN ou un proxy, cette variable retournera "
3050
  "l'adresse réelle du client."
3051
 
3052
- #: lib/help.php:459
3053
  msgid "<code>%host</code>: the requested host (HTTP_HOST), if any."
3054
  msgstr ""
3055
  "<code>%host</code> : l'en-tête Host de la requête courante (HTTP_HOST), si "
3056
  "elle existe."
3057
 
3058
- #: lib/help.php:461
3059
  msgid ""
3060
  "Additionally, you can include any of the following characters: <code>\"</"
3061
  "code>, <code>%</code>, <code>[</code>, <code>]</code>, <code>space</code> "
@@ -3065,7 +3176,7 @@ msgstr ""
3065
  "%</code>, <code>[</code>, <code>]</code>, <code>espace</code> et toute "
3066
  "lettre minuscule <code>a-z</code>."
3067
 
3068
- #: lib/help.php:472
3069
  msgid ""
3070
  "Your website can run NinjaFirewall and be compliant with the General Data "
3071
  "Protection Regulation (GDPR). For more info, please visit our blog:"
@@ -3073,11 +3184,11 @@ msgstr ""
3073
  "NinjaFirewall est conforme à la réglementation générale sur la protection "
3074
  "des données (RGPD). Pour plus d'informations, veuillez visiter notre blog :"
3075
 
3076
- #: lib/help.php:486 lib/security_rules.php:47
3077
  msgid "Rules Updates"
3078
  msgstr "Mise à Jour des Règles"
3079
 
3080
- #: lib/help.php:488
3081
  msgid ""
3082
  "To get the most efficient protection, you can ask NinjaFirewall to "
3083
  "automatically update its security rules."
@@ -3085,7 +3196,7 @@ msgstr ""
3085
  "Pour bénéficier de la protection la plus efficace, vous pouvez demander à "
3086
  "NinjaFirewall de mettre à jour ses règles de sécurité automatiquement."
3087
 
3088
- #: lib/help.php:490
3089
  msgid ""
3090
  "Each time a new vulnerability is found in WordPress or one of its plugins/"
3091
  "themes, a new set of security rules will be made available to protect "
@@ -3095,7 +3206,7 @@ msgstr ""
3095
  "extensions ou ses thèmes, un nouvel ensemble de règles de sécurité est "
3096
  "disponible pour protéger contre cette vulnérabilité si nécessaire."
3097
 
3098
- #: lib/help.php:492
3099
  msgid ""
3100
  "Only security rules will be downloaded. If a new version of NinjaFirewall "
3101
  "(including new files, options and features) was available, it would have to "
@@ -3106,7 +3217,7 @@ msgstr ""
3106
  "jour depuis la page des \"Extensions\" de votre tableau de bord, comme "
3107
  "d'habitude."
3108
 
3109
- #: lib/help.php:494
3110
  msgid ""
3111
  "We recommend to enable this feature, as it is the <strong>best way to keep "
3112
  "your WordPress secure</strong> against new vulnerabilities."
@@ -3115,11 +3226,11 @@ msgstr ""
3115
  "<strong>meilleure façon de garder votre WordPress protégé</strong> contre "
3116
  "les dernières vulnérabilités."
3117
 
3118
- #: lib/help.php:499 lib/security_rules.php:48
3119
  msgid "Rules Editor"
3120
  msgstr "Éditeur de Règles"
3121
 
3122
- #: lib/help.php:501
3123
  msgid ""
3124
  "Besides the \"Firewall Policies\", NinjaFirewall includes also a large set "
3125
  "of built-in rules used to protect your blog against the most common "
@@ -3136,7 +3247,7 @@ msgstr ""
3136
  "règles, vous pouvez utiliser l’Éditeur de règles ci-dessous pour les "
3137
  "désactiver individuellement&nbsp;:"
3138
 
3139
- #: lib/help.php:503
3140
  msgid ""
3141
  "Check your firewall log and find the rule ID you want to disable (it is "
3142
  "displayed in the <code>RULE</code> column)."
@@ -3144,7 +3255,7 @@ msgstr ""
3144
  "Consultez le journal du pare-feu afin d'y trouver l'ID de la règle que vous "
3145
  "souhaitez désactiver (il est affiché dans la colonne <code>RULE</code>)."
3146
 
3147
- #: lib/help.php:504
3148
  msgid ""
3149
  "Select its ID from the enabled rules list below and click the \"Disable it\" "
3150
  "button."
@@ -3152,7 +3263,7 @@ msgstr ""
3152
  "Sélectionnez son ID dans la liste des règles ci-dessous et cliquez sur le "
3153
  "bouton \"Désactiver\"."
3154
 
3155
- #: lib/help.php:506
3156
  msgid ""
3157
  "Note: if the <code>RULE</code> column from your log shows a hyphen <code>-</"
3158
  "code> instead of a number, that means that the rule can be changed in the "
@@ -3162,20 +3273,7 @@ msgstr ""
3162
  "d'union <code>-</code> à la place d'un nombre, cela signifie que la règle ne "
3163
  "peut être modifiée quand dans la page \"Politiques du Pare-feu\"."
3164
 
3165
- #: lib/help.php:511
3166
- msgid "Credits"
3167
- msgstr "Crédits"
3168
-
3169
- #: lib/help.php:513
3170
- msgid ""
3171
- "NinjaFirewall security rules protect against many vulnerabilities. Some of "
3172
- "them were reported by the following companies, individuals or mailing lists:"
3173
- msgstr ""
3174
- "Les règles de sécurité de NinjaFirewall protègent contre de nombreuses "
3175
- "vulnérabilités. Certaines d'entre elles ont été découvertes par les "
3176
- "entreprises, particuliers ou listes de diffusion suivantes:"
3177
-
3178
- #: lib/install.php:60
3179
  #, php-format
3180
  msgid ""
3181
  "Error: Your .htaccess file is not writable, please change its permissions: %s"
@@ -3183,12 +3281,12 @@ msgstr ""
3183
  "Erreur : Votre fichier .htaccess n'est pas accessible en écriture. Veuillez "
3184
  "modifier ses autorisations : %s"
3185
 
3186
- #: lib/install.php:85 ninjafirewall.php:594 ninjafirewall.php:598
3187
  #, php-format
3188
  msgid "Error: wrong parameter value (%s)."
3189
  msgstr "Erreur : Mauvais paramètre (%s)."
3190
 
3191
- #: lib/install.php:92 lib/install.php:168 lib/install.php:189
3192
  #, php-format
3193
  msgid ""
3194
  "Error: The following file is not writable, please change its permissions: %s"
@@ -3196,7 +3294,7 @@ msgstr ""
3196
  "Erreur : Le fichier suivant n'est pas accessible en écriture. Veuillez "
3197
  "modifier ses autorisations : %s"
3198
 
3199
- #: lib/install.php:115
3200
  #, php-format
3201
  msgid ""
3202
  "NinjaFirewall detected that the requested changes seemed to crash your blog. "
@@ -3205,7 +3303,7 @@ msgstr ""
3205
  "NinjaFirewall a détecté que les modifications demandées semblaient planter "
3206
  "votre blog. %s"
3207
 
3208
- #: lib/install.php:116
3209
  msgid ""
3210
  "Changes have been undone. You may need to modify your selection and try "
3211
  "again."
@@ -3213,22 +3311,22 @@ msgstr ""
3213
  "Les modifications ont été annulées. Vous devriez peut-être modifier votre "
3214
  "sélection et réessayer."
3215
 
3216
- #: lib/install.php:126
3217
  #, php-format
3218
  msgid "The website front-end returned: HTTP %s %s."
3219
  msgstr "La page d'accueil du site a retourné : HTTP %s %s."
3220
 
3221
- #: lib/install.php:138
3222
  #, php-format
3223
  msgid "The website front-end returned a fatal error: %s."
3224
  msgstr "La page d'accueil du site a retourné une erreur fatale : %s."
3225
 
3226
- #: lib/install.php:218 lib/install.php:243 lib/install.php:268
3227
- #: lib/install.php:289
3228
  msgid "File is not writable"
3229
  msgstr "Le fichier n'est pas accessible en écriture"
3230
 
3231
- #: lib/install_default.php:164
3232
  msgid ""
3233
  "Error: The installer cannot download the security rules from wordpress.org "
3234
  "website."
@@ -3236,7 +3334,7 @@ msgstr ""
3236
  "Erreur : Impossible de télécharger les règles de sécurité depuis le site de "
3237
  "wordpress.org."
3238
 
3239
- #: lib/install_default.php:165
3240
  msgid ""
3241
  "The server may be temporarily down or you may have network connectivity "
3242
  "problems? Please try again in a few minutes."
@@ -3245,7 +3343,7 @@ msgstr ""
3245
  "problèmes de connectivité réseau ? Veuillez ré-essayer d'ici quelques "
3246
  "minutes."
3247
 
3248
- #: lib/install_default.php:166
3249
  msgid ""
3250
  "NinjaFirewall downloads its rules over an HTTPS secure connection. Maybe "
3251
  "your server does not support SSL? You can force NinjaFirewall to use a non-"
@@ -3258,7 +3356,7 @@ msgstr ""
3258
  "connexion non-sécurisée (HTTP) en ajoutant la ligne suivante dans votre "
3259
  "fichier <strong>wp-config.php</strong> :"
3260
 
3261
- #: lib/install_default.php:225
3262
  #, php-format
3263
  msgid ""
3264
  "NinjaFirewall cannot create its <code>nfwlog/</code>log and cache folder; "
@@ -3457,7 +3555,7 @@ msgstr "Erreur : le mot de passe doit comporter de 6 à 32 caractères."
3457
  msgid "Error: unable to write to the %s configuration file"
3458
  msgstr "Erreur : impossible d’écrire dans le fichier de configuration %s"
3459
 
3460
- #: lib/logs.php:36 ninjafirewall.php:772
3461
  msgid "Logs"
3462
  msgstr "Journaux"
3463
 
@@ -3581,6 +3679,14 @@ msgstr ""
3581
  "et assurez vous que l'option \"Ajouter l'Administrateur à la liste blanche\" "
3582
  "est activée."
3583
 
 
 
 
 
 
 
 
 
3584
  #: lib/logs_live_log.php:104
3585
  msgid "Refresh rate:"
3586
  msgstr "Intervalle :"
@@ -3623,7 +3729,7 @@ msgstr "Options de Live Log"
3623
  msgid "Inclusion and exclusion filters (REQUEST_URI)"
3624
  msgstr "Filtres d'inclusion et d'exclusion (REQUEST_URI)"
3625
 
3626
- #: lib/logs_live_log.php:160 lib/monitoring_file_check.php:391
3627
  msgid "None"
3628
  msgstr "Aucune"
3629
 
@@ -3635,7 +3741,7 @@ msgstr "Doit inclure"
3635
  msgid "Must not include"
3636
  msgstr "Ne doit pas inclure"
3637
 
3638
- #: lib/logs_live_log.php:164 lib/monitoring_file_check.php:149
3639
  #: lib/monitoring_file_guard.php:89
3640
  msgid "e.g.,"
3641
  msgstr "par ex."
@@ -3682,7 +3788,7 @@ msgstr "Sauvegarder les options"
3682
  msgid "Error: please enter the custom log format."
3683
  msgstr "Erreur : veuillez entrer le format d'affichage."
3684
 
3685
- #: lib/monitoring.php:43 ninjafirewall.php:746
3686
  msgid "Monitoring"
3687
  msgstr "Monitoring"
3688
 
@@ -3698,7 +3804,7 @@ msgstr "L'instantané a bien été supprimé."
3698
  msgid "You must create a snapshot first."
3699
  msgstr "Vous devez d'abord créer un instantané."
3700
 
3701
- #: lib/monitoring_file_check.php:96 lib/monitoring_file_check.php:759
3702
  msgid "NinjaFirewall detected that changes were made to your files."
3703
  msgstr "NinjaFirewall a détecté des changements dans vos fichiers."
3704
 
@@ -3706,21 +3812,30 @@ msgstr "NinjaFirewall a détecté des changements dans vos fichiers."
3706
  msgid "No changes detected."
3707
  msgstr "Aucun changement n'a été détecté."
3708
 
3709
- #: lib/monitoring_file_check.php:135
 
 
 
 
 
 
 
 
 
3710
  msgid "Create a snapshot of all files stored in that directory"
3711
  msgstr ""
3712
  "Créer un instantané de tous les fichiers se trouvant dans ce répertoire"
3713
 
3714
- #: lib/monitoring_file_check.php:143
3715
  #, php-format
3716
  msgid "Default: %s"
3717
  msgstr "Défaut : %s"
3718
 
3719
- #: lib/monitoring_file_check.php:148 lib/monitoring_file_guard.php:88
3720
  msgid "Exclude the following files/folders (optional)"
3721
  msgstr "Exclure les fichiers / dossiers suivants (optionnel)"
3722
 
3723
- #: lib/monitoring_file_check.php:149
3724
  msgid ""
3725
  "Full or partial case-sensitive string(s). Multiple values must be comma-"
3726
  "separated"
@@ -3728,141 +3843,141 @@ msgstr ""
3728
  "Chaîne de caractères complète ou partielle, sensible à la casse. Plusieurs "
3729
  "valeurs doivent être séparées par des virgules"
3730
 
3731
- #: lib/monitoring_file_check.php:155
3732
  msgid "Do not follow symbolic links (default)"
3733
  msgstr "Ne pas suivre les liens symboliques (défaut)"
3734
 
3735
- #: lib/monitoring_file_check.php:161
3736
  msgid "Create Snapshot"
3737
  msgstr "Créer un Instantané"
3738
 
3739
- #: lib/monitoring_file_check.php:227
3740
  msgid "Last snapshot"
3741
  msgstr "Dernier instantané"
3742
 
3743
- #: lib/monitoring_file_check.php:229
3744
  #, php-format
3745
  msgid "Created on: %s"
3746
  msgstr "Créé le : %s"
3747
 
3748
- #: lib/monitoring_file_check.php:230
3749
  #, php-format
3750
  msgid "Total files: %s "
3751
  msgstr "Nombre de fichiers : %s "
3752
 
3753
- #: lib/monitoring_file_check.php:232
3754
  msgid "Directory:"
3755
  msgstr "Répertoire&nbsp;:"
3756
 
3757
- #: lib/monitoring_file_check.php:236
3758
  msgid "Exclusion:"
3759
  msgstr "Exclusion&nbsp;:"
3760
 
3761
- #: lib/monitoring_file_check.php:242
3762
  msgid "Symlinks:"
3763
  msgstr "Lien symboliques :"
3764
 
3765
- #: lib/monitoring_file_check.php:244
3766
  msgid "follow"
3767
  msgstr "suivre"
3768
 
3769
- #: lib/monitoring_file_check.php:246
3770
  msgid "do not follow"
3771
  msgstr "ne pas suivre"
3772
 
3773
- #: lib/monitoring_file_check.php:250
3774
  #, php-format
3775
  msgid "Processing time: %s seconds"
3776
  msgstr "Temps de traitement : %s secondes"
3777
 
3778
- #: lib/monitoring_file_check.php:255
3779
  msgid "Download Snapshot"
3780
  msgstr "Télécharger l'instantané"
3781
 
3782
- #: lib/monitoring_file_check.php:255
3783
  msgid "Delete Snapshot"
3784
  msgstr "Supprimer l'instantané"
3785
 
3786
- #: lib/monitoring_file_check.php:261
3787
  msgid "Last changes"
3788
  msgstr "Dernières modifications"
3789
 
3790
- #: lib/monitoring_file_check.php:268 lib/monitoring_file_check.php:767
3791
  #, php-format
3792
  msgid "New files: %s"
3793
  msgstr "Nouveaux fichiers : %s"
3794
 
3795
- #: lib/monitoring_file_check.php:269 lib/monitoring_file_check.php:769
3796
  #, php-format
3797
  msgid "Deleted files: %s"
3798
  msgstr "Fichiers supprimés : %s"
3799
 
3800
- #: lib/monitoring_file_check.php:270 lib/monitoring_file_check.php:768
3801
  #, php-format
3802
  msgid "Modified files: %s"
3803
  msgstr "Fichiers modifiés : %s"
3804
 
3805
- #: lib/monitoring_file_check.php:274
3806
  msgid "View Changes"
3807
  msgstr "Voir les Modifications"
3808
 
3809
- #: lib/monitoring_file_check.php:278
3810
  msgid "Download Changes"
3811
  msgstr "Télécharger les Modifications"
3812
 
3813
- #: lib/monitoring_file_check.php:290
3814
  msgid "Click a file to get more info about it."
3815
  msgstr "Cliquez sur un fichier pour obtenir plus d'informations à son sujet."
3816
 
3817
- #: lib/monitoring_file_check.php:293
3818
  msgid "New files:"
3819
  msgstr "Nouveaux fichiers :"
3820
 
3821
- #: lib/monitoring_file_check.php:302 lib/monitoring_file_check.php:355
3822
  msgid "Size"
3823
  msgstr "Taille"
3824
 
3825
- #: lib/monitoring_file_check.php:306 lib/monitoring_file_check.php:360
3826
  msgid "Access"
3827
  msgstr "Accès"
3828
 
3829
- #: lib/monitoring_file_check.php:310 lib/monitoring_file_check.php:365
3830
  msgid "Uid / Gid"
3831
  msgstr "Uid / Gid"
3832
 
3833
- #: lib/monitoring_file_check.php:314 lib/monitoring_file_check.php:370
3834
  msgid "Modify"
3835
  msgstr "Modification"
3836
 
3837
- #: lib/monitoring_file_check.php:318 lib/monitoring_file_check.php:375
3838
  msgid "Change"
3839
  msgstr "Changement"
3840
 
3841
- #: lib/monitoring_file_check.php:328
3842
  msgid "Deleted files:"
3843
  msgstr "Fichiers supprimés :"
3844
 
3845
- #: lib/monitoring_file_check.php:341
3846
  msgid "Modified files:"
3847
  msgstr "Fichiers modifiés :"
3848
 
3849
- #: lib/monitoring_file_check.php:351
3850
  msgid "Old"
3851
  msgstr "Ancien"
3852
 
3853
- #: lib/monitoring_file_check.php:352
3854
  msgid "New"
3855
  msgstr "Nouveau"
3856
 
3857
- #: lib/monitoring_file_check.php:401
3858
  msgid "Scan System For File Changes"
3859
  msgstr "Lancer l'analyse des fichiers"
3860
 
3861
- #: lib/monitoring_file_check.php:419
3862
  msgid "Options"
3863
  msgstr "Options"
3864
 
3865
- #: lib/monitoring_file_check.php:426
3866
  #, php-format
3867
  msgid ""
3868
  "It seems that %s is set. Ensure you have another way to run WP-Cron, "
@@ -3871,27 +3986,27 @@ msgstr ""
3871
  "Il semble que %s est activé. Assurez vous de pouvoir exécuter WP-Cron, sinon "
3872
  "File Check ne pourra pas se lancer automatiquement."
3873
 
3874
- #: lib/monitoring_file_check.php:432
3875
  msgid "Enable scheduled scans"
3876
  msgstr "Lancer File Check automatiquement"
3877
 
3878
- #: lib/monitoring_file_check.php:434
3879
  msgid "No (default)"
3880
  msgstr "Non (défaut)"
3881
 
3882
- #: lib/monitoring_file_check.php:435 lib/security_rules_update.php:152
3883
  msgid "Hourly"
3884
  msgstr "Une fois par heure"
3885
 
3886
- #: lib/monitoring_file_check.php:436 lib/security_rules_update.php:153
3887
  msgid "Twicedaily"
3888
  msgstr "Deux fois par jour"
3889
 
3890
- #: lib/monitoring_file_check.php:437 lib/security_rules_update.php:154
3891
  msgid "Daily"
3892
  msgstr "Tous les jours"
3893
 
3894
- #: lib/monitoring_file_check.php:444
3895
  #, php-format
3896
  msgid ""
3897
  "Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
@@ -3900,7 +4015,7 @@ msgstr ""
3900
  "La prochaine analyse commencera dans %s jour(s), %s heure(s), %s minute(s) "
3901
  "et %s seconde(s)."
3902
 
3903
- #: lib/monitoring_file_check.php:451
3904
  msgid ""
3905
  "The next scheduled scan date is in the past! WordPress wp-cron may not be "
3906
  "working or may have been disabled."
@@ -3908,109 +4023,109 @@ msgstr ""
3908
  "La date de la prochaine analyse est dans le passé&nbsp;! Essayez de "
3909
  "recharger cette page, sinon vérifiez que WP-Cron n'a pas été désactivé."
3910
 
3911
- #: lib/monitoring_file_check.php:459
3912
  msgid "Scheduled scan report"
3913
  msgstr "Rapport d'analyse"
3914
 
3915
- #: lib/monitoring_file_check.php:461
3916
  msgid "Send me a report by email only if changes are detected (default)"
3917
  msgstr ""
3918
  "Envoyez-moi un rapport uniquement si des changements ont été détectés "
3919
  "(défaut)"
3920
 
3921
- #: lib/monitoring_file_check.php:462
3922
  msgid "Always send me a report by email after a scheduled scan"
3923
  msgstr "Envoyez-moi toujours un rapport après une analyse automatique"
3924
 
3925
- #: lib/monitoring_file_check.php:467
3926
  msgid "Save Scan Options"
3927
  msgstr "Sauvegarder les options"
3928
 
3929
- #: lib/monitoring_file_check.php:479
3930
  msgid "Enter the full path to the directory to be scanned."
3931
  msgstr "Entrez le chemin complet vers le répertoire à scanner."
3932
 
3933
- #: lib/monitoring_file_check.php:486
3934
  #, php-format
3935
  msgid "The directory %s does not exist."
3936
  msgstr "Le répertoire %s n'existe pas."
3937
 
3938
- #: lib/monitoring_file_check.php:489
3939
  #, php-format
3940
  msgid "The directory %s is not readable."
3941
  msgstr "Le répertoire %s n'est pas lisible."
3942
 
3943
- #: lib/monitoring_file_check.php:530
3944
  #, php-format
3945
  msgid "Cannot write to %s."
3946
  msgstr "Impossible d'écrire dans %s."
3947
 
3948
- #: lib/monitoring_file_check.php:560
3949
  #, php-format
3950
  msgid "Error : cannot open %s directory."
3951
  msgstr "Erreur : impossible d'ouvrir le répertoire %s."
3952
 
3953
- #: lib/monitoring_file_check.php:563
3954
  #, php-format
3955
  msgid "Error : %s directory is not readable."
3956
  msgstr "Erreur : le répertoire %s n'est pas lisible."
3957
 
3958
- #: lib/monitoring_file_check.php:578
3959
  #, php-format
3960
  msgid "Missing options line %s, please try again."
3961
  msgstr "Option manquante (ligne %s). Veuillez essayer à nouveau."
3962
 
3963
- #: lib/monitoring_file_check.php:588
3964
  #, php-format
3965
  msgid "Cannot create %s."
3966
  msgstr "Impossible de créer %s."
3967
 
3968
- #: lib/monitoring_file_check.php:605
3969
  msgid "Error reading old snapshot file."
3970
  msgstr "Erreur lors de la lecture du fichier de l'ancien instantané."
3971
 
3972
- #: lib/monitoring_file_check.php:616
3973
  msgid "Error reading new snapshot file."
3974
  msgstr "Erreur lors de la lecture du fichier du nouvel instantané."
3975
 
3976
- #: lib/monitoring_file_check.php:732 ninjafirewall.php:416
3977
  msgid "New file"
3978
  msgstr "Nouveau fichier"
3979
 
3980
- #: lib/monitoring_file_check.php:733 ninjafirewall.php:417
3981
  msgid "Modified file"
3982
  msgstr "Fichier modifié"
3983
 
3984
- #: lib/monitoring_file_check.php:734 ninjafirewall.php:418
3985
  msgid "Deleted file"
3986
  msgstr "Fichier supprimé"
3987
 
3988
- #: lib/monitoring_file_check.php:758
3989
  msgid "[NinjaFirewall] Alert: File Check detection"
3990
  msgstr "[NinjaFirewall] Alerte: Détection File Check"
3991
 
3992
- #: lib/monitoring_file_check.php:761 lib/monitoring_file_check.php:763
3993
- #: lib/monitoring_file_check.php:788 lib/monitoring_file_check.php:790
3994
- #: lib/security_rules_update.php:548 lib/security_rules_update.php:550
3995
- #: lib/utils.php:214 lib/utils.php:839 lib/utils.php:1004 lib/utils.php:1336
3996
  msgid "Blog:"
3997
  msgstr "Blog :"
3998
 
3999
- #: lib/monitoring_file_check.php:765 lib/monitoring_file_check.php:792
4000
- #: lib/security_rules_update.php:553
4001
  #, php-format
4002
  msgid "Date: %s"
4003
  msgstr "Date : %s"
4004
 
4005
- #: lib/monitoring_file_check.php:771
4006
  msgid "See attached file for details."
4007
  msgstr "Voir le fichier joint pour plus de détails."
4008
 
4009
- #: lib/monitoring_file_check.php:785
4010
  msgid "[NinjaFirewall] File Check report"
4011
  msgstr "[NinjaFirewall] Rapport de File Check"
4012
 
4013
- #: lib/monitoring_file_check.php:786
4014
  msgid "NinjaFirewall did not detect changes in your files."
4015
  msgstr "NinjaFirewall n'a pas détecté de changements dans vos fichiers."
4016
 
@@ -4066,7 +4181,7 @@ msgstr ""
4066
  msgid "Save File Guard options"
4067
  msgstr "Sauvegarder les options"
4068
 
4069
- #: lib/network.php:24 ninjafirewall.php:1034 ninjafirewall.php:1038
4070
  #, php-format
4071
  msgid "You are not allowed to perform this task (%s)."
4072
  msgstr "Vous n'êtes pas autorisé à effectuer cette tâche (%s)."
@@ -4091,7 +4206,8 @@ msgstr ""
4091
  msgid "Save Network options"
4092
  msgstr "Sauvegarder les options"
4093
 
4094
- #: lib/security_rules.php:44 ninjafirewall.php:776
 
4095
  msgid "Security Rules"
4096
  msgstr "Règles de Sécurité"
4097
 
@@ -4202,7 +4318,7 @@ msgstr ""
4202
  msgid "Security rules have been updated."
4203
  msgstr "Les règles de sécurité ont été mises à jour."
4204
 
4205
- #: lib/security_rules_update.php:91 lib/security_rules_update.php:430
4206
  msgid "No security rules update available."
4207
  msgstr "Aucune mise à jour des règles de sécurité disponible."
4208
 
@@ -4215,23 +4331,23 @@ msgstr ""
4215
  "Il semble que %s est activé. Assurez vous de pouvoir exécuter WP-Cron, sinon "
4216
  "les mises à jour automatiques ne pourront pas être effectuées."
4217
 
4218
- #: lib/security_rules_update.php:135
4219
  msgid "Automatically update NinjaFirewall security rules"
4220
  msgstr "Activer la mise à jour automatique des règles de sécurité"
4221
 
4222
- #: lib/security_rules_update.php:147
4223
  msgid "Check for updates"
4224
  msgstr "Vérifier les mises à jour"
4225
 
4226
- #: lib/security_rules_update.php:150
4227
  msgid "Every 15 minutes"
4228
  msgstr "Toutes les 15 minutes"
4229
 
4230
- #: lib/security_rules_update.php:151
4231
  msgid "Every 30 minutes"
4232
  msgstr "Toutes les 30 minutes"
4233
 
4234
- #: lib/security_rules_update.php:166
4235
  msgid ""
4236
  "The next scheduled date is in the past! WordPress wp-cron may not be working "
4237
  "or may have been disabled."
@@ -4240,7 +4356,7 @@ msgstr ""
4240
  "passé&nbsp;! Essayez de recharger cette page, sinon vérifiez que WP-Cron n'a "
4241
  "pas été désactivé."
4242
 
4243
- #: lib/security_rules_update.php:170
4244
  #, php-format
4245
  msgid ""
4246
  "Next scheduled update will start in approximately %s day, %s hour(s), %s "
@@ -4249,17 +4365,17 @@ msgstr ""
4249
  "La prochaine vérification des mises à jour aura lieu dans %s jour, %s "
4250
  "heure(s), %s minute(s) et %s secondes."
4251
 
4252
- #: lib/security_rules_update.php:178
4253
  msgid "Notification"
4254
  msgstr "Notification"
4255
 
4256
- #: lib/security_rules_update.php:180
4257
  msgid "Send me a report by email when security rules have been updated."
4258
  msgstr ""
4259
  "Envoyez-moi un rapport par e-mail lorsque les règles de sécurité ont été "
4260
  "mises à jour."
4261
 
4262
- #: lib/security_rules_update.php:181
4263
  msgid ""
4264
  "Reports will be sent to the contact email address defined in the Event "
4265
  "Notifications menu."
@@ -4267,79 +4383,71 @@ msgstr ""
4267
  "Les rapports seront envoyés à l'adresse e-mail définie dans la page "
4268
  "\"Notifications d'Événement\"."
4269
 
4270
- #: lib/security_rules_update.php:191 lib/security_rules_update.php:206
4271
  msgid "The updates log is currently empty."
4272
  msgstr "Le journal des mises à jour est vide."
4273
 
4274
- #: lib/security_rules_update.php:195
4275
  msgid "Updates Log"
4276
  msgstr "Journal des mises à jour"
4277
 
4278
- #: lib/security_rules_update.php:209
4279
  msgid "Log is flushed automatically."
4280
  msgstr "Le journal est purgé automatiquement."
4281
 
4282
- #: lib/security_rules_update.php:220
4283
  msgid "Save Updates Options"
4284
  msgstr "Sauvegarder les options"
4285
 
4286
- #: lib/security_rules_update.php:221
4287
  msgid "Check For Updates Now!"
4288
  msgstr "Vérifier les mises à jour maintenant ! "
4289
 
4290
- #: lib/security_rules_update.php:229
4291
  msgid "Delete Log"
4292
  msgstr "Supprimer le journal"
4293
 
4294
- #: lib/security_rules_update.php:317
4295
  msgid "Error: Wrong rules format."
4296
  msgstr "Erreur : Le format des règles téléchargées ne correspond pas."
4297
 
4298
- #: lib/security_rules_update.php:326
4299
  msgid "Error: Unable to unserialize the new rules."
4300
  msgstr ""
4301
  "Erreur : Impossible d'extraire les règles du fichier téléchargé (unable to "
4302
  "unserialize the new rules)."
4303
 
4304
- #: lib/security_rules_update.php:334
4305
  msgid "Error: Unserialized rules seem corrupted."
4306
  msgstr ""
4307
  "Erreur : Le fichier des règles téléchargé semblent corrompu (unserialized "
4308
  "rules seem corrupted)."
4309
 
4310
- #: lib/security_rules_update.php:374
4311
  #, php-format
4312
  msgid "Security rules updated to version %s."
4313
  msgstr "Les règles de sécurité ont été mises à jour vers la version %s."
4314
 
4315
- #: lib/security_rules_update.php:410
4316
- msgid ""
4317
- "Error: Your version of NinjaFirewall is too old and is not compatible with "
4318
- "those rules. Please upgrade it."
4319
- msgstr ""
4320
- "Erreur : Votre version de NinjaFirewall est trop ancienne et n'est pas "
4321
- "compatible avec ces règles de sécurité. Mettez à jour NinjaFirewall."
4322
-
4323
- #: lib/security_rules_update.php:419
4324
  msgid "Error: Unable to retrieve the new rules version."
4325
  msgstr "Erreur : Impossible de récupérer la nouvelle version des règles."
4326
 
4327
- #: lib/security_rules_update.php:437
4328
  #, php-format
4329
  msgid "Error: Server returned a %s HTTP error code (#1)."
4330
  msgstr "Erreur : Le serveur a retourné un code d'erreur HTTP %s (#1)."
4331
 
4332
- #: lib/security_rules_update.php:444 lib/security_rules_update.php:510
4333
  msgid "Error: Unable to connect to the remote server"
4334
  msgstr "Erreur : Impossible de se connecter au serveur distant"
4335
 
4336
- #: lib/security_rules_update.php:474
4337
  #, php-format
4338
  msgid "Error: The new rules versions do not match (%s != %s)."
4339
  msgstr ""
4340
  "Erreur : La versions des nouvelles règles ne correspond pas (%s != %s)."
4341
 
4342
- #: lib/security_rules_update.php:488
4343
  #, php-format
4344
  msgid ""
4345
  "Error: The new rules %s digital signature is not correct. Aborting update, "
@@ -4348,35 +4456,35 @@ msgstr ""
4348
  "Erreur : La signature numérique des nouvelles règles %s n'est pas correcte. "
4349
  "Annulation de la mise à jour, les règles ont peut-être été altérées."
4350
 
4351
- #: lib/security_rules_update.php:503
4352
  #, php-format
4353
  msgid "Error: Server returned a %s HTTP error code (#2)."
4354
  msgstr "Erreur : Le serveur a retourné un code d'erreur HTTP %s (#2)."
4355
 
4356
- #: lib/security_rules_update.php:545
4357
  msgid "[NinjaFirewall] Security rules update"
4358
  msgstr "[NinjaFirewall] Mise à jour des règles de sécurité"
4359
 
4360
- #: lib/security_rules_update.php:546
4361
  msgid "NinjaFirewall security rules have been updated:"
4362
  msgstr "Les règles de sécurité de NinjaFirewall ont été mises à jour :"
4363
 
4364
- #: lib/security_rules_update.php:552
4365
  msgid "Rules version:"
4366
  msgstr "Version des règles :"
4367
 
4368
- #: lib/security_rules_update.php:554
4369
- msgid ""
4370
- "This notification can be turned off from NinjaFirewall \"Rules Update\" page."
4371
  msgstr ""
4372
- "Cette notification peut être désactivée depuis la page \"Mise à Jour des "
4373
- "Règles\" de NinjaFirewall."
4374
 
4375
- #: lib/thickbox.php:37
4376
  msgid "Upgrade to Full WAF mode"
4377
  msgstr "Passer en mode Full WAF"
4378
 
4379
- #: lib/thickbox.php:42
4380
  msgid ""
4381
  "In <strong>Full WAF</strong> mode, all scripts located inside the blog "
4382
  "installation directories and sub-directories are protected by NinjaFirewall, "
@@ -4388,7 +4496,7 @@ msgstr ""
4388
  "compris ceux qui ne font pas partie de WordPress. Cela vous offre le niveau "
4389
  "de protection le plus élevé possible : La sécurité sans aucun compromis."
4390
 
4391
- #: lib/thickbox.php:44
4392
  #, php-format
4393
  msgid ""
4394
  "It works on most websites right out of the box, or may require <a href=\"%s"
@@ -4402,7 +4510,7 @@ msgstr ""
4402
  "d'hébergement partagé, il se peut que l'installation ne puisse pas "
4403
  "fonctionner du tout."
4404
 
4405
- #: lib/thickbox.php:46
4406
  msgid ""
4407
  "If this happened to you, don't worry: you could still run it in "
4408
  "<strong>WordPress WAF</strong> mode. Despite being less powerful than the "
@@ -4415,37 +4523,37 @@ msgstr ""
4415
  "niveau de protection très supérieur aux autres extensions de sécurité pour "
4416
  "WordPress disponibles sur le marché."
4417
 
4418
- #: lib/thickbox.php:52
4419
  msgid "(recommended)"
4420
  msgstr "(recommandé)"
4421
 
4422
- #: lib/thickbox.php:112
4423
  msgid "Select your HTTP server and your PHP server API"
4424
  msgstr "Sélectionnez votre serveur HTTP et PHP SAPI"
4425
 
4426
- #: lib/thickbox.php:122
4427
  msgid "Other webserver + CGI/FastCGI or PHP-FPM"
4428
  msgstr "Autre serveur + CGI/FastCGI ou PHP-FPM"
4429
 
4430
- #: lib/thickbox.php:124
4431
  msgid "View PHPINFO"
4432
  msgstr "Voir PHPINFO"
4433
 
4434
- #: lib/thickbox.php:156
4435
  msgid "Select the PHP initialization file supported by your server"
4436
  msgstr ""
4437
  "Sélectionnez le type de fichier de configuration PHP utilisé par votre "
4438
  "serveur"
4439
 
4440
- #: lib/thickbox.php:168
4441
  msgid "Let NinjaFirewall make the necessary changes (recommended)."
4442
  msgstr "Laissez NinjaFirewall faire les changements (recommandé)."
4443
 
4444
- #: lib/thickbox.php:169
4445
  msgid "I want to make the changes myself."
4446
  msgstr "Je veux faire les changements moi-même."
4447
 
4448
- #: lib/thickbox.php:171
4449
  msgid ""
4450
  "Ensure that you have FTP access to your website so that, if there were a "
4451
  "problem during the installation of the firewall, you could easily undo the "
@@ -4455,13 +4563,13 @@ msgstr ""
4455
  "problème pendant l'installation du pare-feu, vous pourriez annuler les "
4456
  "modifications."
4457
 
4458
- #: lib/thickbox.php:174
4459
  msgid "Please make the changes below, then click on the \"Finish\" button."
4460
  msgstr ""
4461
  "Veuillez faire les modifications ci-dessous, puis cliquer sur le bouton "
4462
  "\"Finaliser\"."
4463
 
4464
- #: lib/thickbox.php:181
4465
  #, php-format
4466
  msgid ""
4467
  "The %s file must be created, and the following lines of code added to it:"
@@ -4469,12 +4577,12 @@ msgstr ""
4469
  "Le fichier %s doit être créé, et les lignes suivantes doivent y être "
4470
  "ajoutées :"
4471
 
4472
- #: lib/thickbox.php:182
4473
  #, php-format
4474
  msgid "The following lines of code must be added to your existing %s file:"
4475
  msgstr "Les lignes suivantes doivent être ajoutées à votre fichier %s :"
4476
 
4477
- #: lib/thickbox.php:242
4478
  msgid ""
4479
  "Log in to your Openlitespeed admin dashboard, click on \"Virtual Host\", "
4480
  "select your domain, add the following instructions to the \"php.ini Override"
@@ -4485,7 +4593,7 @@ msgstr ""
4485
  "section \"php.ini Override\" de l'onglet \"Général\", puis redémarrez "
4486
  "Openlitespeed:"
4487
 
4488
- #: lib/thickbox.php:249
4489
  msgid ""
4490
  "Important: if one day you wanted to uninstall NinjaFirewall, do not forget "
4491
  "to remove these instructions from your Openlitespeed admin dashboard "
@@ -4497,7 +4605,7 @@ msgstr ""
4497
  "<strong>avant</strong> de désinstaller NinjaFirewall, car cet installateur "
4498
  "ne pourra pas le faire à votre place."
4499
 
4500
- #: lib/thickbox.php:267
4501
  msgid "Finish"
4502
  msgstr "Finaliser"
4503
 
@@ -4510,32 +4618,28 @@ msgid "NinjaFirewall has blocked an attempt to create a user account:"
4510
  msgstr ""
4511
  "NinjaFirewall a bloqué une tentative de création d'un compte d'utilisateur :"
4512
 
4513
- #: lib/utils.php:215 lib/utils.php:1009
4514
  msgid "Username:"
4515
  msgstr "Utilisateur :"
4516
 
4517
- #: lib/utils.php:216 lib/utils.php:1014 lib/utils.php:1337
4518
  msgid "User IP:"
4519
  msgstr "IP utilisateur :"
4520
 
4521
- #: lib/utils.php:219 lib/utils.php:840 lib/utils.php:1017 lib/utils.php:1340
4522
- msgid "Date:"
4523
- msgstr "Date :"
4524
-
4525
- #: lib/utils.php:228 lib/utils.php:1026 lib/utils.php:1332
4526
  msgid "A PHP backtrace has been attached to this message for your convenience."
4527
  msgstr ""
4528
  "La pile d'exécution de PHP est jointe à ce message pour votre commodité."
4529
 
4530
- #: lib/utils.php:251 lib/utils.php:252 lib/utils.php:1051 lib/utils.php:1052
4531
  msgid "You are not allowed to perform this task."
4532
  msgstr "Vous n'êtes pas autorisé à effectuer cette tâche."
4533
 
4534
- #: lib/utils.php:519 lib/utils.php:523
4535
  msgid "NinjaFirewall error"
4536
  msgstr "NinjaFirewall Erreur"
4537
 
4538
- #: lib/utils.php:520
4539
  #, php-format
4540
  msgid ""
4541
  "%s directory cannot be created. Please review your installation and ensure "
@@ -4544,7 +4648,7 @@ msgstr ""
4544
  "Le répertoire %s ne peut pas être créé. Vérifiez votre installation et "
4545
  "assurez vous que %s n'est pas en lecture seule."
4546
 
4547
- #: lib/utils.php:524
4548
  #, php-format
4549
  msgid ""
4550
  "%s directory is read-only. Please review your installation and ensure that "
@@ -4553,51 +4657,35 @@ msgstr ""
4553
  "Le répertoire %s est en lecture seule. Vérifiez votre installation et les "
4554
  "permissions de %s."
4555
 
4556
- #: lib/utils.php:543
4557
  msgid "unknown error"
4558
  msgstr "erreur inconnue"
4559
 
4560
- #: lib/utils.php:545
4561
  msgid "NinjaFirewall fatal error:"
4562
  msgstr "NinjaFirewall erreur fatale :"
4563
 
4564
- #: lib/utils.php:546
4565
  msgid "Review your installation, your site is not protected."
4566
  msgstr "Vérifiez votre installation, votre site n'est pas protégé."
4567
 
4568
- #: lib/utils.php:563
4569
  msgid "Alert: WordPress console login"
4570
  msgstr "Alerte : Connexion à WordPress"
4571
 
4572
- #: lib/utils.php:565
4573
- msgid "-Blog:"
4574
- msgstr "- Blog :"
4575
-
4576
- #: lib/utils.php:569
4577
  msgid "Someone just logged in to your WordPress admin console:"
4578
  msgstr "Quelqu'un vient de se connecter à votre Tableau de bord de WordPress:"
4579
 
4580
- #: lib/utils.php:570
4581
- msgid "-User:"
4582
- msgstr "- Nom :"
4583
-
4584
- #: lib/utils.php:571
4585
- msgid "-IP:"
4586
- msgstr "- IP :"
4587
-
4588
- #: lib/utils.php:572
4589
- msgid "-Date:"
4590
- msgstr "- Date :"
4591
-
4592
- #: lib/utils.php:575
4593
  msgid "Support forum"
4594
  msgstr "Forum "
4595
 
4596
- #: lib/utils.php:636 lib/utils.php:663
4597
  msgid "Forbidden access"
4598
  msgstr "Accès interdit"
4599
 
4600
- #: lib/utils.php:682
4601
  #, php-format
4602
  msgid ""
4603
  "<strong>ERROR</strong>: Invalid username or password.<br /><a href=\"%s"
@@ -4606,59 +4694,11 @@ msgstr ""
4606
  "<strong>ERREUR</strong>: Identifiant ou mot de passe invalide.<br /><a href="
4607
  "\"%s\">Mot de passe perdu</a> ?"
4608
 
4609
- #: lib/utils.php:716
4610
- msgid "Plugin"
4611
- msgstr "Extension"
4612
-
4613
- #: lib/utils.php:716 lib/utils.php:720
4614
- msgid "uploaded"
4615
- msgstr "téléchargé(e)"
4616
-
4617
- #: lib/utils.php:716 lib/utils.php:720
4618
- msgid "installed"
4619
- msgstr "installé(e)"
4620
-
4621
- #: lib/utils.php:716 lib/utils.php:720
4622
- msgid "activated"
4623
- msgstr "activé(e)"
4624
-
4625
- #: lib/utils.php:717
4626
- msgid "updated"
4627
- msgstr "mis(e) à jour"
4628
-
4629
- #: lib/utils.php:717
4630
- msgid "deactivated"
4631
- msgstr "désactivé(e)"
4632
-
4633
- #: lib/utils.php:717 lib/utils.php:721
4634
- msgid "deleted"
4635
- msgstr "supprimé(e)"
4636
-
4637
- #: lib/utils.php:717 lib/utils.php:721
4638
- msgid "Name"
4639
- msgstr "Nom"
4640
-
4641
- #: lib/utils.php:720
4642
- msgid "Theme"
4643
- msgstr "Thème"
4644
-
4645
- #: lib/utils.php:724
4646
- msgid "upgraded"
4647
- msgstr "mis(e) à jour"
4648
-
4649
- #: lib/utils.php:732
4650
- msgid "[NinjaFirewall] Alert:"
4651
- msgstr "[NinjaFirewall] Alerte :"
4652
-
4653
- #: lib/utils.php:738
4654
- msgid "NinjaFirewall has detected the following activity on your account:"
4655
- msgstr "NinjaFirewall a détecté l'activité suivante sur votre compte :"
4656
-
4657
- #: lib/utils.php:835
4658
  msgid "[NinjaFirewall] Alert: Database changes detected"
4659
  msgstr "[NinjaFirewall] Alerte: Modification dans la base de données"
4660
 
4661
- #: lib/utils.php:836
4662
  msgid ""
4663
  "NinjaFirewall has detected that one or more administrator accounts were "
4664
  "modified in the database:"
@@ -4666,12 +4706,12 @@ msgstr ""
4666
  "NinjaFirewall a détecté que un ou plusieurs comptes d'administrateur ont été "
4667
  "modifiés dans la base de données:"
4668
 
4669
- #: lib/utils.php:841
4670
  #, php-format
4671
  msgid "Total administrators : %s"
4672
  msgstr "Nombre d'administrateurs : %s"
4673
 
4674
- #: lib/utils.php:850
4675
  msgid ""
4676
  "If you cannot see any modifications in the above fields, it is possible that "
4677
  "the administrator password was changed."
@@ -4679,11 +4719,11 @@ msgstr ""
4679
  "Si vous ne voyez pas de modifications dans les données ci-dessus, il est "
4680
  "possible que le mot de passe administrateur ait été changé."
4681
 
4682
- #: lib/utils.php:985
4683
  msgid "Blocked privilege escalation attempt"
4684
  msgstr "Tentatives d'élévation des privilèges"
4685
 
4686
- #: lib/utils.php:1002
4687
  msgid ""
4688
  "NinjaFirewall has blocked an attempt to modify a user capability by someone "
4689
  "who does not have administrative privileges:"
@@ -4691,7 +4731,15 @@ msgstr ""
4691
  "NinjaFirewall a bloqué une tentative de modification de certaines Capacités "
4692
  "par un utilisateur ne disposant pas de privilèges administratifs :"
4693
 
4694
- #: lib/utils.php:1063
 
 
 
 
 
 
 
 
4695
  msgid ""
4696
  "NinjaFirewall brute-force protection is enabled and you are temporarily "
4697
  "whitelisted."
@@ -4699,7 +4747,7 @@ msgstr ""
4699
  "La protection de NinjaFirewall contre les attaques par force brute est "
4700
  "activée. Vous êtes temporairement dans la liste blanche."
4701
 
4702
- #: lib/utils.php:1078
4703
  #, php-format
4704
  msgid ""
4705
  "Hey, it seems that you've been using NinjaFirewall for some time. If you "
@@ -4712,17 +4760,17 @@ msgstr ""
4712
  "a>. Il a fallu des milliers d'heures pour le développer, mais il suffit "
4713
  "seulement de quelques minutes pour le noter. Merci !"
4714
 
4715
- #: lib/utils.php:1304
4716
  msgid ""
4717
  "The attempt was blocked and the option was reversed to its original value."
4718
  msgstr ""
4719
  "La tentative a été bloquée et l'option a été remise à sa valeur d'origine."
4720
 
4721
- #: lib/utils.php:1309
4722
  msgid "Attempt to modify WordPress settings"
4723
  msgstr "Tentative de modification des paramètres de WordPress"
4724
 
4725
- #: lib/utils.php:1310
4726
  msgid ""
4727
  "NinjaFirewall has blocked an attempt to modify some important WordPress "
4728
  "settings by a user that does not have administrative privileges:"
@@ -4731,31 +4779,31 @@ msgstr ""
4731
  "importants de WordPress par un utilisateur ne disposant pas de privilèges "
4732
  "administratifs :"
4733
 
4734
- #: lib/utils.php:1311 lib/utils.php:1320
4735
  #, php-format
4736
  msgid "Option: %s"
4737
  msgstr "Option: %s"
4738
 
4739
- #: lib/utils.php:1312
4740
  #, php-format
4741
  msgid "Original value: %s"
4742
  msgstr "Valeur originale : %s"
4743
 
4744
- #: lib/utils.php:1313
4745
  #, php-format
4746
  msgid "Modified value: %s"
4747
  msgstr "Valeur modifiée : %s"
4748
 
4749
- #: lib/utils.php:1314 lib/utils.php:1322
4750
  #, php-format
4751
  msgid "Action taken: %s"
4752
  msgstr "Action prise : %s"
4753
 
4754
- #: lib/utils.php:1318
4755
  msgid "Code injection attempt in WordPress options table"
4756
  msgstr "Tentative d'injection de code dans la table des options de WordPress"
4757
 
4758
- #: lib/utils.php:1319
4759
  msgid ""
4760
  "NinjaFirewall has blocked an attempt to inject code in the WordPress options "
4761
  "table by a user that does not have administrative privileges:"
@@ -4764,34 +4812,26 @@ msgstr ""
4764
  "options de WordPress par un utilisateur ne disposant pas de privilèges "
4765
  "administratifs :"
4766
 
4767
- #: lib/utils.php:1321
4768
  #, php-format
4769
  msgid "Code: %s"
4770
  msgstr "Code : %s"
4771
 
4772
- #: lib/utils.php:1342
4773
- msgid ""
4774
- "This protection (and notification) can be turned off from NinjaFirewall "
4775
- "\"Firewall Policies\" page."
4776
- msgstr ""
4777
- "Cette protection (et notification) peut être désactivée à partir de la page "
4778
- "\"Politiques du Pare-feu\" de NinjaFirewall."
4779
-
4780
- #: lib/utils.php:1377
4781
  #, php-format
4782
  msgid "Error, cannot create the %s folder."
4783
  msgstr "Erreur, impossible de créer le répertoire %s."
4784
 
4785
- #: lib/utils.php:1377 lib/utils.php:1385 lib/utils.php:1393
4786
  msgid "Check your server permissions and try again."
4787
  msgstr "Vérifiez les autorisations de votre serveur et réessayez."
4788
 
4789
- #: lib/utils.php:1385
4790
  #, php-format
4791
  msgid "Error, the %s folder is not writable."
4792
  msgstr "Erreur, le répertoire %s est en lecture seule."
4793
 
4794
- #: lib/utils.php:1393
4795
  #, php-format
4796
  msgid "Error, cannot write %s."
4797
  msgstr "Erreur, impossible d'écrire dans %s."
@@ -5290,7 +5330,7 @@ msgstr ""
5290
  "Impossible de récupérer les règles de l'utilisateur dans la base de données "
5291
  "(#4)"
5292
 
5293
- #: ninjafirewall.php:109
5294
  msgid ""
5295
  "You do not have \"unfiltered_html\" capability. Please enable it in order to "
5296
  "run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
@@ -5301,7 +5341,7 @@ msgstr ""
5301
  "la directive \"DISALLOW_UNFILTERED_HTML\" activée dans votre fichier wp-"
5302
  "config.php)."
5303
 
5304
- #: ninjafirewall.php:116
5305
  #, php-format
5306
  msgid ""
5307
  "NinjaFirewall requires WordPress 3.3 or greater but your current version is "
@@ -5310,19 +5350,19 @@ msgstr ""
5310
  "NinjaFirewall nécessite au moins WordPress 3.3 mais votre version de "
5311
  "WordPress est %s."
5312
 
5313
- #: ninjafirewall.php:120
5314
  #, php-format
5315
  msgid ""
5316
  "NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
5317
  msgstr ""
5318
  "NinjaFirewall nécessite au moins PHP 5.3 mais votre version de PHP est %s."
5319
 
5320
- #: ninjafirewall.php:124
5321
  #, php-format
5322
  msgid "NinjaFirewall requires the PHP %s extension."
5323
  msgstr "NinjaFirewall nécessite l'extension PHP %s."
5324
 
5325
- #: ninjafirewall.php:128
5326
  msgid ""
5327
  "You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
5328
  "5.3.0 (see http://php.net/safe-mode)."
@@ -5331,15 +5371,15 @@ msgstr ""
5331
  "devenue obsolète depuis PHP 5.3 et a été supprimée depuis PHP 5.4 (cf. "
5332
  "http://php.net/safe-mode)."
5333
 
5334
- #: ninjafirewall.php:132
5335
  msgid "You are not allowed to activate NinjaFirewall."
5336
  msgstr "Vous n’êtes pas autorisé à activer NinjaFirewall."
5337
 
5338
- #: ninjafirewall.php:136
5339
  msgid "NinjaFirewall is not compatible with Microsoft Windows."
5340
  msgstr "NinjaFirewall n'est pas compatible avec Microsoft Windows."
5341
 
5342
- #: ninjafirewall.php:288
5343
  msgid ""
5344
  "All fields will be restored to their default values and any changes you made "
5345
  "will be lost. Continue?"
@@ -5347,15 +5387,15 @@ msgstr ""
5347
  "Tous les champs vont être re-initialisés et vos changements seront perdus. "
5348
  "Continuer ?"
5349
 
5350
- #: ninjafirewall.php:292
5351
  msgid "Missing security nonce, try to reload the page."
5352
  msgstr "La nonce de sécurité est manquante, essayer de recharger cette page."
5353
 
5354
- #: ninjafirewall.php:294
5355
  msgid "Please select the HTTP server in the list."
5356
  msgstr "Sélectionnez votre serveur HTTP dans la list."
5357
 
5358
- #: ninjafirewall.php:298
5359
  msgid ""
5360
  "This action will restore the selected configuration file and will override "
5361
  "all your current firewall options, policies and rules. Continue?"
@@ -5364,7 +5404,7 @@ msgstr ""
5364
  "remplacera toutes les options, politiques et règles de pare-feu actuelles. "
5365
  "Continuer ?"
5366
 
5367
- #: ninjafirewall.php:302
5368
  msgid ""
5369
  "Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
5370
  "hyphen [-] or an underscore [_] will be removed from the filename and "
@@ -5374,7 +5414,7 @@ msgstr ""
5374
  "[.], un trait d'union[-] ou un caractère de soulignement[_], sera supprimé "
5375
  "du nom du fichier et remplacé par le caractère de substitution."
5376
 
5377
- #: ninjafirewall.php:304
5378
  msgid ""
5379
  "Ensure that you can access your admin console over HTTPS before enabling "
5380
  "this option, otherwise you will lock yourself out of your site. Continue?"
@@ -5383,65 +5423,65 @@ msgstr ""
5383
  "option, sinon vous risqueriez de ne plus pouvoir accéder à l'interface "
5384
  "d'administration. Continuer ?"
5385
 
5386
- #: ninjafirewall.php:308
5387
  msgid "Delete the current snapshot ?"
5388
  msgstr "Supprimer l'instantané actuel ?"
5389
 
5390
- #: ninjafirewall.php:312
5391
  msgid "Invalid character."
5392
  msgstr "Caractère invalide."
5393
 
5394
- #: ninjafirewall.php:314
5395
  msgid "\"admin\" is not acceptable, please choose another user name."
5396
  msgstr ""
5397
  "\"admin\" n\\'est pas acceptable, merci de bien vouloir choisir un autre "
5398
  "identifiant."
5399
 
5400
- #: ninjafirewall.php:316
5401
  msgid "Please enter max 1024 character only."
5402
  msgstr "Veuillez ne pas entrer plus de 1 024 caractères."
5403
 
5404
- #: ninjafirewall.php:318
5405
  msgid "Select when to enable the login protection."
5406
  msgstr "Veuillez sélectionner quand activer la protection."
5407
 
5408
- #: ninjafirewall.php:320
5409
  msgid "Enter a name and a password for the HTTP authentication."
5410
  msgstr ""
5411
  "Veuillez entrer un nom d'utilisateur et mot de passe pour l'authentification "
5412
  "HTTP."
5413
 
5414
- #: ninjafirewall.php:324
5415
  msgid "Your public key is not valid."
5416
  msgstr "Votre clé publique n\\'est pas valide."
5417
 
5418
- #: ninjafirewall.php:328
5419
  msgid "No traffic yet, please wait"
5420
  msgstr "Aucun visiteur actuellement, veuillez patienter"
5421
 
5422
- #: ninjafirewall.php:330
5423
  msgid "seconds..."
5424
  msgstr "secondes..."
5425
 
5426
- #: ninjafirewall.php:332
5427
  msgid "Error: Live Log did not receive the expected response from your server:"
5428
  msgstr "Erreur : le serveur distant n\\'a pas retourné la réponse attendue :"
5429
 
5430
- #: ninjafirewall.php:334
5431
  msgid "Error: URL does not seem to exist (404 Not Found):"
5432
  msgstr "Erreur : l'URL ne semble pas exister (404 Not Found) :"
5433
 
5434
- #: ninjafirewall.php:336
5435
  msgid "Error: Cannot find your log file. Try to reload this page."
5436
  msgstr ""
5437
  "Erreur : Impossible de trouver le fichier log. Essayez de recharger cette "
5438
  "page."
5439
 
5440
- #: ninjafirewall.php:338
5441
  msgid "Error: The HTTP server returned the following error code:"
5442
  msgstr "Erreur : Le serveur HTTP a retourné le code d'erreur suivant :"
5443
 
5444
- #: ninjafirewall.php:579
5445
  msgid "Error: Security nonces do not match. Reload the page and try again."
5446
  msgstr ""
5447
  "Erreur : Les nonces de sécurité ne correspondent pas. Veuillez recharger "
@@ -5456,70 +5496,654 @@ msgstr "Erreur : NinjaFirewall est désactivé"
5456
  msgid "Error: missing parameter (%s)."
5457
  msgstr "Erreur : Paramètre manquant (%s)."
5458
 
5459
- #: ninjafirewall.php:734
5460
  msgid "NinjaFirewall: Dashboard"
5461
  msgstr "NinjaFirewall : Tableau de Bord"
5462
 
5463
- #: ninjafirewall.php:738
5464
  msgid "NinjaFirewall: Firewall Options"
5465
  msgstr "NinjaFirewall : Options du Pare-feu"
5466
 
5467
- #: ninjafirewall.php:742
5468
  msgid "NinjaFirewall: Firewall Policies"
5469
  msgstr "NinjaFirewall : Politiques du Pare-feu"
5470
 
5471
- #: ninjafirewall.php:746
5472
  msgid "NinjaFirewall: Monitoring"
5473
  msgstr "NinjaFirewall : Monitoring"
5474
 
5475
- #: ninjafirewall.php:756
5476
  msgid "NinjaFirewall: Anti-Malware"
5477
  msgstr "NinjaFirewall : Anti-Malware"
5478
 
5479
- #: ninjafirewall.php:760
5480
  msgid "NinjaFirewall: Network"
5481
  msgstr "NinjaFirewall : Réseau"
5482
 
5483
- #: ninjafirewall.php:764
5484
  msgid "NinjaFirewall: Event Notifications"
5485
  msgstr "NinjaFirewall : Notifications d’Événement"
5486
 
5487
- #: ninjafirewall.php:768
5488
  msgid "NinjaFirewall: Log-in Protection"
5489
  msgstr "NinjaFirewall : Page de Connexion"
5490
 
5491
- #: ninjafirewall.php:772
5492
  msgid "NinjaFirewall: Logs"
5493
  msgstr "NinjaFirewall : Journaux"
5494
 
5495
- #: ninjafirewall.php:776
5496
  msgid "NinjaFirewall: Security Rules"
5497
  msgstr "NinjaFirewall : Règles de Sécurité"
5498
 
5499
- #: ninjafirewall.php:820
5500
  msgid "NinjaFirewall Settings"
5501
  msgstr "Réglages de NinjaFirewall"
5502
 
5503
- #: ninjafirewall.php:828
5504
  msgid "NinjaFirewall is enabled"
5505
  msgstr "NinjaFirewall est activé"
5506
 
5507
- #: ninjafirewall.php:969
5508
  msgid "Access Restricted"
5509
  msgstr "Accès limité"
5510
 
5511
- #: ninjafirewall.php:975
5512
  msgid "Settings"
5513
  msgstr "Réglages"
5514
 
5515
- #: ninjafirewall.php:976
5516
  msgid "Upgrade to Premium"
5517
  msgstr "Passez Premium !"
5518
 
5519
- #: ninjafirewall.php:977
5520
  msgid "Rate it!"
5521
  msgstr "Notez-le !"
5522
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5523
  #~ msgid "About"
5524
  #~ msgstr "À Propos"
5525
 
4
  msgstr ""
5
  "Project-Id-Version: Stable (latest release)\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ninjafirewall\n"
7
+ "POT-Creation-Date: 2020-01-17 21:32+0700\n"
8
+ "PO-Revision-Date: 2020-01-17 21:33+0700\n"
9
  "Last-Translator: NinTechNet <contact@nintechnet.com>\n"
10
  "Language-Team: NinTechNet <nintechnet.com>\n"
11
  "Language: fr_FR\n"
16
  "X-Poedit-SourceCharset: UTF-8\n"
17
  "Plural-Forms: nplurals=2; plural=(n > 1);\n"
18
 
19
+ #: lib/anti_malware.php:24 ninjafirewall.php:774
20
  msgid "Anti-Malware"
21
  msgstr "Anti-Malware"
22
 
92
  msgid "NinjaFirewall (WP Edition)"
93
  msgstr "NinjaFirewall (WP Edition)"
94
 
95
+ #: lib/dashboard.php:120 ninjafirewall.php:752
96
  msgid "Dashboard"
97
  msgstr "Tableau de Bord"
98
 
104
  msgid "About..."
105
  msgstr "À Propos..."
106
 
107
+ #: lib/dashboard.php:134
108
+ msgid "Thank you for using NinjaFirewall."
109
+ msgstr "Merci d'utiliser NinjaFirewall."
110
+
111
+ #: lib/dashboard.php:135
112
+ #, php-format
113
+ msgid ""
114
+ "Every page of NinjaFirewall has a contextual help: whenever you need help "
115
+ "about an option or feature, click on the %s tab located in the upper right "
116
+ "corner of the corresponding page."
117
+ msgstr ""
118
+ "Chaque page de NinjaFirewall a une aide contextuelle : lorsque vous avez "
119
+ "besoin d'aide au sujet d'une option ou d'un menu, cliquez sur l'onglet %s "
120
+ "situé en haut à droite de la page correspondante."
121
+
122
+ #: lib/dashboard.php:135
123
+ msgid "Help"
124
+ msgstr "Aide"
125
+
126
+ #: lib/dashboard.php:137
127
+ msgid "Got it!"
128
+ msgstr "J'ai compris !"
129
+
130
+ #: lib/dashboard.php:153 lib/help.php:36
131
  msgid "Firewall Dashboard"
132
  msgstr "Tableau de Bord du Pare-feu"
133
 
134
+ #: lib/dashboard.php:162
135
  msgid ""
136
  "It seems that you may have another instance of NinjaFirewall running in a "
137
  "parent directory. Make sure to follow these instructions:"
139
  "Il semble qu'une autre instance de NinjaFirewall est installée dans un "
140
  "répertoire parent. Assurez-vous de suivre ces instructions:"
141
 
142
+ #: lib/dashboard.php:164
143
  msgid ""
144
  "Temporarily disable the firewall in the parent folder by renaming its PHP "
145
  "INI or .htaccess file."
147
  "Désactivez temporairement le pare-feu dans le répertoire parent en renommant "
148
  "son fichier PHP INI ou .htaccess."
149
 
150
+ #: lib/dashboard.php:166
151
  msgid "Install NinjaFirewall on this site in Full WAF mode."
152
  msgstr "Installez NinjaFirewall sur ce site, en mode Full WAF."
153
 
154
+ #: lib/dashboard.php:168
155
  msgid ""
156
  "Restore the PHP INI or .htaccess in the parent folder to re-enable the "
157
  "firewall."
159
  "Restaurez le fichier PHP INI ou .htaccess dans le dossier parent pour "
160
  "réactiver le pare-feu."
161
 
162
+ #: lib/dashboard.php:174
163
  msgid "Unknown error"
164
  msgstr "Erreur inconnue"
165
 
166
+ #: lib/dashboard.php:178 lib/dashboard.php:186
167
  msgid "Firewall"
168
  msgstr "Pare-feu"
169
 
170
+ #: lib/dashboard.php:187 lib/dashboard.php:323 lib/firewall_options.php:64
171
  #: lib/login_protection.php:203 lib/logs_live_log.php:101
172
+ #: lib/monitoring_file_guard.php:70 lib/security_rules_update.php:138
173
  msgid "Enabled"
174
  msgstr "Activé"
175
 
176
+ #: lib/dashboard.php:194
177
  msgid "Mode"
178
  msgstr "Mode"
179
 
180
+ #: lib/dashboard.php:199 lib/dashboard.php:205
181
  #, php-format
182
  msgid "NinjaFirewall is running in %s mode."
183
  msgstr "NinjaFirewall fonctionne en mode %s."
184
 
185
+ #: lib/dashboard.php:199
186
  msgid "WordPress WAF"
187
  msgstr "WordPress WAF"
188
 
189
+ #: lib/dashboard.php:201
190
  #, php-format
191
  msgid ""
192
  "For better protection, <a %s>click here</a> to enable its Full WAF mode."
194
  "Pour une meilleure protection, <a %s>cliquez ici</a> pour activer son mode "
195
  "Full WAF."
196
 
197
+ #: lib/dashboard.php:201
198
  msgid "Click to install NinjaFirewall in Full WAF mode."
199
  msgstr "Cliquez pour installer NinjaFirewall en mode Full WAF."
200
 
201
+ #: lib/dashboard.php:205
202
  msgid "Full WAF"
203
  msgstr "Full WAF"
204
 
205
+ #: lib/dashboard.php:218 lib/firewall_options.php:76 lib/help.php:77
206
  msgid "Debugging mode"
207
  msgstr "Mode débogage"
208
 
209
+ #: lib/dashboard.php:219
210
  msgid "Enabled."
211
  msgstr "Activé."
212
 
213
+ #: lib/dashboard.php:219
214
  msgid "Click here to turn Debugging Mode off"
215
  msgstr "Cliquez ici pour désactiver le mode Débogage"
216
 
217
+ #: lib/dashboard.php:225
218
  msgid "Edition"
219
  msgstr "Édition"
220
 
221
+ #: lib/dashboard.php:226
222
+ msgid ""
223
+ "Need more security? Explore our supercharged premium version: NinjaFirewall "
224
+ "(WP+ Edition)"
225
+ msgstr ""
226
+ "Besoin de plus de sécurité ? Prenez le temps d'explorer notre version "
227
+ "premium musclée : NinjaFirewall (WP+ Edition)"
228
 
229
+ #: lib/dashboard.php:229
230
  msgid "Version"
231
  msgstr "Version"
232
 
233
+ #: lib/dashboard.php:230
234
  msgid "Security rules:"
235
  msgstr "Règles de sécurité&nbsp;:"
236
 
237
+ #: lib/dashboard.php:234
238
  msgid "PHP SAPI"
239
  msgstr "PHP SAPI"
240
 
241
+ #: lib/dashboard.php:252
242
  msgid "Updates"
243
  msgstr "Mises à Jour"
244
 
245
+ #: lib/dashboard.php:253
246
  msgid "Security rules updates are disabled."
247
  msgstr "La mise à jour automatique des règles de sécurité est désactivée."
248
 
249
+ #: lib/dashboard.php:253
250
  msgid ""
251
  "If you want your blog to be protected against the latest threats, enable "
252
  "automatic security rules updates."
254
  "Pour garder votre WordPress protégé contre les dernières vulnérabilités, "
255
  "pensez à l'activer."
256
 
257
+ #: lib/dashboard.php:261 lib/dashboard.php:269
258
  msgid "Admin user"
259
  msgstr "Administrateur"
260
 
261
+ #: lib/dashboard.php:262
262
  #, php-format
263
  msgid ""
264
  "You are not whitelisted. Ensure that the \"Do not block WordPress "
271
  "\"%s\">Politiques du Pare-feu</a>, sinon vous pourriez être bloqué par le "
272
  "pare-feu lorsque vous travaillez depuis votre Tableau de bord."
273
 
274
+ #: lib/dashboard.php:270
275
  msgid "You are whitelisted by the firewall."
276
  msgstr "Vous êtes dans la liste blanche du pare-feu."
277
 
278
+ #: lib/dashboard.php:277
279
  msgid "Restrictions"
280
  msgstr "Restrictions"
281
 
282
+ #: lib/dashboard.php:278
283
  msgid "Access to NinjaFirewall is restricted to specific users."
284
  msgstr "L'accès à NinjaFirewall est restreint à certains utilisateurs."
285
 
286
+ #: lib/dashboard.php:289
287
  msgid "User session"
288
  msgstr "Session utilisateur"
289
 
290
+ #: lib/dashboard.php:290
291
  msgid ""
292
  "It seems that the user session set by NinjaFirewall was not found by the "
293
  "firewall script."
295
  "Il semble que la session d'utilisateur définie par NinjaFirewall n'a pas été "
296
  "trouvé par le script du pare-feu."
297
 
298
+ #: lib/dashboard.php:298
299
  #, php-format
300
  msgid ""
301
  "the public key is invalid. Please <a href=\"%s\">check your configuration</"
304
  "la clé publique est invalide. Veuillez vérifier <a href=\"%s\">votre "
305
  "configuration</a>."
306
 
307
+ #: lib/dashboard.php:302
308
  msgid "No IP address restriction."
309
  msgstr "Aucune restriction d'accès par adresse IP."
310
 
311
+ #: lib/dashboard.php:305
312
  #, php-format
313
  msgid "IP address %s is allowed to access NinjaFirewall's log on this server."
314
  msgstr ""
315
  "L'adresse IP %s est autorisée à accéder au journal du pare-feu de "
316
  "NinjaFirewall."
317
 
318
+ #: lib/dashboard.php:308
319
  #, php-format
320
  msgid ""
321
  "the whitelisted IP is not valid. Please <a href=\"%s\">check your "
324
  "l'adresse IP est invalide. Veuillez vérifier <a href=\"%s\">votre "
325
  "configuration</a>."
326
 
327
+ #: lib/dashboard.php:313 lib/help.php:460 lib/logs_firewall_log.php:194
328
  #: lib/wpplus.php:170
329
  msgid "Centralized Logging"
330
  msgstr "Centralisation des Logs"
331
 
332
+ #: lib/dashboard.php:317 lib/security_rules_update.php:415
333
  #, php-format
334
  msgid "Error: %s"
335
  msgstr "Erreur : %s"
336
 
337
+ #: lib/dashboard.php:332
338
  msgid "Source IP"
339
  msgstr "IP source"
340
 
341
+ #: lib/dashboard.php:333
342
  #, php-format
343
  msgid "You have a private IP : %s"
344
  msgstr "Vous avez l'adresse IP d'un réseau privé : %s"
345
 
346
+ #: lib/dashboard.php:333
347
  #, php-format
348
  msgid ""
349
  "If your site is behind a reverse proxy or a load balancer, ensure that you "
355
  "la bonne adresse IP, sinon utilisez le fichier de configuration %s de "
356
  "NinjaFirewall. "
357
 
358
+ #: lib/dashboard.php:341 lib/dashboard.php:351
359
  msgid "CDN detection"
360
  msgstr "Détection CDN"
361
 
362
+ #: lib/dashboard.php:342
363
  #, php-format
364
  msgid ""
365
  "%s detected: you seem to be using Cloudflare CDN services. Ensure that you "
370
  "vous d'avoir configuré votre serveur HTTP afin qu'il fasse suivre la bonne "
371
  "adresse IP, sinon utilisez le fichier de configuration %s de NinjaFirewall."
372
 
373
+ #: lib/dashboard.php:352
374
  #, php-format
375
  msgid ""
376
  "%s detected: you seem to be using Incapsula CDN services. Ensure that you "
381
  "vous d'avoir configuré votre serveur HTTP afin qu'il fasse suivre la bonne "
382
  "adresse IP, sinon utilisez le fichier de configuration %s de NinjaFirewall."
383
 
384
+ #: lib/dashboard.php:361 lib/dashboard.php:370
385
  msgid "Log dir"
386
  msgstr "Répertoire du Journal"
387
 
388
+ #: lib/dashboard.php:362 lib/dashboard.php:371
389
  #, php-format
390
  msgid "%s directory is not writable! Please chmod it to 0777 or equivalent."
391
  msgstr ""
392
  "Le répertoire %s est en lecture seule ! Veuillez changer ses permissions "
393
  "(0777 ou équivalent)."
394
 
395
+ #: lib/dashboard.php:379
396
  msgid "Optional configuration file"
397
  msgstr "Fichier de configuration"
398
 
399
+ #: lib/dashboard.php:386
400
  msgid "MySQLi link identifier"
401
  msgstr "Identifiant de lien MySQLi"
402
 
403
+ #: lib/dashboard.php:387
404
  msgid "A MySQLi link identifier was detected in your <code>.htninja</code>."
405
  msgstr ""
406
  "Un identifiant de lien MySQLi a été détecté dans votre fichier <code>."
407
  "htninja</code>."
408
 
409
+ #: lib/dashboard.php:393
410
  msgid "Help &amp; configuration"
411
  msgstr "Aide &amp; configuration"
412
 
422
  "Soyez informé des dernières vulnérabilités dans les extensions et thèmes de "
423
  "WordPress :"
424
 
425
+ #: lib/dashboard_about.php:31 lib/help.php:508
426
  msgid "GDPR Compliance"
427
  msgstr "Conformité RGPD"
428
 
492
  msgid "Select monthly stats to view..."
493
  msgstr "Sélectionnez les statistiques à afficher"
494
 
495
+ #: lib/event_notifications.php:34 lib/help.php:370 ninjafirewall.php:782
496
  msgid "Event Notifications"
497
  msgstr "Notifications d'Événement"
498
 
508
  msgid "WordPress admin dashboard"
509
  msgstr "Connexion"
510
 
511
+ #: lib/event_notifications.php:55 lib/event_notifications.php:118
512
+ #: lib/event_notifications.php:138
513
  msgid "Send me an alert whenever"
514
  msgstr "Envoyer une alerte quand"
515
 
586
  msgid "Updates WordPress (default)"
587
  msgstr "Met à jour WordPress (défaut)"
588
 
589
+ #: lib/event_notifications.php:115
590
+ msgid "Security updates"
591
+ msgstr "Mises à jour de sécurité"
592
+
593
+ #: lib/event_notifications.php:120
594
+ msgid ""
595
+ "An important security update is available for a plugin, theme or WordPress "
596
+ "(default)"
597
+ msgstr ""
598
+ "Une importante mise à jour de sécurité est disponible pour une extension, un "
599
+ "thème ou WordPress (défaut)"
600
+
601
+ #: lib/event_notifications.php:135
602
  msgid "Administrator account"
603
  msgstr "Compte administrateur"
604
 
605
+ #: lib/event_notifications.php:140
606
  msgid ""
607
  "An administrator account is created, modified or deleted in the database "
608
  "(default)"
610
  "Un compte Administrateur est crée, modifié ou supprimé dans la base de "
611
  "données (défaut)"
612
 
613
+ #: lib/event_notifications.php:147
 
 
 
 
 
 
614
  msgid "Daily report"
615
  msgstr "Rapport quotidien"
616
 
617
+ #: lib/event_notifications.php:150
618
  msgid "Send me a daily activity report"
619
  msgstr "Envoyer un rapport d'activité quotidien"
620
 
621
+ #: lib/event_notifications.php:152 lib/event_notifications.php:164
622
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
623
  #: lib/firewall_policies.php:25 lib/login_protection.php:309
624
  #: lib/login_protection.php:324 lib/login_protection.php:345
626
  msgid "Yes"
627
  msgstr "Oui"
628
 
629
+ #: lib/event_notifications.php:152 lib/event_notifications.php:164
630
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
631
  #: lib/firewall_policies.php:26 lib/login_protection.php:309
632
  #: lib/login_protection.php:324 lib/login_protection.php:345
634
  msgid "No"
635
  msgstr "Non"
636
 
637
+ #: lib/event_notifications.php:159
638
  msgid "Log"
639
  msgstr "Journal"
640
 
641
+ #: lib/event_notifications.php:162
642
  msgid "Write all events to the firewall log"
643
  msgstr "Enregistrer les événements dans le journal du pare-feu"
644
 
645
+ #: lib/event_notifications.php:176
646
  msgid "PHP backtrace"
647
  msgstr "Pile d'exécution de PHP"
648
 
649
+ #: lib/event_notifications.php:179
650
  msgid "Attach a PHP backtrace to important notifications"
651
  msgstr ""
652
  "Ajouter aux notifications importantes la pile d'exécution de PHP en pièce "
653
  "jointe"
654
 
655
+ #: lib/event_notifications.php:182
656
  msgid "Disable backtrace"
657
  msgstr "Désactiver la pile d'exécution"
658
 
659
+ #: lib/event_notifications.php:183
660
  msgid "Low verbosity"
661
  msgstr "Faible verbosité"
662
 
663
+ #: lib/event_notifications.php:184
664
  msgid "Medium verbosity (default)"
665
  msgstr "Verbosité moyenne (par défaut)"
666
 
667
+ #: lib/event_notifications.php:185
668
  msgid "High verbosity"
669
  msgstr "Verbosité élevée"
670
 
671
+ #: lib/event_notifications.php:187
672
  #, php-format
673
  msgid "<a href=\"%s\">Consult our blog</a> for more info."
674
  msgstr ""
675
  "<a href=\"%s\">Consultez notre blog pour plus d'informations à ce sujet</a>."
676
 
677
+ #: lib/event_notifications.php:197 lib/event_notifications.php:227
678
  msgid "Contact email"
679
  msgstr "Adresse e-mail du contact"
680
 
681
+ #: lib/event_notifications.php:200 lib/event_notifications.php:230
682
  msgid "Alerts should be sent to"
683
  msgstr "Envoyer les alertes à"
684
 
685
+ #: lib/event_notifications.php:209 lib/event_notifications.php:235
686
  msgid ""
687
  "Multiple recipients must be comma-separated (e.g., <code>joe@example.org,"
688
  "alice@example.org</code>)."
690
  "Plusieurs destinataires doivent être séparés par des virgules (par ex. "
691
  "<code>joe@example.org,alice@example.org</code>)."
692
 
693
+ #: lib/event_notifications.php:232
694
  msgid "Only to me, the Super Admin"
695
  msgstr "Moi uniquement, le Super Admin"
696
 
697
+ #: lib/event_notifications.php:232
698
  msgid "default"
699
  msgstr "défaut"
700
 
701
+ #: lib/event_notifications.php:233
702
  msgid "To the administrator of the site where originated the alert"
703
  msgstr "L'Administrateur du site d’où provient l'alerte"
704
 
705
+ #: lib/event_notifications.php:234
706
  msgid "Other(s):"
707
  msgstr "Autre(s) :"
708
 
709
+ #: lib/event_notifications.php:246
710
  msgid "Save Event Notifications"
711
  msgstr "Sauvegarder les options"
712
 
713
+ #: lib/event_notifications.php:477
714
  msgid "[NinjaFirewall] Daily Activity Report"
715
  msgstr "[NinjaFirewall] Rapport d'activité quotidien"
716
 
717
+ #: lib/event_notifications.php:487
718
  #, php-format
719
  msgid "Daily activity report for: %s"
720
  msgstr "Rapport d'activité quotidien pour : %s"
721
 
722
+ #: lib/event_notifications.php:488
723
  msgid "Date Range Processed: Yesterday"
724
  msgstr "Plage de date traitée : Hier"
725
 
726
+ #: lib/event_notifications.php:490
727
  msgid "Blocked threats:"
728
  msgstr "Menaces bloquées :"
729
 
730
+ #: lib/event_notifications.php:492
731
  msgid "critical:"
732
  msgstr "Critique :"
733
 
734
+ #: lib/event_notifications.php:493
735
  msgid "high:"
736
  msgstr "Élevé :"
737
 
738
+ #: lib/event_notifications.php:494
739
  msgid "medium:"
740
  msgstr "Moyen :"
741
 
742
+ #: lib/event_notifications.php:496
743
  msgid "Blocked brute-force attacks:"
744
  msgstr "Attaques par force brute bloquées :"
745
 
746
+ #: lib/event_notifications.php:497 lib/utils.php:788
747
  msgid ""
748
  "This notification can be turned off from NinjaFirewall \"Event Notifications"
749
  "\" page."
751
  "Cette notification peut être désactivée depuis la page \"Notifications "
752
  "d’Événement\" de NinjaFirewall."
753
 
754
+ #: lib/event_notifications.php:501 lib/event_updates.php:218 lib/events.php:225
755
+ #: lib/firewall_options.php:525 lib/monitoring_file_check.php:777
756
+ #: lib/monitoring_file_check.php:798 lib/security_rules_update.php:561
757
  msgid "Support forum:"
758
  msgstr "Forum :"
759
 
760
+ #: lib/event_notifications.php:504 lib/event_updates.php:221 lib/events.php:228
761
+ #: lib/firewall_options.php:528 lib/monitoring_file_check.php:780
762
+ #: lib/monitoring_file_check.php:801 lib/security_rules_update.php:564
763
+ #: lib/utils.php:235 lib/utils.php:584 lib/utils.php:793 lib/utils.php:971
764
+ #: lib/utils.php:1284
765
  #, php-format
766
  msgid ""
767
  "Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): "
770
  "Besoin de plus de sécurité ? Venez découvrir NinjaFirewall (WP+ Edition), "
771
  "une version encore plus musclée de notre pare-feu applicatif : %s "
772
 
773
+ #: lib/event_updates.php:157
774
+ msgid "[NinjaFirewall] Security update available"
775
+ msgstr "[NinjaFirewall] Mise à jour de sécurité en attente"
776
+
777
+ #: lib/event_updates.php:159
778
+ msgid ""
779
+ "NinjaFirewall has detected that there are security updates available for "
780
+ "your website:"
781
+ msgstr ""
782
+ "NinjaFirewall a détecté que des mises à jour de sécurité sont disponibles "
783
+ "pour votre site Web :"
784
+
785
+ #: lib/event_updates.php:160 lib/utils.php:219 lib/utils.php:777
786
+ #: lib/utils.php:954 lib/utils.php:1277
787
+ msgid "Date:"
788
+ msgstr "Date :"
789
+
790
+ #: lib/event_updates.php:163 lib/event_updates.php:165
791
+ #, php-format
792
+ msgid "Blog: %s"
793
+ msgstr "Blog : %s"
794
+
795
+ #: lib/event_updates.php:171 lib/event_updates.php:185
796
+ #: lib/event_updates.php:202
797
+ #, php-format
798
+ msgid "Your version: %s"
799
+ msgstr "Votre version : %s"
800
+
801
+ #: lib/event_updates.php:172 lib/event_updates.php:186
802
+ #: lib/event_updates.php:203
803
+ #, php-format
804
+ msgid "New version: %s"
805
+ msgstr "Nouvelle version : %s"
806
+
807
+ #: lib/event_updates.php:174 lib/event_updates.php:189
808
+ #: lib/event_updates.php:206
809
+ msgid "Severity: This is an important security update"
810
+ msgstr "Sévérité : Ceci est une mise à jour de sécurité importante"
811
+
812
+ #: lib/event_updates.php:176 lib/event_updates.php:191
813
+ #: lib/event_updates.php:208
814
+ msgid "Severity: **This is a critical security update**"
815
+ msgstr "Sévérité : **Ceci est une mise à jour de sécurité critique**"
816
+
817
+ #: lib/event_updates.php:184
818
+ #, php-format
819
+ msgid "Plugin: %s"
820
+ msgstr "Extension : %s"
821
+
822
+ #: lib/event_updates.php:201
823
+ #, php-format
824
+ msgid "Theme: %s"
825
+ msgstr "Theme : %s"
826
+
827
+ #: lib/event_updates.php:214
828
+ msgid "Don't leave your blog at risk, make sure to update as soon as possible."
829
+ msgstr ""
830
+ "Ne laissez pas votre blog en danger, lancez cette mise à jour dès que "
831
+ "possible."
832
+
833
+ #: lib/events.php:27
834
+ msgid "Name:"
835
+ msgstr "Nom :"
836
+
837
+ #: lib/events.php:28
838
+ msgid "Plugin"
839
+ msgstr "Extension"
840
+
841
+ #: lib/events.php:29
842
+ msgid "Theme"
843
+ msgstr "Thème"
844
+
845
+ #: lib/events.php:30
846
+ msgid "Version:"
847
+ msgstr "Version :"
848
+
849
+ #: lib/events.php:40 lib/events.php:73 lib/events.php:77 lib/events.php:136
850
+ msgid "activated"
851
+ msgstr "activé(e)"
852
+
853
+ #: lib/events.php:45 lib/events.php:93 lib/events.php:183 lib/events.php:195
854
+ msgid "deleted"
855
+ msgstr "supprimé(e)"
856
+
857
+ #: lib/events.php:81 lib/events.php:104 lib/events.php:109 lib/events.php:113
858
+ #: lib/events.php:128 lib/events.php:132 lib/events.php:148 lib/events.php:157
859
+ #: lib/events.php:179 lib/events.php:191
860
+ msgid "updated"
861
+ msgstr "mis(e) à jour"
862
+
863
+ #: lib/events.php:85 lib/events.php:89
864
+ msgid "deactivated"
865
+ msgstr "désactivé(e)"
866
+
867
+ #: lib/events.php:140 lib/events.php:161 lib/events.php:175 lib/events.php:187
868
+ msgid "installed"
869
+ msgstr "installé(e)"
870
+
871
+ #: lib/events.php:144 lib/events.php:165
872
+ msgid "uploaded"
873
+ msgstr "téléchargé(e)"
874
+
875
+ #: lib/events.php:211
876
+ #, php-format
877
+ msgid "[NinjaFirewall] Alert: %s"
878
+ msgstr "[NinjaFirewall] Alerte : %s"
879
+
880
+ #: lib/events.php:213 lib/events.php:215 lib/utils.php:571
881
+ msgid "-Blog:"
882
+ msgstr "- Blog :"
883
+
884
+ #: lib/events.php:218
885
+ msgid "NinjaFirewall has detected the following activity on your account:"
886
+ msgstr "NinjaFirewall a détecté l'activité suivante sur votre compte :"
887
+
888
+ #: lib/events.php:220 lib/utils.php:576
889
+ msgid "-User:"
890
+ msgstr "- Nom :"
891
+
892
+ #: lib/events.php:221 lib/utils.php:577
893
+ msgid "-IP:"
894
+ msgstr "- IP :"
895
+
896
+ #: lib/events.php:222 lib/utils.php:578
897
+ msgid "-Date:"
898
+ msgstr "-Date :"
899
+
900
+ #: lib/firewall_options.php:29 ninjafirewall.php:756
901
  msgid "Firewall Options"
902
  msgstr "Options du Pare-feu"
903
 
907
 
908
  #: lib/firewall_options.php:64 lib/login_protection.php:203
909
  #: lib/logs_live_log.php:101 lib/monitoring_file_guard.php:70
910
+ #: lib/security_rules_update.php:138
911
  msgid "Disabled"
912
  msgstr "Désactivé"
913
 
956
  "Ne s'applique pas aux adresses IP privées, ni à la <a href=\"%s\">Page de "
957
  "Connexion</a>."
958
 
959
+ #: lib/firewall_options.php:128 lib/help.php:90
960
  msgid "Blocked user message"
961
  msgstr "Message pour les utilisateurs bloqués"
962
 
1037
  msgid "[NinjaFirewall] Alert: Firewall is disabled"
1038
  msgstr "[NinjaFirewall] Alerte : Le pare-feu a été désactivé"
1039
 
1040
+ #: lib/firewall_options.php:501 lib/firewall_options.php:503
 
1041
  msgid "-Blog :"
1042
  msgstr "- Blog :"
1043
 
1066
  "Quelqu'un a importé une nouvelle configuration qui a modifié tous les "
1067
  "paramètres du pare-feu :"
1068
 
1069
+ #: lib/firewall_options.php:520
1070
  msgid "-User :"
1071
  msgstr "- Nom :"
1072
 
1073
+ #: lib/firewall_options.php:521
1074
  msgid "-IP :"
1075
  msgstr "- IP :"
1076
 
1077
+ #: lib/firewall_options.php:522
1078
  msgid "-Date :"
1079
  msgstr "- Date :"
1080
 
1086
  "Cette option ne peut être activée que lorsque NinjaFirewall fonctionne en "
1087
  "mode %s."
1088
 
1089
+ #: lib/firewall_policies.php:62 ninjafirewall.php:760
1090
  msgid "Firewall Policies"
1091
  msgstr "Politiques du Pare-feu"
1092
 
1098
  msgid "No action taken."
1099
  msgstr "Aucune mesure prise."
1100
 
1101
+ #: lib/firewall_policies.php:85 lib/help.php:161
1102
  msgid "Basic Policies"
1103
  msgstr "Politiques de base"
1104
 
1105
+ #: lib/firewall_policies.php:86 lib/help.php:214
1106
  msgid "Intermediate Policies"
1107
  msgstr "Politiques intermédiaires"
1108
 
1109
+ #: lib/firewall_policies.php:87 lib/help.php:253
1110
  msgid "Advanced Policies"
1111
  msgstr "Politiques avancées"
1112
 
1126
  msgid "HTTPS traffic only"
1127
  msgstr "Trafic HTTPS uniquement"
1128
 
1129
+ #: lib/firewall_policies.php:141 lib/help.php:169
1130
  msgid "Uploads"
1131
  msgstr "Téléchargements"
1132
 
1133
+ #: lib/firewall_policies.php:144 lib/help.php:171
1134
  msgid "File Uploads"
1135
  msgstr "Autoriser les téléchargements (uploads)"
1136
 
1146
  msgid "Disallow uploads"
1147
  msgstr "Interdire"
1148
 
1149
+ #: lib/firewall_policies.php:152 lib/help.php:173
1150
  msgid "Sanitise filenames"
1151
  msgstr "Nettoyer le nom des fichiers"
1152
 
1154
  msgid "substitution character:"
1155
  msgstr "caractère de substitution&nbsp;:"
1156
 
1157
+ #: lib/firewall_policies.php:281 lib/help.php:178
1158
  msgid "Block direct access to any PHP file located in one of these directories"
1159
  msgstr ""
1160
  "Bloquer l'accès direct à un fichier PHP situé dans l'un de ces répertoires"
1161
 
1162
+ #: lib/firewall_policies.php:311
1163
  msgid ""
1164
  "NinjaFirewall will not block access to the TinyMCE WYSIWYG editor even if "
1165
  "this option is enabled."
1167
  "NinjaFirewall ne bloquera pas l'accès à l'éditeur WYSIWYG TinyMCE même si "
1168
  "cette option est activée."
1169
 
1170
+ #: lib/firewall_policies.php:326
1171
  msgid ""
1172
  "Unless you have PHP scripts in a \"/cache/\" folder that need to be accessed "
1173
  "by your visitors, we recommend to enable this option."
1176
  "pouvant être consultés par vos visiteurs, nous vous recommandons d'activer "
1177
  "cette option."
1178
 
1179
+ #: lib/firewall_policies.php:335
1180
  msgid "General"
1181
  msgstr "Général"
1182
 
1183
+ #: lib/firewall_policies.php:337 lib/help.php:180
1184
  msgid "Block attempts to modify important WordPress settings"
1185
  msgstr ""
1186
  "Bloquer les tentatives de modification des paramètres importants de WordPress"
1187
 
1188
+ #: lib/firewall_policies.php:338 lib/help.php:182
1189
  msgid "Block user accounts creation"
1190
  msgstr "Bloquer la création de comptes utilisateur"
1191
 
1192
+ #: lib/firewall_policies.php:341
1193
+ #, php-format
1194
+ msgid ""
1195
+ "To enable this option, please remove the %s constant from your wp-config.php "
1196
+ "or .htninja script."
1197
+ msgstr ""
1198
+ "Pour activer cette option, veuillez enlever la constante %s de votre fichier "
1199
+ "wp-config.php ou .htninja."
1200
+
1201
+ #: lib/firewall_policies.php:349 lib/help.php:184
1202
+ msgid "Block attempts to gain administrative privileges"
1203
+ msgstr "Bloquer les tentatives d'élévation des privilèges"
1204
+
1205
+ #: lib/firewall_policies.php:362 lib/help.php:186
1206
  msgid "WordPress AJAX"
1207
  msgstr "WordPress AJAX"
1208
 
1209
+ #: lib/firewall_policies.php:364
1210
  msgid "Protect <code>admin-ajax.php</code> against suspicious bots"
1211
  msgstr ""
1212
  "Proteger <code>admin-ajax.php</code> contre les bots et scanners malveillants"
1213
 
1214
+ #: lib/firewall_policies.php:365
1215
  #, php-format
1216
  msgid ""
1217
  "Your server IP (%s), localhost and private IP addresses will not be affected "
1220
  "L'adresse IP de votre serveur (%s), localhost et toute adresse IP privée ne "
1221
  "seront pas affectées par cette politique."
1222
 
1223
+ #: lib/firewall_policies.php:370 lib/help.php:188
1224
  msgid "Protect against username enumeration"
1225
  msgstr "Protéger contre l'énumération des comptes utilisateurs"
1226
 
1227
+ #: lib/firewall_policies.php:372
1228
  msgid "Through the author archives"
1229
  msgstr "Via la page d'archive d'un auteur"
1230
 
1231
+ #: lib/firewall_policies.php:373
1232
  msgid "Through the login page"
1233
  msgstr "Via la page de connexion"
1234
 
1235
+ #: lib/firewall_policies.php:374
1236
  msgid "Through the WordPress REST API"
1237
  msgstr "Via l'API REST de WordPress"
1238
 
1239
+ #: lib/firewall_policies.php:379 lib/help.php:190
1240
  msgid "WordPress REST API"
1241
  msgstr "API REST de WordPress"
1242
 
1243
+ #: lib/firewall_policies.php:381 lib/firewall_policies.php:387
1244
  msgid "Block any access to the API"
1245
  msgstr "Bloquer tout accès à l'API"
1246
 
1247
+ #: lib/firewall_policies.php:385 lib/help.php:192
1248
  msgid "WordPress XML-RPC API"
1249
  msgstr "API XML-RPC de WordPress"
1250
 
1251
+ #: lib/firewall_policies.php:388
1252
  msgid "Block <code>system.multicall</code> method"
1253
  msgstr "Bloquer la méthode <code>system.multicall</code>"
1254
 
1255
+ #: lib/firewall_policies.php:389
1256
  msgid "Block Pingbacks"
1257
  msgstr "Bloquer les Pingbacks"
1258
 
1259
+ #: lib/firewall_policies.php:391
1260
  msgid ""
1261
  "Disabling access to the REST or XML-RPC API may break some functionality on "
1262
  "your blog, its themes or plugins (e.g., Gutenberg editor, Jetpack, Contact "
1266
  "blog, ses thèmes ou ses extensions (ex.: Éditeur Gutenberg, Jetpack, Contact "
1267
  "Form 7 etc)."
1268
 
1269
+ #: lib/firewall_policies.php:396
1270
  msgid "Block <code>POST</code> requests in the themes folder"
1271
  msgstr "Bloquer les requêtes <code>POST</code> dans le dossier des thèmes"
1272
 
1273
+ #: lib/firewall_policies.php:406
1274
+ msgid "Force HTTPS for admin and logins"
1275
  msgstr "Forcer la connexion sécurisée au Tableau de bord"
1276
 
1277
+ #: lib/firewall_policies.php:412
1278
  msgid "Disable the plugin and theme editor"
1279
  msgstr "Désactiver l’éditeur de thème et d'extension"
1280
 
1281
+ #: lib/firewall_policies.php:418
1282
  msgid "Disable plugin and theme update/installation"
1283
  msgstr "Désactiver l'installation et mise à jour des thèmes et extensions"
1284
 
1285
+ #: lib/firewall_policies.php:424
1286
  msgid "Disable the fatal error handler"
1287
  msgstr "Désactiver le gestionnaire d'erreurs fatales"
1288
 
1289
+ #: lib/firewall_policies.php:446 lib/help.php:204
1290
  msgid "Users Whitelist"
1291
  msgstr "Liste Blanche"
1292
 
1293
+ #: lib/firewall_policies.php:448
1294
  msgid "Add the Administrator to the whitelist (default)."
1295
  msgstr "Ajouter l'Administrateur à la liste blanche (défaut)."
1296
 
1297
+ #: lib/firewall_policies.php:449
1298
  msgid "Add all logged in users to the whitelist."
1299
  msgstr "Ajouter tous les utilisateurs connectés à la liste blanche."
1300
 
1301
+ #: lib/firewall_policies.php:450
1302
  msgid "Disable users whitelist."
1303
  msgstr "Désactiver la liste blanche."
1304
 
1305
+ #: lib/firewall_policies.php:451
1306
  msgid ""
1307
  "Note: This feature does not apply to <code>FORCE_SSL_ADMIN</code>, "
1308
  "<code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> and "
1314
  "<code>WP_DISABLE_FATAL_ERROR_HANDLER</code> qui, si elles sont activées, "
1315
  "seront toujours appliquées."
1316
 
1317
+ #: lib/firewall_policies.php:476 lib/help.php:218
1318
  msgid "HTTP GET variable"
1319
  msgstr "Variable HTTP GET"
1320
 
1321
+ #: lib/firewall_policies.php:479
1322
  msgid "Scan <code>GET</code> variable"
1323
  msgstr "Filtrer la variable <code>GET</code>"
1324
 
1325
+ #: lib/firewall_policies.php:485
1326
  msgid "Sanitise <code>GET</code> variable"
1327
  msgstr "Nettoyer la variable <code>GET</code>"
1328
 
1329
+ #: lib/firewall_policies.php:511 lib/help.php:221
1330
  msgid "HTTP POST variable"
1331
  msgstr "Variable HTTP POST"
1332
 
1333
+ #: lib/firewall_policies.php:514
1334
  msgid "Scan <code>POST</code> variable"
1335
  msgstr "Filtrer la variable <code>POST</code>"
1336
 
1337
+ #: lib/firewall_policies.php:520
1338
  msgid "Sanitise <code>POST</code> variable"
1339
  msgstr "Nettoyer la variable <code>POST</code>"
1340
 
1341
+ #: lib/firewall_policies.php:523 lib/firewall_policies.php:548
1342
  msgid "Do not enable this option unless you know what you are doing!"
1343
  msgstr ""
1344
  "N'activez pas cette option si vous n'êtes pas sûr de ce que vous "
1345
  "faites&nbsp;!"
1346
 
1347
+ #: lib/firewall_policies.php:527 lib/help.php:223
1348
  msgid "Decode Base64-encoded <code>POST</code> variable"
1349
  msgstr ""
1350
  "Décoder les chaîne encodées en Base64 dans la variable <code>POST</code>"
1351
 
1352
+ #: lib/firewall_policies.php:542 lib/help.php:225
1353
  msgid "HTTP REQUEST variable"
1354
  msgstr "Variable HTTP REQUEST"
1355
 
1356
+ #: lib/firewall_policies.php:545
1357
  msgid "Sanitise <code>REQUEST</code> variable"
1358
  msgstr "Nettoyer la variable <code>REQUEST</code>"
1359
 
1360
+ #: lib/firewall_policies.php:567 lib/help.php:228
1361
  msgid "Cookies"
1362
  msgstr "Cookies"
1363
 
1364
+ #: lib/firewall_policies.php:570
1365
  msgid "Scan cookies"
1366
  msgstr "Filtrer les cookies"
1367
 
1368
+ #: lib/firewall_policies.php:576
1369
  msgid "Sanitise cookies"
1370
  msgstr "Nettoyer les cookies"
1371
 
1372
+ #: lib/firewall_policies.php:602 lib/help.php:231
1373
  msgid "HTTP_USER_AGENT server variable"
1374
  msgstr "Variable HTTP_USER_AGENT"
1375
 
1376
+ #: lib/firewall_policies.php:605
1377
  msgid "Scan <code>HTTP_USER_AGENT</code>"
1378
  msgstr "Filtrer <code>HTTP_USER_AGENT</code>"
1379
 
1380
+ #: lib/firewall_policies.php:611
1381
  msgid "Sanitise <code>HTTP_USER_AGENT</code>"
1382
  msgstr "Nettoyer <code>HTTP_USER_AGENT</code>"
1383
 
1384
+ #: lib/firewall_policies.php:617 lib/help.php:233
1385
  msgid "Block suspicious bots/scanners"
1386
  msgstr "Bloquer les requêtes provenant de bots/scanners malveillants"
1387
 
1388
+ #: lib/firewall_policies.php:643 lib/help.php:235
1389
  msgid "HTTP_REFERER server variable"
1390
  msgstr "Variable HTTP_REFERER"
1391
 
1392
+ #: lib/firewall_policies.php:646
1393
  msgid "Scan <code>HTTP_REFERER</code>"
1394
  msgstr "Filtrer <code>HTTP_REFERER</code>"
1395
 
1396
+ #: lib/firewall_policies.php:652
1397
  msgid "Sanitise <code>HTTP_REFERER</code>"
1398
  msgstr "Nettoyer <code>HTTP_REFERER</code>"
1399
 
1400
+ #: lib/firewall_policies.php:658
1401
  msgid ""
1402
  "Block <code>POST</code> requests that do not have an <code>HTTP_REFERER</"
1403
  "code> header"
1405
  "Bloquer les requêtes <code>POST</code> qui n'ont pas d'en-tête "
1406
  "<code>HTTP_REFERER</code>"
1407
 
1408
+ #: lib/firewall_policies.php:661
1409
  msgid ""
1410
  "Keep this option disabled if you are using scripts like Paypal IPN, "
1411
  "WordPress WP-Cron etc"
1413
  "N'activez pas cette option si vous utilisez des scripts comme Paypal IPN, "
1414
  "WordPress WP-Cron etc"
1415
 
1416
+ #: lib/firewall_policies.php:688
1417
  msgid "Block localhost IP in <code>GET/POST</code> request"
1418
  msgstr "Bloquer les requêtes <code>GET/POST</code> contenant l'IP localhost"
1419
 
1420
+ #: lib/firewall_policies.php:694 lib/help.php:243
1421
  msgid "Block HTTP requests with an IP in the <code>HTTP_HOST</code> header"
1422
  msgstr ""
1423
  "Bloquer les requêtes HTTP dont l'en-tête <code>HTTP_HOST</code> contient une "
1424
  "IP"
1425
 
1426
+ #: lib/firewall_policies.php:700 lib/help.php:245
1427
  msgid "Scan traffic coming from localhost and private IP address spaces"
1428
  msgstr "Filtrer les connexions provenant de localhost et d'adresses IP privées"
1429
 
1430
+ #: lib/firewall_policies.php:730
1431
  #, php-format
1432
  msgid ""
1433
  "The \"HTTP response headers\" options below are disabled because the %s PHP "
1436
  "Les politiques \"En-têtes de réponse HTTP\" ci-dessous sont désactivées car "
1437
  "la fonction PHP %s n'est pas disponible sur votre serveur."
1438
 
1439
+ #: lib/firewall_policies.php:750 lib/help.php:257
1440
  msgid "HTTP response headers"
1441
  msgstr "En-têtes de réponse HTTP"
1442
 
1443
+ #: lib/firewall_policies.php:758
1444
  #, php-format
1445
  msgid "Set %s to protect against MIME type confusion attacks"
1446
  msgstr ""
1447
  "Activer %s pour protéger contre les attaques basées sur la confusion du type "
1448
  "MIME"
1449
 
1450
+ #: lib/firewall_policies.php:764
1451
  #, php-format
1452
  msgid "Set %s to protect against clickjacking attempts"
1453
  msgstr ""
1454
  "Activer %s pour protéger contre les attaques de détournement de clic "
1455
  "(clickjacking)"
1456
 
1457
+ #: lib/firewall_policies.php:771
1458
  msgid ""
1459
  "Setting this option to <code>DENY</code> may break some functionality on "
1460
  "your blog, its themes or plugins."
1462
  "Activer cette fonction avec <code>DENY</code> pourrait bloquer certaines "
1463
  "fonctionnalités de votre blog, ses thèmes ou ses extensions."
1464
 
1465
+ #: lib/firewall_policies.php:776
1466
  #, php-format
1467
  msgid "Set %s (IE/Edge, Chrome, Opera and Safari browsers)"
1468
  msgstr "Activer %s (IE/Edge, Opera, Chrome et Safari)"
1469
 
1470
+ #: lib/firewall_policies.php:780 lib/firewall_policies.php:781
1471
+ #: lib/firewall_policies.php:782
1472
  #, php-format
1473
  msgid "Set to %s"
1474
  msgstr "Régler sur %s"
1475
 
1476
+ #: lib/firewall_policies.php:787
1477
  #, php-format
1478
  msgid "Force %s flag on all cookies to mitigate CSRF attacks"
1479
  msgstr ""
1480
  "Activer la propriété %s pour tous les cookies afin d'atténuer les attaques "
1481
  "CSRF"
1482
 
1483
+ #: lib/firewall_policies.php:797
1484
  #, php-format
1485
  msgid "Force %s flag on all cookies to mitigate XSS attacks"
1486
  msgstr ""
1487
  "Activer la propriété %s pour tous les cookies afin d'atténuer les menaces "
1488
  "XSS qui génèrent des vols de cookies"
1489
 
1490
+ #: lib/firewall_policies.php:800
1491
  msgid ""
1492
  "If your PHP scripts use cookies that need to be accessed from JavaScript, "
1493
  "you should not enable this option."
1495
  "Si vos scripts PHP envoient des cookies qui doivent être accessibles à "
1496
  "partir de JavaScript, vous ne devriez pas activer cette option."
1497
 
1498
+ #: lib/firewall_policies.php:809
1499
  msgid ""
1500
  "HSTS headers can only be set when you are accessing your site over HTTPS."
1501
  msgstr ""
1502
  "Les en-têtes HSTS ne peuvent être utilisés que lorsque vous vous connectez à "
1503
  "votre site en HTTPS (connexion sécurisée)."
1504
 
1505
+ #: lib/firewall_policies.php:817
1506
  #, php-format
1507
  msgid "Set %s (HSTS) to enforce secure connections to the server"
1508
  msgstr ""
1509
  "Activer %s (HSTS) pour forcer les connexions sécurisées vers le serveur"
1510
 
1511
+ #: lib/firewall_policies.php:821
1512
  msgid "Set \"max-age\" to 0"
1513
  msgstr "Régler \"max-age\" à 0"
1514
 
1515
+ #: lib/firewall_policies.php:822
1516
  msgid "1 month"
1517
  msgstr "1 mois"
1518
 
1519
+ #: lib/firewall_policies.php:823
1520
  msgid "6 months"
1521
  msgstr "6 mois"
1522
 
1523
+ #: lib/firewall_policies.php:824
1524
  msgid "1 year"
1525
  msgstr "1 année"
1526
 
1527
+ #: lib/firewall_policies.php:826
1528
  msgid "Apply to subdomains"
1529
  msgstr "Appliquer aux sous-domaines"
1530
 
1531
+ #: lib/firewall_policies.php:850
1532
  #, php-format
1533
  msgid "Set %s for the website frontend"
1534
  msgstr "Activer %s pour le site"
1535
 
1536
+ #: lib/firewall_policies.php:855
1537
  msgid "This CSP header will apply to the website frontend only."
1538
  msgstr "Cet en-tête CSP ne s'appliquera qu'au site."
1539
 
1540
+ #: lib/firewall_policies.php:859
1541
  #, php-format
1542
  msgid "Set %s for the WordPress admin dashboard"
1543
  msgstr "Activer %s pour la console d'administration de WordPress"
1544
 
1545
+ #: lib/firewall_policies.php:864
1546
  msgid "This CSP header will apply to the WordPress admin dashboard only."
1547
  msgstr ""
1548
  "Cet en-tête CSP ne s'appliquera qu'à la console d'administration de "
1549
  "WordPress."
1550
 
1551
+ #: lib/firewall_policies.php:880
1552
  #, php-format
1553
  msgid "Set %s (Chrome, Opera and Firefox browsers)"
1554
  msgstr "Activer %s (Chrome, Opera et Firefox)"
1555
 
1556
+ #: lib/firewall_policies.php:930
1557
  msgid ""
1558
  "Block PHP built-in wrappers in <code>GET</code>, <code>POST</code>, "
1559
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> and cookies"
1562
  "<code>GET</code>, <code>POST</code>, <code>HTTP_USER_AGENT</code>, "
1563
  "<code>HTTP_REFERER</code> et les cookies"
1564
 
1565
+ #: lib/firewall_policies.php:969
1566
  msgid "Block serialized PHP objects in the following global variables"
1567
  msgstr ""
1568
  "Bloquer les objets PHP sérialisés dans les variables globales suivantes"
1569
 
1570
+ #: lib/firewall_policies.php:979 lib/help.php:290
1571
  msgid "Hide PHP notice and error messages"
1572
  msgstr "Masquer les messages d'erreur de PHP"
1573
 
1574
+ #: lib/firewall_policies.php:985
1575
  msgid "Sanitise <code>PHP_SELF</code>"
1576
  msgstr "Nettoyer <code>PHP_SELF</code>"
1577
 
1578
+ #: lib/firewall_policies.php:991
1579
  msgid "Sanitise <code>PATH_TRANSLATED</code>"
1580
  msgstr "Nettoyer <code>PATH_TRANSLATED</code>"
1581
 
1582
+ #: lib/firewall_policies.php:997
1583
  msgid "Sanitise <code>PATH_INFO</code>"
1584
  msgstr "Nettoyer <code>PATH_INFO</code>"
1585
 
1586
+ #: lib/firewall_policies.php:1011
1587
  msgid "This option is not compatible with your actual configuration."
1588
  msgstr ""
1589
  "Cette option n'est pas compatible avec la configuration de votre serveur."
1590
 
1591
+ #: lib/firewall_policies.php:1033 lib/help.php:294
1592
  msgid "Various"
1593
  msgstr "Divers"
1594
 
1595
+ #: lib/firewall_policies.php:1036
1596
  msgid "Block the <code>DOCUMENT_ROOT</code> server variable in HTTP request"
1597
  msgstr ""
1598
  "Bloquer les requêtes HTTP contenant la variable <code>DOCUMENT_ROOT</code>"
1599
 
1600
+ #: lib/firewall_policies.php:1043 lib/help.php:297
1601
  msgid "Block ASCII character 0x00 (NULL byte)"
1602
  msgstr "Bloquer le caractère ASCII 0x00 (NULL byte)"
1603
 
1604
+ #: lib/firewall_policies.php:1049 lib/help.php:299
1605
  msgid "Block ASCII control characters 1 to 8 and 14 to 31"
1606
  msgstr "Bloquer les caractères de contrôle ASCII 1 à 8 et 14 à 31"
1607
 
1608
+ #: lib/firewall_policies.php:1062
1609
  msgid "Save Firewall Policies"
1610
  msgstr "Sauvegarder les options"
1611
 
1612
+ #: lib/firewall_policies.php:1064
1613
  msgid "Restore Default Values"
1614
  msgstr "Rétablir les valeurs par défaut"
1615
 
1621
  msgstr ""
1622
  "Le Tableau de Bord affiche toutes les informations relatives au bon "
1623
  "fonctionnement du pare-feu ainsi que les mises à jour; il vous est conseillé "
1624
+ "de le consulter fréquemment car, en cas de problèmes, ceux-ci seront "
1625
  "indiqués ici."
1626
 
1627
  #: lib/help.php:45
1645
  "Benchmarks show the time NinjaFirewall took, in seconds, to process each "
1646
  "request it has blocked."
1647
  msgstr ""
1648
+ "La section \"Performances\" indique le temps qu'il a fallu à NinjaFirewall "
1649
+ "pour intercepter, analyser et bloquer les requêtes dangereuses."
1650
 
1651
  #: lib/help.php:56
1652
  msgid "Everything you ever wanted to know about NinjaFirewall."
1725
  "En outre, si vous redirigez les événements vers le serveur syslog, les "
1726
  "adresses IP y seront également anonymisées."
1727
 
 
 
 
 
1728
  #: lib/help.php:92
1729
  msgid ""
1730
  "Lets you customize the HTTP error code returned by NinjaFirewall when "
1788
  "restaurer sa configuration à une date antérieure, sélectionnez le fichier "
1789
  "correspondant dans la liste."
1790
 
1791
+ #: lib/help.php:131
1792
  #, php-format
1793
  msgid ""
1794
  "Keep in mind, however, that the Firewall Policies apply to any PHP scripts "
1799
  "scripts PHP</b> situés à l'intérieur du répertoire %s ainsi que ses sous-"
1800
  "répertoires, et non pas seulement à la page d'index de WordPress."
1801
 
1802
+ #: lib/help.php:136
1803
  msgid "Policies overview"
1804
  msgstr "Politiques du pare-feu"
1805
 
1806
+ #: lib/help.php:138
1807
  #, php-format
1808
  msgid ""
1809
  "Because NinjaFirewall sits in front of WordPress, it can hook, scan and "
1822
  "adresses IP, avant que celles-ci n'atteignent votre application, que ce soit "
1823
  "en mode HTTP ou HTTPS."
1824
 
1825
+ #: lib/help.php:140
1826
  msgid ""
1827
  "Use the options below to enable, disable or to tweak these rules according "
1828
  "to your needs."
1830
  "Utilisez les options ci-dessous pour configurer NinjaFirewall suivant vos "
1831
  "besoins."
1832
 
1833
+ #: lib/help.php:147
1834
  msgid "Scan and Sanitise"
1835
  msgstr "Filtrer et Nettoyer"
1836
 
1837
+ #: lib/help.php:149
1838
  msgid ""
1839
  "You can choose to scan and reject dangerous content but also to sanitise "
1840
  "requests and variables. Those two actions are different and can be combined "
1844
  "mais aussi de les nettoyer. Ces deux actions sont différentes et peuvent "
1845
  "être combinées pour plus de sécurité."
1846
 
1847
+ #: lib/help.php:150
1848
  msgid ""
1849
+ "Scan: If anything suspicious is detected, NinjaFirewall will block the "
1850
  "request and return an HTTP error code and message (defined in the \"Firewall "
1851
  "Options\" page). The user request will fail and the connection will be "
1852
  "closed immediately."
1856
  "du Pare-feu\"). La requête ne pourra pas aboutir et la connexion sera fermée "
1857
  "immédiatement."
1858
 
1859
+ #: lib/help.php:151
1860
  #, php-format
1861
  msgid ""
1862
+ "Sanitise: This option will not block but sanitise the user request by "
1863
  "escaping characters that can be used to exploit vulnerabilities (%s) and "
1864
  "replacing <code>&lt;</code> and <code>&gt;</code> with their corresponding "
1865
  "HTML entities (<code>&amp;lt;</code>, <code>&amp;gt;</code>). If it is a "
1874
  "HTML correspondantes. S'il s'agit d'une variable et de sa valeur (<code>?"
1875
  "variable=valeur</code>), les deux éléments seront nettoyés."
1876
 
1877
+ #: lib/help.php:153
1878
  msgid ""
1879
  "This action will be performed when the filtering process is over, right "
1880
  "before NinjaFirewall forwards the request to your PHP script."
1883
  "juste avant que NinjaFirewall fasse suivre la requête à votre application "
1884
  "PHP."
1885
 
1886
+ #: lib/help.php:156
1887
  msgid ""
1888
  "If you enabled <code>POST</code> requests sanitising, articles and messages "
1889
  "posted by your visitors could be corrupted with excessive backslashes or "
1893
  "commentaires et messages de vos visiteurs pourraient être endommagés par "
1894
  "cette option."
1895
 
1896
+ #: lib/help.php:167
1897
  msgid "Whether to filter HTTP and/or HTTPS traffic"
1898
  msgstr ""
1899
  "Sélectionnez le type de trafic filtré par le pare-feu (HTTP et/ou HTTPS)."
1900
 
1901
+ #: lib/help.php:171
1902
+ msgid "Whether to allow/disallow file uploads."
 
 
 
 
1903
  msgstr ""
1904
+ "Vous pouvez autoriser ou interdire tout téléchargement de fichiers vers "
1905
  "votre site."
1906
 
1907
+ #: lib/help.php:173
 
 
 
 
1908
  msgid ""
1909
+ "Any character that is not a letter <code>a-zA-Z</code>, a digit <code>0-9</"
1910
  "code>, a dot <code>.</code>, a hyphen <code>-</code> or an underscore "
1911
  "<code>_</code> will be removed from the filename and replaced with the "
1912
  "substitution character."
1913
  msgstr ""
1914
+ "Tout caractère qui n'est pas une lettre <code>a-zA-Z</code>, un chiffre "
1915
+ "<code>0-9</code>, un point <code>.</code>, un trait d'union <code>-</code> "
1916
+ "ou un caractère de soulignement <code>_</code>, sera remplacé par le "
1917
+ "caractère de substitution."
1918
 
1919
+ #: lib/help.php:178
1920
  msgid ""
1921
  "Whether to block direct access to PHP files located in specific WordPress "
1922
  "directories."
1924
  "S'il faut bloquer l’accès direct à tout fichier PHP se trouvant dans l'un de "
1925
  "ces répertoires."
1926
 
1927
+ #: lib/help.php:180
1928
  msgid ""
1929
+ "Enabling this policy will block any attempt (e.g., exploiting a "
1930
  "vulnerability, using a backdoor etc) to modify some important WordPress "
1931
  "settings. This policy will also send you an alert by email with all details "
1932
  "regarding the issue. It is enabled by default."
1933
  msgstr ""
1934
+ "L'activation de cette politique bloquera toute tentative (par exemple, "
1935
  "l'exploitation d'une vulnérabilité, l'utilisation d'une porte dérobée, etc) "
1936
  "de modifier certains paramètres WordPress importants. Cette politique vous "
1937
  "enverra également une alerte par e-mail avec tous les détails concernant le "
1938
  "problème. Elle est activée par défaut."
1939
 
1940
+ #: lib/help.php:182
1941
  msgid ""
1942
+ "Enabling this policy will block any attempt (e.g., exploiting a "
1943
  "vulnerability, using a backdoor etc) to create a user account. If you allow "
1944
  "user registration, you should not enable it."
1945
  msgstr ""
1946
+ "L'activation de cette politique bloquera toute tentative (par exemple, "
1947
  "l'exploitation d'une vulnérabilité, l'utilisation d'une porte dérobée, etc) "
1948
  "de création d'un compte d'utilisateur. Si vous autorisez l'inscription des "
1949
  "utilisateurs, vous ne devez pas l'activer."
1950
 
1951
+ #: lib/help.php:184
1952
+ msgid ""
1953
+ "This policy will block vulnerabilities that could be leveraged by attackers "
1954
+ "to gain administrative privileges."
1955
+ msgstr ""
1956
+ "Cette politique bloquera les vulnérabilités qui pourraient être exploitées "
1957
+ "pour obtenir des privilèges administratifs."
1958
+
1959
+ #: lib/help.php:186
1960
  #, php-format
1961
  msgid ""
1962
+ "Many vulnerabilities in plugins are exploited via the admin-ajax.php script. "
1963
  "This policy will try to detect and immediately block bots and malicious "
1964
  "scanners trying to access it. The server IP address (%s) and private IP "
1965
  "addresses will not be blocked."
1966
  msgstr ""
1967
+ "De nombreuses vulnérabilités dans les extensions WordPress sont exploitées "
1968
  "via le script admin-ajax.php. Cette politique essaiera de détecter et de "
1969
  "bloquer immédiatement les robots et les scanners malveillants qui tentent "
1970
  "d’y accéder. L'adresse IP du serveur (%s) et les adresses IP privées ne "
1971
  "seront pas bloquées."
1972
 
1973
+ #: lib/help.php:188
 
 
 
 
1974
  msgid ""
1975
+ "It is possible to enumerate usernames either through the WordPress author "
1976
  "archives, the REST API or the login page. Although this is not a "
1977
  "vulnerability but a WordPress feature, some hackers use it to retrieve "
1978
  "usernames in order to launch more accurate brute-force attacks. If it is a "
1981
  "redirect the user to the blog index page. Regarding the WP REST API, it will "
1982
  "block the request immediately."
1983
  msgstr ""
1984
+ "Il est possible d'énumérer les noms des utilisateurs de votre blog via l'API "
1985
  "REST, la page d'archive d'un auteur ou la page de connexion au Tableau de "
1986
  "bord. Bien que ce ne soit pas une vulnérabilité, mais une caractéristique de "
1987
  "WordPress, certains hackers utilisent ces astuces pour récupérer les noms "
1988
  "d'utilisateur afin de lancer des attaques par force brute plus précises."
1989
 
1990
+ #: lib/help.php:190
 
 
 
 
1991
  msgid ""
1992
+ "It allows you to access your WordPress site's data through an easy-to-use "
1993
  "HTTP REST API. Since WordPress 4.7, it is enabled by default. NinjaFirewall "
1994
  "allows you to block any access to that API if you do not intend to use it."
1995
  msgstr ""
1996
+ "Elle vous permet d'accéder aux données de votre blog via l'API HTTP REST. "
1997
  "Depuis WordPress 4.7, cette elle est activée par défaut. NinjaFirewall vous "
1998
  "permet de bloquer tout accès a cette API si vous ne l'utilisez pas."
1999
 
2000
+ #: lib/help.php:192
 
 
 
 
2001
  msgid ""
2002
  "XML-RPC is a remote procedure call (RPC) protocol which uses XML to encode "
2003
  "its calls and HTTP as a transport mechanism. WordPress has an XMLRPC API "
2017
  "requêtes qui utilisent la méthode <code>system.multicall</code> ou les "
2018
  "Pingbacks."
2019
 
2020
+ #: lib/help.php:194
2021
  msgid ""
2022
  "Block <code>POST</code> requests in the themes folder <code>/wp-content/"
2023
+ "themes</code>"
2024
  msgstr ""
2025
  "Bloquer les requêtes <code>POST</code> dans le dossier des thèmes <code>/wp-"
2026
+ "content/themes</code>"
2027
 
2028
+ #: lib/help.php:194
2029
  msgid ""
2030
+ "This option can be useful to block hackers from installing backdoor in the "
2031
  "PHP theme files. However, because some custom themes may include an HTML "
2032
  "form (contact, search form etc), this option is not enabled by default."
2033
  msgstr ""
2034
+ "Cette option peut être utile afin de bloquer l'exploitation de "
2035
  "vulnérabilités dans les fichiers PHP de vos thèmes. Toutefois, parce que "
2036
  "certains thèmes personnalisés peuvent inclure un formulaire HTML (formulaire "
2037
  "de recherche ou de contact etc) nécessitant des requêtes <code>POST</code> , "
2038
  "cette option n'est pas activée par défaut."
2039
 
2040
+ #: lib/help.php:196
2041
+ msgid "Force HTTPS for admin and logins <code>FORCE_SSL_ADMIN</code>"
2042
  msgstr ""
2043
+ "Forcer la connexion sécurisée au Tableau de bord <code>FORCE_SSL_ADMIN</code>"
 
2044
 
2045
+ #: lib/help.php:196
2046
  msgid ""
2047
+ "Enable this option when you want to secure logins and the admin area so that "
2048
  "both passwords and cookies are never sent in the clear. Ensure that you can "
2049
  "access your admin console from HTTPS before enabling this option, otherwise "
2050
  "you will lock yourself out of your site!"
2051
  msgstr ""
2052
+ "Activez cette option lorsque vous souhaitez sécuriser les connexions à votre "
2053
  "Tableau de bord. Assurez-vous que vous pouvez accéder à votre page de "
2054
  "connexion via HTTPS avant d'activer cette option, sinon vous risquez de "
2055
+ "bloquer l’accès à votre site !"
2056
 
2057
+ #: lib/help.php:198
2058
+ msgid "Disable the plugin and theme editor <code>DISALLOW_FILE_EDIT</code>"
2059
  msgstr ""
2060
+ "Désactiver l’éditeur de thème et d'extension <code>DISALLOW_FILE_EDIT</code>"
 
2061
 
2062
+ #: lib/help.php:198
2063
  msgid ""
2064
+ "Disabling the plugin and theme editor provides an additional layer of "
2065
  "security if a hacker gains access to a well-privileged user account."
2066
  msgstr ""
2067
+ "Désactiver l’éditeur de thème et d'extension fournit une couche de sécurité "
2068
  "supplémentaire. Si un pirate accédait a votre compte administrateur, il ne "
2069
  "pourrait pas l'utiliser pour insérer une porte dérobée dans l'un de vos "
2070
  "scripts PHP."
2071
 
2072
+ #: lib/help.php:200
2073
  msgid ""
2074
+ "Disable plugin and theme update/installation <code>DISALLOW_FILE_MODS</code>"
2075
  msgstr ""
2076
  "Désactiver l'installation et mise à jour des thèmes et extensions "
2077
+ "<code>DISALLOW_FILE_MODS</code>"
2078
 
2079
+ #: lib/help.php:200
2080
  msgid ""
2081
+ "This option will block users being able to use the plugin and theme "
2082
  "installation/update functionality from the WordPress admin area. Setting "
2083
  "this constant also disables the Plugin and Theme editor."
2084
  msgstr ""
2085
+ "Cette option permet de bloquer les utilisateurs voulant lancer une "
2086
  "installation ou mise à jour d'une extension ou d'un thème. Elle désactive "
2087
  "aussi l’éditeur de thème et d'extension."
2088
 
2089
+ #: lib/help.php:202
2090
  msgid ""
2091
+ "Disable the fatal error handler <code>WP_DISABLE_FATAL_ERROR_HANDLER</code>"
2092
  msgstr ""
2093
  "Désactiver le gestionnaire d'erreurs fatales "
2094
+ "<code>WP_DISABLE_FATAL_ERROR_HANDLER</code>"
2095
+
2096
+ #: lib/help.php:202
2097
+ msgid ""
2098
+ "This option will disable the WSOD protection introduced in WordPress 5.1."
2099
+ msgstr ""
2100
+ "Cette option désactivera la protection WSOD introduite dans WordPress 5.1."
2101
 
2102
+ #: lib/help.php:206
2103
  msgid ""
2104
+ "By default, any logged in WordPress administrator will not be blocked by "
2105
+ "NinjaFirewall. You can also add any logged in users to the whitelist (make "
2106
+ "sure you trust them all before doing so)."
2107
  msgstr ""
2108
+ "Par défaut, tout administrateur connecté à WordPress ne sera pas bloqué par "
2109
+ "NinjaFirewall. Vous pouvez aussi ajouter à la liste blanche tous les autres "
2110
+ "utilisateurs connectés (avant de le faire, assurez-vous que ce sont tous des "
2111
+ "utilisateurs de confiance)."
2112
 
2113
+ #: lib/help.php:219
2114
  msgid "Whether to scan and/or sanitise the <code>GET</code> variable."
2115
  msgstr "S'il faut filtrer / nettoyer la variable <code>GET</code>."
2116
 
2117
+ #: lib/help.php:222
2118
  msgid "Whether to scan and/or sanitise the <code>POST</code> variable."
2119
  msgstr "S'il faut filtrer / nettoyer la variable <code>POST</code>."
2120
 
2121
+ #: lib/help.php:223
 
 
 
 
 
 
2122
  msgid ""
2123
  "NinjaFirewall will decode and scan base64 encoded values in order to detect "
2124
  "obfuscated malicious code. This option is only available for the <code>POST</"
2127
  "NinjaFirewall peut décoder et filtrer les chaînes de caractères encodées en "
2128
  "Base64 afin d'y détecter du code malveillant caché."
2129
 
2130
+ #: lib/help.php:226
2131
  msgid "Whether to sanitise the <code>REQUEST</code> variable."
2132
  msgstr "S'il faut filtrer / nettoyer la variable <code>REQUEST</code>."
2133
 
2134
+ #: lib/help.php:229
2135
  msgid "Whether to scan and/or sanitise cookies."
2136
  msgstr "S'il faut filtrer / nettoyer les cookies."
2137
 
2138
+ #: lib/help.php:232
2139
  msgid "Whether to scan and/or sanitise <code>HTTP_USER_AGENT</code> requests."
2140
  msgstr "S'il faut filtrer / nettoyer la variable <code>HTTP_USER_AGENT</code>."
2141
 
2142
+ #: lib/help.php:233
 
 
 
 
2143
  msgid ""
2144
+ "Rejects some known bots, scanners and various malicious scripts attempting "
2145
  "to access your blog."
2146
  msgstr ""
2147
+ "Cette option peut bloquer de nombreux crawlers, spambots et autres scrappers."
2148
 
2149
+ #: lib/help.php:236
2150
  msgid "Whether to scan and/or sanitise <code>HTTP_REFERER</code> requests."
2151
  msgstr "S'il faut filtrer / nettoyer la variable <code>HTTP_REFERER</code>."
2152
 
2153
+ #: lib/help.php:237
2154
  msgid ""
2155
+ "Block POST requests that do not have an <code>HTTP_REFERER</code> header"
2156
  msgstr ""
2157
+ "Bloquer les requêtes POST qui n'ont pas d'en-tête <code>HTTP_REFERER</code>"
 
2158
 
2159
+ #: lib/help.php:237
2160
  msgid ""
2161
+ "This option will block any <code>POST</code> request that does not have a "
2162
  "Referrer header (<code>HTTP_REFERER</code> variable). If you need external "
2163
  "applications to post to your scripts (e.g. Paypal IPN, WordPress WP-"
2164
  "Cron...), you are advised to keep this option disabled otherwise they will "
2166
  "have a Referrer header and, for that reason, this option is disabled by "
2167
  "default."
2168
  msgstr ""
2169
+ "Cette option bloque toutes les requêtes POST qui n'incluent pas le Referrer "
2170
  "<code>HTTP_REFERER</code> (adresse de la page -si elle existe- qui a conduit "
2171
  "le client à la page courante). Puisque les requêtes POST ne sont pas "
2172
  "obligées d'avoir un Referrer, cette option n'est pas activée par défaut. Si "
2173
  "vous utilisez des scripts comme Paypal IPN, WordPress WP-Cron etc, "
2174
  "désactivez cette fonction."
2175
 
2176
+ #: lib/help.php:241
2177
+ msgid "Block localhost IP in <code>GET/POST</code> requests"
2178
+ msgstr "Bloquer les requêtes <code>GET/POST</code> contenant l'IP localhost"
 
2179
 
2180
+ #: lib/help.php:241
2181
  msgid ""
2182
  "this option will block any <code>GET</code> or <code>POST</code> request "
2183
  "containing the localhost IP (127.0.0.1). It can be useful to block SQL "
2188
  "les programmes malveillants. Attention toutefois à ne pas bloquer certains "
2189
  "scripts d'installation ou de configuration si vous l'activez. "
2190
 
2191
+ #: lib/help.php:243
 
 
 
 
 
 
2192
  #, php-format
2193
  msgid ""
2194
+ "This option will reject any request using an IP instead of a domain name in "
2195
  "the <code>Host</code> header of the HTTP request. Unless you need to connect "
2196
  "to your site using its IP address, (e.g. %s), enabling this option will "
2197
  "block a lot of hackers scanners because such applications scan IPs rather "
2198
  "than domain names."
2199
  msgstr ""
2200
+ "Cette option rejette toute requête HTTP contenant une adresse IP au lieu "
2201
  "d'un nom de domaine dans son en-tête <code>Host</code>. Sauf si vous avez "
2202
  "besoin de vous connecter à votre site en utilisant son adresse IP (ex: %s), "
2203
  "activer cette option bloquera de nombreux scanners de vulnérabilité car ces "
2204
  "application trouvent les sites en scannant les plages d'adresses IP plutôt "
2205
+ "que les noms de domaine."
 
 
 
 
 
2206
 
2207
+ #: lib/help.php:245
2208
  msgid ""
2209
  "this option will allow the firewall to scan traffic from all non-routable "
2210
  "private IPs (IPv4 and IPv6) as well as the localhost IP. We recommend to "
2215
  "Nous vous recommandons de le garder activé si vous avez 2 ou plusieurs "
2216
  "serveurs reliés entre eux."
2217
 
2218
+ #: lib/help.php:258
2219
  msgid ""
2220
  "In addition to filtering incoming requests, NinjaFirewall can also hook the "
2221
  "HTTP response in order to alter its headers. Those modifications can help to "
2226
  "peuvent aider à atténuer les menaces telles que les attaques XSS, phishing "
2227
  "et clickjacking."
2228
 
2229
+ #: lib/help.php:260
2230
  msgid ""
2231
  "Set <code>X-Content-Type-Options</code> to protect against MIME type "
2232
+ "confusion attacks"
2233
  msgstr ""
2234
+ "Activer <code>X-Content-Type-Options</code> pour protéger contre les "
2235
+ "attaques basées sur la confusion du type MIME"
2236
 
2237
+ #: lib/help.php:260
2238
  msgid ""
2239
+ "This header will send the nosniff value to instruct the browser to disable "
2240
  "content or MIME sniffing and to use the content-type returned by the server. "
2241
  "Some browsers try to guess (sniff) and override the content-type by looking "
2242
  "at the content itself which, in some cases, could lead to security issues "
2243
  "such as MIME Confusion Attacks."
2244
  msgstr ""
2245
+ "Cet en-tête enverra la valeur \"nosniff\" pour indiquer au navigateur de "
2246
  "désactiver le reniflage de contenu ou type MIME et d'utiliser le type "
2247
  "retourné par le serveur. Certains navigateurs tentent de deviner (sniff) et "
2248
  "de contourner le type de contenu en regardant le contenu lui-même ce qui, "
2249
  "dans certains cas, peut entraîner des problèmes de sécurité tels que les "
2250
  "attaques basées sur la confusion du type MIME."
2251
 
2252
+ #: lib/help.php:262
2253
  msgid ""
2254
+ "Set <code>X-Frame-Options</code> to protect against clickjacking attempts"
2255
  msgstr ""
2256
  "Activer <code>X-Frame-Options</code> pour protéger contre les attaques de "
2257
+ "détournement de clic (clickjacking)"
2258
 
2259
+ #: lib/help.php:262
2260
  msgid ""
2261
+ "This header indicates a policy whether a browser must not allow to render a "
2262
  "page in a &lt;frame&gt; or &lt;iframe&gt;. Hosts can declare this policy in "
2263
  "the header of their HTTP responses to prevent clickjacking attacks, by "
2264
  "ensuring that their content is not embedded into other pages or frames. "
2265
  "NinjaFirewall accepts two different values:"
2266
  msgstr ""
2267
+ "Cet en-tête informe le navigateur s'il doit autoriser ou non l'affichage "
2268
  "d'une page dans une &lt;frame&gt; ou &lt;iframe&gt;. Cela permet d'empêcher "
2269
  "les attaques de clickjacking, en veillant à ce que le contenu d'une page ne "
2270
  "sont pas intégré dans d'autres pages ou cadres, notamment d'un autre site. "
2271
+ "NinjaFirewall accepte deux valeurs différentes :"
2272
 
2273
+ #: lib/help.php:264
2274
  msgid ""
2275
+ "A browser receiving content with this header must not display this content "
2276
  "in any frame from a page of different origin than the content itself."
2277
  msgstr ""
2278
+ "Un navigateur ne doit pas afficher le contenu dans une &lt;frame&gt; ou &lt;"
2279
  "iframe&gt; d'une page d'origine différente que le contenu lui-même."
2280
 
2281
+ #: lib/help.php:265
2282
  msgid ""
2283
+ "A browser receiving content with this header must not display this content "
2284
  "in any frame."
2285
  msgstr ""
2286
+ "Un navigateur ne doit jamais afficher le contenu dans une &lt;frame&gt; ou "
2287
  "&lt;iframe&gt;"
2288
 
2289
+ #: lib/help.php:267
2290
  msgid "NinjaFirewall does not support the <code>ALLOW-FROM</code> value."
2291
  msgstr ""
2292
  "La valeur <code>ALLOW-FROM</code> n'est pas prise en charge par "
2293
  "NinjaFirewall."
2294
 
2295
+ #: lib/help.php:268
2296
  msgid ""
2297
  "Since v3.1.3, WordPress sets this value to <code>SAMEORIGIN</code> for the "
2298
  "administrator and the login page only."
2300
  "Depuis la version 3.1.3, WordPress active <code>SAMEORIGIN</code> pour "
2301
  "l'administrateur et la page de connexion uniquement."
2302
 
2303
+ #: lib/help.php:270
2304
  msgid ""
2305
  "Set <code>X-XSS-Protection</code> (IE/Edge, Chrome, Opera and Safari "
2306
+ "browsers)"
2307
  msgstr ""
2308
  "Activer <code>X-XSS-Protection</code> (IE/Edge, Opera, Chrome et Safari)"
2309
 
2310
+ #: lib/help.php:270
2311
  msgid ""
2312
+ "This header allows browsers to identify and block XSS attacks by preventing "
2313
  "malicious scripts from executing. It is enabled by default on all compatible "
2314
  "browsers."
2315
  msgstr ""
2316
+ "Cet en-tête permet aux navigateurs compatibles d'identifier et bloquer les "
2317
  "attaques XSS en empêchant un script malveillant de s'exécuter. Notez que "
2318
  "cette option est activée par défaut sur ces navigateurs."
2319
 
2320
+ #: lib/help.php:271
2321
  msgid ""
2322
  "If a visitor disabled their browser's XSS filter, you cannot re-enable it "
2323
  "with that option."
2325
  "Si un visiteur désactive le filtre XSS de son navigateur, vous ne pouvez pas "
2326
  "le réactiver avec cette option."
2327
 
2328
+ #: lib/help.php:273
2329
  msgid ""
2330
+ "Force <code>SameSite</code> flag on all cookies to mitigate CSRF attacks"
2331
  msgstr ""
2332
  "Activer la propriété <code>SameSite</code> pour tous les cookies afin "
2333
+ "d'atténuer les attaques CSRF"
2334
 
2335
+ #: lib/help.php:273
2336
  msgid ""
2337
+ "Adding this flag to cookies helps to mitigate the risk of CSRF (cross-site "
2338
  "request forgery) attacks because cookies can only be sent in requests "
2339
  "originating from the same origin as the target domain."
2340
  msgstr ""
2341
+ "Cette protection permet de diminuer les risques d'attaques CSRF (injection "
2342
  "de requête illégitime par rebond), car les cookies ne peuvent être envoyés "
2343
  "que dans des requêtes provenant de la même origine que le domaine cible."
2344
 
2345
+ #: lib/help.php:275
2346
+ msgid "Force <code>HttpOnly</code> flag on all cookies to mitigate XSS attacks"
 
2347
  msgstr ""
2348
  "Activer la propriété <code>HttpOnly</code> pour tous les cookies afin "
2349
+ "d'atténuer les menaces XSS qui génèrent des vols de cookies"
2350
 
2351
+ #: lib/help.php:275
2352
  msgid ""
2353
+ "Adding this flag to cookies helps to mitigate the risk of cross-site "
2354
  "scripting by preventing them from being accessed through client-side "
2355
  "scripts. NinjaFirewall can hook all cookies sent by your blog, its plugins "
2356
  "or any other PHP script, add the <code>HttpOnly</code> flag if it is "
2358
  "headers right before they are sent to your visitors. Note that WordPress "
2359
  "sets that flag on the logged in user cookies only."
2360
  msgstr ""
2361
+ "Cette protection permet de diminuer les risques d'attaques XSS en empêchant "
2362
  "JavaScript d'accéder aux cookies de l'utilisateur. NinjaFirewall peut "
2363
  "intercepter les cookies envoyés par vos scripts PHP, activer la propriété "
2364
  "<code>HttpOnly</code> si elle est manquante, puis réinjecter les cookies "
2365
  "dans la réponse HTTP juste avant que celle-ci ne soit envoyée à vos "
2366
  "visiteurs."
2367
 
2368
+ #: lib/help.php:276
2369
  msgid ""
2370
  "If your PHP scripts send cookies that need to be accessed from JavaScript, "
2371
  "you should keep that option disabled."
2373
  "Si vos scripts PHP envoient des cookies qui doivent être accessibles à "
2374
  "partir de JavaScript, vous devez garder cette option désactivée."
2375
 
2376
+ #: lib/help.php:278
2377
  msgid ""
2378
  "Set <code>Strict-Transport-Security</code> (HSTS) to enforce secure "
2379
+ "connections to the server"
2380
  msgstr ""
2381
  "Activer <code>Strict-Transport-Security</code> (HSTS) pour forcer les "
2382
+ "connexions sécurisées vers le serveur"
2383
 
2384
+ #: lib/help.php:278
2385
  msgid ""
2386
+ "This policy enforces secure HTTPS connections to the server. Web browsers "
2387
  "will not allow the user to access the web application over insecure HTTP "
2388
  "protocol. It helps to defend against cookie hijacking and Man-in-the-middle "
2389
  "attacks. Most recent browsers support HSTS headers."
2390
  msgstr ""
2391
+ "Cette politique force les connexions HTTPS sécurisées vers le serveur. Les "
2392
  "navigateurs n'accepteront pas de se connecter au site si la connexion n'est "
2393
  "pas sécurisée (HTTPS). Cela permet de se défendre contre les détournements "
2394
  "de cookies ou les attaques du type \"Man-in-the-middle\". La plupart des "
2395
  "navigateurs récents sont compatibles avec cette politique."
2396
 
2397
+ #: lib/help.php:280
2398
+ msgid "Set <code>Content-Security-Policy</code>"
2399
+ msgstr "Activer <code>Content-Security-Policy</code>"
2400
 
2401
+ #: lib/help.php:280
2402
  msgid ""
2403
+ "This policy helps to mitigate threats such as XSS, phishing and clickjacking "
2404
  "attacks. It covers JavaScript, CSS, HTML frames, web workers, fonts, images, "
2405
  "objects (Java, ActiveX, audio and video files), and other HTML5 features."
2406
  msgstr ""
2407
+ "Cette politique aide pour bloquer les attaques XSS notamment. Elle couvre le "
2408
  "code JavaScript, les styles CSS, frames/iframes HTML, polices, images, "
2409
  "objets (Java, ActiveX, fichiers audio et video), mais aussi les WebSocket."
2410
 
2411
+ #: lib/help.php:280
2412
  msgid ""
2413
  "NinjaFirewall lets you configure the CSP policy separately for the frontend "
2414
  "(blog, website) and the backend (WordPress admin dashboard)."
2416
  "NinjaFirewall vous permet de configurer CSP séparément pour le site et "
2417
  "l'interface d'administration de WordPress."
2418
 
2419
+ #: lib/help.php:282
2420
+ msgid "Set <code>Referrer-Policy</code>"
2421
+ msgstr "Activer <code>Referrer-Policy</code>"
2422
 
2423
+ #: lib/help.php:282
2424
  msgid ""
2425
+ "This HTTP header governs which referrer information, sent in the Referer "
2426
  "header, should be included with requests made."
2427
  msgstr ""
2428
+ "Cet en-tête HTTP détermine quelles informations de provenance doivent être "
2429
  "incluses dans l'en-tête Referer."
2430
 
2431
+ #: lib/help.php:286
2432
+ msgid "Block PHP built-in wrappers"
2433
+ msgstr "Bloquer les gestionnaires (wrappers) PHP dangereux"
2434
 
2435
+ #: lib/help.php:286
2436
  msgid ""
2437
  "PHP has several wrappers for use with the filesystem functions. It is "
2438
  "possible for an attacker to use them to bypass firewalls and various IDS to "
2452
  "requête <code>GET</code> ou <code>POST</code>, des cookies, ou dans les "
2453
  "variables <code>HTTP_REFERER</code> et <code>HTTP_USER_AGENT</code>."
2454
 
2455
+ #: lib/help.php:288
2456
+ msgid "Block serialized PHP objects"
2457
+ msgstr "Bloquer les objets PHP sérialisés"
2458
 
2459
+ #: lib/help.php:288
2460
  #, php-format
2461
  msgid ""
2462
  "Object Serialization is a PHP feature used by many applications to generate "
2475
  "<code>POST</code>, les cookies, ou dans les variables <code>HTTP_REFERER</"
2476
  "code> et <code>HTTP_USER_AGENT</code>."
2477
 
2478
+ #: lib/help.php:290
 
 
 
 
2479
  msgid ""
2480
+ "This option lets you hide errors returned by your scripts. Such errors can "
2481
  "leak sensitive informations which can be exploited by hackers."
2482
  msgstr ""
2483
+ "Vous permet de masquer les erreurs retournées par PHP. Ces erreurs peuvent "
2484
  "afficher des informations sensibles qui peuvent être exploitées "
2485
  "ultérieurement par des pirates."
2486
 
2487
+ #: lib/help.php:292
2488
  msgid ""
2489
  "Sanitise <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
2490
+ "<code>PATH_INFO</code>"
2491
  msgstr ""
2492
  "Nettoyer <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
2493
+ "<code>PATH_INFO</code>"
2494
 
2495
+ #: lib/help.php:292
2496
  msgid ""
2497
+ "This option can sanitise any dangerous characters found in those 3 server "
2498
  "variables to prevent various XSS and database injection attempts."
2499
  msgstr ""
2500
+ "Activez ces options si vous souhaitez que le pare-feu nettoie ces trois "
2501
  "variables."
2502
 
2503
+ #: lib/help.php:295
2504
  #, php-format
2505
  msgid ""
2506
+ "Block the <code>DOCUMENT_ROOT</code> server variable (%s) in HTTP requests"
2507
  msgstr ""
2508
  "Bloquer les requêtes HTTP contenant la variable <code>DOCUMENT_ROOT</code> "
2509
+ "(%s)"
2510
 
2511
+ #: lib/help.php:295
2512
  msgid ""
2513
+ "This option will block scripts attempting to pass the <code>DOCUMENT_ROOT</"
2514
  "code> server variable in a <code>GET</code> or <code>POST</code> request. "
2515
  "Hackers use shell scripts that often need to pass this value, but most "
2516
  "legitimate programs do not."
2517
  msgstr ""
2518
+ "Cette option bloque toute tentative de passer la variable "
2519
  "<code>DOCUMENT_ROOT</code> dans une requête <code>GET</code> ou <code>POST</"
2520
  "code>. Les pirates utilisent souvent des scripts qui nécessitent d'utiliser "
2521
  "cette variable, mais pas la plupart des applications légitimes (hormis "
2522
  "certains scripts d'installation ou de configuration)."
2523
 
2524
+ #: lib/help.php:297
 
 
 
 
2525
  msgid ""
2526
+ "This option will reject any <code>GET</code> or <code>POST</code> request, "
2527
  "<code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, <code>PHP_SELF</"
2528
  "code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> variables "
2529
  "containing the ASCII character 0x00 (NULL byte). Such a character is "
2530
  "dangerous and should always be rejected."
2531
  msgstr ""
2532
+ "Toute requête <code>GET</code> ou <code>POST</code>, ainsi que toute "
2533
+ "variable <code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, "
2534
+ "<code>PHP_SELF</code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> "
2535
  "contenant le caractère ASCI 0x00 (NULL byte) sera bloquée immédiatement. Ce "
2536
  "caractère est dangereux et devrait toujours être rejeté."
2537
 
2538
+ #: lib/help.php:299
 
 
 
 
2539
  msgid ""
2540
+ "This option will reject any <code>GET</code> or <code>POST</code> request, "
2541
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> variables containing "
2542
  "ASCII characters from 1 to 8 and 14 to 31."
2543
  msgstr ""
2544
+ "Toute requête <code>GET</code> ou <code>POST</code>, ainsi que toute "
2545
  "variable <code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> contenant "
2546
  "des caractères ASCII 1 à 8 et 14 à 31 sera bloquée."
2547
 
2548
+ #: lib/help.php:312 lib/monitoring.php:46
2549
+ msgid "File Check"
2550
+ msgstr "File Check"
2551
+
2552
+ #: lib/help.php:313
2553
  msgid ""
2554
+ "File Check lets you perform file integrity monitoring upon request or on a "
2555
+ "specific interval."
 
 
 
 
 
2556
  msgstr ""
2557
+ "File Check vous permet d'effectuer une analyse de l'intégrité de vos "
2558
+ "fichiers sur demande ou à un intervalle spécifique défini."
 
 
 
 
 
 
 
 
 
 
2559
 
2560
+ #: lib/help.php:315
2561
  msgid ""
2562
+ "You need to create a snapshot of all your files and then, at a later time, "
2563
+ "you can scan your system to compare it with the previous snapshot. Any "
2564
+ "modification will be immediately detected: file content, file permissions, "
2565
+ "file ownership, timestamp as well as file creation and deletion."
2566
  msgstr ""
2567
+ "Vous devez créer un instantané de tous vos fichiers, puis, ultérieurement, "
2568
+ "vous pouvez scanner votre système pour le comparer avec l'instantané "
2569
+ "précédent. Toute modification sera immédiatement détectée&nbsp;: contenu, "
2570
+ "permissions et propriétés des fichiers, leur création et suppression ainsi "
2571
+ "que l'horodatage."
2572
 
2573
+ #: lib/help.php:317
2574
+ #, php-format
2575
  msgid ""
2576
+ "Create a snapshot of all files stored in that directory: by default, the "
2577
+ "directory is set to WordPress <code>ABSPATH</code> (%s)"
 
 
 
 
 
2578
  msgstr ""
2579
+ "Créer un instantané de tous les fichiers se trouvant dans ce "
2580
+ "répertoire&nbsp;: par défaut, le repertoire est l'<code>ABSPATH</code> de "
2581
+ "WordPress (%s)"
 
 
 
 
 
2582
 
2583
+ #: lib/help.php:318
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2584
  msgid ""
2585
  "Exclude the following files/folders: you can enter a directory or a file "
2586
  "name (e.g., <code>/foo/bar/</code>), or a part of it (e.g., <code>foo</"
2591
  "partie de celui-ci (par ex. <code>foo</code>), ou même exclure une extension "
2592
  "de fichier (par ex. <code>.css</code>)."
2593
 
2594
+ #: lib/help.php:320
2595
  msgid ""
2596
  "Multiple values must be comma-separated (e.g., <code>/foo/bar/,.css,.png</"
2597
  "code>)."
2599
  "Plusieurs valeurs doivent être séparées par des virgules (par ex. <code>/foo/"
2600
  "bar/,.css,.png</code>)."
2601
 
2602
+ #: lib/help.php:321
2603
  msgid ""
2604
  "Do not follow symbolic links: by default, NinjaFirewall will not follow "
2605
  "symbolic links."
2607
  "Ne pas suivre les liens symboliques&nbsp;: par défaut, NinjaFirewall ignore "
2608
  "les liens symboliques lors de son analyse des fichiers."
2609
 
2610
+ #: lib/help.php:324
2611
  msgid "Scheduled scans"
2612
  msgstr "Analyses planifiées"
2613
 
2614
+ #: lib/help.php:325
2615
  msgid ""
2616
  "NinjaFirewall can scan your system on a specific interval (hourly, "
2617
  "twicedaily or daily)."
2619
  "NinjaFirewall peut scanner votre système à intervalle régulier (une fois par "
2620
  "heure, deux fois par jour ou tous les jours)."
2621
 
2622
+ #: lib/help.php:327
2623
  msgid ""
2624
  "It can either send you a scan report only if changes are detected, or always "
2625
  "send you one after each scan."
2628
  "été détectés, ou bien vous en envoyer un systématiquement après chaque "
2629
  "analyse."
2630
 
2631
+ #: lib/help.php:329
2632
  msgid ""
2633
  "Reports will be sent to the contact email address defined in the \"Event "
2634
  "Notifications\" menu."
2636
  "Les rapports seront envoyés à l'adresse e-mail définie dans la page "
2637
  "\"Notifications d'Événement\"."
2638
 
2639
+ #: lib/help.php:331
2640
  #, php-format
2641
  msgid ""
2642
  "Scheduled scans rely on <a href=\"%s\">WordPress pseudo cron</a> which works "
2645
  "Les analyses planifiées utilisent le <a href=\"%s\">pseudo cron de "
2646
  "WordPress</a> qui ne fonctionne que si votre site reçoit un trafic suffisant."
2647
 
2648
+ #: lib/help.php:337 lib/monitoring.php:47
2649
+ msgid "File Guard"
2650
+ msgstr "File Guard"
2651
+
2652
+ #: lib/help.php:339
2653
+ msgid ""
2654
+ "File Guard can detect, in real-time, any access to a PHP file that was "
2655
+ "recently modified or created, and alert you about this."
2656
+ msgstr ""
2657
+ "File Guard peut détecter, en temps réel, tout accès à un fichier PHP qui a "
2658
+ "été récemment modifié ou créé, et vous alerter à ce sujet."
2659
+
2660
+ #: lib/help.php:341
2661
+ msgid ""
2662
+ "If a hacker uploaded a shell script to your site (or injected a backdoor "
2663
+ "into an already existing file) and tried to directly access that file using "
2664
+ "his browser or a script, NinjaFirewall would hook the HTTP request and "
2665
+ "immediately detect that the file was recently modified/created. It would "
2666
+ "send you a detailed alert (script name, IP, request, date and time). Alerts "
2667
+ "will be sent to the contact email address defined in the \"Event "
2668
+ "Notifications\" menu."
2669
+ msgstr ""
2670
+ "Si un pirate téléchargeait un script PHP sur votre site (ou injectait une "
2671
+ "porte dérobée dans un fichier existant) et essayait d'accéder directement à "
2672
+ "ce fichier en utilisant son navigateur ou un autre script, NinjaFirewall "
2673
+ "intercepterait la requête HTTP et détecterait immédiatement que le fichier a "
2674
+ "été récemment modifié ou créé. Il vous enverrait une alerte détaillée (nom "
2675
+ "du script, adresse IP, requête HTTP, la date et l'heure). Les alertes seront "
2676
+ "envoyées à l'adresse e-mail de contact définie dans le menu \"Notifications "
2677
+ "d’Événement\"."
2678
+
2679
+ #: lib/help.php:342
2680
+ msgid ""
2681
+ "If you do not want to monitor a folder, you can exclude its full path or a "
2682
+ "part of it (e.g., <code>/var/www/public_html/cache/</code> or <code>/cache/</"
2683
+ "code> etc). NinjaFirewall will compare this value to the <code>"
2684
+ "$_SERVER[\"SCRIPT_FILENAME\"]</code> server variable and, if it matches, "
2685
+ "will ignore it."
2686
+ msgstr ""
2687
+ "Pour exclure un répertoire, vous pouvez entrer son chemin complet ou une "
2688
+ "partie de celui-ci (par ex. <code>/var/www/public_html/cache/</code> ou "
2689
+ "simplement <code>/cache/</code>). NinjaFirewall comparera cette valeur à la "
2690
+ "variable <code>$_SERVER[\"SCRIPT_FILENAME\"]</code> et, si elle correspond, "
2691
+ "l'ignorera."
2692
+
2693
+ #: lib/help.php:343
2694
+ msgid ""
2695
+ "Multiple values must be comma-separated (e.g., <code>/foo/bar/,/cache/</"
2696
+ "code>)."
2697
+ msgstr ""
2698
+ "Plusieurs valeurs doivent être séparées par des virgules (par ex. <code>/foo/"
2699
+ "bar/,/cache/</code>)."
2700
+
2701
+ #: lib/help.php:344
2702
+ msgid ""
2703
+ "File Guard real-time detection is a totally unique feature, because "
2704
+ "NinjaFirewall is the only plugin for WordPress that can hook HTTP requests "
2705
+ "sent to any PHP script, even if that script is not part of the WordPress "
2706
+ "package (third-party software, shell script, backdoor etc)."
2707
+ msgstr ""
2708
+ "La détection en temps réel de File Guard est une caractéristique tout à fait "
2709
+ "unique, parce NinjaFirewall est la seule extension pour WordPress pouvant "
2710
+ "intercepter les requêtes HTTP envoyées à tout script PHP, même si ce dernier "
2711
+ "ne fait pas partie de WordPress (logiciel tiers, backdoor, etc)."
2712
+
2713
+ #: lib/help.php:353 lib/network.php:32 ninjafirewall.php:778
2714
  msgid "Network"
2715
  msgstr "Réseau"
2716
 
2717
+ #: lib/help.php:355
2718
  msgid ""
2719
  "Even if NinjaFirewall administration menu is only available to the Super "
2720
  "Admin (from the main site), you can still display its status to all sites in "
2726
  "du réseau en ajoutant une petite icône à leur barre d'administration. Elle "
2727
  "ne sera visible que par les administrateurs de ces sites."
2728
 
2729
+ #: lib/help.php:357
2730
  msgid ""
2731
  "It is recommended to enable this feature as it is the only way to know "
2732
  "whether the sites in your network are protected and if NinjaFirewall "
2736
  "si les sites de votre réseau sont protégés et si l'installation de "
2737
  "NinjaFirewall a réussi."
2738
 
2739
+ #: lib/help.php:359
2740
  msgid ""
2741
  "Note that when it is disabled, the icon still remains visible to you, the "
2742
  "Super Admin."
2744
  "Notez que même lorsqu'il est désactivé, l'icône reste visible pour vous, le "
2745
  "Super Administrateur."
2746
 
2747
+ #: lib/help.php:371
2748
  msgid ""
2749
  "NinjaFirewall can alert you by email on specific events triggered within "
2750
  "your blog. They include installations, updates, activations etc, as well as "
2763
  "après avoir pénétré dans votre Tableau de bord de WordPress, d'y installer "
2764
  "une porte dérobée (backdoor) afin de prendre le contrôle de votre blog."
2765
 
2766
+ #: lib/help.php:382 lib/login_protection.php:21 ninjafirewall.php:786
2767
  msgid "Login Protection"
2768
  msgstr "Page de Connexion"
2769
 
2770
+ #: lib/help.php:386
2771
  msgid ""
2772
  "By processing incoming HTTP requests before your blog and any of its "
2773
  "plugins, NinjaFirewall is the only plugin for WordPress able to protect it "
2780
  "compris les attaques distribuées provenant de plusieurs milliers d'adresses "
2781
  "IP différentes."
2782
 
2783
+ #: lib/help.php:388
2784
  msgid ""
2785
  "You can choose two different types of protection: a password or a captcha. "
2786
  "You can enable the protection only if an attack is detected or to keep it "
2790
  "captcha. Vous pouvez choisir d'activer la protection uniquement lorsqu'une "
2791
  "attaque est détectée ou bien l'activer en permanence."
2792
 
2793
+ #: lib/help.php:390
2794
  msgid "Yes, if under attack:"
2795
  msgstr "Oui, si attaque en cours :"
2796
 
2797
+ #: lib/help.php:392
2798
  msgid ""
2799
  "The protection will be triggered when too many login attempts are detected, "
2800
  "regardless of the offending IP. It blocks the attack instantly and prevents "
2809
  "utilisant soit une combinaison nom d'utilisateur / mot de passe prédéfinie, "
2810
  "soit un code captcha."
2811
 
2812
+ #: lib/help.php:394
2813
  msgid "Always ON:"
2814
  msgstr "Toujours activée :"
2815
 
2816
+ #: lib/help.php:396
2817
  msgid ""
2818
  "NinjaFirewall will always enforce the HTTP authentication or captcha "
2819
  "implementation each time you access the login page."
2821
  "Vous serez toujours invité à saisir votre nom d'utilisateur / mot de passe, "
2822
  "ou le code du captcha, chaque fois que vous accéderez à la page de connexion."
2823
 
2824
+ #: lib/help.php:399
2825
  msgid "Type of protection:"
2826
  msgstr "Type de protection :"
2827
 
2828
+ #: lib/help.php:400
2829
  msgid ""
2830
  "<b>Password:</b> It password-protects the login page. NinjaFirewall uses its "
2831
  "own very fast authentication scheme and it is compatible with any HTTP "
2835
  "utilise son propre système d'authentification, rapide et compatible avec "
2836
  "n'importe quel serveur HTTP (Apache, Nginx, Lighttpd etc)."
2837
 
2838
+ #: lib/help.php:401
2839
  msgid "<b>Captcha:</b> It will display a 5-character captcha code."
2840
  msgstr "<b>Captcha :</b> Affichera un code captcha à 5 caractères."
2841
 
2842
+ #: lib/help.php:402
2843
  msgid "Bot protection:"
2844
  msgstr "Protection contre les bots :"
2845
 
2846
+ #: lib/help.php:403
2847
  msgid ""
2848
  "NinjaFirewall will attempt to block bots and scripts immediately, i.e., even "
2849
  "before they start a brute-force attack."
2851
  "NinjaFirewall tentera de bloquer les bots et les scripts immédiatement, "
2852
  "c'est-à-dire avant même qu'ils ne commencent une attaque par force brute."
2853
 
2854
+ #: lib/help.php:411
2855
  msgid "AUTH log"
2856
  msgstr "Journal d'authentification"
2857
 
2858
+ #: lib/help.php:414
2859
  msgid ""
2860
  "NinjaFirewall can write to the server Authentication log when the brute-"
2861
  "force protection is triggered. This can be useful to the system "
2867
  "surveillance ou pour bloquer l'IP incriminée au niveau du pare-feu du "
2868
  "serveur."
2869
 
2870
+ #: lib/help.php:416
2871
  msgid ""
2872
  "If you have a shared hosting account, keep this option disabled as you do "
2873
  "not have any access to the server's logs."
2875
  "Si vous avez un hébergement mutualisé, laissez cette option désactivée car "
2876
  "vous n'avez pas accès aux journaux du serveur."
2877
 
2878
+ #: lib/help.php:418
2879
  msgid ""
2880
  "On Debian-based systems, the log is located in <code>/var/log/auth.log</"
2881
  "code>, and on Red Hat-based systems in <code>/var/log/secure</code>. The "
2885
  "sous Red Hat, dans <code>/var/log/secure</code>. Le format utilisé est le "
2886
  "suivant&nbsp;:"
2887
 
2888
+ #: lib/help.php:421
2889
  msgid "AA: the process ID (PID)."
2890
  msgstr "AA : l'identifiant de processus (PID)."
2891
 
2892
+ #: lib/help.php:422
2893
  msgid "BB: the user IPv4 or IPv6 address."
2894
  msgstr "BB : L'adresse IPv4 ou IPv6 de l'utilisateur."
2895
 
2896
+ #: lib/help.php:423
2897
  msgid "CC: the blog (sub-)domain name."
2898
  msgstr "CC : le nom de (sous-)domaine du blog."
2899
 
2900
+ #: lib/help.php:424
2901
  msgid ""
2902
  "DD: the target: it can be either <code>wp-login.php</code> or <code>XML-RPC "
2903
  "API</code>."
2905
  "DD : la cible; il peut s'agir soit de <code>wp-login.php</code>, soit de "
2906
  "<code>XML-RPC API</code>."
2907
 
2908
+ #: lib/help.php:425
2909
  msgid "EE: the time, in minutes, the protection will remain active."
2910
  msgstr ""
2911
  "EE : le temps, en minutes, pendant lequel la protection restera active."
2912
 
2913
+ #: lib/help.php:427
2914
  msgid "Sample loglines:"
2915
  msgstr "Exemple :"
2916
 
2917
+ #: lib/help.php:430
2918
  #, php-format
2919
  msgid ""
2920
  "Be careful if you are behind a load balancer, reverse-proxy or CDN because "
2934
  "Alternativement, vous pouvez utiliser le fichier <code><a href=\"%s\">."
2935
  "htninja</a></code>."
2936
 
2937
+ #: lib/help.php:444 lib/logs.php:39 lib/wpplus.php:206
2938
  msgid "Firewall Log"
2939
  msgstr "Journal du Pare-feu"
2940
 
2941
+ #: lib/help.php:447
2942
  msgid ""
2943
  "The firewall log displays blocked and sanitised requests as well as some "
2944
  "useful information. It has 6 columns:"
2946
  "Le journal du pare-feu affiche les requêtes HTTP qui ont été bloquées ou "
2947
  "nettoyées ainsi que d'autres informations utiles. Il a six colonnes&nbsp;:"
2948
 
2949
+ #: lib/help.php:448
2950
  msgid "DATE : date and time of the incident."
2951
  msgstr "DATE : date et heure de l'incident."
2952
 
2953
+ #: lib/help.php:449
2954
  msgid ""
2955
  "INCIDENT : unique incident number/ID as it was displayed to the blocked user."
2956
  msgstr ""
2957
  "INCIDENT : le numéro d'incident (ID) unique. Par défaut, il sera aussi "
2958
  "affiché à l'utilisateur dont la requête aura été bloquée par le pare-feu."
2959
 
2960
+ #: lib/help.php:450
2961
  msgid ""
2962
  "LEVEL : level of severity (<code>CRITICAL</code>, <code>HIGH</code> or "
2963
  "<code>MEDIUM</code>), information (<code>INFO</code>, <code>UPLOAD</code>) "
2967
  "<code>MEDIUM</code>), information (<code>INFO</code>, <code>UPLOAD</code>) "
2968
  "et mode débogage (<code>DEBUG_ON</code>)."
2969
 
2970
+ #: lib/help.php:451
2971
  msgid ""
2972
  "RULE : reference of the NinjaFirewall built-in security rule that triggered "
2973
  "the action. A hyphen (<code>-</code>) instead of a number means it was a "
2978
  "d'un numéro signifie que la règle provient de votre configuration "
2979
  "personnelle de la page \"Politiques du Pare-feu\"."
2980
 
2981
+ #: lib/help.php:452
2982
  msgid "IP : the user IPv4 or IPv6 address."
2983
  msgstr "BB : L'adresse IPv4 ou IPv6 de l'utilisateur."
2984
 
2985
+ #: lib/help.php:453
2986
  msgid ""
2987
  "REQUEST : the HTTP request including offending variables and values as well "
2988
  "as the reason the action was logged."
2990
  "REQUEST : la requête HTTP avec ses variables et valeurs, ainsi que la raison "
2991
  "qui a déclenché l'incident."
2992
 
2993
+ #: lib/help.php:456 lib/logs_firewall_log.php:165
2994
  msgid "Auto-delete log"
2995
  msgstr "Suppression automatique des journaux"
2996
 
2997
+ #: lib/help.php:457
2998
  msgid ""
2999
  "This options lets you configure NinjaFirewall to delete its old logs "
3000
  "automatically. By default, logs are never deleted, <b>even when uninstall "
3007
  "cette valeur à <code>0</code> si vous ne voulez pas supprimer les anciens "
3008
  "journaux."
3009
 
3010
+ #: lib/help.php:461
3011
  msgid ""
3012
  "Centralized Logging lets you remotely access the firewall log of all your "
3013
  "NinjaFirewall protected websites from one single installation. You do not "
3018
  "NinjaFirewall. Vous n'avez plus besoin de vous connecter à chaque site pour "
3019
  "analyser vos journaux."
3020
 
3021
+ #: lib/help.php:461
3022
  #, php-format
3023
  msgid "<a href=\"%s\">Consult our blog</a> for more info about it."
3024
  msgstr ""
3025
  "<a href=\"%s\">Consultez notre blog pour plus d'informations à ce sujet</a>."
3026
 
3027
+ #: lib/help.php:462
3028
  msgid ""
3029
  "Enter your public key (optional): This is the public key that was created "
3030
  "from your main server."
3032
  "Entrez votre clé publique (optionnel) : Il s'agit de la clé qui a été créée "
3033
  "depuis le serveur principal."
3034
 
3035
+ #: lib/help.php:466
3036
  msgid ""
3037
  "Centralized Logging will keep working even if NinjaFirewall is disabled. "
3038
  "Delete your public key below if you want to disable it."
3041
  "NinjaFirewall. Si vous souhaitez complètement désactiver cette option, "
3042
  "supprimez votre clé publique ci-dessous. "
3043
 
3044
+ #: lib/help.php:473 lib/logs.php:40 lib/logs_live_log.php:37
3045
  msgid "Live Log"
3046
  msgstr "Live Log"
3047
 
3048
+ #: lib/help.php:476
3049
  msgid ""
3050
  "Live Log lets you watch your blog traffic in real time, just like the Unix "
3051
  "<code>tail -f</code> command. Note that requests sent to static elements "
3057
  "statiques comme les fichiers JS/CSS ou les images ne sont pas traitées par "
3058
  "NinjaFirewall."
3059
 
3060
+ #: lib/help.php:478
3061
  msgid ""
3062
  "You can enable/disable the monitoring process, change the refresh rate, "
3063
  "clear the screen, enable automatic vertical scrolling, change the log "
3068
  "effacer l'écran, changer le format d'affichage, le fuseau horaire et choisir "
3069
  "le type de trafic à visualiser (HTTP/HTTPS)."
3070
 
3071
+ #: lib/help.php:478
3072
  msgid ""
3073
  "You can also apply filters to include or exclude files and folders "
3074
  "(REQUEST_URI)."
3076
  "Vous pouvez également appliquer des filtres pour inclure ou exclure des "
3077
  "fichiers et des dossiers (REQUEST_URI)."
3078
 
3079
+ #: lib/help.php:481
3080
  msgid ""
3081
  "Live Log does not make use of any WordPress core file (e.g., <code>admin-"
3082
  "ajax.php</code>). It communicates directly with the firewall without loading "
3090
  "serveur, même si vous ajustez son intervalle de rafraîchissement de la page "
3091
  "sur la fréquence la plus rapide (5 secondes)."
3092
 
3093
+ #: lib/help.php:483
3094
  msgid ""
3095
  "If you are using the optional <code>.htninja</code> configuration file to "
3096
  "whitelist your IP, the Live Log feature will not work."
3099
  "pour toujours accepter les requêtes provenant de votre adresse IP, Live Log "
3100
  "ne fonctionnera pas."
3101
 
3102
+ #: lib/help.php:487
3103
  msgid "Log Format"
3104
  msgstr "Format d'affichage"
3105
 
3106
+ #: lib/help.php:488
3107
  msgid "You can easily customize the log format. Possible values are:"
3108
  msgstr ""
3109
  "Vous pouvez facilement changer le format d'affichage en combinant une ou "
3110
  "plusieurs des valeurs suivantes&nbsp;:"
3111
 
3112
+ #: lib/help.php:489
3113
  msgid "<code>%time</code>: the server date, time and timezone."
3114
  msgstr "<code>%time</code> : la date, heure et fuseau horaire du serveur."
3115
 
3116
+ #: lib/help.php:490
3117
  msgid "<code>%name</code>: authenticated user (HTTP basic auth), if any."
3118
  msgstr ""
3119
  "<code>%name</code> : le nom de l'utilisateur (Authentification HTTP), s'il "
3120
  "existe."
3121
 
3122
+ #: lib/help.php:491
3123
  #, php-format
3124
  msgid ""
3125
  "<code>%client</code>: the client REMOTE_ADDR. If you are behind a load "
3129
  "serveur est derrière un CDN ou un proxy, cette variable retournera l'adresse "
3130
  "IP de celui-ci."
3131
 
3132
+ #: lib/help.php:492
3133
  msgid "<code>%method</code>: HTTP method (e.g., GET, POST)."
3134
  msgstr "<code>%method</code> : la méthode HTTP (ex. GET, POST)."
3135
 
3136
+ #: lib/help.php:493
3137
  #, php-format
3138
  msgid ""
3139
  "<code>%uri</code>: the URI which was given in order to access the page "
3140
  "(REQUEST_URI)."
3141
  msgstr "<code>%uri</code> : l'URI donnée pour accéder à la page (REQUEST_URI)."
3142
 
3143
+ #: lib/help.php:494
3144
  msgid "<code>%referrer</code>: the referrer (HTTP_REFERER), if any."
3145
  msgstr "<code>%referrer</code> : le referrer (HTTP_REFERER), s'il existe."
3146
 
3147
+ #: lib/help.php:495
3148
  #, php-format
3149
  msgid "<code>%ua</code>: the user-agent (HTTP_USER_AGENT), if any."
3150
  msgstr ""
3151
  "<code>%ua</code> : l'en-tête User-Agent (HTTP_USER_AGENT), s'il existe."
3152
 
3153
+ #: lib/help.php:496
3154
  #, php-format
3155
  msgid ""
3156
  "<code>%forward</code>: HTTP_X_FORWARDED_FOR, if any. If you are behind a "
3160
  "votre serveur est derrière un CDN ou un proxy, cette variable retournera "
3161
  "l'adresse réelle du client."
3162
 
3163
+ #: lib/help.php:497
3164
  msgid "<code>%host</code>: the requested host (HTTP_HOST), if any."
3165
  msgstr ""
3166
  "<code>%host</code> : l'en-tête Host de la requête courante (HTTP_HOST), si "
3167
  "elle existe."
3168
 
3169
+ #: lib/help.php:499
3170
  msgid ""
3171
  "Additionally, you can include any of the following characters: <code>\"</"
3172
  "code>, <code>%</code>, <code>[</code>, <code>]</code>, <code>space</code> "
3176
  "%</code>, <code>[</code>, <code>]</code>, <code>espace</code> et toute "
3177
  "lettre minuscule <code>a-z</code>."
3178
 
3179
+ #: lib/help.php:510
3180
  msgid ""
3181
  "Your website can run NinjaFirewall and be compliant with the General Data "
3182
  "Protection Regulation (GDPR). For more info, please visit our blog:"
3184
  "NinjaFirewall est conforme à la réglementation générale sur la protection "
3185
  "des données (RGPD). Pour plus d'informations, veuillez visiter notre blog :"
3186
 
3187
+ #: lib/help.php:524 lib/security_rules.php:47
3188
  msgid "Rules Updates"
3189
  msgstr "Mise à Jour des Règles"
3190
 
3191
+ #: lib/help.php:526
3192
  msgid ""
3193
  "To get the most efficient protection, you can ask NinjaFirewall to "
3194
  "automatically update its security rules."
3196
  "Pour bénéficier de la protection la plus efficace, vous pouvez demander à "
3197
  "NinjaFirewall de mettre à jour ses règles de sécurité automatiquement."
3198
 
3199
+ #: lib/help.php:528
3200
  msgid ""
3201
  "Each time a new vulnerability is found in WordPress or one of its plugins/"
3202
  "themes, a new set of security rules will be made available to protect "
3206
  "extensions ou ses thèmes, un nouvel ensemble de règles de sécurité est "
3207
  "disponible pour protéger contre cette vulnérabilité si nécessaire."
3208
 
3209
+ #: lib/help.php:530
3210
  msgid ""
3211
  "Only security rules will be downloaded. If a new version of NinjaFirewall "
3212
  "(including new files, options and features) was available, it would have to "
3217
  "jour depuis la page des \"Extensions\" de votre tableau de bord, comme "
3218
  "d'habitude."
3219
 
3220
+ #: lib/help.php:532
3221
  msgid ""
3222
  "We recommend to enable this feature, as it is the <strong>best way to keep "
3223
  "your WordPress secure</strong> against new vulnerabilities."
3226
  "<strong>meilleure façon de garder votre WordPress protégé</strong> contre "
3227
  "les dernières vulnérabilités."
3228
 
3229
+ #: lib/help.php:537 lib/security_rules.php:48
3230
  msgid "Rules Editor"
3231
  msgstr "Éditeur de Règles"
3232
 
3233
+ #: lib/help.php:539
3234
  msgid ""
3235
  "Besides the \"Firewall Policies\", NinjaFirewall includes also a large set "
3236
  "of built-in rules used to protect your blog against the most common "
3247
  "règles, vous pouvez utiliser l’Éditeur de règles ci-dessous pour les "
3248
  "désactiver individuellement&nbsp;:"
3249
 
3250
+ #: lib/help.php:541
3251
  msgid ""
3252
  "Check your firewall log and find the rule ID you want to disable (it is "
3253
  "displayed in the <code>RULE</code> column)."
3255
  "Consultez le journal du pare-feu afin d'y trouver l'ID de la règle que vous "
3256
  "souhaitez désactiver (il est affiché dans la colonne <code>RULE</code>)."
3257
 
3258
+ #: lib/help.php:542
3259
  msgid ""
3260
  "Select its ID from the enabled rules list below and click the \"Disable it\" "
3261
  "button."
3263
  "Sélectionnez son ID dans la liste des règles ci-dessous et cliquez sur le "
3264
  "bouton \"Désactiver\"."
3265
 
3266
+ #: lib/help.php:544
3267
  msgid ""
3268
  "Note: if the <code>RULE</code> column from your log shows a hyphen <code>-</"
3269
  "code> instead of a number, that means that the rule can be changed in the "
3273
  "d'union <code>-</code> à la place d'un nombre, cela signifie que la règle ne "
3274
  "peut être modifiée quand dans la page \"Politiques du Pare-feu\"."
3275
 
3276
+ #: lib/install.php:70
 
 
 
 
 
 
 
 
 
 
 
 
 
3277
  #, php-format
3278
  msgid ""
3279
  "Error: Your .htaccess file is not writable, please change its permissions: %s"
3281
  "Erreur : Votre fichier .htaccess n'est pas accessible en écriture. Veuillez "
3282
  "modifier ses autorisations : %s"
3283
 
3284
+ #: lib/install.php:95 ninjafirewall.php:594 ninjafirewall.php:598
3285
  #, php-format
3286
  msgid "Error: wrong parameter value (%s)."
3287
  msgstr "Erreur : Mauvais paramètre (%s)."
3288
 
3289
+ #: lib/install.php:102 lib/install.php:183 lib/install.php:204
3290
  #, php-format
3291
  msgid ""
3292
  "Error: The following file is not writable, please change its permissions: %s"
3294
  "Erreur : Le fichier suivant n'est pas accessible en écriture. Veuillez "
3295
  "modifier ses autorisations : %s"
3296
 
3297
+ #: lib/install.php:125
3298
  #, php-format
3299
  msgid ""
3300
  "NinjaFirewall detected that the requested changes seemed to crash your blog. "
3303
  "NinjaFirewall a détecté que les modifications demandées semblaient planter "
3304
  "votre blog. %s"
3305
 
3306
+ #: lib/install.php:126
3307
  msgid ""
3308
  "Changes have been undone. You may need to modify your selection and try "
3309
  "again."
3311
  "Les modifications ont été annulées. Vous devriez peut-être modifier votre "
3312
  "sélection et réessayer."
3313
 
3314
+ #: lib/install.php:136
3315
  #, php-format
3316
  msgid "The website front-end returned: HTTP %s %s."
3317
  msgstr "La page d'accueil du site a retourné : HTTP %s %s."
3318
 
3319
+ #: lib/install.php:148
3320
  #, php-format
3321
  msgid "The website front-end returned a fatal error: %s."
3322
  msgstr "La page d'accueil du site a retourné une erreur fatale : %s."
3323
 
3324
+ #: lib/install.php:238 lib/install.php:263 lib/install.php:288
3325
+ #: lib/install.php:309
3326
  msgid "File is not writable"
3327
  msgstr "Le fichier n'est pas accessible en écriture"
3328
 
3329
+ #: lib/install_default.php:167
3330
  msgid ""
3331
  "Error: The installer cannot download the security rules from wordpress.org "
3332
  "website."
3334
  "Erreur : Impossible de télécharger les règles de sécurité depuis le site de "
3335
  "wordpress.org."
3336
 
3337
+ #: lib/install_default.php:168
3338
  msgid ""
3339
  "The server may be temporarily down or you may have network connectivity "
3340
  "problems? Please try again in a few minutes."
3343
  "problèmes de connectivité réseau ? Veuillez ré-essayer d'ici quelques "
3344
  "minutes."
3345
 
3346
+ #: lib/install_default.php:169
3347
  msgid ""
3348
  "NinjaFirewall downloads its rules over an HTTPS secure connection. Maybe "
3349
  "your server does not support SSL? You can force NinjaFirewall to use a non-"
3356
  "connexion non-sécurisée (HTTP) en ajoutant la ligne suivante dans votre "
3357
  "fichier <strong>wp-config.php</strong> :"
3358
 
3359
+ #: lib/install_default.php:232
3360
  #, php-format
3361
  msgid ""
3362
  "NinjaFirewall cannot create its <code>nfwlog/</code>log and cache folder; "
3555
  msgid "Error: unable to write to the %s configuration file"
3556
  msgstr "Erreur : impossible d’écrire dans le fichier de configuration %s"
3557
 
3558
+ #: lib/logs.php:36 ninjafirewall.php:790
3559
  msgid "Logs"
3560
  msgstr "Journaux"
3561
 
3679
  "et assurez vous que l'option \"Ajouter l'Administrateur à la liste blanche\" "
3680
  "est activée."
3681
 
3682
+ #: lib/logs_live_log.php:98 ninjafirewall.php:329
3683
+ msgid ""
3684
+ "Live Log lets you watch your blog traffic in real time. To enable it, click "
3685
+ "on the button below."
3686
+ msgstr ""
3687
+ "Live Log vous permet de surveiller le trafic de votre blog en temps réel. "
3688
+ "Pour l'activer, cliquez sur le bouton ci-dessous."
3689
+
3690
  #: lib/logs_live_log.php:104
3691
  msgid "Refresh rate:"
3692
  msgstr "Intervalle :"
3729
  msgid "Inclusion and exclusion filters (REQUEST_URI)"
3730
  msgstr "Filtres d'inclusion et d'exclusion (REQUEST_URI)"
3731
 
3732
+ #: lib/logs_live_log.php:160 lib/monitoring_file_check.php:395
3733
  msgid "None"
3734
  msgstr "Aucune"
3735
 
3741
  msgid "Must not include"
3742
  msgstr "Ne doit pas inclure"
3743
 
3744
+ #: lib/logs_live_log.php:164 lib/monitoring_file_check.php:153
3745
  #: lib/monitoring_file_guard.php:89
3746
  msgid "e.g.,"
3747
  msgstr "par ex."
3788
  msgid "Error: please enter the custom log format."
3789
  msgstr "Erreur : veuillez entrer le format d'affichage."
3790
 
3791
+ #: lib/monitoring.php:43 ninjafirewall.php:764
3792
  msgid "Monitoring"
3793
  msgstr "Monitoring"
3794
 
3804
  msgid "You must create a snapshot first."
3805
  msgstr "Vous devez d'abord créer un instantané."
3806
 
3807
+ #: lib/monitoring_file_check.php:96 lib/monitoring_file_check.php:763
3808
  msgid "NinjaFirewall detected that changes were made to your files."
3809
  msgstr "NinjaFirewall a détecté des changements dans vos fichiers."
3810
 
3812
  msgid "No changes detected."
3813
  msgstr "Aucun changement n'a été détecté."
3814
 
3815
+ #: lib/monitoring_file_check.php:132
3816
+ msgid ""
3817
+ "File Check lets you perform file integrity monitoring upon request or on a "
3818
+ "specific interval. To start, create a snapshot of your files by clicking the "
3819
+ "button below."
3820
+ msgstr ""
3821
+ "File Check vous permet d'effectuer une analyse de l'intégrité de vos "
3822
+ "fichiers sur demande ou à un intervalle spécifique défini."
3823
+
3824
+ #: lib/monitoring_file_check.php:139
3825
  msgid "Create a snapshot of all files stored in that directory"
3826
  msgstr ""
3827
  "Créer un instantané de tous les fichiers se trouvant dans ce répertoire"
3828
 
3829
+ #: lib/monitoring_file_check.php:147
3830
  #, php-format
3831
  msgid "Default: %s"
3832
  msgstr "Défaut : %s"
3833
 
3834
+ #: lib/monitoring_file_check.php:152 lib/monitoring_file_guard.php:88
3835
  msgid "Exclude the following files/folders (optional)"
3836
  msgstr "Exclure les fichiers / dossiers suivants (optionnel)"
3837
 
3838
+ #: lib/monitoring_file_check.php:153
3839
  msgid ""
3840
  "Full or partial case-sensitive string(s). Multiple values must be comma-"
3841
  "separated"
3843
  "Chaîne de caractères complète ou partielle, sensible à la casse. Plusieurs "
3844
  "valeurs doivent être séparées par des virgules"
3845
 
3846
+ #: lib/monitoring_file_check.php:159
3847
  msgid "Do not follow symbolic links (default)"
3848
  msgstr "Ne pas suivre les liens symboliques (défaut)"
3849
 
3850
+ #: lib/monitoring_file_check.php:165
3851
  msgid "Create Snapshot"
3852
  msgstr "Créer un Instantané"
3853
 
3854
+ #: lib/monitoring_file_check.php:231
3855
  msgid "Last snapshot"
3856
  msgstr "Dernier instantané"
3857
 
3858
+ #: lib/monitoring_file_check.php:233
3859
  #, php-format
3860
  msgid "Created on: %s"
3861
  msgstr "Créé le : %s"
3862
 
3863
+ #: lib/monitoring_file_check.php:234
3864
  #, php-format
3865
  msgid "Total files: %s "
3866
  msgstr "Nombre de fichiers : %s "
3867
 
3868
+ #: lib/monitoring_file_check.php:236
3869
  msgid "Directory:"
3870
  msgstr "Répertoire&nbsp;:"
3871
 
3872
+ #: lib/monitoring_file_check.php:240
3873
  msgid "Exclusion:"
3874
  msgstr "Exclusion&nbsp;:"
3875
 
3876
+ #: lib/monitoring_file_check.php:246
3877
  msgid "Symlinks:"
3878
  msgstr "Lien symboliques :"
3879
 
3880
+ #: lib/monitoring_file_check.php:248
3881
  msgid "follow"
3882
  msgstr "suivre"
3883
 
3884
+ #: lib/monitoring_file_check.php:250
3885
  msgid "do not follow"
3886
  msgstr "ne pas suivre"
3887
 
3888
+ #: lib/monitoring_file_check.php:254
3889
  #, php-format
3890
  msgid "Processing time: %s seconds"
3891
  msgstr "Temps de traitement : %s secondes"
3892
 
3893
+ #: lib/monitoring_file_check.php:259
3894
  msgid "Download Snapshot"
3895
  msgstr "Télécharger l'instantané"
3896
 
3897
+ #: lib/monitoring_file_check.php:259
3898
  msgid "Delete Snapshot"
3899
  msgstr "Supprimer l'instantané"
3900
 
3901
+ #: lib/monitoring_file_check.php:265
3902
  msgid "Last changes"
3903
  msgstr "Dernières modifications"
3904
 
3905
+ #: lib/monitoring_file_check.php:272 lib/monitoring_file_check.php:771
3906
  #, php-format
3907
  msgid "New files: %s"
3908
  msgstr "Nouveaux fichiers : %s"
3909
 
3910
+ #: lib/monitoring_file_check.php:273 lib/monitoring_file_check.php:773
3911
  #, php-format
3912
  msgid "Deleted files: %s"
3913
  msgstr "Fichiers supprimés : %s"
3914
 
3915
+ #: lib/monitoring_file_check.php:274 lib/monitoring_file_check.php:772
3916
  #, php-format
3917
  msgid "Modified files: %s"
3918
  msgstr "Fichiers modifiés : %s"
3919
 
3920
+ #: lib/monitoring_file_check.php:278
3921
  msgid "View Changes"
3922
  msgstr "Voir les Modifications"
3923
 
3924
+ #: lib/monitoring_file_check.php:282
3925
  msgid "Download Changes"
3926
  msgstr "Télécharger les Modifications"
3927
 
3928
+ #: lib/monitoring_file_check.php:294
3929
  msgid "Click a file to get more info about it."
3930
  msgstr "Cliquez sur un fichier pour obtenir plus d'informations à son sujet."
3931
 
3932
+ #: lib/monitoring_file_check.php:297
3933
  msgid "New files:"
3934
  msgstr "Nouveaux fichiers :"
3935
 
3936
+ #: lib/monitoring_file_check.php:306 lib/monitoring_file_check.php:359
3937
  msgid "Size"
3938
  msgstr "Taille"
3939
 
3940
+ #: lib/monitoring_file_check.php:310 lib/monitoring_file_check.php:364
3941
  msgid "Access"
3942
  msgstr "Accès"
3943
 
3944
+ #: lib/monitoring_file_check.php:314 lib/monitoring_file_check.php:369
3945
  msgid "Uid / Gid"
3946
  msgstr "Uid / Gid"
3947
 
3948
+ #: lib/monitoring_file_check.php:318 lib/monitoring_file_check.php:374
3949
  msgid "Modify"
3950
  msgstr "Modification"
3951
 
3952
+ #: lib/monitoring_file_check.php:322 lib/monitoring_file_check.php:379
3953
  msgid "Change"
3954
  msgstr "Changement"
3955
 
3956
+ #: lib/monitoring_file_check.php:332
3957
  msgid "Deleted files:"
3958
  msgstr "Fichiers supprimés :"
3959
 
3960
+ #: lib/monitoring_file_check.php:345
3961
  msgid "Modified files:"
3962
  msgstr "Fichiers modifiés :"
3963
 
3964
+ #: lib/monitoring_file_check.php:355
3965
  msgid "Old"
3966
  msgstr "Ancien"
3967
 
3968
+ #: lib/monitoring_file_check.php:356
3969
  msgid "New"
3970
  msgstr "Nouveau"
3971
 
3972
+ #: lib/monitoring_file_check.php:405
3973
  msgid "Scan System For File Changes"
3974
  msgstr "Lancer l'analyse des fichiers"
3975
 
3976
+ #: lib/monitoring_file_check.php:423
3977
  msgid "Options"
3978
  msgstr "Options"
3979
 
3980
+ #: lib/monitoring_file_check.php:430
3981
  #, php-format
3982
  msgid ""
3983
  "It seems that %s is set. Ensure you have another way to run WP-Cron, "
3986
  "Il semble que %s est activé. Assurez vous de pouvoir exécuter WP-Cron, sinon "
3987
  "File Check ne pourra pas se lancer automatiquement."
3988
 
3989
+ #: lib/monitoring_file_check.php:436
3990
  msgid "Enable scheduled scans"
3991
  msgstr "Lancer File Check automatiquement"
3992
 
3993
+ #: lib/monitoring_file_check.php:438
3994
  msgid "No (default)"
3995
  msgstr "Non (défaut)"
3996
 
3997
+ #: lib/monitoring_file_check.php:439 lib/security_rules_update.php:153
3998
  msgid "Hourly"
3999
  msgstr "Une fois par heure"
4000
 
4001
+ #: lib/monitoring_file_check.php:440 lib/security_rules_update.php:154
4002
  msgid "Twicedaily"
4003
  msgstr "Deux fois par jour"
4004
 
4005
+ #: lib/monitoring_file_check.php:441 lib/security_rules_update.php:155
4006
  msgid "Daily"
4007
  msgstr "Tous les jours"
4008
 
4009
+ #: lib/monitoring_file_check.php:448
4010
  #, php-format
4011
  msgid ""
4012
  "Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
4015
  "La prochaine analyse commencera dans %s jour(s), %s heure(s), %s minute(s) "
4016
  "et %s seconde(s)."
4017
 
4018
+ #: lib/monitoring_file_check.php:455
4019
  msgid ""
4020
  "The next scheduled scan date is in the past! WordPress wp-cron may not be "
4021
  "working or may have been disabled."
4023
  "La date de la prochaine analyse est dans le passé&nbsp;! Essayez de "
4024
  "recharger cette page, sinon vérifiez que WP-Cron n'a pas été désactivé."
4025
 
4026
+ #: lib/monitoring_file_check.php:463
4027
  msgid "Scheduled scan report"
4028
  msgstr "Rapport d'analyse"
4029
 
4030
+ #: lib/monitoring_file_check.php:465
4031
  msgid "Send me a report by email only if changes are detected (default)"
4032
  msgstr ""
4033
  "Envoyez-moi un rapport uniquement si des changements ont été détectés "
4034
  "(défaut)"
4035
 
4036
+ #: lib/monitoring_file_check.php:466
4037
  msgid "Always send me a report by email after a scheduled scan"
4038
  msgstr "Envoyez-moi toujours un rapport après une analyse automatique"
4039
 
4040
+ #: lib/monitoring_file_check.php:471
4041
  msgid "Save Scan Options"
4042
  msgstr "Sauvegarder les options"
4043
 
4044
+ #: lib/monitoring_file_check.php:483
4045
  msgid "Enter the full path to the directory to be scanned."
4046
  msgstr "Entrez le chemin complet vers le répertoire à scanner."
4047
 
4048
+ #: lib/monitoring_file_check.php:490
4049
  #, php-format
4050
  msgid "The directory %s does not exist."
4051
  msgstr "Le répertoire %s n'existe pas."
4052
 
4053
+ #: lib/monitoring_file_check.php:493
4054
  #, php-format
4055
  msgid "The directory %s is not readable."
4056
  msgstr "Le répertoire %s n'est pas lisible."
4057
 
4058
+ #: lib/monitoring_file_check.php:534
4059
  #, php-format
4060
  msgid "Cannot write to %s."
4061
  msgstr "Impossible d'écrire dans %s."
4062
 
4063
+ #: lib/monitoring_file_check.php:564
4064
  #, php-format
4065
  msgid "Error : cannot open %s directory."
4066
  msgstr "Erreur : impossible d'ouvrir le répertoire %s."
4067
 
4068
+ #: lib/monitoring_file_check.php:567
4069
  #, php-format
4070
  msgid "Error : %s directory is not readable."
4071
  msgstr "Erreur : le répertoire %s n'est pas lisible."
4072
 
4073
+ #: lib/monitoring_file_check.php:582
4074
  #, php-format
4075
  msgid "Missing options line %s, please try again."
4076
  msgstr "Option manquante (ligne %s). Veuillez essayer à nouveau."
4077
 
4078
+ #: lib/monitoring_file_check.php:592
4079
  #, php-format
4080
  msgid "Cannot create %s."
4081
  msgstr "Impossible de créer %s."
4082
 
4083
+ #: lib/monitoring_file_check.php:609
4084
  msgid "Error reading old snapshot file."
4085
  msgstr "Erreur lors de la lecture du fichier de l'ancien instantané."
4086
 
4087
+ #: lib/monitoring_file_check.php:620
4088
  msgid "Error reading new snapshot file."
4089
  msgstr "Erreur lors de la lecture du fichier du nouvel instantané."
4090
 
4091
+ #: lib/monitoring_file_check.php:736 ninjafirewall.php:421
4092
  msgid "New file"
4093
  msgstr "Nouveau fichier"
4094
 
4095
+ #: lib/monitoring_file_check.php:737 ninjafirewall.php:422
4096
  msgid "Modified file"
4097
  msgstr "Fichier modifié"
4098
 
4099
+ #: lib/monitoring_file_check.php:738 ninjafirewall.php:423
4100
  msgid "Deleted file"
4101
  msgstr "Fichier supprimé"
4102
 
4103
+ #: lib/monitoring_file_check.php:762
4104
  msgid "[NinjaFirewall] Alert: File Check detection"
4105
  msgstr "[NinjaFirewall] Alerte: Détection File Check"
4106
 
4107
+ #: lib/monitoring_file_check.php:765 lib/monitoring_file_check.php:767
4108
+ #: lib/monitoring_file_check.php:792 lib/monitoring_file_check.php:794
4109
+ #: lib/security_rules_update.php:553 lib/security_rules_update.php:555
4110
+ #: lib/utils.php:214 lib/utils.php:776 lib/utils.php:941 lib/utils.php:1273
4111
  msgid "Blog:"
4112
  msgstr "Blog :"
4113
 
4114
+ #: lib/monitoring_file_check.php:769 lib/monitoring_file_check.php:796
4115
+ #: lib/security_rules_update.php:558
4116
  #, php-format
4117
  msgid "Date: %s"
4118
  msgstr "Date : %s"
4119
 
4120
+ #: lib/monitoring_file_check.php:775
4121
  msgid "See attached file for details."
4122
  msgstr "Voir le fichier joint pour plus de détails."
4123
 
4124
+ #: lib/monitoring_file_check.php:789
4125
  msgid "[NinjaFirewall] File Check report"
4126
  msgstr "[NinjaFirewall] Rapport de File Check"
4127
 
4128
+ #: lib/monitoring_file_check.php:790
4129
  msgid "NinjaFirewall did not detect changes in your files."
4130
  msgstr "NinjaFirewall n'a pas détecté de changements dans vos fichiers."
4131
 
4181
  msgid "Save File Guard options"
4182
  msgstr "Sauvegarder les options"
4183
 
4184
+ #: lib/network.php:24 ninjafirewall.php:1051 ninjafirewall.php:1055
4185
  #, php-format
4186
  msgid "You are not allowed to perform this task (%s)."
4187
  msgstr "Vous n'êtes pas autorisé à effectuer cette tâche (%s)."
4206
  msgid "Save Network options"
4207
  msgstr "Sauvegarder les options"
4208
 
4209
+ #: lib/security_rules.php:44 lib/security_rules_update.php:559
4210
+ #: ninjafirewall.php:794
4211
  msgid "Security Rules"
4212
  msgstr "Règles de Sécurité"
4213
 
4318
  msgid "Security rules have been updated."
4319
  msgstr "Les règles de sécurité ont été mises à jour."
4320
 
4321
+ #: lib/security_rules_update.php:91 lib/security_rules_update.php:435
4322
  msgid "No security rules update available."
4323
  msgstr "Aucune mise à jour des règles de sécurité disponible."
4324
 
4331
  "Il semble que %s est activé. Assurez vous de pouvoir exécuter WP-Cron, sinon "
4332
  "les mises à jour automatiques ne pourront pas être effectuées."
4333
 
4334
+ #: lib/security_rules_update.php:136
4335
  msgid "Automatically update NinjaFirewall security rules"
4336
  msgstr "Activer la mise à jour automatique des règles de sécurité"
4337
 
4338
+ #: lib/security_rules_update.php:148
4339
  msgid "Check for updates"
4340
  msgstr "Vérifier les mises à jour"
4341
 
4342
+ #: lib/security_rules_update.php:151
4343
  msgid "Every 15 minutes"
4344
  msgstr "Toutes les 15 minutes"
4345
 
4346
+ #: lib/security_rules_update.php:152
4347
  msgid "Every 30 minutes"
4348
  msgstr "Toutes les 30 minutes"
4349
 
4350
+ #: lib/security_rules_update.php:169
4351
  msgid ""
4352
  "The next scheduled date is in the past! WordPress wp-cron may not be working "
4353
  "or may have been disabled."
4356
  "passé&nbsp;! Essayez de recharger cette page, sinon vérifiez que WP-Cron n'a "
4357
  "pas été désactivé."
4358
 
4359
+ #: lib/security_rules_update.php:174
4360
  #, php-format
4361
  msgid ""
4362
  "Next scheduled update will start in approximately %s day, %s hour(s), %s "
4365
  "La prochaine vérification des mises à jour aura lieu dans %s jour, %s "
4366
  "heure(s), %s minute(s) et %s secondes."
4367
 
4368
+ #: lib/security_rules_update.php:182
4369
  msgid "Notification"
4370
  msgstr "Notification"
4371
 
4372
+ #: lib/security_rules_update.php:184
4373
  msgid "Send me a report by email when security rules have been updated."
4374
  msgstr ""
4375
  "Envoyez-moi un rapport par e-mail lorsque les règles de sécurité ont été "
4376
  "mises à jour."
4377
 
4378
+ #: lib/security_rules_update.php:185
4379
  msgid ""
4380
  "Reports will be sent to the contact email address defined in the Event "
4381
  "Notifications menu."
4383
  "Les rapports seront envoyés à l'adresse e-mail définie dans la page "
4384
  "\"Notifications d'Événement\"."
4385
 
4386
+ #: lib/security_rules_update.php:195 lib/security_rules_update.php:210
4387
  msgid "The updates log is currently empty."
4388
  msgstr "Le journal des mises à jour est vide."
4389
 
4390
+ #: lib/security_rules_update.php:199
4391
  msgid "Updates Log"
4392
  msgstr "Journal des mises à jour"
4393
 
4394
+ #: lib/security_rules_update.php:213
4395
  msgid "Log is flushed automatically."
4396
  msgstr "Le journal est purgé automatiquement."
4397
 
4398
+ #: lib/security_rules_update.php:224
4399
  msgid "Save Updates Options"
4400
  msgstr "Sauvegarder les options"
4401
 
4402
+ #: lib/security_rules_update.php:225
4403
  msgid "Check For Updates Now!"
4404
  msgstr "Vérifier les mises à jour maintenant ! "
4405
 
4406
+ #: lib/security_rules_update.php:233
4407
  msgid "Delete Log"
4408
  msgstr "Supprimer le journal"
4409
 
4410
+ #: lib/security_rules_update.php:321
4411
  msgid "Error: Wrong rules format."
4412
  msgstr "Erreur : Le format des règles téléchargées ne correspond pas."
4413
 
4414
+ #: lib/security_rules_update.php:330
4415
  msgid "Error: Unable to unserialize the new rules."
4416
  msgstr ""
4417
  "Erreur : Impossible d'extraire les règles du fichier téléchargé (unable to "
4418
  "unserialize the new rules)."
4419
 
4420
+ #: lib/security_rules_update.php:338
4421
  msgid "Error: Unserialized rules seem corrupted."
4422
  msgstr ""
4423
  "Erreur : Le fichier des règles téléchargé semblent corrompu (unserialized "
4424
  "rules seem corrupted)."
4425
 
4426
+ #: lib/security_rules_update.php:378
4427
  #, php-format
4428
  msgid "Security rules updated to version %s."
4429
  msgstr "Les règles de sécurité ont été mises à jour vers la version %s."
4430
 
4431
+ #: lib/security_rules_update.php:424
 
 
 
 
 
 
 
 
4432
  msgid "Error: Unable to retrieve the new rules version."
4433
  msgstr "Erreur : Impossible de récupérer la nouvelle version des règles."
4434
 
4435
+ #: lib/security_rules_update.php:442
4436
  #, php-format
4437
  msgid "Error: Server returned a %s HTTP error code (#1)."
4438
  msgstr "Erreur : Le serveur a retourné un code d'erreur HTTP %s (#1)."
4439
 
4440
+ #: lib/security_rules_update.php:449 lib/security_rules_update.php:515
4441
  msgid "Error: Unable to connect to the remote server"
4442
  msgstr "Erreur : Impossible de se connecter au serveur distant"
4443
 
4444
+ #: lib/security_rules_update.php:479
4445
  #, php-format
4446
  msgid "Error: The new rules versions do not match (%s != %s)."
4447
  msgstr ""
4448
  "Erreur : La versions des nouvelles règles ne correspond pas (%s != %s)."
4449
 
4450
+ #: lib/security_rules_update.php:493
4451
  #, php-format
4452
  msgid ""
4453
  "Error: The new rules %s digital signature is not correct. Aborting update, "
4456
  "Erreur : La signature numérique des nouvelles règles %s n'est pas correcte. "
4457
  "Annulation de la mise à jour, les règles ont peut-être été altérées."
4458
 
4459
+ #: lib/security_rules_update.php:508
4460
  #, php-format
4461
  msgid "Error: Server returned a %s HTTP error code (#2)."
4462
  msgstr "Erreur : Le serveur a retourné un code d'erreur HTTP %s (#2)."
4463
 
4464
+ #: lib/security_rules_update.php:550
4465
  msgid "[NinjaFirewall] Security rules update"
4466
  msgstr "[NinjaFirewall] Mise à jour des règles de sécurité"
4467
 
4468
+ #: lib/security_rules_update.php:551
4469
  msgid "NinjaFirewall security rules have been updated:"
4470
  msgstr "Les règles de sécurité de NinjaFirewall ont été mises à jour :"
4471
 
4472
+ #: lib/security_rules_update.php:557
4473
  msgid "Rules version:"
4474
  msgstr "Version des règles :"
4475
 
4476
+ #: lib/security_rules_update.php:559
4477
+ #, php-format
4478
+ msgid "This notification can be turned off from NinjaFirewall \"%s\" page."
4479
  msgstr ""
4480
+ "Cette notification peut être désactivée depuis la page \"%s\" de "
4481
+ "NinjaFirewall."
4482
 
4483
+ #: lib/thickbox.php:42
4484
  msgid "Upgrade to Full WAF mode"
4485
  msgstr "Passer en mode Full WAF"
4486
 
4487
+ #: lib/thickbox.php:47
4488
  msgid ""
4489
  "In <strong>Full WAF</strong> mode, all scripts located inside the blog "
4490
  "installation directories and sub-directories are protected by NinjaFirewall, "
4496
  "compris ceux qui ne font pas partie de WordPress. Cela vous offre le niveau "
4497
  "de protection le plus élevé possible : La sécurité sans aucun compromis."
4498
 
4499
+ #: lib/thickbox.php:49
4500
  #, php-format
4501
  msgid ""
4502
  "It works on most websites right out of the box, or may require <a href=\"%s"
4510
  "d'hébergement partagé, il se peut que l'installation ne puisse pas "
4511
  "fonctionner du tout."
4512
 
4513
+ #: lib/thickbox.php:51
4514
  msgid ""
4515
  "If this happened to you, don't worry: you could still run it in "
4516
  "<strong>WordPress WAF</strong> mode. Despite being less powerful than the "
4523
  "niveau de protection très supérieur aux autres extensions de sécurité pour "
4524
  "WordPress disponibles sur le marché."
4525
 
4526
+ #: lib/thickbox.php:57
4527
  msgid "(recommended)"
4528
  msgstr "(recommandé)"
4529
 
4530
+ #: lib/thickbox.php:117
4531
  msgid "Select your HTTP server and your PHP server API"
4532
  msgstr "Sélectionnez votre serveur HTTP et PHP SAPI"
4533
 
4534
+ #: lib/thickbox.php:127
4535
  msgid "Other webserver + CGI/FastCGI or PHP-FPM"
4536
  msgstr "Autre serveur + CGI/FastCGI ou PHP-FPM"
4537
 
4538
+ #: lib/thickbox.php:129
4539
  msgid "View PHPINFO"
4540
  msgstr "Voir PHPINFO"
4541
 
4542
+ #: lib/thickbox.php:161
4543
  msgid "Select the PHP initialization file supported by your server"
4544
  msgstr ""
4545
  "Sélectionnez le type de fichier de configuration PHP utilisé par votre "
4546
  "serveur"
4547
 
4548
+ #: lib/thickbox.php:173
4549
  msgid "Let NinjaFirewall make the necessary changes (recommended)."
4550
  msgstr "Laissez NinjaFirewall faire les changements (recommandé)."
4551
 
4552
+ #: lib/thickbox.php:174
4553
  msgid "I want to make the changes myself."
4554
  msgstr "Je veux faire les changements moi-même."
4555
 
4556
+ #: lib/thickbox.php:176
4557
  msgid ""
4558
  "Ensure that you have FTP access to your website so that, if there were a "
4559
  "problem during the installation of the firewall, you could easily undo the "
4563
  "problème pendant l'installation du pare-feu, vous pourriez annuler les "
4564
  "modifications."
4565
 
4566
+ #: lib/thickbox.php:179
4567
  msgid "Please make the changes below, then click on the \"Finish\" button."
4568
  msgstr ""
4569
  "Veuillez faire les modifications ci-dessous, puis cliquer sur le bouton "
4570
  "\"Finaliser\"."
4571
 
4572
+ #: lib/thickbox.php:186
4573
  #, php-format
4574
  msgid ""
4575
  "The %s file must be created, and the following lines of code added to it:"
4577
  "Le fichier %s doit être créé, et les lignes suivantes doivent y être "
4578
  "ajoutées :"
4579
 
4580
+ #: lib/thickbox.php:187
4581
  #, php-format
4582
  msgid "The following lines of code must be added to your existing %s file:"
4583
  msgstr "Les lignes suivantes doivent être ajoutées à votre fichier %s :"
4584
 
4585
+ #: lib/thickbox.php:247
4586
  msgid ""
4587
  "Log in to your Openlitespeed admin dashboard, click on \"Virtual Host\", "
4588
  "select your domain, add the following instructions to the \"php.ini Override"
4593
  "section \"php.ini Override\" de l'onglet \"Général\", puis redémarrez "
4594
  "Openlitespeed:"
4595
 
4596
+ #: lib/thickbox.php:254
4597
  msgid ""
4598
  "Important: if one day you wanted to uninstall NinjaFirewall, do not forget "
4599
  "to remove these instructions from your Openlitespeed admin dashboard "
4605
  "<strong>avant</strong> de désinstaller NinjaFirewall, car cet installateur "
4606
  "ne pourra pas le faire à votre place."
4607
 
4608
+ #: lib/thickbox.php:272
4609
  msgid "Finish"
4610
  msgstr "Finaliser"
4611
 
4618
  msgstr ""
4619
  "NinjaFirewall a bloqué une tentative de création d'un compte d'utilisateur :"
4620
 
4621
+ #: lib/utils.php:215 lib/utils.php:946
4622
  msgid "Username:"
4623
  msgstr "Utilisateur :"
4624
 
4625
+ #: lib/utils.php:216 lib/utils.php:951 lib/utils.php:1274
4626
  msgid "User IP:"
4627
  msgstr "IP utilisateur :"
4628
 
4629
+ #: lib/utils.php:228 lib/utils.php:963 lib/utils.php:1269
 
 
 
 
4630
  msgid "A PHP backtrace has been attached to this message for your convenience."
4631
  msgstr ""
4632
  "La pile d'exécution de PHP est jointe à ce message pour votre commodité."
4633
 
4634
+ #: lib/utils.php:251 lib/utils.php:252 lib/utils.php:987 lib/utils.php:988
4635
  msgid "You are not allowed to perform this task."
4636
  msgstr "Vous n'êtes pas autorisé à effectuer cette tâche."
4637
 
4638
+ #: lib/utils.php:525 lib/utils.php:529
4639
  msgid "NinjaFirewall error"
4640
  msgstr "NinjaFirewall Erreur"
4641
 
4642
+ #: lib/utils.php:526
4643
  #, php-format
4644
  msgid ""
4645
  "%s directory cannot be created. Please review your installation and ensure "
4648
  "Le répertoire %s ne peut pas être créé. Vérifiez votre installation et "
4649
  "assurez vous que %s n'est pas en lecture seule."
4650
 
4651
+ #: lib/utils.php:530
4652
  #, php-format
4653
  msgid ""
4654
  "%s directory is read-only. Please review your installation and ensure that "
4657
  "Le répertoire %s est en lecture seule. Vérifiez votre installation et les "
4658
  "permissions de %s."
4659
 
4660
+ #: lib/utils.php:549
4661
  msgid "unknown error"
4662
  msgstr "erreur inconnue"
4663
 
4664
+ #: lib/utils.php:551
4665
  msgid "NinjaFirewall fatal error:"
4666
  msgstr "NinjaFirewall erreur fatale :"
4667
 
4668
+ #: lib/utils.php:552
4669
  msgid "Review your installation, your site is not protected."
4670
  msgstr "Vérifiez votre installation, votre site n'est pas protégé."
4671
 
4672
+ #: lib/utils.php:569
4673
  msgid "Alert: WordPress console login"
4674
  msgstr "Alerte : Connexion à WordPress"
4675
 
4676
+ #: lib/utils.php:575
 
 
 
 
4677
  msgid "Someone just logged in to your WordPress admin console:"
4678
  msgstr "Quelqu'un vient de se connecter à votre Tableau de bord de WordPress:"
4679
 
4680
+ #: lib/utils.php:581
 
 
 
 
 
 
 
 
 
 
 
 
4681
  msgid "Support forum"
4682
  msgstr "Forum "
4683
 
4684
+ #: lib/utils.php:642 lib/utils.php:669
4685
  msgid "Forbidden access"
4686
  msgstr "Accès interdit"
4687
 
4688
+ #: lib/utils.php:688
4689
  #, php-format
4690
  msgid ""
4691
  "<strong>ERROR</strong>: Invalid username or password.<br /><a href=\"%s"
4694
  "<strong>ERREUR</strong>: Identifiant ou mot de passe invalide.<br /><a href="
4695
  "\"%s\">Mot de passe perdu</a> ?"
4696
 
4697
+ #: lib/utils.php:772
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4698
  msgid "[NinjaFirewall] Alert: Database changes detected"
4699
  msgstr "[NinjaFirewall] Alerte: Modification dans la base de données"
4700
 
4701
+ #: lib/utils.php:773
4702
  msgid ""
4703
  "NinjaFirewall has detected that one or more administrator accounts were "
4704
  "modified in the database:"
4706
  "NinjaFirewall a détecté que un ou plusieurs comptes d'administrateur ont été "
4707
  "modifiés dans la base de données:"
4708
 
4709
+ #: lib/utils.php:778
4710
  #, php-format
4711
  msgid "Total administrators : %s"
4712
  msgstr "Nombre d'administrateurs : %s"
4713
 
4714
+ #: lib/utils.php:787
4715
  msgid ""
4716
  "If you cannot see any modifications in the above fields, it is possible that "
4717
  "the administrator password was changed."
4719
  "Si vous ne voyez pas de modifications dans les données ci-dessus, il est "
4720
  "possible que le mot de passe administrateur ait été changé."
4721
 
4722
+ #: lib/utils.php:926
4723
  msgid "Blocked privilege escalation attempt"
4724
  msgstr "Tentatives d'élévation des privilèges"
4725
 
4726
+ #: lib/utils.php:939
4727
  msgid ""
4728
  "NinjaFirewall has blocked an attempt to modify a user capability by someone "
4729
  "who does not have administrative privileges:"
4731
  "NinjaFirewall a bloqué une tentative de modification de certaines Capacités "
4732
  "par un utilisateur ne disposant pas de privilèges administratifs :"
4733
 
4734
+ #: lib/utils.php:966 lib/utils.php:1279
4735
+ msgid ""
4736
+ "This protection (and notification) can be turned off from NinjaFirewall "
4737
+ "\"Firewall Policies\" page."
4738
+ msgstr ""
4739
+ "Cette protection (et notification) peut être désactivée à partir de la page "
4740
+ "\"Politiques du Pare-feu\" de NinjaFirewall."
4741
+
4742
+ #: lib/utils.php:999
4743
  msgid ""
4744
  "NinjaFirewall brute-force protection is enabled and you are temporarily "
4745
  "whitelisted."
4747
  "La protection de NinjaFirewall contre les attaques par force brute est "
4748
  "activée. Vous êtes temporairement dans la liste blanche."
4749
 
4750
+ #: lib/utils.php:1014
4751
  #, php-format
4752
  msgid ""
4753
  "Hey, it seems that you've been using NinjaFirewall for some time. If you "
4760
  "a>. Il a fallu des milliers d'heures pour le développer, mais il suffit "
4761
  "seulement de quelques minutes pour le noter. Merci !"
4762
 
4763
+ #: lib/utils.php:1241
4764
  msgid ""
4765
  "The attempt was blocked and the option was reversed to its original value."
4766
  msgstr ""
4767
  "La tentative a été bloquée et l'option a été remise à sa valeur d'origine."
4768
 
4769
+ #: lib/utils.php:1246
4770
  msgid "Attempt to modify WordPress settings"
4771
  msgstr "Tentative de modification des paramètres de WordPress"
4772
 
4773
+ #: lib/utils.php:1247
4774
  msgid ""
4775
  "NinjaFirewall has blocked an attempt to modify some important WordPress "
4776
  "settings by a user that does not have administrative privileges:"
4779
  "importants de WordPress par un utilisateur ne disposant pas de privilèges "
4780
  "administratifs :"
4781
 
4782
+ #: lib/utils.php:1248 lib/utils.php:1257
4783
  #, php-format
4784
  msgid "Option: %s"
4785
  msgstr "Option: %s"
4786
 
4787
+ #: lib/utils.php:1249
4788
  #, php-format
4789
  msgid "Original value: %s"
4790
  msgstr "Valeur originale : %s"
4791
 
4792
+ #: lib/utils.php:1250
4793
  #, php-format
4794
  msgid "Modified value: %s"
4795
  msgstr "Valeur modifiée : %s"
4796
 
4797
+ #: lib/utils.php:1251 lib/utils.php:1259
4798
  #, php-format
4799
  msgid "Action taken: %s"
4800
  msgstr "Action prise : %s"
4801
 
4802
+ #: lib/utils.php:1255
4803
  msgid "Code injection attempt in WordPress options table"
4804
  msgstr "Tentative d'injection de code dans la table des options de WordPress"
4805
 
4806
+ #: lib/utils.php:1256
4807
  msgid ""
4808
  "NinjaFirewall has blocked an attempt to inject code in the WordPress options "
4809
  "table by a user that does not have administrative privileges:"
4812
  "options de WordPress par un utilisateur ne disposant pas de privilèges "
4813
  "administratifs :"
4814
 
4815
+ #: lib/utils.php:1258
4816
  #, php-format
4817
  msgid "Code: %s"
4818
  msgstr "Code : %s"
4819
 
4820
+ #: lib/utils.php:1314
 
 
 
 
 
 
 
 
4821
  #, php-format
4822
  msgid "Error, cannot create the %s folder."
4823
  msgstr "Erreur, impossible de créer le répertoire %s."
4824
 
4825
+ #: lib/utils.php:1314 lib/utils.php:1322 lib/utils.php:1330
4826
  msgid "Check your server permissions and try again."
4827
  msgstr "Vérifiez les autorisations de votre serveur et réessayez."
4828
 
4829
+ #: lib/utils.php:1322
4830
  #, php-format
4831
  msgid "Error, the %s folder is not writable."
4832
  msgstr "Erreur, le répertoire %s est en lecture seule."
4833
 
4834
+ #: lib/utils.php:1330
4835
  #, php-format
4836
  msgid "Error, cannot write %s."
4837
  msgstr "Erreur, impossible d'écrire dans %s."
5330
  "Impossible de récupérer les règles de l'utilisateur dans la base de données "
5331
  "(#4)"
5332
 
5333
+ #: ninjafirewall.php:110
5334
  msgid ""
5335
  "You do not have \"unfiltered_html\" capability. Please enable it in order to "
5336
  "run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
5341
  "la directive \"DISALLOW_UNFILTERED_HTML\" activée dans votre fichier wp-"
5342
  "config.php)."
5343
 
5344
+ #: ninjafirewall.php:117
5345
  #, php-format
5346
  msgid ""
5347
  "NinjaFirewall requires WordPress 3.3 or greater but your current version is "
5350
  "NinjaFirewall nécessite au moins WordPress 3.3 mais votre version de "
5351
  "WordPress est %s."
5352
 
5353
+ #: ninjafirewall.php:121
5354
  #, php-format
5355
  msgid ""
5356
  "NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
5357
  msgstr ""
5358
  "NinjaFirewall nécessite au moins PHP 5.3 mais votre version de PHP est %s."
5359
 
5360
+ #: ninjafirewall.php:125
5361
  #, php-format
5362
  msgid "NinjaFirewall requires the PHP %s extension."
5363
  msgstr "NinjaFirewall nécessite l'extension PHP %s."
5364
 
5365
+ #: ninjafirewall.php:129
5366
  msgid ""
5367
  "You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
5368
  "5.3.0 (see http://php.net/safe-mode)."
5371
  "devenue obsolète depuis PHP 5.3 et a été supprimée depuis PHP 5.4 (cf. "
5372
  "http://php.net/safe-mode)."
5373
 
5374
+ #: ninjafirewall.php:133
5375
  msgid "You are not allowed to activate NinjaFirewall."
5376
  msgstr "Vous n’êtes pas autorisé à activer NinjaFirewall."
5377
 
5378
+ #: ninjafirewall.php:137
5379
  msgid "NinjaFirewall is not compatible with Microsoft Windows."
5380
  msgstr "NinjaFirewall n'est pas compatible avec Microsoft Windows."
5381
 
5382
+ #: ninjafirewall.php:289
5383
  msgid ""
5384
  "All fields will be restored to their default values and any changes you made "
5385
  "will be lost. Continue?"
5387
  "Tous les champs vont être re-initialisés et vos changements seront perdus. "
5388
  "Continuer ?"
5389
 
5390
+ #: ninjafirewall.php:293
5391
  msgid "Missing security nonce, try to reload the page."
5392
  msgstr "La nonce de sécurité est manquante, essayer de recharger cette page."
5393
 
5394
+ #: ninjafirewall.php:295
5395
  msgid "Please select the HTTP server in the list."
5396
  msgstr "Sélectionnez votre serveur HTTP dans la list."
5397
 
5398
+ #: ninjafirewall.php:299
5399
  msgid ""
5400
  "This action will restore the selected configuration file and will override "
5401
  "all your current firewall options, policies and rules. Continue?"
5404
  "remplacera toutes les options, politiques et règles de pare-feu actuelles. "
5405
  "Continuer ?"
5406
 
5407
+ #: ninjafirewall.php:303
5408
  msgid ""
5409
  "Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
5410
  "hyphen [-] or an underscore [_] will be removed from the filename and "
5414
  "[.], un trait d'union[-] ou un caractère de soulignement[_], sera supprimé "
5415
  "du nom du fichier et remplacé par le caractère de substitution."
5416
 
5417
+ #: ninjafirewall.php:305
5418
  msgid ""
5419
  "Ensure that you can access your admin console over HTTPS before enabling "
5420
  "this option, otherwise you will lock yourself out of your site. Continue?"
5423
  "option, sinon vous risqueriez de ne plus pouvoir accéder à l'interface "
5424
  "d'administration. Continuer ?"
5425
 
5426
+ #: ninjafirewall.php:309
5427
  msgid "Delete the current snapshot ?"
5428
  msgstr "Supprimer l'instantané actuel ?"
5429
 
5430
+ #: ninjafirewall.php:313
5431
  msgid "Invalid character."
5432
  msgstr "Caractère invalide."
5433
 
5434
+ #: ninjafirewall.php:315
5435
  msgid "\"admin\" is not acceptable, please choose another user name."
5436
  msgstr ""
5437
  "\"admin\" n\\'est pas acceptable, merci de bien vouloir choisir un autre "
5438
  "identifiant."
5439
 
5440
+ #: ninjafirewall.php:317
5441
  msgid "Please enter max 1024 character only."
5442
  msgstr "Veuillez ne pas entrer plus de 1 024 caractères."
5443
 
5444
+ #: ninjafirewall.php:319
5445
  msgid "Select when to enable the login protection."
5446
  msgstr "Veuillez sélectionner quand activer la protection."
5447
 
5448
+ #: ninjafirewall.php:321
5449
  msgid "Enter a name and a password for the HTTP authentication."
5450
  msgstr ""
5451
  "Veuillez entrer un nom d'utilisateur et mot de passe pour l'authentification "
5452
  "HTTP."
5453
 
5454
+ #: ninjafirewall.php:325
5455
  msgid "Your public key is not valid."
5456
  msgstr "Votre clé publique n\\'est pas valide."
5457
 
5458
+ #: ninjafirewall.php:331
5459
  msgid "No traffic yet, please wait"
5460
  msgstr "Aucun visiteur actuellement, veuillez patienter"
5461
 
5462
+ #: ninjafirewall.php:333
5463
  msgid "seconds..."
5464
  msgstr "secondes..."
5465
 
5466
+ #: ninjafirewall.php:335
5467
  msgid "Error: Live Log did not receive the expected response from your server:"
5468
  msgstr "Erreur : le serveur distant n\\'a pas retourné la réponse attendue :"
5469
 
5470
+ #: ninjafirewall.php:337
5471
  msgid "Error: URL does not seem to exist (404 Not Found):"
5472
  msgstr "Erreur : l'URL ne semble pas exister (404 Not Found) :"
5473
 
5474
+ #: ninjafirewall.php:339
5475
  msgid "Error: Cannot find your log file. Try to reload this page."
5476
  msgstr ""
5477
  "Erreur : Impossible de trouver le fichier log. Essayez de recharger cette "
5478
  "page."
5479
 
5480
+ #: ninjafirewall.php:341
5481
  msgid "Error: The HTTP server returned the following error code:"
5482
  msgstr "Erreur : Le serveur HTTP a retourné le code d'erreur suivant :"
5483
 
5484
+ #: ninjafirewall.php:579 ninjafirewall.php:690
5485
  msgid "Error: Security nonces do not match. Reload the page and try again."
5486
  msgstr ""
5487
  "Erreur : Les nonces de sécurité ne correspondent pas. Veuillez recharger "
5496
  msgid "Error: missing parameter (%s)."
5497
  msgstr "Erreur : Paramètre manquant (%s)."
5498
 
5499
+ #: ninjafirewall.php:752
5500
  msgid "NinjaFirewall: Dashboard"
5501
  msgstr "NinjaFirewall : Tableau de Bord"
5502
 
5503
+ #: ninjafirewall.php:756
5504
  msgid "NinjaFirewall: Firewall Options"
5505
  msgstr "NinjaFirewall : Options du Pare-feu"
5506
 
5507
+ #: ninjafirewall.php:760
5508
  msgid "NinjaFirewall: Firewall Policies"
5509
  msgstr "NinjaFirewall : Politiques du Pare-feu"
5510
 
5511
+ #: ninjafirewall.php:764
5512
  msgid "NinjaFirewall: Monitoring"
5513
  msgstr "NinjaFirewall : Monitoring"
5514
 
5515
+ #: ninjafirewall.php:774
5516
  msgid "NinjaFirewall: Anti-Malware"
5517
  msgstr "NinjaFirewall : Anti-Malware"
5518
 
5519
+ #: ninjafirewall.php:778
5520
  msgid "NinjaFirewall: Network"
5521
  msgstr "NinjaFirewall : Réseau"
5522
 
5523
+ #: ninjafirewall.php:782
5524
  msgid "NinjaFirewall: Event Notifications"
5525
  msgstr "NinjaFirewall : Notifications d’Événement"
5526
 
5527
+ #: ninjafirewall.php:786
5528
  msgid "NinjaFirewall: Log-in Protection"
5529
  msgstr "NinjaFirewall : Page de Connexion"
5530
 
5531
+ #: ninjafirewall.php:790
5532
  msgid "NinjaFirewall: Logs"
5533
  msgstr "NinjaFirewall : Journaux"
5534
 
5535
+ #: ninjafirewall.php:794
5536
  msgid "NinjaFirewall: Security Rules"
5537
  msgstr "NinjaFirewall : Règles de Sécurité"
5538
 
5539
+ #: ninjafirewall.php:838
5540
  msgid "NinjaFirewall Settings"
5541
  msgstr "Réglages de NinjaFirewall"
5542
 
5543
+ #: ninjafirewall.php:846
5544
  msgid "NinjaFirewall is enabled"
5545
  msgstr "NinjaFirewall est activé"
5546
 
5547
+ #: ninjafirewall.php:986
5548
  msgid "Access Restricted"
5549
  msgstr "Accès limité"
5550
 
5551
+ #: ninjafirewall.php:992
5552
  msgid "Settings"
5553
  msgstr "Réglages"
5554
 
5555
+ #: ninjafirewall.php:993
5556
  msgid "Upgrade to Premium"
5557
  msgstr "Passez Premium !"
5558
 
5559
+ #: ninjafirewall.php:994
5560
  msgid "Rate it!"
5561
  msgstr "Notez-le !"
5562
 
5563
+ #~ msgid ""
5564
+ #~ "Don't leave your blog at risk and make sure to update as soon as possible."
5565
+ #~ msgstr ""
5566
+ #~ "Ne laissez pas votre blog en danger, lancez cette mise à jour dès que "
5567
+ #~ "possible."
5568
+
5569
+ #~ msgid "-Blog: %s"
5570
+ #~ msgstr "-Blog : %s"
5571
+
5572
+ #~ msgid "-Plugin: %s"
5573
+ #~ msgstr "-Extension : %s"
5574
+
5575
+ #~ msgid "-Theme: %s"
5576
+ #~ msgstr "-Theme : %s"
5577
+
5578
+ #~ msgid "Force SSL for admin and logins"
5579
+ #~ msgstr "Forcer la connexion sécurisée au Tableau de bord"
5580
+
5581
+ #~ msgid "Error code and message to return"
5582
+ #~ msgstr "Code HTTP et Message à retourner"
5583
+
5584
+ #~ msgid "Force SSL for admin and logins <code>FORCE_SSL_ADMIN</code>"
5585
+ #~ msgstr ""
5586
+ #~ "Forcer la connexion sécurisée au Tableau de bord <code>FORCE_SSL_ADMIN</"
5587
+ #~ "code>"
5588
+
5589
+ #~ msgid "Need more security? Get Premium!"
5590
+ #~ msgstr "Besoin de plus de sécurité ? Découvrez NinjaFirewall WP+ Edition !"
5591
+
5592
+ #~ msgid ""
5593
+ #~ "Scan : if anything suspicious is detected, NinjaFirewall will block the "
5594
+ #~ "request and return an HTTP error code and message (defined in the "
5595
+ #~ "\"Firewall Options\" page). The user request will fail and the connection "
5596
+ #~ "will be closed immediately."
5597
+ #~ msgstr ""
5598
+ #~ "Filtrer : lorsqu'il détecte une requête dangereuse, NinjaFirewall la "
5599
+ #~ "bloque et retourne un message et code d'erreur HTTP (définis dans la page "
5600
+ #~ "\"Options du Pare-feu\"). La requête ne pourra pas aboutir et la "
5601
+ #~ "connexion sera fermée immédiatement."
5602
+
5603
+ #~ msgid ""
5604
+ #~ "Sanitise : this option will not block but sanitise the user request by "
5605
+ #~ "escaping characters that can be used to exploit vulnerabilities (%s) and "
5606
+ #~ "replacing <code>&lt;</code> and <code>&gt;</code> with their "
5607
+ #~ "corresponding HTML entities (<code>&amp;lt;</code>, <code>&amp;gt;</"
5608
+ #~ "code>). If it is a variable, i.e. <code>?name=value</code>, both its name "
5609
+ #~ "and value will be sanitised."
5610
+ #~ msgstr ""
5611
+ #~ "Nettoyer : cette action ne bloque pas la requête mais l'analyse afin d'y "
5612
+ #~ "trouver des caractères pouvant être dangereux, par exemple pour injecter "
5613
+ #~ "du code dans la base de données (%s) et, le cas échéant, nettoie cette "
5614
+ #~ "requête en y insérant des caractères d'échappement ou, dans le cas des "
5615
+ #~ "caractères <code>&lt;</code> et <code>&gt;</code>, en les remplaçant par "
5616
+ #~ "leurs entités HTML correspondantes. S'il s'agit d'une variable et de sa "
5617
+ #~ "valeur (<code>?variable=valeur</code>), les deux éléments seront nettoyés."
5618
+
5619
+ #~ msgid "File Uploads:"
5620
+ #~ msgstr "Autoriser les téléchargements&nbsp;:"
5621
+
5622
+ #~ msgid "whether to allow/disallow file uploads."
5623
+ #~ msgstr ""
5624
+ #~ "vous pouvez autoriser ou interdire tout téléchargement de fichiers vers "
5625
+ #~ "votre site."
5626
+
5627
+ #~ msgid "Sanitise filenames:"
5628
+ #~ msgstr "Nettoyer le nom des fichiers&nbsp;:"
5629
+
5630
+ #~ msgid ""
5631
+ #~ "any character that is not a letter <code>a-zA-Z</code>, a digit "
5632
+ #~ "<code>0-9</code>, a dot <code>.</code>, a hyphen <code>-</code> or an "
5633
+ #~ "underscore <code>_</code> will be removed from the filename and replaced "
5634
+ #~ "with the substitution character."
5635
+ #~ msgstr ""
5636
+ #~ "si le nom du fichier contient un caractère qui n'est pas une lettre "
5637
+ #~ "<code>a-zA-Z</code>, un chiffre <code>0-9</code>, un point <code>.</"
5638
+ #~ "code>, un trait d'union <code>-</code> ou un caractère de soulignement "
5639
+ #~ "<code>_</code>, celui-si sera remplacé par le caractère de substitution."
5640
+
5641
+ #~ msgid ""
5642
+ #~ "enabling this policy will block any attempt (e.g., exploiting a "
5643
+ #~ "vulnerability, using a backdoor etc) to modify some important WordPress "
5644
+ #~ "settings. This policy will also send you an alert by email with all "
5645
+ #~ "details regarding the issue. It is enabled by default."
5646
+ #~ msgstr ""
5647
+ #~ "l'activation de cette politique bloquera toute tentative (par exemple, "
5648
+ #~ "l'exploitation d'une vulnérabilité, l'utilisation d'une porte dérobée, "
5649
+ #~ "etc) de modifier certains paramètres WordPress importants. Cette "
5650
+ #~ "politique vous enverra également une alerte par e-mail avec tous les "
5651
+ #~ "détails concernant le problème. Elle est activée par défaut."
5652
+
5653
+ #~ msgid ""
5654
+ #~ "enabling this policy will block any attempt (e.g., exploiting a "
5655
+ #~ "vulnerability, using a backdoor etc) to create a user account. If you "
5656
+ #~ "allow user registration, you should not enable it."
5657
+ #~ msgstr ""
5658
+ #~ "l'activation de cette politique bloquera toute tentative (par exemple, "
5659
+ #~ "l'exploitation d'une vulnérabilité, l'utilisation d'une porte dérobée, "
5660
+ #~ "etc) de création d'un compte d'utilisateur. Si vous autorisez "
5661
+ #~ "l'inscription des utilisateurs, vous ne devez pas l'activer."
5662
+
5663
+ #~ msgid ""
5664
+ #~ "this policy will block vulnerabilities that could be leveraged by "
5665
+ #~ "attackers to gain administrative privileges."
5666
+ #~ msgstr ""
5667
+ #~ "cette politique bloquera les vulnérabilités qui pourraient être "
5668
+ #~ "exploitées pour obtenir des privilèges administratifs."
5669
+
5670
+ #~ msgid ""
5671
+ #~ "many vulnerabilities in plugins are exploited via the admin-ajax.php "
5672
+ #~ "script. This policy will try to detect and immediately block bots and "
5673
+ #~ "malicious scanners trying to access it. The server IP address (%s) and "
5674
+ #~ "private IP addresses will not be blocked."
5675
+ #~ msgstr ""
5676
+ #~ "de nombreuses vulnérabilités dans les extensions WordPress sont "
5677
+ #~ "exploitées via le script admin-ajax.php. Cette politique essaiera de "
5678
+ #~ "détecter et de bloquer immédiatement les robots et les scanners "
5679
+ #~ "malveillants qui tentent d’y accéder. L'adresse IP du serveur (%s) et les "
5680
+ #~ "adresses IP privées ne seront pas bloquées."
5681
+
5682
+ #~ msgid "Protect against username enumeration:"
5683
+ #~ msgstr "Protéger contre l'énumération des comptes utilisateurs&nbsp;:"
5684
+
5685
+ #~ msgid ""
5686
+ #~ "it is possible to enumerate usernames either through the WordPress author "
5687
+ #~ "archives, the REST API or the login page. Although this is not a "
5688
+ #~ "vulnerability but a WordPress feature, some hackers use it to retrieve "
5689
+ #~ "usernames in order to launch more accurate brute-force attacks. If it is "
5690
+ #~ "a failed login attempt, NinjaFirewall will sanitise the error message "
5691
+ #~ "returned by WordPress. If it is an author archives scan, it will "
5692
+ #~ "invalidate it and redirect the user to the blog index page. Regarding the "
5693
+ #~ "WP REST API, it will block the request immediately."
5694
+ #~ msgstr ""
5695
+ #~ "il est possible d'énumérer les noms des utilisateurs de votre blog via "
5696
+ #~ "l'API REST, la page d'archive d'un auteur ou la page de connexion au "
5697
+ #~ "Tableau de bord. Bien que ce ne soit pas une vulnérabilité, mais une "
5698
+ #~ "caractéristique de WordPress, certains hackers utilisent ces astuces pour "
5699
+ #~ "récupérer les noms d'utilisateur afin de lancer des attaques par force "
5700
+ #~ "brute plus précises."
5701
+
5702
+ #~ msgid "WordPress REST API:"
5703
+ #~ msgstr "API REST de WordPress :"
5704
+
5705
+ #~ msgid ""
5706
+ #~ "it allows you to access your WordPress site's data through an easy-to-use "
5707
+ #~ "HTTP REST API. Since WordPress 4.7, it is enabled by default. "
5708
+ #~ "NinjaFirewall allows you to block any access to that API if you do not "
5709
+ #~ "intend to use it."
5710
+ #~ msgstr ""
5711
+ #~ "elle vous permet d'accéder aux données de votre blog via l'API HTTP REST. "
5712
+ #~ "Depuis WordPress 4.7, cette elle est activée par défaut. NinjaFirewall "
5713
+ #~ "vous permet de bloquer tout accès a cette API si vous ne l'utilisez pas."
5714
+
5715
+ #~ msgid "WordPress XML-RPC API:"
5716
+ #~ msgstr "API XML-RPC de WordPress :"
5717
+
5718
+ #~ msgid ""
5719
+ #~ "Block <code>POST</code> requests in the themes folder <code>/wp-content/"
5720
+ #~ "themes</code>:"
5721
+ #~ msgstr ""
5722
+ #~ "Bloquer les requêtes <code>POST</code> dans le dossier des thèmes <code>/"
5723
+ #~ "wp-content/themes</code>&nbsp;:"
5724
+
5725
+ #~ msgid ""
5726
+ #~ "this option can be useful to block hackers from installing backdoor in "
5727
+ #~ "the PHP theme files. However, because some custom themes may include an "
5728
+ #~ "HTML form (contact, search form etc), this option is not enabled by "
5729
+ #~ "default."
5730
+ #~ msgstr ""
5731
+ #~ "cette option peut être utile afin de bloquer l'exploitation de "
5732
+ #~ "vulnérabilités dans les fichiers PHP de vos thèmes. Toutefois, parce que "
5733
+ #~ "certains thèmes personnalisés peuvent inclure un formulaire HTML "
5734
+ #~ "(formulaire de recherche ou de contact etc) nécessitant des requêtes "
5735
+ #~ "<code>POST</code> , cette option n'est pas activée par défaut."
5736
+
5737
+ #~ msgid "Force SSL for admin and logins <code>FORCE_SSL_ADMIN</code>:"
5738
+ #~ msgstr ""
5739
+ #~ "Forcer la connexion sécurisée au Tableau de bord <code>FORCE_SSL_ADMIN</"
5740
+ #~ "code>&nbsp;:"
5741
+
5742
+ #~ msgid ""
5743
+ #~ "enable this option when you want to secure logins and the admin area so "
5744
+ #~ "that both passwords and cookies are never sent in the clear. Ensure that "
5745
+ #~ "you can access your admin console from HTTPS before enabling this option, "
5746
+ #~ "otherwise you will lock yourself out of your site!"
5747
+ #~ msgstr ""
5748
+ #~ "activez cette option lorsque vous souhaitez sécuriser les connexions à "
5749
+ #~ "votre Tableau de bord. Assurez-vous que vous pouvez accéder à votre page "
5750
+ #~ "de connexion via HTTPS avant d'activer cette option, sinon vous risquez "
5751
+ #~ "de bloquer l’accès à votre site&nbsp;!"
5752
+
5753
+ #~ msgid "Disable the plugin and theme editor <code>DISALLOW_FILE_EDIT</code>:"
5754
+ #~ msgstr ""
5755
+ #~ "Désactiver l’éditeur de thème et d'extension <code>DISALLOW_FILE_EDIT</"
5756
+ #~ "code>&nbsp;:"
5757
+
5758
+ #~ msgid ""
5759
+ #~ "disabling the plugin and theme editor provides an additional layer of "
5760
+ #~ "security if a hacker gains access to a well-privileged user account."
5761
+ #~ msgstr ""
5762
+ #~ "désactiver l’éditeur de thème et d'extension fournit une couche de "
5763
+ #~ "sécurité supplémentaire. Si un pirate accédait a votre compte "
5764
+ #~ "administrateur, il ne pourrait pas l'utiliser pour insérer une porte "
5765
+ #~ "dérobée dans l'un de vos scripts PHP."
5766
+
5767
+ #~ msgid ""
5768
+ #~ "Disable plugin and theme update/installation <code>DISALLOW_FILE_MODS</"
5769
+ #~ "code>:"
5770
+ #~ msgstr ""
5771
+ #~ "Désactiver l'installation et mise à jour des thèmes et extensions "
5772
+ #~ "<code>DISALLOW_FILE_MODS</code>&nbsp;:"
5773
+
5774
+ #~ msgid ""
5775
+ #~ "this option will block users being able to use the plugin and theme "
5776
+ #~ "installation/update functionality from the WordPress admin area. Setting "
5777
+ #~ "this constant also disables the Plugin and Theme editor."
5778
+ #~ msgstr ""
5779
+ #~ "cette option permet de bloquer les utilisateurs voulant lancer une "
5780
+ #~ "installation ou mise à jour d'une extension ou d'un thème. Elle désactive "
5781
+ #~ "aussi l’éditeur de thème et d'extension."
5782
+
5783
+ #~ msgid ""
5784
+ #~ "Disable the fatal error handler <code>WP_DISABLE_FATAL_ERROR_HANDLER</"
5785
+ #~ "code>:"
5786
+ #~ msgstr ""
5787
+ #~ "Désactiver le gestionnaire d'erreurs fatales "
5788
+ #~ "<code>WP_DISABLE_FATAL_ERROR_HANDLER</code> :"
5789
+
5790
+ #~ msgid ""
5791
+ #~ "this option will disable the WSOD protection introduced in WordPress 5.1."
5792
+ #~ msgstr ""
5793
+ #~ "cette option désactivera la protection WSOD introduite dans WordPress 5.1."
5794
+
5795
+ #~ msgid "Decode Base64-encoded <code>POST</code> variable:"
5796
+ #~ msgstr ""
5797
+ #~ "Décoder les chaîne encodées en Base64 dans la variable <code>POST</"
5798
+ #~ "code>&nbsp;:"
5799
+
5800
+ #~ msgid "Block suspicious bots/scanners:"
5801
+ #~ msgstr "Bloquer les requêtes provenant de bots/scanners malveillants :"
5802
+
5803
+ #~ msgid ""
5804
+ #~ "rejects some known bots, scanners and various malicious scripts "
5805
+ #~ "attempting to access your blog."
5806
+ #~ msgstr ""
5807
+ #~ "cette option peut bloquer de nombreux crawlers, spambots et autres "
5808
+ #~ "scrappers."
5809
+
5810
+ #~ msgid ""
5811
+ #~ "Block POST requests that do not have an <code>HTTP_REFERER</code> header:"
5812
+ #~ msgstr ""
5813
+ #~ "Bloquer les requêtes POST qui n'ont pas d'en-tête <code>HTTP_REFERER</"
5814
+ #~ "code>&nbsp;:"
5815
+
5816
+ #~ msgid ""
5817
+ #~ "this option will block any <code>POST</code> request that does not have a "
5818
+ #~ "Referrer header (<code>HTTP_REFERER</code> variable). If you need "
5819
+ #~ "external applications to post to your scripts (e.g. Paypal IPN, WordPress "
5820
+ #~ "WP-Cron...), you are advised to keep this option disabled otherwise they "
5821
+ #~ "will likely be blocked. Note that <code>POST</code> requests are not "
5822
+ #~ "required to have a Referrer header and, for that reason, this option is "
5823
+ #~ "disabled by default."
5824
+ #~ msgstr ""
5825
+ #~ "cette option bloque toutes les requêtes POST qui n'incluent pas le "
5826
+ #~ "Referrer <code>HTTP_REFERER</code> (adresse de la page -si elle existe- "
5827
+ #~ "qui a conduit le client à la page courante). Puisque les requêtes POST ne "
5828
+ #~ "sont pas obligées d'avoir un Referrer, cette option n'est pas activée par "
5829
+ #~ "défaut. Si vous utilisez des scripts comme Paypal IPN, WordPress WP-Cron "
5830
+ #~ "etc, désactivez cette fonction."
5831
+
5832
+ #~ msgid "Block localhost IP in <code>GET/POST</code> requests:"
5833
+ #~ msgstr ""
5834
+ #~ "Bloquer les requêtes <code>GET/POST</code> contenant l'IP localhost&nbsp;:"
5835
+
5836
+ #~ msgid "Block HTTP requests with an IP in the <code>HTTP_HOST</code> header:"
5837
+ #~ msgstr ""
5838
+ #~ "Bloquer les requêtes HTTP dont l'en-tête <code>HTTP_HOST</code> contient "
5839
+ #~ "une IP&nbsp;:"
5840
+
5841
+ #~ msgid ""
5842
+ #~ "this option will reject any request using an IP instead of a domain name "
5843
+ #~ "in the <code>Host</code> header of the HTTP request. Unless you need to "
5844
+ #~ "connect to your site using its IP address, (e.g. %s), enabling this "
5845
+ #~ "option will block a lot of hackers scanners because such applications "
5846
+ #~ "scan IPs rather than domain names."
5847
+ #~ msgstr ""
5848
+ #~ "cette option rejette toute requête HTTP contenant une adresse IP au lieu "
5849
+ #~ "d'un nom de domaine dans son en-tête <code>Host</code>. Sauf si vous avez "
5850
+ #~ "besoin de vous connecter à votre site en utilisant son adresse IP (ex: "
5851
+ #~ "%s), activer cette option bloquera de nombreux scanners de vulnérabilité "
5852
+ #~ "car ces application trouvent les sites en scannant les plages d'adresses "
5853
+ #~ "IP plutôt que les noms de domaine. "
5854
+
5855
+ #~ msgid "Scan traffic coming from localhost and private IP address spaces:"
5856
+ #~ msgstr ""
5857
+ #~ "Filtrer les connexions provenant de localhost et d'adresses IP "
5858
+ #~ "privées&nbsp;:"
5859
+
5860
+ #~ msgid ""
5861
+ #~ "Set <code>X-Content-Type-Options</code> to protect against MIME type "
5862
+ #~ "confusion attacks:"
5863
+ #~ msgstr ""
5864
+ #~ "Activer <code>X-Content-Type-Options</code> pour protéger contre les "
5865
+ #~ "attaques basées sur la confusion du type MIME&nbsp;:"
5866
+
5867
+ #~ msgid ""
5868
+ #~ "this header will send the nosniff value to instruct the browser to "
5869
+ #~ "disable content or MIME sniffing and to use the content-type returned by "
5870
+ #~ "the server. Some browsers try to guess (sniff) and override the content-"
5871
+ #~ "type by looking at the content itself which, in some cases, could lead to "
5872
+ #~ "security issues such as MIME Confusion Attacks."
5873
+ #~ msgstr ""
5874
+ #~ "cet en-tête enverra la valeur \"nosniff\" pour indiquer au navigateur de "
5875
+ #~ "désactiver le reniflage de contenu ou type MIME et d'utiliser le type "
5876
+ #~ "retourné par le serveur. Certains navigateurs tentent de deviner (sniff) "
5877
+ #~ "et de contourner le type de contenu en regardant le contenu lui-même ce "
5878
+ #~ "qui, dans certains cas, peut entraîner des problèmes de sécurité tels que "
5879
+ #~ "les attaques basées sur la confusion du type MIME."
5880
+
5881
+ #~ msgid ""
5882
+ #~ "Set <code>X-Frame-Options</code> to protect against clickjacking attempts:"
5883
+ #~ msgstr ""
5884
+ #~ "Activer <code>X-Frame-Options</code> pour protéger contre les attaques de "
5885
+ #~ "détournement de clic (clickjacking)&nbsp;:"
5886
+
5887
+ #~ msgid ""
5888
+ #~ "this header indicates a policy whether a browser must not allow to render "
5889
+ #~ "a page in a &lt;frame&gt; or &lt;iframe&gt;. Hosts can declare this "
5890
+ #~ "policy in the header of their HTTP responses to prevent clickjacking "
5891
+ #~ "attacks, by ensuring that their content is not embedded into other pages "
5892
+ #~ "or frames. NinjaFirewall accepts two different values:"
5893
+ #~ msgstr ""
5894
+ #~ "cet en-tête informe le navigateur s'il doit autoriser ou non l'affichage "
5895
+ #~ "d'une page dans une &lt;frame&gt; ou &lt;iframe&gt;. Cela permet "
5896
+ #~ "d'empêcher les attaques de clickjacking, en veillant à ce que le contenu "
5897
+ #~ "d'une page ne sont pas intégré dans d'autres pages ou cadres, notamment "
5898
+ #~ "d'un autre site. NinjaFirewall accepte deux valeurs différentes&nbsp;:"
5899
+
5900
+ #~ msgid ""
5901
+ #~ "a browser receiving content with this header must not display this "
5902
+ #~ "content in any frame from a page of different origin than the content "
5903
+ #~ "itself."
5904
+ #~ msgstr ""
5905
+ #~ "un navigateur ne doit pas afficher le contenu dans une &lt;frame&gt; ou "
5906
+ #~ "&lt;iframe&gt; d'une page d'origine différente que le contenu lui-même."
5907
+
5908
+ #~ msgid ""
5909
+ #~ "a browser receiving content with this header must not display this "
5910
+ #~ "content in any frame."
5911
+ #~ msgstr ""
5912
+ #~ "un navigateur ne doit jamais afficher le contenu dans une &lt;frame&gt; "
5913
+ #~ "ou &lt;iframe&gt;"
5914
+
5915
+ #~ msgid ""
5916
+ #~ "Set <code>X-XSS-Protection</code> (IE/Edge, Chrome, Opera and Safari "
5917
+ #~ "browsers):"
5918
+ #~ msgstr ""
5919
+ #~ "Activer <code>X-XSS-Protection</code> (IE/Edge, Opera, Chrome et Safari)"
5920
+
5921
+ #~ msgid ""
5922
+ #~ "this header allows browsers to identify and block XSS attacks by "
5923
+ #~ "preventing malicious scripts from executing. It is enabled by default on "
5924
+ #~ "all compatible browsers."
5925
+ #~ msgstr ""
5926
+ #~ "cet en-tête permet aux navigateurs compatibles d'identifier et bloquer "
5927
+ #~ "les attaques XSS en empêchant un script malveillant de s'exécuter. Notez "
5928
+ #~ "que cette option est activée par défaut sur ces navigateurs."
5929
+
5930
+ #~ msgid ""
5931
+ #~ "Force <code>SameSite</code> flag on all cookies to mitigate CSRF attacks:"
5932
+ #~ msgstr ""
5933
+ #~ "Activer la propriété <code>SameSite</code> pour tous les cookies afin "
5934
+ #~ "d'atténuer les attaques CSRF :"
5935
+
5936
+ #~ msgid ""
5937
+ #~ "adding this flag to cookies helps to mitigate the risk of CSRF (cross-"
5938
+ #~ "site request forgery) attacks because cookies can only be sent in "
5939
+ #~ "requests originating from the same origin as the target domain."
5940
+ #~ msgstr ""
5941
+ #~ "cette protection permet de diminuer les risques d'attaques CSRF "
5942
+ #~ "(injection de requête illégitime par rebond), car les cookies ne peuvent "
5943
+ #~ "être envoyés que dans des requêtes provenant de la même origine que le "
5944
+ #~ "domaine cible."
5945
+
5946
+ #~ msgid ""
5947
+ #~ "Force <code>HttpOnly</code> flag on all cookies to mitigate XSS attacks:"
5948
+ #~ msgstr ""
5949
+ #~ "Activer la propriété <code>HttpOnly</code> pour tous les cookies afin "
5950
+ #~ "d'atténuer les menaces XSS qui génèrent des vols de cookies&nbsp;:"
5951
+
5952
+ #~ msgid ""
5953
+ #~ "adding this flag to cookies helps to mitigate the risk of cross-site "
5954
+ #~ "scripting by preventing them from being accessed through client-side "
5955
+ #~ "scripts. NinjaFirewall can hook all cookies sent by your blog, its "
5956
+ #~ "plugins or any other PHP script, add the <code>HttpOnly</code> flag if it "
5957
+ #~ "is missing, and re-inject those cookies back into your server HTTP "
5958
+ #~ "response headers right before they are sent to your visitors. Note that "
5959
+ #~ "WordPress sets that flag on the logged in user cookies only."
5960
+ #~ msgstr ""
5961
+ #~ "cette protection permet de diminuer les risques d'attaques XSS en "
5962
+ #~ "empêchant JavaScript d'accéder aux cookies de l'utilisateur. "
5963
+ #~ "NinjaFirewall peut intercepter les cookies envoyés par vos scripts PHP, "
5964
+ #~ "activer la propriété <code>HttpOnly</code> si elle est manquante, puis "
5965
+ #~ "réinjecter les cookies dans la réponse HTTP juste avant que celle-ci ne "
5966
+ #~ "soit envoyée à vos visiteurs."
5967
+
5968
+ #~ msgid ""
5969
+ #~ "Set <code>Strict-Transport-Security</code> (HSTS) to enforce secure "
5970
+ #~ "connections to the server:"
5971
+ #~ msgstr ""
5972
+ #~ "Activer <code>Strict-Transport-Security</code> (HSTS) pour forcer les "
5973
+ #~ "connexions sécurisées vers le serveur&nbsp;"
5974
+
5975
+ #~ msgid ""
5976
+ #~ "this policy enforces secure HTTPS connections to the server. Web browsers "
5977
+ #~ "will not allow the user to access the web application over insecure HTTP "
5978
+ #~ "protocol. It helps to defend against cookie hijacking and Man-in-the-"
5979
+ #~ "middle attacks. Most recent browsers support HSTS headers."
5980
+ #~ msgstr ""
5981
+ #~ "cette politique force les connexions HTTPS sécurisées vers le serveur. "
5982
+ #~ "Les navigateurs n'accepteront pas de se connecter au site si la connexion "
5983
+ #~ "n'est pas sécurisée (HTTPS). Cela permet de se défendre contre les "
5984
+ #~ "détournements de cookies ou les attaques du type \"Man-in-the-middle\". "
5985
+ #~ "La plupart des navigateurs récents sont compatibles avec cette politique."
5986
+
5987
+ #~ msgid "Set <code>Content-Security-Policy</code>:"
5988
+ #~ msgstr "Activer <code>Content-Security-Policy</code> :"
5989
+
5990
+ #~ msgid ""
5991
+ #~ "this policy helps to mitigate threats such as XSS, phishing and "
5992
+ #~ "clickjacking attacks. It covers JavaScript, CSS, HTML frames, web "
5993
+ #~ "workers, fonts, images, objects (Java, ActiveX, audio and video files), "
5994
+ #~ "and other HTML5 features."
5995
+ #~ msgstr ""
5996
+ #~ "cette politique aide pour bloquer les attaques XSS notamment. Elle couvre "
5997
+ #~ "le code JavaScript, les styles CSS, frames/iframes HTML, polices, images, "
5998
+ #~ "objets (Java, ActiveX, fichiers audio et video), mais aussi les WebSocket."
5999
+
6000
+ #~ msgid "Set <code>Referrer-Policy</code>:"
6001
+ #~ msgstr "Activer <code>Referrer-Policy</code> :"
6002
+
6003
+ #~ msgid ""
6004
+ #~ "this HTTP header governs which referrer information, sent in the Referer "
6005
+ #~ "header, should be included with requests made."
6006
+ #~ msgstr ""
6007
+ #~ "cet en-tête HTTP détermine quelles informations de provenance doivent "
6008
+ #~ "être incluses dans l'en-tête Referer."
6009
+
6010
+ #~ msgid "Block PHP built-in wrappers:"
6011
+ #~ msgstr "Bloquer les gestionnaires (wrappers) PHP dangereux&nbsp;:"
6012
+
6013
+ #~ msgid "Block serialized PHP objects:"
6014
+ #~ msgstr "Bloquer les objets PHP sérialisés :"
6015
+
6016
+ #~ msgid "Hide PHP notice and error messages:"
6017
+ #~ msgstr "Masquer les messages d'erreur de PHP&nbsp;:"
6018
+
6019
+ #~ msgid ""
6020
+ #~ "this option lets you hide errors returned by your scripts. Such errors "
6021
+ #~ "can leak sensitive informations which can be exploited by hackers."
6022
+ #~ msgstr ""
6023
+ #~ "vous permet de masquer les erreurs retournées par PHP. Ces erreurs "
6024
+ #~ "peuvent afficher des informations sensibles qui peuvent être exploitées "
6025
+ #~ "ultérieurement par des pirates."
6026
+
6027
+ #~ msgid ""
6028
+ #~ "Sanitise <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
6029
+ #~ "<code>PATH_INFO</code>:"
6030
+ #~ msgstr ""
6031
+ #~ "Nettoyer <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
6032
+ #~ "<code>PATH_INFO</code>&nbsp;:"
6033
+
6034
+ #~ msgid ""
6035
+ #~ "this option can sanitise any dangerous characters found in those 3 server "
6036
+ #~ "variables to prevent various XSS and database injection attempts."
6037
+ #~ msgstr ""
6038
+ #~ "activez ces options si vous souhaitez que le pare-feu nettoie ces trois "
6039
+ #~ "variables."
6040
+
6041
+ #~ msgid ""
6042
+ #~ "Block the <code>DOCUMENT_ROOT</code> server variable (%s) in HTTP "
6043
+ #~ "requests:"
6044
+ #~ msgstr ""
6045
+ #~ "Bloquer les requêtes HTTP contenant la variable <code>DOCUMENT_ROOT</"
6046
+ #~ "code> (%s)&nbsp;:"
6047
+
6048
+ #~ msgid ""
6049
+ #~ "this option will block scripts attempting to pass the "
6050
+ #~ "<code>DOCUMENT_ROOT</code> server variable in a <code>GET</code> or "
6051
+ #~ "<code>POST</code> request. Hackers use shell scripts that often need to "
6052
+ #~ "pass this value, but most legitimate programs do not."
6053
+ #~ msgstr ""
6054
+ #~ "cette option bloque toute tentative de passer la variable "
6055
+ #~ "<code>DOCUMENT_ROOT</code> dans une requête <code>GET</code> ou "
6056
+ #~ "<code>POST</code>. Les pirates utilisent souvent des scripts qui "
6057
+ #~ "nécessitent d'utiliser cette variable, mais pas la plupart des "
6058
+ #~ "applications légitimes (hormis certains scripts d'installation ou de "
6059
+ #~ "configuration)."
6060
+
6061
+ #~ msgid "Block ASCII character 0x00 (NULL byte):"
6062
+ #~ msgstr "Bloquer le caractère ASCII 0x00 (NULL byte)&nbsp;:"
6063
+
6064
+ #~ msgid ""
6065
+ #~ "this option will reject any <code>GET</code> or <code>POST</code> "
6066
+ #~ "request, <code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, "
6067
+ #~ "<code>PHP_SELF</code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> "
6068
+ #~ "variables containing the ASCII character 0x00 (NULL byte). Such a "
6069
+ #~ "character is dangerous and should always be rejected."
6070
+ #~ msgstr ""
6071
+ #~ "toute requête <code>GET</code> ou <code>POST</code>, ainsi que toute "
6072
+ #~ "variable <code>HTTP_REFERER</code>, <code>HTTP_USER_AGENT</code>, "
6073
+ #~ "<code>REQUEST_URI</code>, <code>PHP_SELF</code>, <code>PATH_INFO</code> "
6074
+ #~ "contenant le caractère ASCI 0x00 (NULL byte) sera bloquée immédiatement. "
6075
+ #~ "Ce caractère est dangereux et devrait toujours être rejeté."
6076
+
6077
+ #~ msgid "Block ASCII control characters 1 to 8 and 14 to 31:"
6078
+ #~ msgstr "Bloquer les caractères de contrôle ASCII 1 à 8 et 14 à 31&nbsp;:"
6079
+
6080
+ #~ msgid ""
6081
+ #~ "this option will reject any <code>GET</code> or <code>POST</code> "
6082
+ #~ "request, <code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> "
6083
+ #~ "variables containing ASCII characters from 1 to 8 and 14 to 31."
6084
+ #~ msgstr ""
6085
+ #~ "toute requête <code>GET</code> ou <code>POST</code>, ainsi que toute "
6086
+ #~ "variable <code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> "
6087
+ #~ "contenant des caractères ASCII 1 à 8 et 14 à 31 sera bloquée."
6088
+
6089
+ #~ msgid ""
6090
+ #~ "By default, any logged in WordPress administrator will not be blocked by "
6091
+ #~ "NinjaFirewall. You can also add any logged in users to the whitelist "
6092
+ #~ "(make sure you trust them all before doing so).<br />This feature applies "
6093
+ #~ "to all Firewall Policies listed below, except <code>FORCE_SSL_ADMIN</"
6094
+ #~ "code>, <code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> "
6095
+ #~ "options and the <a href=\"%s\">Login Protection</a> which, if enabled, "
6096
+ #~ "are always enforced."
6097
+ #~ msgstr ""
6098
+ #~ "Par défaut, tout administrateur connecté à WordPress ne sera pas bloqué "
6099
+ #~ "par NinjaFirewall. Vous pouvez aussi ajouter à la liste blanche tous les "
6100
+ #~ "autres utilisateurs connectés (avant de le faire, assurez-vous que ce "
6101
+ #~ "sont tous des utilisateurs de confiance).<br />Cela vaut pour toutes les "
6102
+ #~ "politiques de pare-feu énumérées ci-dessous, à l'exception de "
6103
+ #~ "<code>FORCE_SSL_ADMIN</code>, <code>DISALLOW_FILE_EDIT</code>, "
6104
+ #~ "<code>DISALLOW_FILE_MODS</code> et les options de la <a href=\"%s\">Page "
6105
+ #~ "de Connexion</a> qui, si elle sont activées, seront toujours appliquées."
6106
+
6107
+ #~ msgid "Credits"
6108
+ #~ msgstr "Crédits"
6109
+
6110
+ #~ msgid ""
6111
+ #~ "NinjaFirewall security rules protect against many vulnerabilities. Some "
6112
+ #~ "of them were reported by the following companies, individuals or mailing "
6113
+ #~ "lists:"
6114
+ #~ msgstr ""
6115
+ #~ "Les règles de sécurité de NinjaFirewall protègent contre de nombreuses "
6116
+ #~ "vulnérabilités. Certaines d'entre elles ont été découvertes par les "
6117
+ #~ "entreprises, particuliers ou listes de diffusion suivantes:"
6118
+
6119
+ #~ msgid "A user attempts to gain administrative privileges (default)"
6120
+ #~ msgstr ""
6121
+ #~ "Un utilisateur a essayé d'élever ses privilèges pour devenir "
6122
+ #~ "administrateur du blog (défaut)"
6123
+
6124
+ #~ msgid ""
6125
+ #~ "Error: Your version of NinjaFirewall is too old and is not compatible "
6126
+ #~ "with those rules. Please upgrade it."
6127
+ #~ msgstr ""
6128
+ #~ "Erreur : Votre version de NinjaFirewall est trop ancienne et n'est pas "
6129
+ #~ "compatible avec ces règles de sécurité. Mettez à jour NinjaFirewall."
6130
+
6131
+ #~ msgid ""
6132
+ #~ "This notification can be turned off from NinjaFirewall \"Rules Update\" "
6133
+ #~ "page."
6134
+ #~ msgstr ""
6135
+ #~ "Cette notification peut être désactivée depuis la page \"Mise à Jour des "
6136
+ #~ "Règles\" de NinjaFirewall."
6137
+
6138
+ #~ msgid "Name"
6139
+ #~ msgstr "Nom"
6140
+
6141
+ #~ msgid "upgraded"
6142
+ #~ msgstr "mis(e) à jour"
6143
+
6144
+ #~ msgid "[NinjaFirewall] Alert:"
6145
+ #~ msgstr "[NinjaFirewall] Alerte :"
6146
+
6147
  #~ msgid "About"
6148
  #~ msgstr "À Propos"
6149
 
languages/ninjafirewall.pot CHANGED
@@ -2,7 +2,7 @@
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: Stable (latest release)\n"
5
- "POT-Creation-Date: 2019-09-20 17:35+0700\n"
6
  "PO-Revision-Date: 2018-04-05 22:52+0700\n"
7
  "Last-Translator: NinTechNet <contact@nintechnet.com>\n"
8
  "Language-Team: \n"
@@ -18,7 +18,7 @@ msgstr ""
18
  "X-Poedit-SearchPath-0: .\n"
19
  "X-Poedit-SearchPathExcluded-0: /languages\n"
20
 
21
- #: lib/anti_malware.php:24 ninjafirewall.php:756
22
  msgid "Anti-Malware"
23
  msgstr ""
24
 
@@ -76,7 +76,7 @@ msgstr ""
76
  msgid "NinjaFirewall (WP Edition)"
77
  msgstr ""
78
 
79
- #: lib/dashboard.php:120 ninjafirewall.php:734
80
  msgid "Dashboard"
81
  msgstr ""
82
 
@@ -88,124 +88,146 @@ msgstr ""
88
  msgid "About..."
89
  msgstr ""
90
 
91
- #: lib/dashboard.php:130 lib/help.php:36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  msgid "Firewall Dashboard"
93
  msgstr ""
94
 
95
- #: lib/dashboard.php:139
96
  msgid ""
97
  "It seems that you may have another instance of NinjaFirewall running in a "
98
  "parent directory. Make sure to follow these instructions:"
99
  msgstr ""
100
 
101
- #: lib/dashboard.php:141
102
  msgid ""
103
  "Temporarily disable the firewall in the parent folder by renaming its PHP "
104
  "INI or .htaccess file."
105
  msgstr ""
106
 
107
- #: lib/dashboard.php:143
108
  msgid "Install NinjaFirewall on this site in Full WAF mode."
109
  msgstr ""
110
 
111
- #: lib/dashboard.php:145
112
  msgid ""
113
  "Restore the PHP INI or .htaccess in the parent folder to re-enable the "
114
  "firewall."
115
  msgstr ""
116
 
117
- #: lib/dashboard.php:151
118
  msgid "Unknown error"
119
  msgstr ""
120
 
121
- #: lib/dashboard.php:155 lib/dashboard.php:163
122
  msgid "Firewall"
123
  msgstr ""
124
 
125
- #: lib/dashboard.php:164 lib/dashboard.php:300 lib/firewall_options.php:64
126
  #: lib/login_protection.php:203 lib/logs_live_log.php:101
127
- #: lib/monitoring_file_guard.php:70 lib/security_rules_update.php:137
128
  msgid "Enabled"
129
  msgstr ""
130
 
131
- #: lib/dashboard.php:171
132
  msgid "Mode"
133
  msgstr ""
134
 
135
- #: lib/dashboard.php:176 lib/dashboard.php:182
136
  #, php-format
137
  msgid "NinjaFirewall is running in %s mode."
138
  msgstr ""
139
 
140
- #: lib/dashboard.php:176
141
  msgid "WordPress WAF"
142
  msgstr ""
143
 
144
- #: lib/dashboard.php:178
145
  #, php-format
146
  msgid ""
147
  "For better protection, <a %s>click here</a> to enable its Full WAF mode."
148
  msgstr ""
149
 
150
- #: lib/dashboard.php:178
151
  msgid "Click to install NinjaFirewall in Full WAF mode."
152
  msgstr ""
153
 
154
- #: lib/dashboard.php:182
155
  msgid "Full WAF"
156
  msgstr ""
157
 
158
- #: lib/dashboard.php:195 lib/firewall_options.php:76 lib/help.php:77
159
  msgid "Debugging mode"
160
  msgstr ""
161
 
162
- #: lib/dashboard.php:196
163
  msgid "Enabled."
164
  msgstr ""
165
 
166
- #: lib/dashboard.php:196
167
  msgid "Click here to turn Debugging Mode off"
168
  msgstr ""
169
 
170
- #: lib/dashboard.php:202
171
  msgid "Edition"
172
  msgstr ""
173
 
174
- #: lib/dashboard.php:203
175
- msgid "Need more security? Get Premium!"
 
 
176
  msgstr ""
177
 
178
- #: lib/dashboard.php:206 lib/utils.php:724
179
  msgid "Version"
180
  msgstr ""
181
 
182
- #: lib/dashboard.php:207
183
  msgid "Security rules:"
184
  msgstr ""
185
 
186
- #: lib/dashboard.php:211
187
  msgid "PHP SAPI"
188
  msgstr ""
189
 
190
- #: lib/dashboard.php:229
191
  msgid "Updates"
192
  msgstr ""
193
 
194
- #: lib/dashboard.php:230
195
  msgid "Security rules updates are disabled."
196
  msgstr ""
197
 
198
- #: lib/dashboard.php:230
199
  msgid ""
200
  "If you want your blog to be protected against the latest threats, enable "
201
  "automatic security rules updates."
202
  msgstr ""
203
 
204
- #: lib/dashboard.php:238 lib/dashboard.php:246
205
  msgid "Admin user"
206
  msgstr ""
207
 
208
- #: lib/dashboard.php:239
209
  #, php-format
210
  msgid ""
211
  "You are not whitelisted. Ensure that the \"Do not block WordPress "
@@ -214,71 +236,71 @@ msgid ""
214
  "your administration dashboard."
215
  msgstr ""
216
 
217
- #: lib/dashboard.php:247
218
  msgid "You are whitelisted by the firewall."
219
  msgstr ""
220
 
221
- #: lib/dashboard.php:254
222
  msgid "Restrictions"
223
  msgstr ""
224
 
225
- #: lib/dashboard.php:255
226
  msgid "Access to NinjaFirewall is restricted to specific users."
227
  msgstr ""
228
 
229
- #: lib/dashboard.php:266
230
  msgid "User session"
231
  msgstr ""
232
 
233
- #: lib/dashboard.php:267
234
  msgid ""
235
  "It seems that the user session set by NinjaFirewall was not found by the "
236
  "firewall script."
237
  msgstr ""
238
 
239
- #: lib/dashboard.php:275
240
  #, php-format
241
  msgid ""
242
  "the public key is invalid. Please <a href=\"%s\">check your configuration</"
243
  "a>."
244
  msgstr ""
245
 
246
- #: lib/dashboard.php:279
247
  msgid "No IP address restriction."
248
  msgstr ""
249
 
250
- #: lib/dashboard.php:282
251
  #, php-format
252
  msgid "IP address %s is allowed to access NinjaFirewall's log on this server."
253
  msgstr ""
254
 
255
- #: lib/dashboard.php:285
256
  #, php-format
257
  msgid ""
258
  "the whitelisted IP is not valid. Please <a href=\"%s\">check your "
259
  "configuration</a>."
260
  msgstr ""
261
 
262
- #: lib/dashboard.php:290 lib/help.php:422 lib/logs_firewall_log.php:194
263
  #: lib/wpplus.php:170
264
  msgid "Centralized Logging"
265
  msgstr ""
266
 
267
- #: lib/dashboard.php:294
268
  #, php-format
269
  msgid "Error: %s"
270
  msgstr ""
271
 
272
- #: lib/dashboard.php:309
273
  msgid "Source IP"
274
  msgstr ""
275
 
276
- #: lib/dashboard.php:310
277
  #, php-format
278
  msgid "You have a private IP : %s"
279
  msgstr ""
280
 
281
- #: lib/dashboard.php:310
282
  #, php-format
283
  msgid ""
284
  "If your site is behind a reverse proxy or a load balancer, ensure that you "
@@ -286,11 +308,11 @@ msgid ""
286
  "otherwise use the NinjaFirewall %s configuration file."
287
  msgstr ""
288
 
289
- #: lib/dashboard.php:318 lib/dashboard.php:328
290
  msgid "CDN detection"
291
  msgstr ""
292
 
293
- #: lib/dashboard.php:319
294
  #, php-format
295
  msgid ""
296
  "%s detected: you seem to be using Cloudflare CDN services. Ensure that you "
@@ -298,7 +320,7 @@ msgid ""
298
  "otherwise use the NinjaFirewall %s configuration file."
299
  msgstr ""
300
 
301
- #: lib/dashboard.php:329
302
  #, php-format
303
  msgid ""
304
  "%s detected: you seem to be using Incapsula CDN services. Ensure that you "
@@ -306,28 +328,28 @@ msgid ""
306
  "otherwise use the NinjaFirewall %s configuration file."
307
  msgstr ""
308
 
309
- #: lib/dashboard.php:338 lib/dashboard.php:347
310
  msgid "Log dir"
311
  msgstr ""
312
 
313
- #: lib/dashboard.php:339 lib/dashboard.php:348
314
  #, php-format
315
  msgid "%s directory is not writable! Please chmod it to 0777 or equivalent."
316
  msgstr ""
317
 
318
- #: lib/dashboard.php:356
319
  msgid "Optional configuration file"
320
  msgstr ""
321
 
322
- #: lib/dashboard.php:363
323
  msgid "MySQLi link identifier"
324
  msgstr ""
325
 
326
- #: lib/dashboard.php:364
327
  msgid "A MySQLi link identifier was detected in your <code>.htninja</code>."
328
  msgstr ""
329
 
330
- #: lib/dashboard.php:370
331
  msgid "Help &amp; configuration"
332
  msgstr ""
333
 
@@ -341,7 +363,7 @@ msgid ""
341
  "themes:"
342
  msgstr ""
343
 
344
- #: lib/dashboard_about.php:31 lib/help.php:470
345
  msgid "GDPR Compliance"
346
  msgstr ""
347
 
@@ -411,7 +433,7 @@ msgstr ""
411
  msgid "Select monthly stats to view..."
412
  msgstr ""
413
 
414
- #: lib/event_notifications.php:34 lib/help.php:332 ninjafirewall.php:764
415
  msgid "Event Notifications"
416
  msgstr ""
417
 
@@ -427,7 +449,8 @@ msgstr ""
427
  msgid "WordPress admin dashboard"
428
  msgstr ""
429
 
430
- #: lib/event_notifications.php:55 lib/event_notifications.php:124
 
431
  msgid "Send me an alert whenever"
432
  msgstr ""
433
 
@@ -504,29 +527,35 @@ msgstr ""
504
  msgid "Updates WordPress (default)"
505
  msgstr ""
506
 
507
- #: lib/event_notifications.php:121
508
- msgid "Administrator account"
509
  msgstr ""
510
 
511
- #: lib/event_notifications.php:126
512
  msgid ""
513
- "An administrator account is created, modified or deleted in the database "
514
  "(default)"
515
  msgstr ""
516
 
517
- #: lib/event_notifications.php:127
518
- msgid "A user attempts to gain administrative privileges (default)"
 
 
 
 
 
 
519
  msgstr ""
520
 
521
- #: lib/event_notifications.php:134
522
  msgid "Daily report"
523
  msgstr ""
524
 
525
- #: lib/event_notifications.php:137
526
  msgid "Send me a daily activity report"
527
  msgstr ""
528
 
529
- #: lib/event_notifications.php:139 lib/event_notifications.php:151
530
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
531
  #: lib/firewall_policies.php:25 lib/login_protection.php:309
532
  #: lib/login_protection.php:324 lib/login_protection.php:345
@@ -534,7 +563,7 @@ msgstr ""
534
  msgid "Yes"
535
  msgstr ""
536
 
537
- #: lib/event_notifications.php:139 lib/event_notifications.php:151
538
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
539
  #: lib/firewall_policies.php:26 lib/login_protection.php:309
540
  #: lib/login_protection.php:324 lib/login_protection.php:345
@@ -542,133 +571,257 @@ msgstr ""
542
  msgid "No"
543
  msgstr ""
544
 
545
- #: lib/event_notifications.php:146
546
  msgid "Log"
547
  msgstr ""
548
 
549
- #: lib/event_notifications.php:149
550
  msgid "Write all events to the firewall log"
551
  msgstr ""
552
 
553
- #: lib/event_notifications.php:163
554
  msgid "PHP backtrace"
555
  msgstr ""
556
 
557
- #: lib/event_notifications.php:166
558
  msgid "Attach a PHP backtrace to important notifications"
559
  msgstr ""
560
 
561
- #: lib/event_notifications.php:169
562
  msgid "Disable backtrace"
563
  msgstr ""
564
 
565
- #: lib/event_notifications.php:170
566
  msgid "Low verbosity"
567
  msgstr ""
568
 
569
- #: lib/event_notifications.php:171
570
  msgid "Medium verbosity (default)"
571
  msgstr ""
572
 
573
- #: lib/event_notifications.php:172
574
  msgid "High verbosity"
575
  msgstr ""
576
 
577
- #: lib/event_notifications.php:174
578
  #, php-format
579
  msgid "<a href=\"%s\">Consult our blog</a> for more info."
580
  msgstr ""
581
 
582
- #: lib/event_notifications.php:184 lib/event_notifications.php:214
583
  msgid "Contact email"
584
  msgstr ""
585
 
586
- #: lib/event_notifications.php:187 lib/event_notifications.php:217
587
  msgid "Alerts should be sent to"
588
  msgstr ""
589
 
590
- #: lib/event_notifications.php:196 lib/event_notifications.php:222
591
  msgid ""
592
  "Multiple recipients must be comma-separated (e.g., <code>joe@example.org,"
593
  "alice@example.org</code>)."
594
  msgstr ""
595
 
596
- #: lib/event_notifications.php:219
597
  msgid "Only to me, the Super Admin"
598
  msgstr ""
599
 
600
- #: lib/event_notifications.php:219
601
  msgid "default"
602
  msgstr ""
603
 
604
- #: lib/event_notifications.php:220
605
  msgid "To the administrator of the site where originated the alert"
606
  msgstr ""
607
 
608
- #: lib/event_notifications.php:221
609
  msgid "Other(s):"
610
  msgstr ""
611
 
612
- #: lib/event_notifications.php:233
613
  msgid "Save Event Notifications"
614
  msgstr ""
615
 
616
- #: lib/event_notifications.php:461
617
  msgid "[NinjaFirewall] Daily Activity Report"
618
  msgstr ""
619
 
620
- #: lib/event_notifications.php:471
621
  #, php-format
622
  msgid "Daily activity report for: %s"
623
  msgstr ""
624
 
625
- #: lib/event_notifications.php:472
626
  msgid "Date Range Processed: Yesterday"
627
  msgstr ""
628
 
629
- #: lib/event_notifications.php:474
630
  msgid "Blocked threats:"
631
  msgstr ""
632
 
633
- #: lib/event_notifications.php:476
634
  msgid "critical:"
635
  msgstr ""
636
 
637
- #: lib/event_notifications.php:477
638
  msgid "high:"
639
  msgstr ""
640
 
641
- #: lib/event_notifications.php:478
642
  msgid "medium:"
643
  msgstr ""
644
 
645
- #: lib/event_notifications.php:480
646
  msgid "Blocked brute-force attacks:"
647
  msgstr ""
648
 
649
- #: lib/event_notifications.php:481 lib/utils.php:851 lib/utils.php:1029
650
  msgid ""
651
  "This notification can be turned off from NinjaFirewall \"Event Notifications"
652
  "\" page."
653
  msgstr ""
654
 
655
- #: lib/event_notifications.php:485 lib/firewall_options.php:525
656
- #: lib/monitoring_file_check.php:773 lib/monitoring_file_check.php:794
657
- #: lib/security_rules_update.php:556 lib/utils.php:746
658
  msgid "Support forum:"
659
  msgstr ""
660
 
661
- #: lib/event_notifications.php:488 lib/firewall_options.php:528
662
- #: lib/monitoring_file_check.php:776 lib/monitoring_file_check.php:797
663
- #: lib/security_rules_update.php:559 lib/utils.php:235 lib/utils.php:578
664
- #: lib/utils.php:749 lib/utils.php:856 lib/utils.php:1034 lib/utils.php:1347
 
665
  #, php-format
666
  msgid ""
667
  "Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): "
668
  "%s"
669
  msgstr ""
670
 
671
- #: lib/firewall_options.php:29 ninjafirewall.php:738
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
672
  msgid "Firewall Options"
673
  msgstr ""
674
 
@@ -678,7 +831,7 @@ msgstr ""
678
 
679
  #: lib/firewall_options.php:64 lib/login_protection.php:203
680
  #: lib/logs_live_log.php:101 lib/monitoring_file_guard.php:70
681
- #: lib/security_rules_update.php:137
682
  msgid "Disabled"
683
  msgstr ""
684
 
@@ -725,7 +878,7 @@ msgid ""
725
  "Protection</a>."
726
  msgstr ""
727
 
728
- #: lib/firewall_options.php:128
729
  msgid "Blocked user message"
730
  msgstr ""
731
 
@@ -802,8 +955,7 @@ msgstr ""
802
  msgid "[NinjaFirewall] Alert: Firewall is disabled"
803
  msgstr ""
804
 
805
- #: lib/firewall_options.php:501 lib/firewall_options.php:503 lib/utils.php:734
806
- #: lib/utils.php:736
807
  msgid "-Blog :"
808
  msgstr ""
809
 
@@ -826,15 +978,15 @@ msgid ""
826
  "Someone imported a new configuration which overrode the firewall settings:"
827
  msgstr ""
828
 
829
- #: lib/firewall_options.php:520 lib/utils.php:741
830
  msgid "-User :"
831
  msgstr ""
832
 
833
- #: lib/firewall_options.php:521 lib/utils.php:742
834
  msgid "-IP :"
835
  msgstr ""
836
 
837
- #: lib/firewall_options.php:522 lib/utils.php:743
838
  msgid "-Date :"
839
  msgstr ""
840
 
@@ -844,7 +996,7 @@ msgid ""
844
  "This feature is only available when NinjaFirewall is running in %s mode."
845
  msgstr ""
846
 
847
- #: lib/firewall_policies.php:62 lib/help.php:155 ninjafirewall.php:742
848
  msgid "Firewall Policies"
849
  msgstr ""
850
 
@@ -856,15 +1008,15 @@ msgstr ""
856
  msgid "No action taken."
857
  msgstr ""
858
 
859
- #: lib/firewall_policies.php:85 lib/help.php:160
860
  msgid "Basic Policies"
861
  msgstr ""
862
 
863
- #: lib/firewall_policies.php:86 lib/help.php:186
864
  msgid "Intermediate Policies"
865
  msgstr ""
866
 
867
- #: lib/firewall_policies.php:87 lib/help.php:217
868
  msgid "Advanced Policies"
869
  msgstr ""
870
 
@@ -884,11 +1036,11 @@ msgstr ""
884
  msgid "HTTPS traffic only"
885
  msgstr ""
886
 
887
- #: lib/firewall_policies.php:141 lib/help.php:165
888
  msgid "Uploads"
889
  msgstr ""
890
 
891
- #: lib/firewall_policies.php:144
892
  msgid "File Uploads"
893
  msgstr ""
894
 
@@ -904,7 +1056,7 @@ msgstr ""
904
  msgid "Disallow uploads"
905
  msgstr ""
906
 
907
- #: lib/firewall_policies.php:152
908
  msgid "Sanitise filenames"
909
  msgstr ""
910
 
@@ -912,129 +1064,140 @@ msgstr ""
912
  msgid "substitution character:"
913
  msgstr ""
914
 
915
- #: lib/firewall_policies.php:276
916
  msgid "Block direct access to any PHP file located in one of these directories"
917
  msgstr ""
918
 
919
- #: lib/firewall_policies.php:306
920
  msgid ""
921
  "NinjaFirewall will not block access to the TinyMCE WYSIWYG editor even if "
922
  "this option is enabled."
923
  msgstr ""
924
 
925
- #: lib/firewall_policies.php:321
926
  msgid ""
927
  "Unless you have PHP scripts in a \"/cache/\" folder that need to be accessed "
928
  "by your visitors, we recommend to enable this option."
929
  msgstr ""
930
 
931
- #: lib/firewall_policies.php:330
932
  msgid "General"
933
  msgstr ""
934
 
935
- #: lib/firewall_policies.php:332 lib/help.php:171
936
  msgid "Block attempts to modify important WordPress settings"
937
  msgstr ""
938
 
939
- #: lib/firewall_policies.php:333 lib/help.php:172
940
  msgid "Block user accounts creation"
941
  msgstr ""
942
 
943
- #: lib/firewall_policies.php:345 lib/help.php:173
 
 
 
 
 
 
 
 
 
 
 
944
  msgid "WordPress AJAX"
945
  msgstr ""
946
 
947
- #: lib/firewall_policies.php:347
948
  msgid "Protect <code>admin-ajax.php</code> against suspicious bots"
949
  msgstr ""
950
 
951
- #: lib/firewall_policies.php:348
952
  #, php-format
953
  msgid ""
954
  "Your server IP (%s), localhost and private IP addresses will not be affected "
955
  "by this policy."
956
  msgstr ""
957
 
958
- #: lib/firewall_policies.php:353
959
  msgid "Protect against username enumeration"
960
  msgstr ""
961
 
962
- #: lib/firewall_policies.php:355
963
  msgid "Through the author archives"
964
  msgstr ""
965
 
966
- #: lib/firewall_policies.php:356
967
  msgid "Through the login page"
968
  msgstr ""
969
 
970
- #: lib/firewall_policies.php:357
971
  msgid "Through the WordPress REST API"
972
  msgstr ""
973
 
974
- #: lib/firewall_policies.php:362
975
  msgid "WordPress REST API"
976
  msgstr ""
977
 
978
- #: lib/firewall_policies.php:364 lib/firewall_policies.php:370
979
  msgid "Block any access to the API"
980
  msgstr ""
981
 
982
- #: lib/firewall_policies.php:368
983
  msgid "WordPress XML-RPC API"
984
  msgstr ""
985
 
986
- #: lib/firewall_policies.php:371
987
  msgid "Block <code>system.multicall</code> method"
988
  msgstr ""
989
 
990
- #: lib/firewall_policies.php:372
991
  msgid "Block Pingbacks"
992
  msgstr ""
993
 
994
- #: lib/firewall_policies.php:374
995
  msgid ""
996
  "Disabling access to the REST or XML-RPC API may break some functionality on "
997
  "your blog, its themes or plugins (e.g., Gutenberg editor, Jetpack, Contact "
998
  "Form 7 etc)."
999
  msgstr ""
1000
 
1001
- #: lib/firewall_policies.php:379
1002
  msgid "Block <code>POST</code> requests in the themes folder"
1003
  msgstr ""
1004
 
1005
- #: lib/firewall_policies.php:389
1006
- msgid "Force SSL for admin and logins"
1007
  msgstr ""
1008
 
1009
- #: lib/firewall_policies.php:395
1010
  msgid "Disable the plugin and theme editor"
1011
  msgstr ""
1012
 
1013
- #: lib/firewall_policies.php:401
1014
  msgid "Disable plugin and theme update/installation"
1015
  msgstr ""
1016
 
1017
- #: lib/firewall_policies.php:407
1018
  msgid "Disable the fatal error handler"
1019
  msgstr ""
1020
 
1021
- #: lib/firewall_policies.php:429 lib/help.php:259
1022
  msgid "Users Whitelist"
1023
  msgstr ""
1024
 
1025
- #: lib/firewall_policies.php:431
1026
  msgid "Add the Administrator to the whitelist (default)."
1027
  msgstr ""
1028
 
1029
- #: lib/firewall_policies.php:432
1030
  msgid "Add all logged in users to the whitelist."
1031
  msgstr ""
1032
 
1033
- #: lib/firewall_policies.php:433
1034
  msgid "Disable users whitelist."
1035
  msgstr ""
1036
 
1037
- #: lib/firewall_policies.php:434
1038
  msgid ""
1039
  "Note: This feature does not apply to <code>FORCE_SSL_ADMIN</code>, "
1040
  "<code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> and "
@@ -1042,268 +1205,268 @@ msgid ""
1042
  "always enforced."
1043
  msgstr ""
1044
 
1045
- #: lib/firewall_policies.php:459 lib/help.php:188
1046
  msgid "HTTP GET variable"
1047
  msgstr ""
1048
 
1049
- #: lib/firewall_policies.php:462
1050
  msgid "Scan <code>GET</code> variable"
1051
  msgstr ""
1052
 
1053
- #: lib/firewall_policies.php:468
1054
  msgid "Sanitise <code>GET</code> variable"
1055
  msgstr ""
1056
 
1057
- #: lib/firewall_policies.php:494 lib/help.php:191
1058
  msgid "HTTP POST variable"
1059
  msgstr ""
1060
 
1061
- #: lib/firewall_policies.php:497
1062
  msgid "Scan <code>POST</code> variable"
1063
  msgstr ""
1064
 
1065
- #: lib/firewall_policies.php:503
1066
  msgid "Sanitise <code>POST</code> variable"
1067
  msgstr ""
1068
 
1069
- #: lib/firewall_policies.php:506 lib/firewall_policies.php:531
1070
  msgid "Do not enable this option unless you know what you are doing!"
1071
  msgstr ""
1072
 
1073
- #: lib/firewall_policies.php:510
1074
  msgid "Decode Base64-encoded <code>POST</code> variable"
1075
  msgstr ""
1076
 
1077
- #: lib/firewall_policies.php:525 lib/help.php:195
1078
  msgid "HTTP REQUEST variable"
1079
  msgstr ""
1080
 
1081
- #: lib/firewall_policies.php:528
1082
  msgid "Sanitise <code>REQUEST</code> variable"
1083
  msgstr ""
1084
 
1085
- #: lib/firewall_policies.php:550 lib/help.php:198
1086
  msgid "Cookies"
1087
  msgstr ""
1088
 
1089
- #: lib/firewall_policies.php:553
1090
  msgid "Scan cookies"
1091
  msgstr ""
1092
 
1093
- #: lib/firewall_policies.php:559
1094
  msgid "Sanitise cookies"
1095
  msgstr ""
1096
 
1097
- #: lib/firewall_policies.php:585 lib/help.php:201
1098
  msgid "HTTP_USER_AGENT server variable"
1099
  msgstr ""
1100
 
1101
- #: lib/firewall_policies.php:588
1102
  msgid "Scan <code>HTTP_USER_AGENT</code>"
1103
  msgstr ""
1104
 
1105
- #: lib/firewall_policies.php:594
1106
  msgid "Sanitise <code>HTTP_USER_AGENT</code>"
1107
  msgstr ""
1108
 
1109
- #: lib/firewall_policies.php:600
1110
  msgid "Block suspicious bots/scanners"
1111
  msgstr ""
1112
 
1113
- #: lib/firewall_policies.php:626 lib/help.php:205
1114
  msgid "HTTP_REFERER server variable"
1115
  msgstr ""
1116
 
1117
- #: lib/firewall_policies.php:629
1118
  msgid "Scan <code>HTTP_REFERER</code>"
1119
  msgstr ""
1120
 
1121
- #: lib/firewall_policies.php:635
1122
  msgid "Sanitise <code>HTTP_REFERER</code>"
1123
  msgstr ""
1124
 
1125
- #: lib/firewall_policies.php:641
1126
  msgid ""
1127
  "Block <code>POST</code> requests that do not have an <code>HTTP_REFERER</"
1128
  "code> header"
1129
  msgstr ""
1130
 
1131
- #: lib/firewall_policies.php:644
1132
  msgid ""
1133
  "Keep this option disabled if you are using scripts like Paypal IPN, "
1134
  "WordPress WP-Cron etc"
1135
  msgstr ""
1136
 
1137
- #: lib/firewall_policies.php:671
1138
  msgid "Block localhost IP in <code>GET/POST</code> request"
1139
  msgstr ""
1140
 
1141
- #: lib/firewall_policies.php:677
1142
  msgid "Block HTTP requests with an IP in the <code>HTTP_HOST</code> header"
1143
  msgstr ""
1144
 
1145
- #: lib/firewall_policies.php:683
1146
  msgid "Scan traffic coming from localhost and private IP address spaces"
1147
  msgstr ""
1148
 
1149
- #: lib/firewall_policies.php:713
1150
  #, php-format
1151
  msgid ""
1152
  "The \"HTTP response headers\" options below are disabled because the %s PHP "
1153
  "function is not available on your server."
1154
  msgstr ""
1155
 
1156
- #: lib/firewall_policies.php:733 lib/help.php:219
1157
  msgid "HTTP response headers"
1158
  msgstr ""
1159
 
1160
- #: lib/firewall_policies.php:741
1161
  #, php-format
1162
  msgid "Set %s to protect against MIME type confusion attacks"
1163
  msgstr ""
1164
 
1165
- #: lib/firewall_policies.php:747
1166
  #, php-format
1167
  msgid "Set %s to protect against clickjacking attempts"
1168
  msgstr ""
1169
 
1170
- #: lib/firewall_policies.php:754
1171
  msgid ""
1172
  "Setting this option to <code>DENY</code> may break some functionality on "
1173
  "your blog, its themes or plugins."
1174
  msgstr ""
1175
 
1176
- #: lib/firewall_policies.php:759
1177
  #, php-format
1178
  msgid "Set %s (IE/Edge, Chrome, Opera and Safari browsers)"
1179
  msgstr ""
1180
 
1181
- #: lib/firewall_policies.php:763 lib/firewall_policies.php:764
1182
- #: lib/firewall_policies.php:765
1183
  #, php-format
1184
  msgid "Set to %s"
1185
  msgstr ""
1186
 
1187
- #: lib/firewall_policies.php:770
1188
  #, php-format
1189
  msgid "Force %s flag on all cookies to mitigate CSRF attacks"
1190
  msgstr ""
1191
 
1192
- #: lib/firewall_policies.php:780
1193
  #, php-format
1194
  msgid "Force %s flag on all cookies to mitigate XSS attacks"
1195
  msgstr ""
1196
 
1197
- #: lib/firewall_policies.php:783
1198
  msgid ""
1199
  "If your PHP scripts use cookies that need to be accessed from JavaScript, "
1200
  "you should not enable this option."
1201
  msgstr ""
1202
 
1203
- #: lib/firewall_policies.php:792
1204
  msgid ""
1205
  "HSTS headers can only be set when you are accessing your site over HTTPS."
1206
  msgstr ""
1207
 
1208
- #: lib/firewall_policies.php:800
1209
  #, php-format
1210
  msgid "Set %s (HSTS) to enforce secure connections to the server"
1211
  msgstr ""
1212
 
1213
- #: lib/firewall_policies.php:804
1214
  msgid "Set \"max-age\" to 0"
1215
  msgstr ""
1216
 
1217
- #: lib/firewall_policies.php:805
1218
  msgid "1 month"
1219
  msgstr ""
1220
 
1221
- #: lib/firewall_policies.php:806
1222
  msgid "6 months"
1223
  msgstr ""
1224
 
1225
- #: lib/firewall_policies.php:807
1226
  msgid "1 year"
1227
  msgstr ""
1228
 
1229
- #: lib/firewall_policies.php:809
1230
  msgid "Apply to subdomains"
1231
  msgstr ""
1232
 
1233
- #: lib/firewall_policies.php:833
1234
  #, php-format
1235
  msgid "Set %s for the website frontend"
1236
  msgstr ""
1237
 
1238
- #: lib/firewall_policies.php:838
1239
  msgid "This CSP header will apply to the website frontend only."
1240
  msgstr ""
1241
 
1242
- #: lib/firewall_policies.php:842
1243
  #, php-format
1244
  msgid "Set %s for the WordPress admin dashboard"
1245
  msgstr ""
1246
 
1247
- #: lib/firewall_policies.php:847
1248
  msgid "This CSP header will apply to the WordPress admin dashboard only."
1249
  msgstr ""
1250
 
1251
- #: lib/firewall_policies.php:863
1252
  #, php-format
1253
  msgid "Set %s (Chrome, Opera and Firefox browsers)"
1254
  msgstr ""
1255
 
1256
- #: lib/firewall_policies.php:913
1257
  msgid ""
1258
  "Block PHP built-in wrappers in <code>GET</code>, <code>POST</code>, "
1259
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> and cookies"
1260
  msgstr ""
1261
 
1262
- #: lib/firewall_policies.php:952
1263
  msgid "Block serialized PHP objects in the following global variables"
1264
  msgstr ""
1265
 
1266
- #: lib/firewall_policies.php:962
1267
  msgid "Hide PHP notice and error messages"
1268
  msgstr ""
1269
 
1270
- #: lib/firewall_policies.php:968
1271
  msgid "Sanitise <code>PHP_SELF</code>"
1272
  msgstr ""
1273
 
1274
- #: lib/firewall_policies.php:974
1275
  msgid "Sanitise <code>PATH_TRANSLATED</code>"
1276
  msgstr ""
1277
 
1278
- #: lib/firewall_policies.php:980
1279
  msgid "Sanitise <code>PATH_INFO</code>"
1280
  msgstr ""
1281
 
1282
- #: lib/firewall_policies.php:994
1283
  msgid "This option is not compatible with your actual configuration."
1284
  msgstr ""
1285
 
1286
- #: lib/firewall_policies.php:1016 lib/help.php:250
1287
  msgid "Various"
1288
  msgstr ""
1289
 
1290
- #: lib/firewall_policies.php:1019
1291
  msgid "Block the <code>DOCUMENT_ROOT</code> server variable in HTTP request"
1292
  msgstr ""
1293
 
1294
- #: lib/firewall_policies.php:1026
1295
  msgid "Block ASCII character 0x00 (NULL byte)"
1296
  msgstr ""
1297
 
1298
- #: lib/firewall_policies.php:1032
1299
  msgid "Block ASCII control characters 1 to 8 and 14 to 31"
1300
  msgstr ""
1301
 
1302
- #: lib/firewall_policies.php:1045
1303
  msgid "Save Firewall Policies"
1304
  msgstr ""
1305
 
1306
- #: lib/firewall_policies.php:1047
1307
  msgid "Restore Default Values"
1308
  msgstr ""
1309
 
@@ -1388,10 +1551,6 @@ msgid ""
1388
  "too."
1389
  msgstr ""
1390
 
1391
- #: lib/help.php:90
1392
- msgid "Error code and message to return"
1393
- msgstr ""
1394
-
1395
  #: lib/help.php:92
1396
  msgid ""
1397
  "Lets you customize the HTTP error code returned by NinjaFirewall when "
@@ -1440,7 +1599,7 @@ msgid ""
1440
  "configuration to an earlier date, select the corresponding file in the list."
1441
  msgstr ""
1442
 
1443
- #: lib/help.php:126
1444
  #, php-format
1445
  msgid ""
1446
  "Keep in mind, however, that the Firewall Policies apply to any PHP scripts "
@@ -1448,11 +1607,11 @@ msgid ""
1448
  "your WordPress index page."
1449
  msgstr ""
1450
 
1451
- #: lib/help.php:131
1452
  msgid "Policies overview"
1453
  msgstr ""
1454
 
1455
- #: lib/help.php:133
1456
  #, php-format
1457
  msgid ""
1458
  "Because NinjaFirewall sits in front of WordPress, it can hook, scan and "
@@ -1463,35 +1622,35 @@ msgid ""
1463
  "<code><a href=\"%s\">$_SERVER</a></code> in HTTP and/or HTTPS mode."
1464
  msgstr ""
1465
 
1466
- #: lib/help.php:135
1467
  msgid ""
1468
  "Use the options below to enable, disable or to tweak these rules according "
1469
  "to your needs."
1470
  msgstr ""
1471
 
1472
- #: lib/help.php:142
1473
  msgid "Scan and Sanitise"
1474
  msgstr ""
1475
 
1476
- #: lib/help.php:144
1477
  msgid ""
1478
  "You can choose to scan and reject dangerous content but also to sanitise "
1479
  "requests and variables. Those two actions are different and can be combined "
1480
  "together for better security."
1481
  msgstr ""
1482
 
1483
- #: lib/help.php:145
1484
  msgid ""
1485
- "Scan : if anything suspicious is detected, NinjaFirewall will block the "
1486
  "request and return an HTTP error code and message (defined in the \"Firewall "
1487
  "Options\" page). The user request will fail and the connection will be "
1488
  "closed immediately."
1489
  msgstr ""
1490
 
1491
- #: lib/help.php:146
1492
  #, php-format
1493
  msgid ""
1494
- "Sanitise : this option will not block but sanitise the user request by "
1495
  "escaping characters that can be used to exploit vulnerabilities (%s) and "
1496
  "replacing <code>&lt;</code> and <code>&gt;</code> with their corresponding "
1497
  "HTML entities (<code>&amp;lt;</code>, <code>&amp;gt;</code>). If it is a "
@@ -1499,80 +1658,74 @@ msgid ""
1499
  "sanitised."
1500
  msgstr ""
1501
 
1502
- #: lib/help.php:148
1503
  msgid ""
1504
  "This action will be performed when the filtering process is over, right "
1505
  "before NinjaFirewall forwards the request to your PHP script."
1506
  msgstr ""
1507
 
1508
- #: lib/help.php:151
1509
  msgid ""
1510
  "If you enabled <code>POST</code> requests sanitising, articles and messages "
1511
  "posted by your visitors could be corrupted with excessive backslashes or "
1512
  "substitution characters."
1513
  msgstr ""
1514
 
1515
- #: lib/help.php:163
1516
  msgid "Whether to filter HTTP and/or HTTPS traffic"
1517
  msgstr ""
1518
 
1519
- #: lib/help.php:166
1520
- msgid "File Uploads:"
1521
- msgstr ""
1522
-
1523
- #: lib/help.php:166
1524
- msgid "whether to allow/disallow file uploads."
1525
- msgstr ""
1526
-
1527
- #: lib/help.php:167
1528
- msgid "Sanitise filenames:"
1529
  msgstr ""
1530
 
1531
- #: lib/help.php:167
1532
  msgid ""
1533
- "any character that is not a letter <code>a-zA-Z</code>, a digit <code>0-9</"
1534
  "code>, a dot <code>.</code>, a hyphen <code>-</code> or an underscore "
1535
  "<code>_</code> will be removed from the filename and replaced with the "
1536
  "substitution character."
1537
  msgstr ""
1538
 
1539
- #: lib/help.php:170
1540
  msgid ""
1541
  "Whether to block direct access to PHP files located in specific WordPress "
1542
  "directories."
1543
  msgstr ""
1544
 
1545
- #: lib/help.php:171
1546
  msgid ""
1547
- "enabling this policy will block any attempt (e.g., exploiting a "
1548
  "vulnerability, using a backdoor etc) to modify some important WordPress "
1549
  "settings. This policy will also send you an alert by email with all details "
1550
  "regarding the issue. It is enabled by default."
1551
  msgstr ""
1552
 
1553
- #: lib/help.php:172
1554
  msgid ""
1555
- "enabling this policy will block any attempt (e.g., exploiting a "
1556
  "vulnerability, using a backdoor etc) to create a user account. If you allow "
1557
  "user registration, you should not enable it."
1558
  msgstr ""
1559
 
1560
- #: lib/help.php:173
 
 
 
 
 
 
1561
  #, php-format
1562
  msgid ""
1563
- "many vulnerabilities in plugins are exploited via the admin-ajax.php script. "
1564
  "This policy will try to detect and immediately block bots and malicious "
1565
  "scanners trying to access it. The server IP address (%s) and private IP "
1566
  "addresses will not be blocked."
1567
  msgstr ""
1568
 
1569
- #: lib/help.php:174
1570
- msgid "Protect against username enumeration:"
1571
- msgstr ""
1572
-
1573
- #: lib/help.php:174
1574
  msgid ""
1575
- "it is possible to enumerate usernames either through the WordPress author "
1576
  "archives, the REST API or the login page. Although this is not a "
1577
  "vulnerability but a WordPress feature, some hackers use it to retrieve "
1578
  "usernames in order to launch more accurate brute-force attacks. If it is a "
@@ -1582,22 +1735,14 @@ msgid ""
1582
  "block the request immediately."
1583
  msgstr ""
1584
 
1585
- #: lib/help.php:175
1586
- msgid "WordPress REST API:"
1587
- msgstr ""
1588
-
1589
- #: lib/help.php:175
1590
  msgid ""
1591
- "it allows you to access your WordPress site's data through an easy-to-use "
1592
  "HTTP REST API. Since WordPress 4.7, it is enabled by default. NinjaFirewall "
1593
  "allows you to block any access to that API if you do not intend to use it."
1594
  msgstr ""
1595
 
1596
- #: lib/help.php:176
1597
- msgid "WordPress XML-RPC API:"
1598
- msgstr ""
1599
-
1600
- #: lib/help.php:176
1601
  msgid ""
1602
  "XML-RPC is a remote procedure call (RPC) protocol which uses XML to encode "
1603
  "its calls and HTTP as a transport mechanism. WordPress has an XMLRPC API "
@@ -1608,116 +1753,115 @@ msgid ""
1608
  "used in brute-force amplification attacks or to block Pingbacks."
1609
  msgstr ""
1610
 
1611
- #: lib/help.php:177
1612
  msgid ""
1613
  "Block <code>POST</code> requests in the themes folder <code>/wp-content/"
1614
- "themes</code>:"
1615
  msgstr ""
1616
 
1617
- #: lib/help.php:177
1618
  msgid ""
1619
- "this option can be useful to block hackers from installing backdoor in the "
1620
  "PHP theme files. However, because some custom themes may include an HTML "
1621
  "form (contact, search form etc), this option is not enabled by default."
1622
  msgstr ""
1623
 
1624
- #: lib/help.php:178
1625
- msgid "Force SSL for admin and logins <code>FORCE_SSL_ADMIN</code>:"
1626
  msgstr ""
1627
 
1628
- #: lib/help.php:178
1629
  msgid ""
1630
- "enable this option when you want to secure logins and the admin area so that "
1631
  "both passwords and cookies are never sent in the clear. Ensure that you can "
1632
  "access your admin console from HTTPS before enabling this option, otherwise "
1633
  "you will lock yourself out of your site!"
1634
  msgstr ""
1635
 
1636
- #: lib/help.php:179
1637
- msgid "Disable the plugin and theme editor <code>DISALLOW_FILE_EDIT</code>:"
1638
  msgstr ""
1639
 
1640
- #: lib/help.php:179
1641
  msgid ""
1642
- "disabling the plugin and theme editor provides an additional layer of "
1643
  "security if a hacker gains access to a well-privileged user account."
1644
  msgstr ""
1645
 
1646
- #: lib/help.php:180
1647
  msgid ""
1648
- "Disable plugin and theme update/installation <code>DISALLOW_FILE_MODS</code>:"
1649
  msgstr ""
1650
 
1651
- #: lib/help.php:180
1652
  msgid ""
1653
- "this option will block users being able to use the plugin and theme "
1654
  "installation/update functionality from the WordPress admin area. Setting "
1655
  "this constant also disables the Plugin and Theme editor."
1656
  msgstr ""
1657
 
1658
- #: lib/help.php:181
1659
  msgid ""
1660
- "Disable the fatal error handler <code>WP_DISABLE_FATAL_ERROR_HANDLER</code>:"
1661
  msgstr ""
1662
 
1663
- #: lib/help.php:181
1664
  msgid ""
1665
- "this option will disable the WSOD protection introduced in WordPress 5.1."
1666
  msgstr ""
1667
 
1668
- #: lib/help.php:189
1669
- msgid "Whether to scan and/or sanitise the <code>GET</code> variable."
 
 
 
1670
  msgstr ""
1671
 
1672
- #: lib/help.php:192
1673
- msgid "Whether to scan and/or sanitise the <code>POST</code> variable."
1674
  msgstr ""
1675
 
1676
- #: lib/help.php:193
1677
- msgid "Decode Base64-encoded <code>POST</code> variable:"
1678
  msgstr ""
1679
 
1680
- #: lib/help.php:193
1681
  msgid ""
1682
  "NinjaFirewall will decode and scan base64 encoded values in order to detect "
1683
  "obfuscated malicious code. This option is only available for the <code>POST</"
1684
  "code> variable."
1685
  msgstr ""
1686
 
1687
- #: lib/help.php:196
1688
  msgid "Whether to sanitise the <code>REQUEST</code> variable."
1689
  msgstr ""
1690
 
1691
- #: lib/help.php:199
1692
  msgid "Whether to scan and/or sanitise cookies."
1693
  msgstr ""
1694
 
1695
- #: lib/help.php:202
1696
  msgid "Whether to scan and/or sanitise <code>HTTP_USER_AGENT</code> requests."
1697
  msgstr ""
1698
 
1699
- #: lib/help.php:203
1700
- msgid "Block suspicious bots/scanners:"
1701
- msgstr ""
1702
-
1703
- #: lib/help.php:203
1704
  msgid ""
1705
- "rejects some known bots, scanners and various malicious scripts attempting "
1706
  "to access your blog."
1707
  msgstr ""
1708
 
1709
- #: lib/help.php:206
1710
  msgid "Whether to scan and/or sanitise <code>HTTP_REFERER</code> requests."
1711
  msgstr ""
1712
 
1713
- #: lib/help.php:207
1714
  msgid ""
1715
- "Block POST requests that do not have an <code>HTTP_REFERER</code> header:"
1716
  msgstr ""
1717
 
1718
- #: lib/help.php:207
1719
  msgid ""
1720
- "this option will block any <code>POST</code> request that does not have a "
1721
  "Referrer header (<code>HTTP_REFERER</code> variable). If you need external "
1722
  "applications to post to your scripts (e.g. Paypal IPN, WordPress WP-"
1723
  "Cron...), you are advised to keep this option disabled otherwise they will "
@@ -1726,36 +1870,28 @@ msgid ""
1726
  "default."
1727
  msgstr ""
1728
 
1729
- #: lib/help.php:210
1730
- msgid "Block localhost IP in <code>GET/POST</code> requests:"
1731
  msgstr ""
1732
 
1733
- #: lib/help.php:210
1734
  msgid ""
1735
  "this option will block any <code>GET</code> or <code>POST</code> request "
1736
  "containing the localhost IP (127.0.0.1). It can be useful to block SQL "
1737
  "dumpers and various hacker's shell scripts."
1738
  msgstr ""
1739
 
1740
- #: lib/help.php:211
1741
- msgid "Block HTTP requests with an IP in the <code>HTTP_HOST</code> header:"
1742
- msgstr ""
1743
-
1744
- #: lib/help.php:211
1745
  #, php-format
1746
  msgid ""
1747
- "this option will reject any request using an IP instead of a domain name in "
1748
  "the <code>Host</code> header of the HTTP request. Unless you need to connect "
1749
  "to your site using its IP address, (e.g. %s), enabling this option will "
1750
  "block a lot of hackers scanners because such applications scan IPs rather "
1751
  "than domain names."
1752
  msgstr ""
1753
 
1754
- #: lib/help.php:212
1755
- msgid "Scan traffic coming from localhost and private IP address spaces:"
1756
- msgstr ""
1757
-
1758
- #: lib/help.php:212
1759
  msgid ""
1760
  "this option will allow the firewall to scan traffic from all non-routable "
1761
  "private IPs (IPv4 and IPv6) as well as the localhost IP. We recommend to "
@@ -1763,103 +1899,102 @@ msgid ""
1763
  "interconnected)."
1764
  msgstr ""
1765
 
1766
- #: lib/help.php:221
1767
  msgid ""
1768
  "In addition to filtering incoming requests, NinjaFirewall can also hook the "
1769
  "HTTP response in order to alter its headers. Those modifications can help to "
1770
  "mitigate threats such as XSS, phishing and clickjacking attacks."
1771
  msgstr ""
1772
 
1773
- #: lib/help.php:223
1774
  msgid ""
1775
  "Set <code>X-Content-Type-Options</code> to protect against MIME type "
1776
- "confusion attacks:"
1777
  msgstr ""
1778
 
1779
- #: lib/help.php:223
1780
  msgid ""
1781
- "this header will send the nosniff value to instruct the browser to disable "
1782
  "content or MIME sniffing and to use the content-type returned by the server. "
1783
  "Some browsers try to guess (sniff) and override the content-type by looking "
1784
  "at the content itself which, in some cases, could lead to security issues "
1785
  "such as MIME Confusion Attacks."
1786
  msgstr ""
1787
 
1788
- #: lib/help.php:224
1789
  msgid ""
1790
- "Set <code>X-Frame-Options</code> to protect against clickjacking attempts:"
1791
  msgstr ""
1792
 
1793
- #: lib/help.php:224
1794
  msgid ""
1795
- "this header indicates a policy whether a browser must not allow to render a "
1796
  "page in a &lt;frame&gt; or &lt;iframe&gt;. Hosts can declare this policy in "
1797
  "the header of their HTTP responses to prevent clickjacking attacks, by "
1798
  "ensuring that their content is not embedded into other pages or frames. "
1799
  "NinjaFirewall accepts two different values:"
1800
  msgstr ""
1801
 
1802
- #: lib/help.php:226
1803
  msgid ""
1804
- "a browser receiving content with this header must not display this content "
1805
  "in any frame from a page of different origin than the content itself."
1806
  msgstr ""
1807
 
1808
- #: lib/help.php:227
1809
  msgid ""
1810
- "a browser receiving content with this header must not display this content "
1811
  "in any frame."
1812
  msgstr ""
1813
 
1814
- #: lib/help.php:230
1815
  msgid "NinjaFirewall does not support the <code>ALLOW-FROM</code> value."
1816
  msgstr ""
1817
 
1818
- #: lib/help.php:232
1819
  msgid ""
1820
  "Since v3.1.3, WordPress sets this value to <code>SAMEORIGIN</code> for the "
1821
  "administrator and the login page only."
1822
  msgstr ""
1823
 
1824
- #: lib/help.php:233
1825
  msgid ""
1826
  "Set <code>X-XSS-Protection</code> (IE/Edge, Chrome, Opera and Safari "
1827
- "browsers):"
1828
  msgstr ""
1829
 
1830
- #: lib/help.php:233
1831
  msgid ""
1832
- "this header allows browsers to identify and block XSS attacks by preventing "
1833
  "malicious scripts from executing. It is enabled by default on all compatible "
1834
  "browsers."
1835
  msgstr ""
1836
 
1837
- #: lib/help.php:234
1838
  msgid ""
1839
  "If a visitor disabled their browser's XSS filter, you cannot re-enable it "
1840
  "with that option."
1841
  msgstr ""
1842
 
1843
- #: lib/help.php:236
1844
  msgid ""
1845
- "Force <code>SameSite</code> flag on all cookies to mitigate CSRF attacks:"
1846
  msgstr ""
1847
 
1848
- #: lib/help.php:236
1849
  msgid ""
1850
- "adding this flag to cookies helps to mitigate the risk of CSRF (cross-site "
1851
  "request forgery) attacks because cookies can only be sent in requests "
1852
  "originating from the same origin as the target domain."
1853
  msgstr ""
1854
 
1855
- #: lib/help.php:237
1856
- msgid ""
1857
- "Force <code>HttpOnly</code> flag on all cookies to mitigate XSS attacks:"
1858
  msgstr ""
1859
 
1860
- #: lib/help.php:237
1861
  msgid ""
1862
- "adding this flag to cookies helps to mitigate the risk of cross-site "
1863
  "scripting by preventing them from being accessed through client-side "
1864
  "scripts. NinjaFirewall can hook all cookies sent by your blog, its plugins "
1865
  "or any other PHP script, add the <code>HttpOnly</code> flag if it is "
@@ -1868,58 +2003,58 @@ msgid ""
1868
  "sets that flag on the logged in user cookies only."
1869
  msgstr ""
1870
 
1871
- #: lib/help.php:238
1872
  msgid ""
1873
  "If your PHP scripts send cookies that need to be accessed from JavaScript, "
1874
  "you should keep that option disabled."
1875
  msgstr ""
1876
 
1877
- #: lib/help.php:239
1878
  msgid ""
1879
  "Set <code>Strict-Transport-Security</code> (HSTS) to enforce secure "
1880
- "connections to the server:"
1881
  msgstr ""
1882
 
1883
- #: lib/help.php:239
1884
  msgid ""
1885
- "this policy enforces secure HTTPS connections to the server. Web browsers "
1886
  "will not allow the user to access the web application over insecure HTTP "
1887
  "protocol. It helps to defend against cookie hijacking and Man-in-the-middle "
1888
  "attacks. Most recent browsers support HSTS headers."
1889
  msgstr ""
1890
 
1891
- #: lib/help.php:240
1892
- msgid "Set <code>Content-Security-Policy</code>:"
1893
  msgstr ""
1894
 
1895
- #: lib/help.php:240
1896
  msgid ""
1897
- "this policy helps to mitigate threats such as XSS, phishing and clickjacking "
1898
  "attacks. It covers JavaScript, CSS, HTML frames, web workers, fonts, images, "
1899
  "objects (Java, ActiveX, audio and video files), and other HTML5 features."
1900
  msgstr ""
1901
 
1902
- #: lib/help.php:240
1903
  msgid ""
1904
  "NinjaFirewall lets you configure the CSP policy separately for the frontend "
1905
  "(blog, website) and the backend (WordPress admin dashboard)."
1906
  msgstr ""
1907
 
1908
- #: lib/help.php:241
1909
- msgid "Set <code>Referrer-Policy</code>:"
1910
  msgstr ""
1911
 
1912
- #: lib/help.php:241
1913
  msgid ""
1914
- "this HTTP header governs which referrer information, sent in the Referer "
1915
  "header, should be included with requests made."
1916
  msgstr ""
1917
 
1918
- #: lib/help.php:245
1919
- msgid "Block PHP built-in wrappers:"
1920
  msgstr ""
1921
 
1922
- #: lib/help.php:245
1923
  msgid ""
1924
  "PHP has several wrappers for use with the filesystem functions. It is "
1925
  "possible for an attacker to use them to bypass firewalls and various IDS to "
@@ -1930,11 +2065,11 @@ msgid ""
1930
  "request, cookies, user agent and referrer variables."
1931
  msgstr ""
1932
 
1933
- #: lib/help.php:246
1934
- msgid "Block serialized PHP objects:"
1935
  msgstr ""
1936
 
1937
- #: lib/help.php:246
1938
  #, php-format
1939
  msgid ""
1940
  "Object Serialization is a PHP feature used by many applications to generate "
@@ -1945,133 +2080,65 @@ msgid ""
1945
  "code> request, cookies, user agent and referrer variables."
1946
  msgstr ""
1947
 
1948
- #: lib/help.php:247
1949
- msgid "Hide PHP notice and error messages:"
1950
- msgstr ""
1951
-
1952
- #: lib/help.php:247
1953
  msgid ""
1954
- "this option lets you hide errors returned by your scripts. Such errors can "
1955
  "leak sensitive informations which can be exploited by hackers."
1956
  msgstr ""
1957
 
1958
- #: lib/help.php:248
1959
  msgid ""
1960
  "Sanitise <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
1961
- "<code>PATH_INFO</code>:"
1962
  msgstr ""
1963
 
1964
- #: lib/help.php:248
1965
  msgid ""
1966
- "this option can sanitise any dangerous characters found in those 3 server "
1967
  "variables to prevent various XSS and database injection attempts."
1968
  msgstr ""
1969
 
1970
- #: lib/help.php:251
1971
  #, php-format
1972
  msgid ""
1973
- "Block the <code>DOCUMENT_ROOT</code> server variable (%s) in HTTP requests:"
1974
  msgstr ""
1975
 
1976
- #: lib/help.php:251
1977
  msgid ""
1978
- "this option will block scripts attempting to pass the <code>DOCUMENT_ROOT</"
1979
  "code> server variable in a <code>GET</code> or <code>POST</code> request. "
1980
  "Hackers use shell scripts that often need to pass this value, but most "
1981
  "legitimate programs do not."
1982
  msgstr ""
1983
 
1984
- #: lib/help.php:252
1985
- msgid "Block ASCII character 0x00 (NULL byte):"
1986
- msgstr ""
1987
-
1988
- #: lib/help.php:252
1989
  msgid ""
1990
- "this option will reject any <code>GET</code> or <code>POST</code> request, "
1991
  "<code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, <code>PHP_SELF</"
1992
  "code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> variables "
1993
  "containing the ASCII character 0x00 (NULL byte). Such a character is "
1994
  "dangerous and should always be rejected."
1995
  msgstr ""
1996
 
1997
- #: lib/help.php:253
1998
- msgid "Block ASCII control characters 1 to 8 and 14 to 31:"
1999
- msgstr ""
2000
-
2001
- #: lib/help.php:253
2002
  msgid ""
2003
- "this option will reject any <code>GET</code> or <code>POST</code> request, "
2004
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> variables containing "
2005
  "ASCII characters from 1 to 8 and 14 to 31."
2006
  msgstr ""
2007
 
2008
- #: lib/help.php:261
2009
- #, php-format
2010
- msgid ""
2011
- "By default, any logged in WordPress administrator will not be blocked by "
2012
- "NinjaFirewall. You can also add any logged in users to the whitelist (make "
2013
- "sure you trust them all before doing so).<br />This feature applies to all "
2014
- "Firewall Policies listed below, except <code>FORCE_SSL_ADMIN</code>, "
2015
- "<code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> options and "
2016
- "the <a href=\"%s\">Login Protection</a> which, if enabled, are always "
2017
- "enforced."
2018
- msgstr ""
2019
-
2020
- #: lib/help.php:273 lib/monitoring.php:46
2021
- msgid "File Guard"
2022
- msgstr ""
2023
-
2024
- #: lib/help.php:275
2025
- msgid ""
2026
- "File Guard can detect, in real-time, any access to a PHP file that was "
2027
- "recently modified or created, and alert you about this."
2028
- msgstr ""
2029
-
2030
- #: lib/help.php:277
2031
- msgid ""
2032
- "If a hacker uploaded a shell script to your site (or injected a backdoor "
2033
- "into an already existing file) and tried to directly access that file using "
2034
- "his browser or a script, NinjaFirewall would hook the HTTP request and "
2035
- "immediately detect that the file was recently modified/created. It would "
2036
- "send you a detailed alert (script name, IP, request, date and time). Alerts "
2037
- "will be sent to the contact email address defined in the \"Event "
2038
- "Notifications\" menu."
2039
- msgstr ""
2040
-
2041
- #: lib/help.php:278
2042
- msgid ""
2043
- "If you do not want to monitor a folder, you can exclude its full path or a "
2044
- "part of it (e.g., <code>/var/www/public_html/cache/</code> or <code>/cache/</"
2045
- "code> etc). NinjaFirewall will compare this value to the <code>"
2046
- "$_SERVER[\"SCRIPT_FILENAME\"]</code> server variable and, if it matches, "
2047
- "will ignore it."
2048
- msgstr ""
2049
-
2050
- #: lib/help.php:279
2051
- msgid ""
2052
- "Multiple values must be comma-separated (e.g., <code>/foo/bar/,/cache/</"
2053
- "code>)."
2054
- msgstr ""
2055
-
2056
- #: lib/help.php:280
2057
- msgid ""
2058
- "File Guard real-time detection is a totally unique feature, because "
2059
- "NinjaFirewall is the only plugin for WordPress that can hook HTTP requests "
2060
- "sent to any PHP script, even if that script is not part of the WordPress "
2061
- "package (third-party software, shell script, backdoor etc)."
2062
- msgstr ""
2063
-
2064
- #: lib/help.php:286 lib/monitoring.php:47
2065
  msgid "File Check"
2066
  msgstr ""
2067
 
2068
- #: lib/help.php:287
2069
  msgid ""
2070
  "File Check lets you perform file integrity monitoring upon request or on a "
2071
  "specific interval."
2072
  msgstr ""
2073
 
2074
- #: lib/help.php:289
2075
  msgid ""
2076
  "You need to create a snapshot of all your files and then, at a later time, "
2077
  "you can scan your system to compare it with the previous snapshot. Any "
@@ -2079,66 +2146,110 @@ msgid ""
2079
  "file ownership, timestamp as well as file creation and deletion."
2080
  msgstr ""
2081
 
2082
- #: lib/help.php:291
2083
  #, php-format
2084
  msgid ""
2085
  "Create a snapshot of all files stored in that directory: by default, the "
2086
  "directory is set to WordPress <code>ABSPATH</code> (%s)"
2087
  msgstr ""
2088
 
2089
- #: lib/help.php:292
2090
  msgid ""
2091
  "Exclude the following files/folders: you can enter a directory or a file "
2092
  "name (e.g., <code>/foo/bar/</code>), or a part of it (e.g., <code>foo</"
2093
  "code>). Or you can exclude a file extension (e.g., <code>.css</code>)."
2094
  msgstr ""
2095
 
2096
- #: lib/help.php:294
2097
  msgid ""
2098
  "Multiple values must be comma-separated (e.g., <code>/foo/bar/,.css,.png</"
2099
  "code>)."
2100
  msgstr ""
2101
 
2102
- #: lib/help.php:295
2103
  msgid ""
2104
  "Do not follow symbolic links: by default, NinjaFirewall will not follow "
2105
  "symbolic links."
2106
  msgstr ""
2107
 
2108
- #: lib/help.php:298
2109
  msgid "Scheduled scans"
2110
  msgstr ""
2111
 
2112
- #: lib/help.php:299
2113
  msgid ""
2114
  "NinjaFirewall can scan your system on a specific interval (hourly, "
2115
  "twicedaily or daily)."
2116
  msgstr ""
2117
 
2118
- #: lib/help.php:301
2119
  msgid ""
2120
  "It can either send you a scan report only if changes are detected, or always "
2121
  "send you one after each scan."
2122
  msgstr ""
2123
 
2124
- #: lib/help.php:303
2125
  msgid ""
2126
  "Reports will be sent to the contact email address defined in the \"Event "
2127
  "Notifications\" menu."
2128
  msgstr ""
2129
 
2130
- #: lib/help.php:305
2131
  #, php-format
2132
  msgid ""
2133
  "Scheduled scans rely on <a href=\"%s\">WordPress pseudo cron</a> which works "
2134
  "only if your site gets sufficient traffic."
2135
  msgstr ""
2136
 
2137
- #: lib/help.php:315 lib/network.php:32 ninjafirewall.php:760
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2138
  msgid "Network"
2139
  msgstr ""
2140
 
2141
- #: lib/help.php:317
2142
  msgid ""
2143
  "Even if NinjaFirewall administration menu is only available to the Super "
2144
  "Admin (from the main site), you can still display its status to all sites in "
@@ -2146,20 +2257,20 @@ msgid ""
2146
  "be visible only to the administrators of those sites."
2147
  msgstr ""
2148
 
2149
- #: lib/help.php:319
2150
  msgid ""
2151
  "It is recommended to enable this feature as it is the only way to know "
2152
  "whether the sites in your network are protected and if NinjaFirewall "
2153
  "installation was successful."
2154
  msgstr ""
2155
 
2156
- #: lib/help.php:321
2157
  msgid ""
2158
  "Note that when it is disabled, the icon still remains visible to you, the "
2159
  "Super Admin."
2160
  msgstr ""
2161
 
2162
- #: lib/help.php:333
2163
  msgid ""
2164
  "NinjaFirewall can alert you by email on specific events triggered within "
2165
  "your blog. They include installations, updates, activations etc, as well as "
@@ -2170,11 +2281,11 @@ msgid ""
2170
  "theme in order to take full control of your website."
2171
  msgstr ""
2172
 
2173
- #: lib/help.php:344 lib/login_protection.php:21 ninjafirewall.php:768
2174
  msgid "Login Protection"
2175
  msgstr ""
2176
 
2177
- #: lib/help.php:348
2178
  msgid ""
2179
  "By processing incoming HTTP requests before your blog and any of its "
2180
  "plugins, NinjaFirewall is the only plugin for WordPress able to protect it "
@@ -2182,18 +2293,18 @@ msgid ""
2182
  "from several thousands of different IPs."
2183
  msgstr ""
2184
 
2185
- #: lib/help.php:350
2186
  msgid ""
2187
  "You can choose two different types of protection: a password or a captcha. "
2188
  "You can enable the protection only if an attack is detected or to keep it "
2189
  "always activated."
2190
  msgstr ""
2191
 
2192
- #: lib/help.php:352
2193
  msgid "Yes, if under attack:"
2194
  msgstr ""
2195
 
2196
- #: lib/help.php:354
2197
  msgid ""
2198
  "The protection will be triggered when too many login attempts are detected, "
2199
  "regardless of the offending IP. It blocks the attack instantly and prevents "
@@ -2202,92 +2313,92 @@ msgid ""
2202
  "combination or the captcha code. "
2203
  msgstr ""
2204
 
2205
- #: lib/help.php:356
2206
  msgid "Always ON:"
2207
  msgstr ""
2208
 
2209
- #: lib/help.php:358
2210
  msgid ""
2211
  "NinjaFirewall will always enforce the HTTP authentication or captcha "
2212
  "implementation each time you access the login page."
2213
  msgstr ""
2214
 
2215
- #: lib/help.php:361
2216
  msgid "Type of protection:"
2217
  msgstr ""
2218
 
2219
- #: lib/help.php:362
2220
  msgid ""
2221
  "<b>Password:</b> It password-protects the login page. NinjaFirewall uses its "
2222
  "own very fast authentication scheme and it is compatible with any HTTP "
2223
  "server (Apache, Nginx, Lighttpd etc)."
2224
  msgstr ""
2225
 
2226
- #: lib/help.php:363
2227
  msgid "<b>Captcha:</b> It will display a 5-character captcha code."
2228
  msgstr ""
2229
 
2230
- #: lib/help.php:364
2231
  msgid "Bot protection:"
2232
  msgstr ""
2233
 
2234
- #: lib/help.php:365
2235
  msgid ""
2236
  "NinjaFirewall will attempt to block bots and scripts immediately, i.e., even "
2237
  "before they start a brute-force attack."
2238
  msgstr ""
2239
 
2240
- #: lib/help.php:373
2241
  msgid "AUTH log"
2242
  msgstr ""
2243
 
2244
- #: lib/help.php:376
2245
  msgid ""
2246
  "NinjaFirewall can write to the server Authentication log when the brute-"
2247
  "force protection is triggered. This can be useful to the system "
2248
  "administrator for monitoring purposes or banning IPs at the server level."
2249
  msgstr ""
2250
 
2251
- #: lib/help.php:378
2252
  msgid ""
2253
  "If you have a shared hosting account, keep this option disabled as you do "
2254
  "not have any access to the server's logs."
2255
  msgstr ""
2256
 
2257
- #: lib/help.php:380
2258
  msgid ""
2259
  "On Debian-based systems, the log is located in <code>/var/log/auth.log</"
2260
  "code>, and on Red Hat-based systems in <code>/var/log/secure</code>. The "
2261
  "logline uses the following format:"
2262
  msgstr ""
2263
 
2264
- #: lib/help.php:383
2265
  msgid "AA: the process ID (PID)."
2266
  msgstr ""
2267
 
2268
- #: lib/help.php:384
2269
  msgid "BB: the user IPv4 or IPv6 address."
2270
  msgstr ""
2271
 
2272
- #: lib/help.php:385
2273
  msgid "CC: the blog (sub-)domain name."
2274
  msgstr ""
2275
 
2276
- #: lib/help.php:386
2277
  msgid ""
2278
  "DD: the target: it can be either <code>wp-login.php</code> or <code>XML-RPC "
2279
  "API</code>."
2280
  msgstr ""
2281
 
2282
- #: lib/help.php:387
2283
  msgid "EE: the time, in minutes, the protection will remain active."
2284
  msgstr ""
2285
 
2286
- #: lib/help.php:389
2287
  msgid "Sample loglines:"
2288
  msgstr ""
2289
 
2290
- #: lib/help.php:392
2291
  #, php-format
2292
  msgid ""
2293
  "Be careful if you are behind a load balancer, reverse-proxy or CDN because "
@@ -2298,54 +2409,54 @@ msgid ""
2298
  "otherwise you will likely block legitimate users."
2299
  msgstr ""
2300
 
2301
- #: lib/help.php:406 lib/logs.php:39 lib/wpplus.php:206
2302
  msgid "Firewall Log"
2303
  msgstr ""
2304
 
2305
- #: lib/help.php:409
2306
  msgid ""
2307
  "The firewall log displays blocked and sanitised requests as well as some "
2308
  "useful information. It has 6 columns:"
2309
  msgstr ""
2310
 
2311
- #: lib/help.php:410
2312
  msgid "DATE : date and time of the incident."
2313
  msgstr ""
2314
 
2315
- #: lib/help.php:411
2316
  msgid ""
2317
  "INCIDENT : unique incident number/ID as it was displayed to the blocked user."
2318
  msgstr ""
2319
 
2320
- #: lib/help.php:412
2321
  msgid ""
2322
  "LEVEL : level of severity (<code>CRITICAL</code>, <code>HIGH</code> or "
2323
  "<code>MEDIUM</code>), information (<code>INFO</code>, <code>UPLOAD</code>) "
2324
  "and debugging mode (<code>DEBUG_ON</code>)."
2325
  msgstr ""
2326
 
2327
- #: lib/help.php:413
2328
  msgid ""
2329
  "RULE : reference of the NinjaFirewall built-in security rule that triggered "
2330
  "the action. A hyphen (<code>-</code>) instead of a number means it was a "
2331
  "rule from the \"Firewall Policies\" page."
2332
  msgstr ""
2333
 
2334
- #: lib/help.php:414
2335
  msgid "IP : the user IPv4 or IPv6 address."
2336
  msgstr ""
2337
 
2338
- #: lib/help.php:415
2339
  msgid ""
2340
  "REQUEST : the HTTP request including offending variables and values as well "
2341
  "as the reason the action was logged."
2342
  msgstr ""
2343
 
2344
- #: lib/help.php:418 lib/logs_firewall_log.php:165
2345
  msgid "Auto-delete log"
2346
  msgstr ""
2347
 
2348
- #: lib/help.php:419
2349
  msgid ""
2350
  "This options lets you configure NinjaFirewall to delete its old logs "
2351
  "automatically. By default, logs are never deleted, <b>even when uninstall "
@@ -2353,55 +2464,55 @@ msgid ""
2353
  "delete old logs."
2354
  msgstr ""
2355
 
2356
- #: lib/help.php:423
2357
  msgid ""
2358
  "Centralized Logging lets you remotely access the firewall log of all your "
2359
  "NinjaFirewall protected websites from one single installation. You do not "
2360
  "need any longer to log in to individual servers to analyse your log data."
2361
  msgstr ""
2362
 
2363
- #: lib/help.php:423
2364
  #, php-format
2365
  msgid "<a href=\"%s\">Consult our blog</a> for more info about it."
2366
  msgstr ""
2367
 
2368
- #: lib/help.php:424
2369
  msgid ""
2370
  "Enter your public key (optional): This is the public key that was created "
2371
  "from your main server."
2372
  msgstr ""
2373
 
2374
- #: lib/help.php:428
2375
  msgid ""
2376
  "Centralized Logging will keep working even if NinjaFirewall is disabled. "
2377
  "Delete your public key below if you want to disable it."
2378
  msgstr ""
2379
 
2380
- #: lib/help.php:435 lib/logs.php:40 lib/logs_live_log.php:37
2381
  msgid "Live Log"
2382
  msgstr ""
2383
 
2384
- #: lib/help.php:438
2385
  msgid ""
2386
  "Live Log lets you watch your blog traffic in real time, just like the Unix "
2387
  "<code>tail -f</code> command. Note that requests sent to static elements "
2388
  "like JS/CSS files and images are not managed by NinjaFirewall."
2389
  msgstr ""
2390
 
2391
- #: lib/help.php:440
2392
  msgid ""
2393
  "You can enable/disable the monitoring process, change the refresh rate, "
2394
  "clear the screen, enable automatic vertical scrolling, change the log "
2395
  "format, select which traffic you want to view (HTTP/HTTPS) and the timezone."
2396
  msgstr ""
2397
 
2398
- #: lib/help.php:440
2399
  msgid ""
2400
  "You can also apply filters to include or exclude files and folders "
2401
  "(REQUEST_URI)."
2402
  msgstr ""
2403
 
2404
- #: lib/help.php:443
2405
  msgid ""
2406
  "Live Log does not make use of any WordPress core file (e.g., <code>admin-"
2407
  "ajax.php</code>). It communicates directly with the firewall without loading "
@@ -2410,114 +2521,114 @@ msgid ""
2410
  "value."
2411
  msgstr ""
2412
 
2413
- #: lib/help.php:445
2414
  msgid ""
2415
  "If you are using the optional <code>.htninja</code> configuration file to "
2416
  "whitelist your IP, the Live Log feature will not work."
2417
  msgstr ""
2418
 
2419
- #: lib/help.php:449
2420
  msgid "Log Format"
2421
  msgstr ""
2422
 
2423
- #: lib/help.php:450
2424
  msgid "You can easily customize the log format. Possible values are:"
2425
  msgstr ""
2426
 
2427
- #: lib/help.php:451
2428
  msgid "<code>%time</code>: the server date, time and timezone."
2429
  msgstr ""
2430
 
2431
- #: lib/help.php:452
2432
  msgid "<code>%name</code>: authenticated user (HTTP basic auth), if any."
2433
  msgstr ""
2434
 
2435
- #: lib/help.php:453
2436
  #, php-format
2437
  msgid ""
2438
  "<code>%client</code>: the client REMOTE_ADDR. If you are behind a load "
2439
  "balancer or CDN, this will be its IP."
2440
  msgstr ""
2441
 
2442
- #: lib/help.php:454
2443
  msgid "<code>%method</code>: HTTP method (e.g., GET, POST)."
2444
  msgstr ""
2445
 
2446
- #: lib/help.php:455
2447
  #, php-format
2448
  msgid ""
2449
  "<code>%uri</code>: the URI which was given in order to access the page "
2450
  "(REQUEST_URI)."
2451
  msgstr ""
2452
 
2453
- #: lib/help.php:456
2454
  msgid "<code>%referrer</code>: the referrer (HTTP_REFERER), if any."
2455
  msgstr ""
2456
 
2457
- #: lib/help.php:457
2458
  #, php-format
2459
  msgid "<code>%ua</code>: the user-agent (HTTP_USER_AGENT), if any."
2460
  msgstr ""
2461
 
2462
- #: lib/help.php:458
2463
  #, php-format
2464
  msgid ""
2465
  "<code>%forward</code>: HTTP_X_FORWARDED_FOR, if any. If you are behind a "
2466
  "load balancer or CDN, this will likely be the visitor true IP."
2467
  msgstr ""
2468
 
2469
- #: lib/help.php:459
2470
  msgid "<code>%host</code>: the requested host (HTTP_HOST), if any."
2471
  msgstr ""
2472
 
2473
- #: lib/help.php:461
2474
  msgid ""
2475
  "Additionally, you can include any of the following characters: <code>\"</"
2476
  "code>, <code>%</code>, <code>[</code>, <code>]</code>, <code>space</code> "
2477
  "and lowercase letters <code>a-z</code>."
2478
  msgstr ""
2479
 
2480
- #: lib/help.php:472
2481
  msgid ""
2482
  "Your website can run NinjaFirewall and be compliant with the General Data "
2483
  "Protection Regulation (GDPR). For more info, please visit our blog:"
2484
  msgstr ""
2485
 
2486
- #: lib/help.php:486 lib/security_rules.php:47
2487
  msgid "Rules Updates"
2488
  msgstr ""
2489
 
2490
- #: lib/help.php:488
2491
  msgid ""
2492
  "To get the most efficient protection, you can ask NinjaFirewall to "
2493
  "automatically update its security rules."
2494
  msgstr ""
2495
 
2496
- #: lib/help.php:490
2497
  msgid ""
2498
  "Each time a new vulnerability is found in WordPress or one of its plugins/"
2499
  "themes, a new set of security rules will be made available to protect "
2500
  "against such vulnerability if needed."
2501
  msgstr ""
2502
 
2503
- #: lib/help.php:492
2504
  msgid ""
2505
  "Only security rules will be downloaded. If a new version of NinjaFirewall "
2506
  "(including new files, options and features) was available, it would have to "
2507
  "be updated from the dashboard plugins menu as usual."
2508
  msgstr ""
2509
 
2510
- #: lib/help.php:494
2511
  msgid ""
2512
  "We recommend to enable this feature, as it is the <strong>best way to keep "
2513
  "your WordPress secure</strong> against new vulnerabilities."
2514
  msgstr ""
2515
 
2516
- #: lib/help.php:499 lib/security_rules.php:48
2517
  msgid "Rules Editor"
2518
  msgstr ""
2519
 
2520
- #: lib/help.php:501
2521
  msgid ""
2522
  "Besides the \"Firewall Policies\", NinjaFirewall includes also a large set "
2523
  "of built-in rules used to protect your blog against the most common "
@@ -2527,93 +2638,83 @@ msgid ""
2527
  "individually:"
2528
  msgstr ""
2529
 
2530
- #: lib/help.php:503
2531
  msgid ""
2532
  "Check your firewall log and find the rule ID you want to disable (it is "
2533
  "displayed in the <code>RULE</code> column)."
2534
  msgstr ""
2535
 
2536
- #: lib/help.php:504
2537
  msgid ""
2538
  "Select its ID from the enabled rules list below and click the \"Disable it\" "
2539
  "button."
2540
  msgstr ""
2541
 
2542
- #: lib/help.php:506
2543
  msgid ""
2544
  "Note: if the <code>RULE</code> column from your log shows a hyphen <code>-</"
2545
  "code> instead of a number, that means that the rule can be changed in the "
2546
  "\"Firewall Policies\" page."
2547
  msgstr ""
2548
 
2549
- #: lib/help.php:511
2550
- msgid "Credits"
2551
- msgstr ""
2552
-
2553
- #: lib/help.php:513
2554
- msgid ""
2555
- "NinjaFirewall security rules protect against many vulnerabilities. Some of "
2556
- "them were reported by the following companies, individuals or mailing lists:"
2557
- msgstr ""
2558
-
2559
- #: lib/install.php:60
2560
  #, php-format
2561
  msgid ""
2562
  "Error: Your .htaccess file is not writable, please change its permissions: %s"
2563
  msgstr ""
2564
 
2565
- #: lib/install.php:85 ninjafirewall.php:594 ninjafirewall.php:598
2566
  #, php-format
2567
  msgid "Error: wrong parameter value (%s)."
2568
  msgstr ""
2569
 
2570
- #: lib/install.php:92 lib/install.php:168 lib/install.php:189
2571
  #, php-format
2572
  msgid ""
2573
  "Error: The following file is not writable, please change its permissions: %s"
2574
  msgstr ""
2575
 
2576
- #: lib/install.php:115
2577
  #, php-format
2578
  msgid ""
2579
  "NinjaFirewall detected that the requested changes seemed to crash your blog. "
2580
  "%s"
2581
  msgstr ""
2582
 
2583
- #: lib/install.php:116
2584
  msgid ""
2585
  "Changes have been undone. You may need to modify your selection and try "
2586
  "again."
2587
  msgstr ""
2588
 
2589
- #: lib/install.php:126
2590
  #, php-format
2591
  msgid "The website front-end returned: HTTP %s %s."
2592
  msgstr ""
2593
 
2594
- #: lib/install.php:138
2595
  #, php-format
2596
  msgid "The website front-end returned a fatal error: %s."
2597
  msgstr ""
2598
 
2599
- #: lib/install.php:218 lib/install.php:243 lib/install.php:268
2600
- #: lib/install.php:289
2601
  msgid "File is not writable"
2602
  msgstr ""
2603
 
2604
- #: lib/install_default.php:164
2605
  msgid ""
2606
  "Error: The installer cannot download the security rules from wordpress.org "
2607
  "website."
2608
  msgstr ""
2609
 
2610
- #: lib/install_default.php:165
2611
  msgid ""
2612
  "The server may be temporarily down or you may have network connectivity "
2613
  "problems? Please try again in a few minutes."
2614
  msgstr ""
2615
 
2616
- #: lib/install_default.php:166
2617
  msgid ""
2618
  "NinjaFirewall downloads its rules over an HTTPS secure connection. Maybe "
2619
  "your server does not support SSL? You can force NinjaFirewall to use a non-"
@@ -2621,7 +2722,7 @@ msgid ""
2621
  "config.php</strong> file:"
2622
  msgstr ""
2623
 
2624
- #: lib/install_default.php:225
2625
  #, php-format
2626
  msgid ""
2627
  "NinjaFirewall cannot create its <code>nfwlog/</code>log and cache folder; "
@@ -2800,7 +2901,7 @@ msgstr ""
2800
  msgid "Error: unable to write to the %s configuration file"
2801
  msgstr ""
2802
 
2803
- #: lib/logs.php:36 ninjafirewall.php:772
2804
  msgid "Logs"
2805
  msgstr ""
2806
 
@@ -2909,6 +3010,12 @@ msgid ""
2909
  "Administrator to the whitelist\" option is enabled."
2910
  msgstr ""
2911
 
 
 
 
 
 
 
2912
  #: lib/logs_live_log.php:104
2913
  msgid "Refresh rate:"
2914
  msgstr ""
@@ -2949,7 +3056,7 @@ msgstr ""
2949
  msgid "Inclusion and exclusion filters (REQUEST_URI)"
2950
  msgstr ""
2951
 
2952
- #: lib/logs_live_log.php:160 lib/monitoring_file_check.php:391
2953
  msgid "None"
2954
  msgstr ""
2955
 
@@ -2961,7 +3068,7 @@ msgstr ""
2961
  msgid "Must not include"
2962
  msgstr ""
2963
 
2964
- #: lib/logs_live_log.php:164 lib/monitoring_file_check.php:149
2965
  #: lib/monitoring_file_guard.php:89
2966
  msgid "e.g.,"
2967
  msgstr ""
@@ -3004,7 +3111,7 @@ msgstr ""
3004
  msgid "Error: please enter the custom log format."
3005
  msgstr ""
3006
 
3007
- #: lib/monitoring.php:43 ninjafirewall.php:746
3008
  msgid "Monitoring"
3009
  msgstr ""
3010
 
@@ -3020,7 +3127,7 @@ msgstr ""
3020
  msgid "You must create a snapshot first."
3021
  msgstr ""
3022
 
3023
- #: lib/monitoring_file_check.php:96 lib/monitoring_file_check.php:759
3024
  msgid "NinjaFirewall detected that changes were made to your files."
3025
  msgstr ""
3026
 
@@ -3028,300 +3135,307 @@ msgstr ""
3028
  msgid "No changes detected."
3029
  msgstr ""
3030
 
3031
- #: lib/monitoring_file_check.php:135
 
 
 
 
 
 
 
3032
  msgid "Create a snapshot of all files stored in that directory"
3033
  msgstr ""
3034
 
3035
- #: lib/monitoring_file_check.php:143
3036
  #, php-format
3037
  msgid "Default: %s"
3038
  msgstr ""
3039
 
3040
- #: lib/monitoring_file_check.php:148 lib/monitoring_file_guard.php:88
3041
  msgid "Exclude the following files/folders (optional)"
3042
  msgstr ""
3043
 
3044
- #: lib/monitoring_file_check.php:149
3045
  msgid ""
3046
  "Full or partial case-sensitive string(s). Multiple values must be comma-"
3047
  "separated"
3048
  msgstr ""
3049
 
3050
- #: lib/monitoring_file_check.php:155
3051
  msgid "Do not follow symbolic links (default)"
3052
  msgstr ""
3053
 
3054
- #: lib/monitoring_file_check.php:161
3055
  msgid "Create Snapshot"
3056
  msgstr ""
3057
 
3058
- #: lib/monitoring_file_check.php:227
3059
  msgid "Last snapshot"
3060
  msgstr ""
3061
 
3062
- #: lib/monitoring_file_check.php:229
3063
  #, php-format
3064
  msgid "Created on: %s"
3065
  msgstr ""
3066
 
3067
- #: lib/monitoring_file_check.php:230
3068
  #, php-format
3069
  msgid "Total files: %s "
3070
  msgstr ""
3071
 
3072
- #: lib/monitoring_file_check.php:232
3073
  msgid "Directory:"
3074
  msgstr ""
3075
 
3076
- #: lib/monitoring_file_check.php:236
3077
  msgid "Exclusion:"
3078
  msgstr ""
3079
 
3080
- #: lib/monitoring_file_check.php:242
3081
  msgid "Symlinks:"
3082
  msgstr ""
3083
 
3084
- #: lib/monitoring_file_check.php:244
3085
  msgid "follow"
3086
  msgstr ""
3087
 
3088
- #: lib/monitoring_file_check.php:246
3089
  msgid "do not follow"
3090
  msgstr ""
3091
 
3092
- #: lib/monitoring_file_check.php:250
3093
  #, php-format
3094
  msgid "Processing time: %s seconds"
3095
  msgstr ""
3096
 
3097
- #: lib/monitoring_file_check.php:255
3098
  msgid "Download Snapshot"
3099
  msgstr ""
3100
 
3101
- #: lib/monitoring_file_check.php:255
3102
  msgid "Delete Snapshot"
3103
  msgstr ""
3104
 
3105
- #: lib/monitoring_file_check.php:261
3106
  msgid "Last changes"
3107
  msgstr ""
3108
 
3109
- #: lib/monitoring_file_check.php:268 lib/monitoring_file_check.php:767
3110
  #, php-format
3111
  msgid "New files: %s"
3112
  msgstr ""
3113
 
3114
- #: lib/monitoring_file_check.php:269 lib/monitoring_file_check.php:769
3115
  #, php-format
3116
  msgid "Deleted files: %s"
3117
  msgstr ""
3118
 
3119
- #: lib/monitoring_file_check.php:270 lib/monitoring_file_check.php:768
3120
  #, php-format
3121
  msgid "Modified files: %s"
3122
  msgstr ""
3123
 
3124
- #: lib/monitoring_file_check.php:274
3125
  msgid "View Changes"
3126
  msgstr ""
3127
 
3128
- #: lib/monitoring_file_check.php:278
3129
  msgid "Download Changes"
3130
  msgstr ""
3131
 
3132
- #: lib/monitoring_file_check.php:290
3133
  msgid "Click a file to get more info about it."
3134
  msgstr ""
3135
 
3136
- #: lib/monitoring_file_check.php:293
3137
  msgid "New files:"
3138
  msgstr ""
3139
 
3140
- #: lib/monitoring_file_check.php:302 lib/monitoring_file_check.php:355
3141
  msgid "Size"
3142
  msgstr ""
3143
 
3144
- #: lib/monitoring_file_check.php:306 lib/monitoring_file_check.php:360
3145
  msgid "Access"
3146
  msgstr ""
3147
 
3148
- #: lib/monitoring_file_check.php:310 lib/monitoring_file_check.php:365
3149
  msgid "Uid / Gid"
3150
  msgstr ""
3151
 
3152
- #: lib/monitoring_file_check.php:314 lib/monitoring_file_check.php:370
3153
  msgid "Modify"
3154
  msgstr ""
3155
 
3156
- #: lib/monitoring_file_check.php:318 lib/monitoring_file_check.php:375
3157
  msgid "Change"
3158
  msgstr ""
3159
 
3160
- #: lib/monitoring_file_check.php:328
3161
  msgid "Deleted files:"
3162
  msgstr ""
3163
 
3164
- #: lib/monitoring_file_check.php:341
3165
  msgid "Modified files:"
3166
  msgstr ""
3167
 
3168
- #: lib/monitoring_file_check.php:351
3169
  msgid "Old"
3170
  msgstr ""
3171
 
3172
- #: lib/monitoring_file_check.php:352
3173
  msgid "New"
3174
  msgstr ""
3175
 
3176
- #: lib/monitoring_file_check.php:401
3177
  msgid "Scan System For File Changes"
3178
  msgstr ""
3179
 
3180
- #: lib/monitoring_file_check.php:419
3181
  msgid "Options"
3182
  msgstr ""
3183
 
3184
- #: lib/monitoring_file_check.php:426
3185
  #, php-format
3186
  msgid ""
3187
  "It seems that %s is set. Ensure you have another way to run WP-Cron, "
3188
  "otherwise NinjaFirewall scheduled scans will not work."
3189
  msgstr ""
3190
 
3191
- #: lib/monitoring_file_check.php:432
3192
  msgid "Enable scheduled scans"
3193
  msgstr ""
3194
 
3195
- #: lib/monitoring_file_check.php:434
3196
  msgid "No (default)"
3197
  msgstr ""
3198
 
3199
- #: lib/monitoring_file_check.php:435 lib/security_rules_update.php:152
3200
  msgid "Hourly"
3201
  msgstr ""
3202
 
3203
- #: lib/monitoring_file_check.php:436 lib/security_rules_update.php:153
3204
  msgid "Twicedaily"
3205
  msgstr ""
3206
 
3207
- #: lib/monitoring_file_check.php:437 lib/security_rules_update.php:154
3208
  msgid "Daily"
3209
  msgstr ""
3210
 
3211
- #: lib/monitoring_file_check.php:444
3212
  #, php-format
3213
  msgid ""
3214
  "Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
3215
  "and %s second(s)."
3216
  msgstr ""
3217
 
3218
- #: lib/monitoring_file_check.php:451
3219
  msgid ""
3220
  "The next scheduled scan date is in the past! WordPress wp-cron may not be "
3221
  "working or may have been disabled."
3222
  msgstr ""
3223
 
3224
- #: lib/monitoring_file_check.php:459
3225
  msgid "Scheduled scan report"
3226
  msgstr ""
3227
 
3228
- #: lib/monitoring_file_check.php:461
3229
  msgid "Send me a report by email only if changes are detected (default)"
3230
  msgstr ""
3231
 
3232
- #: lib/monitoring_file_check.php:462
3233
  msgid "Always send me a report by email after a scheduled scan"
3234
  msgstr ""
3235
 
3236
- #: lib/monitoring_file_check.php:467
3237
  msgid "Save Scan Options"
3238
  msgstr ""
3239
 
3240
- #: lib/monitoring_file_check.php:479
3241
  msgid "Enter the full path to the directory to be scanned."
3242
  msgstr ""
3243
 
3244
- #: lib/monitoring_file_check.php:486
3245
  #, php-format
3246
  msgid "The directory %s does not exist."
3247
  msgstr ""
3248
 
3249
- #: lib/monitoring_file_check.php:489
3250
  #, php-format
3251
  msgid "The directory %s is not readable."
3252
  msgstr ""
3253
 
3254
- #: lib/monitoring_file_check.php:530
3255
  #, php-format
3256
  msgid "Cannot write to %s."
3257
  msgstr ""
3258
 
3259
- #: lib/monitoring_file_check.php:560
3260
  #, php-format
3261
  msgid "Error : cannot open %s directory."
3262
  msgstr ""
3263
 
3264
- #: lib/monitoring_file_check.php:563
3265
  #, php-format
3266
  msgid "Error : %s directory is not readable."
3267
  msgstr ""
3268
 
3269
- #: lib/monitoring_file_check.php:578
3270
  #, php-format
3271
  msgid "Missing options line %s, please try again."
3272
  msgstr ""
3273
 
3274
- #: lib/monitoring_file_check.php:588
3275
  #, php-format
3276
  msgid "Cannot create %s."
3277
  msgstr ""
3278
 
3279
- #: lib/monitoring_file_check.php:605
3280
  msgid "Error reading old snapshot file."
3281
  msgstr ""
3282
 
3283
- #: lib/monitoring_file_check.php:616
3284
  msgid "Error reading new snapshot file."
3285
  msgstr ""
3286
 
3287
- #: lib/monitoring_file_check.php:732 ninjafirewall.php:416
3288
  msgid "New file"
3289
  msgstr ""
3290
 
3291
- #: lib/monitoring_file_check.php:733 ninjafirewall.php:417
3292
  msgid "Modified file"
3293
  msgstr ""
3294
 
3295
- #: lib/monitoring_file_check.php:734 ninjafirewall.php:418
3296
  msgid "Deleted file"
3297
  msgstr ""
3298
 
3299
- #: lib/monitoring_file_check.php:758
3300
  msgid "[NinjaFirewall] Alert: File Check detection"
3301
  msgstr ""
3302
 
3303
- #: lib/monitoring_file_check.php:761 lib/monitoring_file_check.php:763
3304
- #: lib/monitoring_file_check.php:788 lib/monitoring_file_check.php:790
3305
- #: lib/security_rules_update.php:548 lib/security_rules_update.php:550
3306
- #: lib/utils.php:214 lib/utils.php:839 lib/utils.php:1004 lib/utils.php:1336
3307
  msgid "Blog:"
3308
  msgstr ""
3309
 
3310
- #: lib/monitoring_file_check.php:765 lib/monitoring_file_check.php:792
3311
- #: lib/security_rules_update.php:553
3312
  #, php-format
3313
  msgid "Date: %s"
3314
  msgstr ""
3315
 
3316
- #: lib/monitoring_file_check.php:771
3317
  msgid "See attached file for details."
3318
  msgstr ""
3319
 
3320
- #: lib/monitoring_file_check.php:785
3321
  msgid "[NinjaFirewall] File Check report"
3322
  msgstr ""
3323
 
3324
- #: lib/monitoring_file_check.php:786
3325
  msgid "NinjaFirewall did not detect changes in your files."
3326
  msgstr ""
3327
 
@@ -3366,7 +3480,7 @@ msgstr ""
3366
  msgid "Save File Guard options"
3367
  msgstr ""
3368
 
3369
- #: lib/network.php:24 ninjafirewall.php:1034 ninjafirewall.php:1038
3370
  #, php-format
3371
  msgid "You are not allowed to perform this task (%s)."
3372
  msgstr ""
@@ -3389,7 +3503,8 @@ msgstr ""
3389
  msgid "Save Network options"
3390
  msgstr ""
3391
 
3392
- #: lib/security_rules.php:44 ninjafirewall.php:776
 
3393
  msgid "Security Rules"
3394
  msgstr ""
3395
 
@@ -3491,7 +3606,7 @@ msgstr ""
3491
  msgid "Security rules have been updated."
3492
  msgstr ""
3493
 
3494
- #: lib/security_rules_update.php:91 lib/security_rules_update.php:430
3495
  msgid "No security rules update available."
3496
  msgstr ""
3497
 
@@ -3502,148 +3617,142 @@ msgid ""
3502
  "otherwise NinjaFirewall automatic updates will not work."
3503
  msgstr ""
3504
 
3505
- #: lib/security_rules_update.php:135
3506
  msgid "Automatically update NinjaFirewall security rules"
3507
  msgstr ""
3508
 
3509
- #: lib/security_rules_update.php:147
3510
  msgid "Check for updates"
3511
  msgstr ""
3512
 
3513
- #: lib/security_rules_update.php:150
3514
  msgid "Every 15 minutes"
3515
  msgstr ""
3516
 
3517
- #: lib/security_rules_update.php:151
3518
  msgid "Every 30 minutes"
3519
  msgstr ""
3520
 
3521
- #: lib/security_rules_update.php:166
3522
  msgid ""
3523
  "The next scheduled date is in the past! WordPress wp-cron may not be working "
3524
  "or may have been disabled."
3525
  msgstr ""
3526
 
3527
- #: lib/security_rules_update.php:170
3528
  #, php-format
3529
  msgid ""
3530
  "Next scheduled update will start in approximately %s day, %s hour(s), %s "
3531
  "minute(s) and %s seconds."
3532
  msgstr ""
3533
 
3534
- #: lib/security_rules_update.php:178
3535
  msgid "Notification"
3536
  msgstr ""
3537
 
3538
- #: lib/security_rules_update.php:180
3539
  msgid "Send me a report by email when security rules have been updated."
3540
  msgstr ""
3541
 
3542
- #: lib/security_rules_update.php:181
3543
  msgid ""
3544
  "Reports will be sent to the contact email address defined in the Event "
3545
  "Notifications menu."
3546
  msgstr ""
3547
 
3548
- #: lib/security_rules_update.php:191 lib/security_rules_update.php:206
3549
  msgid "The updates log is currently empty."
3550
  msgstr ""
3551
 
3552
- #: lib/security_rules_update.php:195
3553
  msgid "Updates Log"
3554
  msgstr ""
3555
 
3556
- #: lib/security_rules_update.php:209
3557
  msgid "Log is flushed automatically."
3558
  msgstr ""
3559
 
3560
- #: lib/security_rules_update.php:220
3561
  msgid "Save Updates Options"
3562
  msgstr ""
3563
 
3564
- #: lib/security_rules_update.php:221
3565
  msgid "Check For Updates Now!"
3566
  msgstr ""
3567
 
3568
- #: lib/security_rules_update.php:229
3569
  msgid "Delete Log"
3570
  msgstr ""
3571
 
3572
- #: lib/security_rules_update.php:317
3573
  msgid "Error: Wrong rules format."
3574
  msgstr ""
3575
 
3576
- #: lib/security_rules_update.php:326
3577
  msgid "Error: Unable to unserialize the new rules."
3578
  msgstr ""
3579
 
3580
- #: lib/security_rules_update.php:334
3581
  msgid "Error: Unserialized rules seem corrupted."
3582
  msgstr ""
3583
 
3584
- #: lib/security_rules_update.php:374
3585
  #, php-format
3586
  msgid "Security rules updated to version %s."
3587
  msgstr ""
3588
 
3589
- #: lib/security_rules_update.php:410
3590
- msgid ""
3591
- "Error: Your version of NinjaFirewall is too old and is not compatible with "
3592
- "those rules. Please upgrade it."
3593
- msgstr ""
3594
-
3595
- #: lib/security_rules_update.php:419
3596
  msgid "Error: Unable to retrieve the new rules version."
3597
  msgstr ""
3598
 
3599
- #: lib/security_rules_update.php:437
3600
  #, php-format
3601
  msgid "Error: Server returned a %s HTTP error code (#1)."
3602
  msgstr ""
3603
 
3604
- #: lib/security_rules_update.php:444 lib/security_rules_update.php:510
3605
  msgid "Error: Unable to connect to the remote server"
3606
  msgstr ""
3607
 
3608
- #: lib/security_rules_update.php:474
3609
  #, php-format
3610
  msgid "Error: The new rules versions do not match (%s != %s)."
3611
  msgstr ""
3612
 
3613
- #: lib/security_rules_update.php:488
3614
  #, php-format
3615
  msgid ""
3616
  "Error: The new rules %s digital signature is not correct. Aborting update, "
3617
  "rules may have been tampered with."
3618
  msgstr ""
3619
 
3620
- #: lib/security_rules_update.php:503
3621
  #, php-format
3622
  msgid "Error: Server returned a %s HTTP error code (#2)."
3623
  msgstr ""
3624
 
3625
- #: lib/security_rules_update.php:545
3626
  msgid "[NinjaFirewall] Security rules update"
3627
  msgstr ""
3628
 
3629
- #: lib/security_rules_update.php:546
3630
  msgid "NinjaFirewall security rules have been updated:"
3631
  msgstr ""
3632
 
3633
- #: lib/security_rules_update.php:552
3634
  msgid "Rules version:"
3635
  msgstr ""
3636
 
3637
- #: lib/security_rules_update.php:554
3638
- msgid ""
3639
- "This notification can be turned off from NinjaFirewall \"Rules Update\" page."
3640
  msgstr ""
3641
 
3642
- #: lib/thickbox.php:37
3643
  msgid "Upgrade to Full WAF mode"
3644
  msgstr ""
3645
 
3646
- #: lib/thickbox.php:42
3647
  msgid ""
3648
  "In <strong>Full WAF</strong> mode, all scripts located inside the blog "
3649
  "installation directories and sub-directories are protected by NinjaFirewall, "
@@ -3651,7 +3760,7 @@ msgid ""
3651
  "highest possible level of protection: security without compromise."
3652
  msgstr ""
3653
 
3654
- #: lib/thickbox.php:44
3655
  #, php-format
3656
  msgid ""
3657
  "It works on most websites right out of the box, or may require <a href=\"%s"
@@ -3660,7 +3769,7 @@ msgid ""
3660
  "all."
3661
  msgstr ""
3662
 
3663
- #: lib/thickbox.php:46
3664
  msgid ""
3665
  "If this happened to you, don't worry: you could still run it in "
3666
  "<strong>WordPress WAF</strong> mode. Despite being less powerful than the "
@@ -3668,64 +3777,64 @@ msgid ""
3668
  "higher than other security plugins."
3669
  msgstr ""
3670
 
3671
- #: lib/thickbox.php:52
3672
  msgid "(recommended)"
3673
  msgstr ""
3674
 
3675
- #: lib/thickbox.php:112
3676
  msgid "Select your HTTP server and your PHP server API"
3677
  msgstr ""
3678
 
3679
- #: lib/thickbox.php:122
3680
  msgid "Other webserver + CGI/FastCGI or PHP-FPM"
3681
  msgstr ""
3682
 
3683
- #: lib/thickbox.php:124
3684
  msgid "View PHPINFO"
3685
  msgstr ""
3686
 
3687
- #: lib/thickbox.php:156
3688
  msgid "Select the PHP initialization file supported by your server"
3689
  msgstr ""
3690
 
3691
- #: lib/thickbox.php:168
3692
  msgid "Let NinjaFirewall make the necessary changes (recommended)."
3693
  msgstr ""
3694
 
3695
- #: lib/thickbox.php:169
3696
  msgid "I want to make the changes myself."
3697
  msgstr ""
3698
 
3699
- #: lib/thickbox.php:171
3700
  msgid ""
3701
  "Ensure that you have FTP access to your website so that, if there were a "
3702
  "problem during the installation of the firewall, you could easily undo the "
3703
  "changes."
3704
  msgstr ""
3705
 
3706
- #: lib/thickbox.php:174
3707
  msgid "Please make the changes below, then click on the \"Finish\" button."
3708
  msgstr ""
3709
 
3710
- #: lib/thickbox.php:181
3711
  #, php-format
3712
  msgid ""
3713
  "The %s file must be created, and the following lines of code added to it:"
3714
  msgstr ""
3715
 
3716
- #: lib/thickbox.php:182
3717
  #, php-format
3718
  msgid "The following lines of code must be added to your existing %s file:"
3719
  msgstr ""
3720
 
3721
- #: lib/thickbox.php:242
3722
  msgid ""
3723
  "Log in to your Openlitespeed admin dashboard, click on \"Virtual Host\", "
3724
  "select your domain, add the following instructions to the \"php.ini Override"
3725
  "\" section in the \"General\" tab, and restart Openlitespeed:"
3726
  msgstr ""
3727
 
3728
- #: lib/thickbox.php:249
3729
  msgid ""
3730
  "Important: if one day you wanted to uninstall NinjaFirewall, do not forget "
3731
  "to remove these instructions from your Openlitespeed admin dashboard "
@@ -3733,7 +3842,7 @@ msgid ""
3733
  "could not do it for you."
3734
  msgstr ""
3735
 
3736
- #: lib/thickbox.php:267
3737
  msgid "Finish"
3738
  msgstr ""
3739
 
@@ -3745,181 +3854,119 @@ msgstr ""
3745
  msgid "NinjaFirewall has blocked an attempt to create a user account:"
3746
  msgstr ""
3747
 
3748
- #: lib/utils.php:215 lib/utils.php:1009
3749
  msgid "Username:"
3750
  msgstr ""
3751
 
3752
- #: lib/utils.php:216 lib/utils.php:1014 lib/utils.php:1337
3753
  msgid "User IP:"
3754
  msgstr ""
3755
 
3756
- #: lib/utils.php:219 lib/utils.php:840 lib/utils.php:1017 lib/utils.php:1340
3757
- msgid "Date:"
3758
- msgstr ""
3759
-
3760
- #: lib/utils.php:228 lib/utils.php:1026 lib/utils.php:1332
3761
  msgid "A PHP backtrace has been attached to this message for your convenience."
3762
  msgstr ""
3763
 
3764
- #: lib/utils.php:251 lib/utils.php:252 lib/utils.php:1051 lib/utils.php:1052
3765
  msgid "You are not allowed to perform this task."
3766
  msgstr ""
3767
 
3768
- #: lib/utils.php:519 lib/utils.php:523
3769
  msgid "NinjaFirewall error"
3770
  msgstr ""
3771
 
3772
- #: lib/utils.php:520
3773
  #, php-format
3774
  msgid ""
3775
  "%s directory cannot be created. Please review your installation and ensure "
3776
  "that %s is writable."
3777
  msgstr ""
3778
 
3779
- #: lib/utils.php:524
3780
  #, php-format
3781
  msgid ""
3782
  "%s directory is read-only. Please review your installation and ensure that "
3783
  "%s is writable."
3784
  msgstr ""
3785
 
3786
- #: lib/utils.php:543
3787
  msgid "unknown error"
3788
  msgstr ""
3789
 
3790
- #: lib/utils.php:545
3791
  msgid "NinjaFirewall fatal error:"
3792
  msgstr ""
3793
 
3794
- #: lib/utils.php:546
3795
  msgid "Review your installation, your site is not protected."
3796
  msgstr ""
3797
 
3798
- #: lib/utils.php:563
3799
  msgid "Alert: WordPress console login"
3800
  msgstr ""
3801
 
3802
- #: lib/utils.php:565
3803
- msgid "-Blog:"
3804
- msgstr ""
3805
-
3806
- #: lib/utils.php:569
3807
  msgid "Someone just logged in to your WordPress admin console:"
3808
  msgstr ""
3809
 
3810
- #: lib/utils.php:570
3811
- msgid "-User:"
3812
- msgstr ""
3813
-
3814
- #: lib/utils.php:571
3815
- msgid "-IP:"
3816
- msgstr ""
3817
-
3818
- #: lib/utils.php:572
3819
- msgid "-Date:"
3820
- msgstr ""
3821
-
3822
- #: lib/utils.php:575
3823
  msgid "Support forum"
3824
  msgstr ""
3825
 
3826
- #: lib/utils.php:636 lib/utils.php:663
3827
  msgid "Forbidden access"
3828
  msgstr ""
3829
 
3830
- #: lib/utils.php:682
3831
  #, php-format
3832
  msgid ""
3833
  "<strong>ERROR</strong>: Invalid username or password.<br /><a href=\"%s"
3834
  "\">Lost your password</a>?"
3835
  msgstr ""
3836
 
3837
- #: lib/utils.php:716
3838
- msgid "Plugin"
3839
- msgstr ""
3840
-
3841
- #: lib/utils.php:716 lib/utils.php:720
3842
- msgid "uploaded"
3843
- msgstr ""
3844
-
3845
- #: lib/utils.php:716 lib/utils.php:720
3846
- msgid "installed"
3847
- msgstr ""
3848
-
3849
- #: lib/utils.php:716 lib/utils.php:720
3850
- msgid "activated"
3851
- msgstr ""
3852
-
3853
- #: lib/utils.php:717
3854
- msgid "updated"
3855
- msgstr ""
3856
-
3857
- #: lib/utils.php:717
3858
- msgid "deactivated"
3859
- msgstr ""
3860
-
3861
- #: lib/utils.php:717 lib/utils.php:721
3862
- msgid "deleted"
3863
- msgstr ""
3864
-
3865
- #: lib/utils.php:717 lib/utils.php:721
3866
- msgid "Name"
3867
- msgstr ""
3868
-
3869
- #: lib/utils.php:720
3870
- msgid "Theme"
3871
- msgstr ""
3872
-
3873
- #: lib/utils.php:724
3874
- msgid "upgraded"
3875
- msgstr ""
3876
-
3877
- #: lib/utils.php:732
3878
- msgid "[NinjaFirewall] Alert:"
3879
- msgstr ""
3880
-
3881
- #: lib/utils.php:738
3882
- msgid "NinjaFirewall has detected the following activity on your account:"
3883
- msgstr ""
3884
-
3885
- #: lib/utils.php:835
3886
  msgid "[NinjaFirewall] Alert: Database changes detected"
3887
  msgstr ""
3888
 
3889
- #: lib/utils.php:836
3890
  msgid ""
3891
  "NinjaFirewall has detected that one or more administrator accounts were "
3892
  "modified in the database:"
3893
  msgstr ""
3894
 
3895
- #: lib/utils.php:841
3896
  #, php-format
3897
  msgid "Total administrators : %s"
3898
  msgstr ""
3899
 
3900
- #: lib/utils.php:850
3901
  msgid ""
3902
  "If you cannot see any modifications in the above fields, it is possible that "
3903
  "the administrator password was changed."
3904
  msgstr ""
3905
 
3906
- #: lib/utils.php:985
3907
  msgid "Blocked privilege escalation attempt"
3908
  msgstr ""
3909
 
3910
- #: lib/utils.php:1002
3911
  msgid ""
3912
  "NinjaFirewall has blocked an attempt to modify a user capability by someone "
3913
  "who does not have administrative privileges:"
3914
  msgstr ""
3915
 
3916
- #: lib/utils.php:1063
 
 
 
 
 
 
3917
  msgid ""
3918
  "NinjaFirewall brute-force protection is enabled and you are temporarily "
3919
  "whitelisted."
3920
  msgstr ""
3921
 
3922
- #: lib/utils.php:1078
3923
  #, php-format
3924
  msgid ""
3925
  "Hey, it seems that you've been using NinjaFirewall for some time. If you "
@@ -3928,77 +3975,71 @@ msgid ""
3928
  "rate it. Thank you!"
3929
  msgstr ""
3930
 
3931
- #: lib/utils.php:1304
3932
  msgid ""
3933
  "The attempt was blocked and the option was reversed to its original value."
3934
  msgstr ""
3935
 
3936
- #: lib/utils.php:1309
3937
  msgid "Attempt to modify WordPress settings"
3938
  msgstr ""
3939
 
3940
- #: lib/utils.php:1310
3941
  msgid ""
3942
  "NinjaFirewall has blocked an attempt to modify some important WordPress "
3943
  "settings by a user that does not have administrative privileges:"
3944
  msgstr ""
3945
 
3946
- #: lib/utils.php:1311 lib/utils.php:1320
3947
  #, php-format
3948
  msgid "Option: %s"
3949
  msgstr ""
3950
 
3951
- #: lib/utils.php:1312
3952
  #, php-format
3953
  msgid "Original value: %s"
3954
  msgstr ""
3955
 
3956
- #: lib/utils.php:1313
3957
  #, php-format
3958
  msgid "Modified value: %s"
3959
  msgstr ""
3960
 
3961
- #: lib/utils.php:1314 lib/utils.php:1322
3962
  #, php-format
3963
  msgid "Action taken: %s"
3964
  msgstr ""
3965
 
3966
- #: lib/utils.php:1318
3967
  msgid "Code injection attempt in WordPress options table"
3968
  msgstr ""
3969
 
3970
- #: lib/utils.php:1319
3971
  msgid ""
3972
  "NinjaFirewall has blocked an attempt to inject code in the WordPress options "
3973
  "table by a user that does not have administrative privileges:"
3974
  msgstr ""
3975
 
3976
- #: lib/utils.php:1321
3977
  #, php-format
3978
  msgid "Code: %s"
3979
  msgstr ""
3980
 
3981
- #: lib/utils.php:1342
3982
- msgid ""
3983
- "This protection (and notification) can be turned off from NinjaFirewall "
3984
- "\"Firewall Policies\" page."
3985
- msgstr ""
3986
-
3987
- #: lib/utils.php:1377
3988
  #, php-format
3989
  msgid "Error, cannot create the %s folder."
3990
  msgstr ""
3991
 
3992
- #: lib/utils.php:1377 lib/utils.php:1385 lib/utils.php:1393
3993
  msgid "Check your server permissions and try again."
3994
  msgstr ""
3995
 
3996
- #: lib/utils.php:1385
3997
  #, php-format
3998
  msgid "Error, the %s folder is not writable."
3999
  msgstr ""
4000
 
4001
- #: lib/utils.php:1393
4002
  #, php-format
4003
  msgid "Error, cannot write %s."
4004
  msgstr ""
@@ -4372,131 +4413,131 @@ msgstr ""
4372
  msgid "Cannot retrieve user rules from database (#4)"
4373
  msgstr ""
4374
 
4375
- #: ninjafirewall.php:109
4376
  msgid ""
4377
  "You do not have \"unfiltered_html\" capability. Please enable it in order to "
4378
  "run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
4379
  "in your wp-config.php script)."
4380
  msgstr ""
4381
 
4382
- #: ninjafirewall.php:116
4383
  #, php-format
4384
  msgid ""
4385
  "NinjaFirewall requires WordPress 3.3 or greater but your current version is "
4386
  "%s."
4387
  msgstr ""
4388
 
4389
- #: ninjafirewall.php:120
4390
  #, php-format
4391
  msgid ""
4392
  "NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
4393
  msgstr ""
4394
 
4395
- #: ninjafirewall.php:124
4396
  #, php-format
4397
  msgid "NinjaFirewall requires the PHP %s extension."
4398
  msgstr ""
4399
 
4400
- #: ninjafirewall.php:128
4401
  msgid ""
4402
  "You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
4403
  "5.3.0 (see http://php.net/safe-mode)."
4404
  msgstr ""
4405
 
4406
- #: ninjafirewall.php:132
4407
  msgid "You are not allowed to activate NinjaFirewall."
4408
  msgstr ""
4409
 
4410
- #: ninjafirewall.php:136
4411
  msgid "NinjaFirewall is not compatible with Microsoft Windows."
4412
  msgstr ""
4413
 
4414
- #: ninjafirewall.php:288
4415
  msgid ""
4416
  "All fields will be restored to their default values and any changes you made "
4417
  "will be lost. Continue?"
4418
  msgstr ""
4419
 
4420
- #: ninjafirewall.php:292
4421
  msgid "Missing security nonce, try to reload the page."
4422
  msgstr ""
4423
 
4424
- #: ninjafirewall.php:294
4425
  msgid "Please select the HTTP server in the list."
4426
  msgstr ""
4427
 
4428
- #: ninjafirewall.php:298
4429
  msgid ""
4430
  "This action will restore the selected configuration file and will override "
4431
  "all your current firewall options, policies and rules. Continue?"
4432
  msgstr ""
4433
 
4434
- #: ninjafirewall.php:302
4435
  msgid ""
4436
  "Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
4437
  "hyphen [-] or an underscore [_] will be removed from the filename and "
4438
  "replaced with the substitution character. Continue?"
4439
  msgstr ""
4440
 
4441
- #: ninjafirewall.php:304
4442
  msgid ""
4443
  "Ensure that you can access your admin console over HTTPS before enabling "
4444
  "this option, otherwise you will lock yourself out of your site. Continue?"
4445
  msgstr ""
4446
 
4447
- #: ninjafirewall.php:308
4448
  msgid "Delete the current snapshot ?"
4449
  msgstr ""
4450
 
4451
- #: ninjafirewall.php:312
4452
  msgid "Invalid character."
4453
  msgstr ""
4454
 
4455
- #: ninjafirewall.php:314
4456
  msgid "\"admin\" is not acceptable, please choose another user name."
4457
  msgstr ""
4458
 
4459
- #: ninjafirewall.php:316
4460
  msgid "Please enter max 1024 character only."
4461
  msgstr ""
4462
 
4463
- #: ninjafirewall.php:318
4464
  msgid "Select when to enable the login protection."
4465
  msgstr ""
4466
 
4467
- #: ninjafirewall.php:320
4468
  msgid "Enter a name and a password for the HTTP authentication."
4469
  msgstr ""
4470
 
4471
- #: ninjafirewall.php:324
4472
  msgid "Your public key is not valid."
4473
  msgstr ""
4474
 
4475
- #: ninjafirewall.php:328
4476
  msgid "No traffic yet, please wait"
4477
  msgstr ""
4478
 
4479
- #: ninjafirewall.php:330
4480
  msgid "seconds..."
4481
  msgstr ""
4482
 
4483
- #: ninjafirewall.php:332
4484
  msgid "Error: Live Log did not receive the expected response from your server:"
4485
  msgstr ""
4486
 
4487
- #: ninjafirewall.php:334
4488
  msgid "Error: URL does not seem to exist (404 Not Found):"
4489
  msgstr ""
4490
 
4491
- #: ninjafirewall.php:336
4492
  msgid "Error: Cannot find your log file. Try to reload this page."
4493
  msgstr ""
4494
 
4495
- #: ninjafirewall.php:338
4496
  msgid "Error: The HTTP server returned the following error code:"
4497
  msgstr ""
4498
 
4499
- #: ninjafirewall.php:579
4500
  msgid "Error: Security nonces do not match. Reload the page and try again."
4501
  msgstr ""
4502
 
@@ -4509,66 +4550,66 @@ msgstr ""
4509
  msgid "Error: missing parameter (%s)."
4510
  msgstr ""
4511
 
4512
- #: ninjafirewall.php:734
4513
  msgid "NinjaFirewall: Dashboard"
4514
  msgstr ""
4515
 
4516
- #: ninjafirewall.php:738
4517
  msgid "NinjaFirewall: Firewall Options"
4518
  msgstr ""
4519
 
4520
- #: ninjafirewall.php:742
4521
  msgid "NinjaFirewall: Firewall Policies"
4522
  msgstr ""
4523
 
4524
- #: ninjafirewall.php:746
4525
  msgid "NinjaFirewall: Monitoring"
4526
  msgstr ""
4527
 
4528
- #: ninjafirewall.php:756
4529
  msgid "NinjaFirewall: Anti-Malware"
4530
  msgstr ""
4531
 
4532
- #: ninjafirewall.php:760
4533
  msgid "NinjaFirewall: Network"
4534
  msgstr ""
4535
 
4536
- #: ninjafirewall.php:764
4537
  msgid "NinjaFirewall: Event Notifications"
4538
  msgstr ""
4539
 
4540
- #: ninjafirewall.php:768
4541
  msgid "NinjaFirewall: Log-in Protection"
4542
  msgstr ""
4543
 
4544
- #: ninjafirewall.php:772
4545
  msgid "NinjaFirewall: Logs"
4546
  msgstr ""
4547
 
4548
- #: ninjafirewall.php:776
4549
  msgid "NinjaFirewall: Security Rules"
4550
  msgstr ""
4551
 
4552
- #: ninjafirewall.php:820
4553
  msgid "NinjaFirewall Settings"
4554
  msgstr ""
4555
 
4556
- #: ninjafirewall.php:828
4557
  msgid "NinjaFirewall is enabled"
4558
  msgstr ""
4559
 
4560
- #: ninjafirewall.php:969
4561
  msgid "Access Restricted"
4562
  msgstr ""
4563
 
4564
- #: ninjafirewall.php:975
4565
  msgid "Settings"
4566
  msgstr ""
4567
 
4568
- #: ninjafirewall.php:976
4569
  msgid "Upgrade to Premium"
4570
  msgstr ""
4571
 
4572
- #: ninjafirewall.php:977
4573
  msgid "Rate it!"
4574
  msgstr ""
2
  msgid ""
3
  msgstr ""
4
  "Project-Id-Version: Stable (latest release)\n"
5
+ "POT-Creation-Date: 2020-01-18 16:33+0700\n"
6
  "PO-Revision-Date: 2018-04-05 22:52+0700\n"
7
  "Last-Translator: NinTechNet <contact@nintechnet.com>\n"
8
  "Language-Team: \n"
18
  "X-Poedit-SearchPath-0: .\n"
19
  "X-Poedit-SearchPathExcluded-0: /languages\n"
20
 
21
+ #: lib/anti_malware.php:24 ninjafirewall.php:774
22
  msgid "Anti-Malware"
23
  msgstr ""
24
 
76
  msgid "NinjaFirewall (WP Edition)"
77
  msgstr ""
78
 
79
+ #: lib/dashboard.php:120 ninjafirewall.php:752
80
  msgid "Dashboard"
81
  msgstr ""
82
 
88
  msgid "About..."
89
  msgstr ""
90
 
91
+ #: lib/dashboard.php:134
92
+ msgid "Thank you for using NinjaFirewall."
93
+ msgstr ""
94
+
95
+ #: lib/dashboard.php:135
96
+ #, php-format
97
+ msgid ""
98
+ "Every page of NinjaFirewall has a contextual help: whenever you need help "
99
+ "about an option or feature, click on the %s tab located in the upper right "
100
+ "corner of the corresponding page."
101
+ msgstr ""
102
+
103
+ #: lib/dashboard.php:135
104
+ msgid "Help"
105
+ msgstr ""
106
+
107
+ #: lib/dashboard.php:137
108
+ msgid "Got it!"
109
+ msgstr ""
110
+
111
+ #: lib/dashboard.php:153 lib/help.php:36
112
  msgid "Firewall Dashboard"
113
  msgstr ""
114
 
115
+ #: lib/dashboard.php:162
116
  msgid ""
117
  "It seems that you may have another instance of NinjaFirewall running in a "
118
  "parent directory. Make sure to follow these instructions:"
119
  msgstr ""
120
 
121
+ #: lib/dashboard.php:164
122
  msgid ""
123
  "Temporarily disable the firewall in the parent folder by renaming its PHP "
124
  "INI or .htaccess file."
125
  msgstr ""
126
 
127
+ #: lib/dashboard.php:166
128
  msgid "Install NinjaFirewall on this site in Full WAF mode."
129
  msgstr ""
130
 
131
+ #: lib/dashboard.php:168
132
  msgid ""
133
  "Restore the PHP INI or .htaccess in the parent folder to re-enable the "
134
  "firewall."
135
  msgstr ""
136
 
137
+ #: lib/dashboard.php:174
138
  msgid "Unknown error"
139
  msgstr ""
140
 
141
+ #: lib/dashboard.php:178 lib/dashboard.php:186
142
  msgid "Firewall"
143
  msgstr ""
144
 
145
+ #: lib/dashboard.php:187 lib/dashboard.php:323 lib/firewall_options.php:64
146
  #: lib/login_protection.php:203 lib/logs_live_log.php:101
147
+ #: lib/monitoring_file_guard.php:70 lib/security_rules_update.php:138
148
  msgid "Enabled"
149
  msgstr ""
150
 
151
+ #: lib/dashboard.php:194
152
  msgid "Mode"
153
  msgstr ""
154
 
155
+ #: lib/dashboard.php:199 lib/dashboard.php:205
156
  #, php-format
157
  msgid "NinjaFirewall is running in %s mode."
158
  msgstr ""
159
 
160
+ #: lib/dashboard.php:199
161
  msgid "WordPress WAF"
162
  msgstr ""
163
 
164
+ #: lib/dashboard.php:201
165
  #, php-format
166
  msgid ""
167
  "For better protection, <a %s>click here</a> to enable its Full WAF mode."
168
  msgstr ""
169
 
170
+ #: lib/dashboard.php:201
171
  msgid "Click to install NinjaFirewall in Full WAF mode."
172
  msgstr ""
173
 
174
+ #: lib/dashboard.php:205
175
  msgid "Full WAF"
176
  msgstr ""
177
 
178
+ #: lib/dashboard.php:218 lib/firewall_options.php:76 lib/help.php:77
179
  msgid "Debugging mode"
180
  msgstr ""
181
 
182
+ #: lib/dashboard.php:219
183
  msgid "Enabled."
184
  msgstr ""
185
 
186
+ #: lib/dashboard.php:219
187
  msgid "Click here to turn Debugging Mode off"
188
  msgstr ""
189
 
190
+ #: lib/dashboard.php:225
191
  msgid "Edition"
192
  msgstr ""
193
 
194
+ #: lib/dashboard.php:226
195
+ msgid ""
196
+ "Need more security? Explore our supercharged premium version: NinjaFirewall "
197
+ "(WP+ Edition)"
198
  msgstr ""
199
 
200
+ #: lib/dashboard.php:229
201
  msgid "Version"
202
  msgstr ""
203
 
204
+ #: lib/dashboard.php:230
205
  msgid "Security rules:"
206
  msgstr ""
207
 
208
+ #: lib/dashboard.php:234
209
  msgid "PHP SAPI"
210
  msgstr ""
211
 
212
+ #: lib/dashboard.php:252
213
  msgid "Updates"
214
  msgstr ""
215
 
216
+ #: lib/dashboard.php:253
217
  msgid "Security rules updates are disabled."
218
  msgstr ""
219
 
220
+ #: lib/dashboard.php:253
221
  msgid ""
222
  "If you want your blog to be protected against the latest threats, enable "
223
  "automatic security rules updates."
224
  msgstr ""
225
 
226
+ #: lib/dashboard.php:261 lib/dashboard.php:269
227
  msgid "Admin user"
228
  msgstr ""
229
 
230
+ #: lib/dashboard.php:262
231
  #, php-format
232
  msgid ""
233
  "You are not whitelisted. Ensure that the \"Do not block WordPress "
236
  "your administration dashboard."
237
  msgstr ""
238
 
239
+ #: lib/dashboard.php:270
240
  msgid "You are whitelisted by the firewall."
241
  msgstr ""
242
 
243
+ #: lib/dashboard.php:277
244
  msgid "Restrictions"
245
  msgstr ""
246
 
247
+ #: lib/dashboard.php:278
248
  msgid "Access to NinjaFirewall is restricted to specific users."
249
  msgstr ""
250
 
251
+ #: lib/dashboard.php:289
252
  msgid "User session"
253
  msgstr ""
254
 
255
+ #: lib/dashboard.php:290
256
  msgid ""
257
  "It seems that the user session set by NinjaFirewall was not found by the "
258
  "firewall script."
259
  msgstr ""
260
 
261
+ #: lib/dashboard.php:298
262
  #, php-format
263
  msgid ""
264
  "the public key is invalid. Please <a href=\"%s\">check your configuration</"
265
  "a>."
266
  msgstr ""
267
 
268
+ #: lib/dashboard.php:302
269
  msgid "No IP address restriction."
270
  msgstr ""
271
 
272
+ #: lib/dashboard.php:305
273
  #, php-format
274
  msgid "IP address %s is allowed to access NinjaFirewall's log on this server."
275
  msgstr ""
276
 
277
+ #: lib/dashboard.php:308
278
  #, php-format
279
  msgid ""
280
  "the whitelisted IP is not valid. Please <a href=\"%s\">check your "
281
  "configuration</a>."
282
  msgstr ""
283
 
284
+ #: lib/dashboard.php:313 lib/help.php:460 lib/logs_firewall_log.php:194
285
  #: lib/wpplus.php:170
286
  msgid "Centralized Logging"
287
  msgstr ""
288
 
289
+ #: lib/dashboard.php:317 lib/security_rules_update.php:415
290
  #, php-format
291
  msgid "Error: %s"
292
  msgstr ""
293
 
294
+ #: lib/dashboard.php:332
295
  msgid "Source IP"
296
  msgstr ""
297
 
298
+ #: lib/dashboard.php:333
299
  #, php-format
300
  msgid "You have a private IP : %s"
301
  msgstr ""
302
 
303
+ #: lib/dashboard.php:333
304
  #, php-format
305
  msgid ""
306
  "If your site is behind a reverse proxy or a load balancer, ensure that you "
308
  "otherwise use the NinjaFirewall %s configuration file."
309
  msgstr ""
310
 
311
+ #: lib/dashboard.php:341 lib/dashboard.php:351
312
  msgid "CDN detection"
313
  msgstr ""
314
 
315
+ #: lib/dashboard.php:342
316
  #, php-format
317
  msgid ""
318
  "%s detected: you seem to be using Cloudflare CDN services. Ensure that you "
320
  "otherwise use the NinjaFirewall %s configuration file."
321
  msgstr ""
322
 
323
+ #: lib/dashboard.php:352
324
  #, php-format
325
  msgid ""
326
  "%s detected: you seem to be using Incapsula CDN services. Ensure that you "
328
  "otherwise use the NinjaFirewall %s configuration file."
329
  msgstr ""
330
 
331
+ #: lib/dashboard.php:361 lib/dashboard.php:370
332
  msgid "Log dir"
333
  msgstr ""
334
 
335
+ #: lib/dashboard.php:362 lib/dashboard.php:371
336
  #, php-format
337
  msgid "%s directory is not writable! Please chmod it to 0777 or equivalent."
338
  msgstr ""
339
 
340
+ #: lib/dashboard.php:379
341
  msgid "Optional configuration file"
342
  msgstr ""
343
 
344
+ #: lib/dashboard.php:386
345
  msgid "MySQLi link identifier"
346
  msgstr ""
347
 
348
+ #: lib/dashboard.php:387
349
  msgid "A MySQLi link identifier was detected in your <code>.htninja</code>."
350
  msgstr ""
351
 
352
+ #: lib/dashboard.php:393
353
  msgid "Help &amp; configuration"
354
  msgstr ""
355
 
363
  "themes:"
364
  msgstr ""
365
 
366
+ #: lib/dashboard_about.php:31 lib/help.php:508
367
  msgid "GDPR Compliance"
368
  msgstr ""
369
 
433
  msgid "Select monthly stats to view..."
434
  msgstr ""
435
 
436
+ #: lib/event_notifications.php:34 lib/help.php:370 ninjafirewall.php:782
437
  msgid "Event Notifications"
438
  msgstr ""
439
 
449
  msgid "WordPress admin dashboard"
450
  msgstr ""
451
 
452
+ #: lib/event_notifications.php:55 lib/event_notifications.php:118
453
+ #: lib/event_notifications.php:138
454
  msgid "Send me an alert whenever"
455
  msgstr ""
456
 
527
  msgid "Updates WordPress (default)"
528
  msgstr ""
529
 
530
+ #: lib/event_notifications.php:115
531
+ msgid "Security updates"
532
  msgstr ""
533
 
534
+ #: lib/event_notifications.php:120
535
  msgid ""
536
+ "An important security update is available for a plugin, theme or WordPress "
537
  "(default)"
538
  msgstr ""
539
 
540
+ #: lib/event_notifications.php:135
541
+ msgid "Administrator account"
542
+ msgstr ""
543
+
544
+ #: lib/event_notifications.php:140
545
+ msgid ""
546
+ "An administrator account is created, modified or deleted in the database "
547
+ "(default)"
548
  msgstr ""
549
 
550
+ #: lib/event_notifications.php:147
551
  msgid "Daily report"
552
  msgstr ""
553
 
554
+ #: lib/event_notifications.php:150
555
  msgid "Send me a daily activity report"
556
  msgstr ""
557
 
558
+ #: lib/event_notifications.php:152 lib/event_notifications.php:164
559
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
560
  #: lib/firewall_policies.php:25 lib/login_protection.php:309
561
  #: lib/login_protection.php:324 lib/login_protection.php:345
563
  msgid "Yes"
564
  msgstr ""
565
 
566
+ #: lib/event_notifications.php:152 lib/event_notifications.php:164
567
  #: lib/firewall_options.php:78 lib/firewall_options.php:113
568
  #: lib/firewall_policies.php:26 lib/login_protection.php:309
569
  #: lib/login_protection.php:324 lib/login_protection.php:345
571
  msgid "No"
572
  msgstr ""
573
 
574
+ #: lib/event_notifications.php:159
575
  msgid "Log"
576
  msgstr ""
577
 
578
+ #: lib/event_notifications.php:162
579
  msgid "Write all events to the firewall log"
580
  msgstr ""
581
 
582
+ #: lib/event_notifications.php:176
583
  msgid "PHP backtrace"
584
  msgstr ""
585
 
586
+ #: lib/event_notifications.php:179
587
  msgid "Attach a PHP backtrace to important notifications"
588
  msgstr ""
589
 
590
+ #: lib/event_notifications.php:182
591
  msgid "Disable backtrace"
592
  msgstr ""
593
 
594
+ #: lib/event_notifications.php:183
595
  msgid "Low verbosity"
596
  msgstr ""
597
 
598
+ #: lib/event_notifications.php:184
599
  msgid "Medium verbosity (default)"
600
  msgstr ""
601
 
602
+ #: lib/event_notifications.php:185
603
  msgid "High verbosity"
604
  msgstr ""
605
 
606
+ #: lib/event_notifications.php:187
607
  #, php-format
608
  msgid "<a href=\"%s\">Consult our blog</a> for more info."
609
  msgstr ""
610
 
611
+ #: lib/event_notifications.php:197 lib/event_notifications.php:227
612
  msgid "Contact email"
613
  msgstr ""
614
 
615
+ #: lib/event_notifications.php:200 lib/event_notifications.php:230
616
  msgid "Alerts should be sent to"
617
  msgstr ""
618
 
619
+ #: lib/event_notifications.php:209 lib/event_notifications.php:235
620
  msgid ""
621
  "Multiple recipients must be comma-separated (e.g., <code>joe@example.org,"
622
  "alice@example.org</code>)."
623
  msgstr ""
624
 
625
+ #: lib/event_notifications.php:232
626
  msgid "Only to me, the Super Admin"
627
  msgstr ""
628
 
629
+ #: lib/event_notifications.php:232
630
  msgid "default"
631
  msgstr ""
632
 
633
+ #: lib/event_notifications.php:233
634
  msgid "To the administrator of the site where originated the alert"
635
  msgstr ""
636
 
637
+ #: lib/event_notifications.php:234
638
  msgid "Other(s):"
639
  msgstr ""
640
 
641
+ #: lib/event_notifications.php:246
642
  msgid "Save Event Notifications"
643
  msgstr ""
644
 
645
+ #: lib/event_notifications.php:477
646
  msgid "[NinjaFirewall] Daily Activity Report"
647
  msgstr ""
648
 
649
+ #: lib/event_notifications.php:487
650
  #, php-format
651
  msgid "Daily activity report for: %s"
652
  msgstr ""
653
 
654
+ #: lib/event_notifications.php:488
655
  msgid "Date Range Processed: Yesterday"
656
  msgstr ""
657
 
658
+ #: lib/event_notifications.php:490
659
  msgid "Blocked threats:"
660
  msgstr ""
661
 
662
+ #: lib/event_notifications.php:492
663
  msgid "critical:"
664
  msgstr ""
665
 
666
+ #: lib/event_notifications.php:493
667
  msgid "high:"
668
  msgstr ""
669
 
670
+ #: lib/event_notifications.php:494
671
  msgid "medium:"
672
  msgstr ""
673
 
674
+ #: lib/event_notifications.php:496
675
  msgid "Blocked brute-force attacks:"
676
  msgstr ""
677
 
678
+ #: lib/event_notifications.php:497 lib/event_updates.php:216 lib/utils.php:788
679
  msgid ""
680
  "This notification can be turned off from NinjaFirewall \"Event Notifications"
681
  "\" page."
682
  msgstr ""
683
 
684
+ #: lib/event_notifications.php:501 lib/event_updates.php:218 lib/events.php:225
685
+ #: lib/firewall_options.php:525 lib/monitoring_file_check.php:777
686
+ #: lib/monitoring_file_check.php:798 lib/security_rules_update.php:561
687
  msgid "Support forum:"
688
  msgstr ""
689
 
690
+ #: lib/event_notifications.php:504 lib/event_updates.php:221 lib/events.php:228
691
+ #: lib/firewall_options.php:528 lib/monitoring_file_check.php:780
692
+ #: lib/monitoring_file_check.php:801 lib/security_rules_update.php:564
693
+ #: lib/utils.php:235 lib/utils.php:584 lib/utils.php:793 lib/utils.php:971
694
+ #: lib/utils.php:1284
695
  #, php-format
696
  msgid ""
697
  "Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): "
698
  "%s"
699
  msgstr ""
700
 
701
+ #: lib/event_updates.php:157
702
+ msgid "[NinjaFirewall] Security update available"
703
+ msgstr ""
704
+
705
+ #: lib/event_updates.php:159
706
+ msgid ""
707
+ "NinjaFirewall has detected that there are security updates available for "
708
+ "your website:"
709
+ msgstr ""
710
+
711
+ #: lib/event_updates.php:160 lib/utils.php:219 lib/utils.php:777
712
+ #: lib/utils.php:954 lib/utils.php:1277
713
+ msgid "Date:"
714
+ msgstr ""
715
+
716
+ #: lib/event_updates.php:163 lib/event_updates.php:165
717
+ #, php-format
718
+ msgid "Blog: %s"
719
+ msgstr ""
720
+
721
+ #: lib/event_updates.php:171 lib/event_updates.php:185
722
+ #: lib/event_updates.php:202
723
+ #, php-format
724
+ msgid "Your version: %s"
725
+ msgstr ""
726
+
727
+ #: lib/event_updates.php:172 lib/event_updates.php:186
728
+ #: lib/event_updates.php:203
729
+ #, php-format
730
+ msgid "New version: %s"
731
+ msgstr ""
732
+
733
+ #: lib/event_updates.php:174 lib/event_updates.php:189
734
+ #: lib/event_updates.php:206
735
+ msgid "Severity: This is an important security update"
736
+ msgstr ""
737
+
738
+ #: lib/event_updates.php:176 lib/event_updates.php:191
739
+ #: lib/event_updates.php:208
740
+ msgid "Severity: **This is a critical security update**"
741
+ msgstr ""
742
+
743
+ #: lib/event_updates.php:184
744
+ #, php-format
745
+ msgid "Plugin: %s"
746
+ msgstr ""
747
+
748
+ #: lib/event_updates.php:201
749
+ #, php-format
750
+ msgid "Theme: %s"
751
+ msgstr ""
752
+
753
+ #: lib/event_updates.php:214
754
+ msgid "Don't leave your blog at risk, make sure to update as soon as possible."
755
+ msgstr ""
756
+
757
+ #: lib/events.php:27
758
+ msgid "Name:"
759
+ msgstr ""
760
+
761
+ #: lib/events.php:28
762
+ msgid "Plugin"
763
+ msgstr ""
764
+
765
+ #: lib/events.php:29
766
+ msgid "Theme"
767
+ msgstr ""
768
+
769
+ #: lib/events.php:30
770
+ msgid "Version:"
771
+ msgstr ""
772
+
773
+ #: lib/events.php:40 lib/events.php:73 lib/events.php:77 lib/events.php:136
774
+ msgid "activated"
775
+ msgstr ""
776
+
777
+ #: lib/events.php:45 lib/events.php:93 lib/events.php:183 lib/events.php:195
778
+ msgid "deleted"
779
+ msgstr ""
780
+
781
+ #: lib/events.php:81 lib/events.php:104 lib/events.php:109 lib/events.php:113
782
+ #: lib/events.php:128 lib/events.php:132 lib/events.php:148 lib/events.php:157
783
+ #: lib/events.php:179 lib/events.php:191
784
+ msgid "updated"
785
+ msgstr ""
786
+
787
+ #: lib/events.php:85 lib/events.php:89
788
+ msgid "deactivated"
789
+ msgstr ""
790
+
791
+ #: lib/events.php:140 lib/events.php:161 lib/events.php:175 lib/events.php:187
792
+ msgid "installed"
793
+ msgstr ""
794
+
795
+ #: lib/events.php:144 lib/events.php:165
796
+ msgid "uploaded"
797
+ msgstr ""
798
+
799
+ #: lib/events.php:211
800
+ #, php-format
801
+ msgid "[NinjaFirewall] Alert: %s"
802
+ msgstr ""
803
+
804
+ #: lib/events.php:213 lib/events.php:215 lib/utils.php:571
805
+ msgid "-Blog:"
806
+ msgstr ""
807
+
808
+ #: lib/events.php:218
809
+ msgid "NinjaFirewall has detected the following activity on your account:"
810
+ msgstr ""
811
+
812
+ #: lib/events.php:220 lib/utils.php:576
813
+ msgid "-User:"
814
+ msgstr ""
815
+
816
+ #: lib/events.php:221 lib/utils.php:577
817
+ msgid "-IP:"
818
+ msgstr ""
819
+
820
+ #: lib/events.php:222 lib/utils.php:578
821
+ msgid "-Date:"
822
+ msgstr ""
823
+
824
+ #: lib/firewall_options.php:29 ninjafirewall.php:756
825
  msgid "Firewall Options"
826
  msgstr ""
827
 
831
 
832
  #: lib/firewall_options.php:64 lib/login_protection.php:203
833
  #: lib/logs_live_log.php:101 lib/monitoring_file_guard.php:70
834
+ #: lib/security_rules_update.php:138
835
  msgid "Disabled"
836
  msgstr ""
837
 
878
  "Protection</a>."
879
  msgstr ""
880
 
881
+ #: lib/firewall_options.php:128 lib/help.php:90
882
  msgid "Blocked user message"
883
  msgstr ""
884
 
955
  msgid "[NinjaFirewall] Alert: Firewall is disabled"
956
  msgstr ""
957
 
958
+ #: lib/firewall_options.php:501 lib/firewall_options.php:503
 
959
  msgid "-Blog :"
960
  msgstr ""
961
 
978
  "Someone imported a new configuration which overrode the firewall settings:"
979
  msgstr ""
980
 
981
+ #: lib/firewall_options.php:520
982
  msgid "-User :"
983
  msgstr ""
984
 
985
+ #: lib/firewall_options.php:521
986
  msgid "-IP :"
987
  msgstr ""
988
 
989
+ #: lib/firewall_options.php:522
990
  msgid "-Date :"
991
  msgstr ""
992
 
996
  "This feature is only available when NinjaFirewall is running in %s mode."
997
  msgstr ""
998
 
999
+ #: lib/firewall_policies.php:62 ninjafirewall.php:760
1000
  msgid "Firewall Policies"
1001
  msgstr ""
1002
 
1008
  msgid "No action taken."
1009
  msgstr ""
1010
 
1011
+ #: lib/firewall_policies.php:85 lib/help.php:161
1012
  msgid "Basic Policies"
1013
  msgstr ""
1014
 
1015
+ #: lib/firewall_policies.php:86 lib/help.php:214
1016
  msgid "Intermediate Policies"
1017
  msgstr ""
1018
 
1019
+ #: lib/firewall_policies.php:87 lib/help.php:253
1020
  msgid "Advanced Policies"
1021
  msgstr ""
1022
 
1036
  msgid "HTTPS traffic only"
1037
  msgstr ""
1038
 
1039
+ #: lib/firewall_policies.php:141 lib/help.php:169
1040
  msgid "Uploads"
1041
  msgstr ""
1042
 
1043
+ #: lib/firewall_policies.php:144 lib/help.php:171
1044
  msgid "File Uploads"
1045
  msgstr ""
1046
 
1056
  msgid "Disallow uploads"
1057
  msgstr ""
1058
 
1059
+ #: lib/firewall_policies.php:152 lib/help.php:173
1060
  msgid "Sanitise filenames"
1061
  msgstr ""
1062
 
1064
  msgid "substitution character:"
1065
  msgstr ""
1066
 
1067
+ #: lib/firewall_policies.php:281 lib/help.php:178
1068
  msgid "Block direct access to any PHP file located in one of these directories"
1069
  msgstr ""
1070
 
1071
+ #: lib/firewall_policies.php:311
1072
  msgid ""
1073
  "NinjaFirewall will not block access to the TinyMCE WYSIWYG editor even if "
1074
  "this option is enabled."
1075
  msgstr ""
1076
 
1077
+ #: lib/firewall_policies.php:326
1078
  msgid ""
1079
  "Unless you have PHP scripts in a \"/cache/\" folder that need to be accessed "
1080
  "by your visitors, we recommend to enable this option."
1081
  msgstr ""
1082
 
1083
+ #: lib/firewall_policies.php:335
1084
  msgid "General"
1085
  msgstr ""
1086
 
1087
+ #: lib/firewall_policies.php:337 lib/help.php:180
1088
  msgid "Block attempts to modify important WordPress settings"
1089
  msgstr ""
1090
 
1091
+ #: lib/firewall_policies.php:338 lib/help.php:182
1092
  msgid "Block user accounts creation"
1093
  msgstr ""
1094
 
1095
+ #: lib/firewall_policies.php:341
1096
+ #, php-format
1097
+ msgid ""
1098
+ "To enable this option, please remove the %s constant from your wp-config.php "
1099
+ "or .htninja script."
1100
+ msgstr ""
1101
+
1102
+ #: lib/firewall_policies.php:349 lib/help.php:184
1103
+ msgid "Block attempts to gain administrative privileges"
1104
+ msgstr ""
1105
+
1106
+ #: lib/firewall_policies.php:362 lib/help.php:186
1107
  msgid "WordPress AJAX"
1108
  msgstr ""
1109
 
1110
+ #: lib/firewall_policies.php:364
1111
  msgid "Protect <code>admin-ajax.php</code> against suspicious bots"
1112
  msgstr ""
1113
 
1114
+ #: lib/firewall_policies.php:365
1115
  #, php-format
1116
  msgid ""
1117
  "Your server IP (%s), localhost and private IP addresses will not be affected "
1118
  "by this policy."
1119
  msgstr ""
1120
 
1121
+ #: lib/firewall_policies.php:370 lib/help.php:188
1122
  msgid "Protect against username enumeration"
1123
  msgstr ""
1124
 
1125
+ #: lib/firewall_policies.php:372
1126
  msgid "Through the author archives"
1127
  msgstr ""
1128
 
1129
+ #: lib/firewall_policies.php:373
1130
  msgid "Through the login page"
1131
  msgstr ""
1132
 
1133
+ #: lib/firewall_policies.php:374
1134
  msgid "Through the WordPress REST API"
1135
  msgstr ""
1136
 
1137
+ #: lib/firewall_policies.php:379 lib/help.php:190
1138
  msgid "WordPress REST API"
1139
  msgstr ""
1140
 
1141
+ #: lib/firewall_policies.php:381 lib/firewall_policies.php:387
1142
  msgid "Block any access to the API"
1143
  msgstr ""
1144
 
1145
+ #: lib/firewall_policies.php:385 lib/help.php:192
1146
  msgid "WordPress XML-RPC API"
1147
  msgstr ""
1148
 
1149
+ #: lib/firewall_policies.php:388
1150
  msgid "Block <code>system.multicall</code> method"
1151
  msgstr ""
1152
 
1153
+ #: lib/firewall_policies.php:389
1154
  msgid "Block Pingbacks"
1155
  msgstr ""
1156
 
1157
+ #: lib/firewall_policies.php:391
1158
  msgid ""
1159
  "Disabling access to the REST or XML-RPC API may break some functionality on "
1160
  "your blog, its themes or plugins (e.g., Gutenberg editor, Jetpack, Contact "
1161
  "Form 7 etc)."
1162
  msgstr ""
1163
 
1164
+ #: lib/firewall_policies.php:396
1165
  msgid "Block <code>POST</code> requests in the themes folder"
1166
  msgstr ""
1167
 
1168
+ #: lib/firewall_policies.php:406
1169
+ msgid "Force HTTPS for admin and logins"
1170
  msgstr ""
1171
 
1172
+ #: lib/firewall_policies.php:412
1173
  msgid "Disable the plugin and theme editor"
1174
  msgstr ""
1175
 
1176
+ #: lib/firewall_policies.php:418
1177
  msgid "Disable plugin and theme update/installation"
1178
  msgstr ""
1179
 
1180
+ #: lib/firewall_policies.php:424
1181
  msgid "Disable the fatal error handler"
1182
  msgstr ""
1183
 
1184
+ #: lib/firewall_policies.php:446 lib/help.php:204
1185
  msgid "Users Whitelist"
1186
  msgstr ""
1187
 
1188
+ #: lib/firewall_policies.php:448
1189
  msgid "Add the Administrator to the whitelist (default)."
1190
  msgstr ""
1191
 
1192
+ #: lib/firewall_policies.php:449
1193
  msgid "Add all logged in users to the whitelist."
1194
  msgstr ""
1195
 
1196
+ #: lib/firewall_policies.php:450
1197
  msgid "Disable users whitelist."
1198
  msgstr ""
1199
 
1200
+ #: lib/firewall_policies.php:451
1201
  msgid ""
1202
  "Note: This feature does not apply to <code>FORCE_SSL_ADMIN</code>, "
1203
  "<code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> and "
1205
  "always enforced."
1206
  msgstr ""
1207
 
1208
+ #: lib/firewall_policies.php:476 lib/help.php:218
1209
  msgid "HTTP GET variable"
1210
  msgstr ""
1211
 
1212
+ #: lib/firewall_policies.php:479
1213
  msgid "Scan <code>GET</code> variable"
1214
  msgstr ""
1215
 
1216
+ #: lib/firewall_policies.php:485
1217
  msgid "Sanitise <code>GET</code> variable"
1218
  msgstr ""
1219
 
1220
+ #: lib/firewall_policies.php:511 lib/help.php:221
1221
  msgid "HTTP POST variable"
1222
  msgstr ""
1223
 
1224
+ #: lib/firewall_policies.php:514
1225
  msgid "Scan <code>POST</code> variable"
1226
  msgstr ""
1227
 
1228
+ #: lib/firewall_policies.php:520
1229
  msgid "Sanitise <code>POST</code> variable"
1230
  msgstr ""
1231
 
1232
+ #: lib/firewall_policies.php:523 lib/firewall_policies.php:548
1233
  msgid "Do not enable this option unless you know what you are doing!"
1234
  msgstr ""
1235
 
1236
+ #: lib/firewall_policies.php:527 lib/help.php:223
1237
  msgid "Decode Base64-encoded <code>POST</code> variable"
1238
  msgstr ""
1239
 
1240
+ #: lib/firewall_policies.php:542 lib/help.php:225
1241
  msgid "HTTP REQUEST variable"
1242
  msgstr ""
1243
 
1244
+ #: lib/firewall_policies.php:545
1245
  msgid "Sanitise <code>REQUEST</code> variable"
1246
  msgstr ""
1247
 
1248
+ #: lib/firewall_policies.php:567 lib/help.php:228
1249
  msgid "Cookies"
1250
  msgstr ""
1251
 
1252
+ #: lib/firewall_policies.php:570
1253
  msgid "Scan cookies"
1254
  msgstr ""
1255
 
1256
+ #: lib/firewall_policies.php:576
1257
  msgid "Sanitise cookies"
1258
  msgstr ""
1259
 
1260
+ #: lib/firewall_policies.php:602 lib/help.php:231
1261
  msgid "HTTP_USER_AGENT server variable"
1262
  msgstr ""
1263
 
1264
+ #: lib/firewall_policies.php:605
1265
  msgid "Scan <code>HTTP_USER_AGENT</code>"
1266
  msgstr ""
1267
 
1268
+ #: lib/firewall_policies.php:611
1269
  msgid "Sanitise <code>HTTP_USER_AGENT</code>"
1270
  msgstr ""
1271
 
1272
+ #: lib/firewall_policies.php:617 lib/help.php:233
1273
  msgid "Block suspicious bots/scanners"
1274
  msgstr ""
1275
 
1276
+ #: lib/firewall_policies.php:643 lib/help.php:235
1277
  msgid "HTTP_REFERER server variable"
1278
  msgstr ""
1279
 
1280
+ #: lib/firewall_policies.php:646
1281
  msgid "Scan <code>HTTP_REFERER</code>"
1282
  msgstr ""
1283
 
1284
+ #: lib/firewall_policies.php:652
1285
  msgid "Sanitise <code>HTTP_REFERER</code>"
1286
  msgstr ""
1287
 
1288
+ #: lib/firewall_policies.php:658
1289
  msgid ""
1290
  "Block <code>POST</code> requests that do not have an <code>HTTP_REFERER</"
1291
  "code> header"
1292
  msgstr ""
1293
 
1294
+ #: lib/firewall_policies.php:661
1295
  msgid ""
1296
  "Keep this option disabled if you are using scripts like Paypal IPN, "
1297
  "WordPress WP-Cron etc"
1298
  msgstr ""
1299
 
1300
+ #: lib/firewall_policies.php:688
1301
  msgid "Block localhost IP in <code>GET/POST</code> request"
1302
  msgstr ""
1303
 
1304
+ #: lib/firewall_policies.php:694 lib/help.php:243
1305
  msgid "Block HTTP requests with an IP in the <code>HTTP_HOST</code> header"
1306
  msgstr ""
1307
 
1308
+ #: lib/firewall_policies.php:700 lib/help.php:245
1309
  msgid "Scan traffic coming from localhost and private IP address spaces"
1310
  msgstr ""
1311
 
1312
+ #: lib/firewall_policies.php:730
1313
  #, php-format
1314
  msgid ""
1315
  "The \"HTTP response headers\" options below are disabled because the %s PHP "
1316
  "function is not available on your server."
1317
  msgstr ""
1318
 
1319
+ #: lib/firewall_policies.php:750 lib/help.php:257
1320
  msgid "HTTP response headers"
1321
  msgstr ""
1322
 
1323
+ #: lib/firewall_policies.php:758
1324
  #, php-format
1325
  msgid "Set %s to protect against MIME type confusion attacks"
1326
  msgstr ""
1327
 
1328
+ #: lib/firewall_policies.php:764
1329
  #, php-format
1330
  msgid "Set %s to protect against clickjacking attempts"
1331
  msgstr ""
1332
 
1333
+ #: lib/firewall_policies.php:771
1334
  msgid ""
1335
  "Setting this option to <code>DENY</code> may break some functionality on "
1336
  "your blog, its themes or plugins."
1337
  msgstr ""
1338
 
1339
+ #: lib/firewall_policies.php:776
1340
  #, php-format
1341
  msgid "Set %s (IE/Edge, Chrome, Opera and Safari browsers)"
1342
  msgstr ""
1343
 
1344
+ #: lib/firewall_policies.php:780 lib/firewall_policies.php:781
1345
+ #: lib/firewall_policies.php:782
1346
  #, php-format
1347
  msgid "Set to %s"
1348
  msgstr ""
1349
 
1350
+ #: lib/firewall_policies.php:787
1351
  #, php-format
1352
  msgid "Force %s flag on all cookies to mitigate CSRF attacks"
1353
  msgstr ""
1354
 
1355
+ #: lib/firewall_policies.php:797
1356
  #, php-format
1357
  msgid "Force %s flag on all cookies to mitigate XSS attacks"
1358
  msgstr ""
1359
 
1360
+ #: lib/firewall_policies.php:800
1361
  msgid ""
1362
  "If your PHP scripts use cookies that need to be accessed from JavaScript, "
1363
  "you should not enable this option."
1364
  msgstr ""
1365
 
1366
+ #: lib/firewall_policies.php:809
1367
  msgid ""
1368
  "HSTS headers can only be set when you are accessing your site over HTTPS."
1369
  msgstr ""
1370
 
1371
+ #: lib/firewall_policies.php:817
1372
  #, php-format
1373
  msgid "Set %s (HSTS) to enforce secure connections to the server"
1374
  msgstr ""
1375
 
1376
+ #: lib/firewall_policies.php:821
1377
  msgid "Set \"max-age\" to 0"
1378
  msgstr ""
1379
 
1380
+ #: lib/firewall_policies.php:822
1381
  msgid "1 month"
1382
  msgstr ""
1383
 
1384
+ #: lib/firewall_policies.php:823
1385
  msgid "6 months"
1386
  msgstr ""
1387
 
1388
+ #: lib/firewall_policies.php:824
1389
  msgid "1 year"
1390
  msgstr ""
1391
 
1392
+ #: lib/firewall_policies.php:826
1393
  msgid "Apply to subdomains"
1394
  msgstr ""
1395
 
1396
+ #: lib/firewall_policies.php:850
1397
  #, php-format
1398
  msgid "Set %s for the website frontend"
1399
  msgstr ""
1400
 
1401
+ #: lib/firewall_policies.php:855
1402
  msgid "This CSP header will apply to the website frontend only."
1403
  msgstr ""
1404
 
1405
+ #: lib/firewall_policies.php:859
1406
  #, php-format
1407
  msgid "Set %s for the WordPress admin dashboard"
1408
  msgstr ""
1409
 
1410
+ #: lib/firewall_policies.php:864
1411
  msgid "This CSP header will apply to the WordPress admin dashboard only."
1412
  msgstr ""
1413
 
1414
+ #: lib/firewall_policies.php:880
1415
  #, php-format
1416
  msgid "Set %s (Chrome, Opera and Firefox browsers)"
1417
  msgstr ""
1418
 
1419
+ #: lib/firewall_policies.php:930
1420
  msgid ""
1421
  "Block PHP built-in wrappers in <code>GET</code>, <code>POST</code>, "
1422
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> and cookies"
1423
  msgstr ""
1424
 
1425
+ #: lib/firewall_policies.php:969
1426
  msgid "Block serialized PHP objects in the following global variables"
1427
  msgstr ""
1428
 
1429
+ #: lib/firewall_policies.php:979 lib/help.php:290
1430
  msgid "Hide PHP notice and error messages"
1431
  msgstr ""
1432
 
1433
+ #: lib/firewall_policies.php:985
1434
  msgid "Sanitise <code>PHP_SELF</code>"
1435
  msgstr ""
1436
 
1437
+ #: lib/firewall_policies.php:991
1438
  msgid "Sanitise <code>PATH_TRANSLATED</code>"
1439
  msgstr ""
1440
 
1441
+ #: lib/firewall_policies.php:997
1442
  msgid "Sanitise <code>PATH_INFO</code>"
1443
  msgstr ""
1444
 
1445
+ #: lib/firewall_policies.php:1011
1446
  msgid "This option is not compatible with your actual configuration."
1447
  msgstr ""
1448
 
1449
+ #: lib/firewall_policies.php:1033 lib/help.php:294
1450
  msgid "Various"
1451
  msgstr ""
1452
 
1453
+ #: lib/firewall_policies.php:1036
1454
  msgid "Block the <code>DOCUMENT_ROOT</code> server variable in HTTP request"
1455
  msgstr ""
1456
 
1457
+ #: lib/firewall_policies.php:1043 lib/help.php:297
1458
  msgid "Block ASCII character 0x00 (NULL byte)"
1459
  msgstr ""
1460
 
1461
+ #: lib/firewall_policies.php:1049 lib/help.php:299
1462
  msgid "Block ASCII control characters 1 to 8 and 14 to 31"
1463
  msgstr ""
1464
 
1465
+ #: lib/firewall_policies.php:1062
1466
  msgid "Save Firewall Policies"
1467
  msgstr ""
1468
 
1469
+ #: lib/firewall_policies.php:1064
1470
  msgid "Restore Default Values"
1471
  msgstr ""
1472
 
1551
  "too."
1552
  msgstr ""
1553
 
 
 
 
 
1554
  #: lib/help.php:92
1555
  msgid ""
1556
  "Lets you customize the HTTP error code returned by NinjaFirewall when "
1599
  "configuration to an earlier date, select the corresponding file in the list."
1600
  msgstr ""
1601
 
1602
+ #: lib/help.php:131
1603
  #, php-format
1604
  msgid ""
1605
  "Keep in mind, however, that the Firewall Policies apply to any PHP scripts "
1607
  "your WordPress index page."
1608
  msgstr ""
1609
 
1610
+ #: lib/help.php:136
1611
  msgid "Policies overview"
1612
  msgstr ""
1613
 
1614
+ #: lib/help.php:138
1615
  #, php-format
1616
  msgid ""
1617
  "Because NinjaFirewall sits in front of WordPress, it can hook, scan and "
1622
  "<code><a href=\"%s\">$_SERVER</a></code> in HTTP and/or HTTPS mode."
1623
  msgstr ""
1624
 
1625
+ #: lib/help.php:140
1626
  msgid ""
1627
  "Use the options below to enable, disable or to tweak these rules according "
1628
  "to your needs."
1629
  msgstr ""
1630
 
1631
+ #: lib/help.php:147
1632
  msgid "Scan and Sanitise"
1633
  msgstr ""
1634
 
1635
+ #: lib/help.php:149
1636
  msgid ""
1637
  "You can choose to scan and reject dangerous content but also to sanitise "
1638
  "requests and variables. Those two actions are different and can be combined "
1639
  "together for better security."
1640
  msgstr ""
1641
 
1642
+ #: lib/help.php:150
1643
  msgid ""
1644
+ "Scan: If anything suspicious is detected, NinjaFirewall will block the "
1645
  "request and return an HTTP error code and message (defined in the \"Firewall "
1646
  "Options\" page). The user request will fail and the connection will be "
1647
  "closed immediately."
1648
  msgstr ""
1649
 
1650
+ #: lib/help.php:151
1651
  #, php-format
1652
  msgid ""
1653
+ "Sanitise: This option will not block but sanitise the user request by "
1654
  "escaping characters that can be used to exploit vulnerabilities (%s) and "
1655
  "replacing <code>&lt;</code> and <code>&gt;</code> with their corresponding "
1656
  "HTML entities (<code>&amp;lt;</code>, <code>&amp;gt;</code>). If it is a "
1658
  "sanitised."
1659
  msgstr ""
1660
 
1661
+ #: lib/help.php:153
1662
  msgid ""
1663
  "This action will be performed when the filtering process is over, right "
1664
  "before NinjaFirewall forwards the request to your PHP script."
1665
  msgstr ""
1666
 
1667
+ #: lib/help.php:156
1668
  msgid ""
1669
  "If you enabled <code>POST</code> requests sanitising, articles and messages "
1670
  "posted by your visitors could be corrupted with excessive backslashes or "
1671
  "substitution characters."
1672
  msgstr ""
1673
 
1674
+ #: lib/help.php:167
1675
  msgid "Whether to filter HTTP and/or HTTPS traffic"
1676
  msgstr ""
1677
 
1678
+ #: lib/help.php:171
1679
+ msgid "Whether to allow/disallow file uploads."
 
 
 
 
 
 
 
 
1680
  msgstr ""
1681
 
1682
+ #: lib/help.php:173
1683
  msgid ""
1684
+ "Any character that is not a letter <code>a-zA-Z</code>, a digit <code>0-9</"
1685
  "code>, a dot <code>.</code>, a hyphen <code>-</code> or an underscore "
1686
  "<code>_</code> will be removed from the filename and replaced with the "
1687
  "substitution character."
1688
  msgstr ""
1689
 
1690
+ #: lib/help.php:178
1691
  msgid ""
1692
  "Whether to block direct access to PHP files located in specific WordPress "
1693
  "directories."
1694
  msgstr ""
1695
 
1696
+ #: lib/help.php:180
1697
  msgid ""
1698
+ "Enabling this policy will block any attempt (e.g., exploiting a "
1699
  "vulnerability, using a backdoor etc) to modify some important WordPress "
1700
  "settings. This policy will also send you an alert by email with all details "
1701
  "regarding the issue. It is enabled by default."
1702
  msgstr ""
1703
 
1704
+ #: lib/help.php:182
1705
  msgid ""
1706
+ "Enabling this policy will block any attempt (e.g., exploiting a "
1707
  "vulnerability, using a backdoor etc) to create a user account. If you allow "
1708
  "user registration, you should not enable it."
1709
  msgstr ""
1710
 
1711
+ #: lib/help.php:184
1712
+ msgid ""
1713
+ "This policy will block vulnerabilities that could be leveraged by attackers "
1714
+ "to gain administrative privileges."
1715
+ msgstr ""
1716
+
1717
+ #: lib/help.php:186
1718
  #, php-format
1719
  msgid ""
1720
+ "Many vulnerabilities in plugins are exploited via the admin-ajax.php script. "
1721
  "This policy will try to detect and immediately block bots and malicious "
1722
  "scanners trying to access it. The server IP address (%s) and private IP "
1723
  "addresses will not be blocked."
1724
  msgstr ""
1725
 
1726
+ #: lib/help.php:188
 
 
 
 
1727
  msgid ""
1728
+ "It is possible to enumerate usernames either through the WordPress author "
1729
  "archives, the REST API or the login page. Although this is not a "
1730
  "vulnerability but a WordPress feature, some hackers use it to retrieve "
1731
  "usernames in order to launch more accurate brute-force attacks. If it is a "
1735
  "block the request immediately."
1736
  msgstr ""
1737
 
1738
+ #: lib/help.php:190
 
 
 
 
1739
  msgid ""
1740
+ "It allows you to access your WordPress site's data through an easy-to-use "
1741
  "HTTP REST API. Since WordPress 4.7, it is enabled by default. NinjaFirewall "
1742
  "allows you to block any access to that API if you do not intend to use it."
1743
  msgstr ""
1744
 
1745
+ #: lib/help.php:192
 
 
 
 
1746
  msgid ""
1747
  "XML-RPC is a remote procedure call (RPC) protocol which uses XML to encode "
1748
  "its calls and HTTP as a transport mechanism. WordPress has an XMLRPC API "
1753
  "used in brute-force amplification attacks or to block Pingbacks."
1754
  msgstr ""
1755
 
1756
+ #: lib/help.php:194
1757
  msgid ""
1758
  "Block <code>POST</code> requests in the themes folder <code>/wp-content/"
1759
+ "themes</code>"
1760
  msgstr ""
1761
 
1762
+ #: lib/help.php:194
1763
  msgid ""
1764
+ "This option can be useful to block hackers from installing backdoor in the "
1765
  "PHP theme files. However, because some custom themes may include an HTML "
1766
  "form (contact, search form etc), this option is not enabled by default."
1767
  msgstr ""
1768
 
1769
+ #: lib/help.php:196
1770
+ msgid "Force HTTPS for admin and logins <code>FORCE_SSL_ADMIN</code>"
1771
  msgstr ""
1772
 
1773
+ #: lib/help.php:196
1774
  msgid ""
1775
+ "Enable this option when you want to secure logins and the admin area so that "
1776
  "both passwords and cookies are never sent in the clear. Ensure that you can "
1777
  "access your admin console from HTTPS before enabling this option, otherwise "
1778
  "you will lock yourself out of your site!"
1779
  msgstr ""
1780
 
1781
+ #: lib/help.php:198
1782
+ msgid "Disable the plugin and theme editor <code>DISALLOW_FILE_EDIT</code>"
1783
  msgstr ""
1784
 
1785
+ #: lib/help.php:198
1786
  msgid ""
1787
+ "Disabling the plugin and theme editor provides an additional layer of "
1788
  "security if a hacker gains access to a well-privileged user account."
1789
  msgstr ""
1790
 
1791
+ #: lib/help.php:200
1792
  msgid ""
1793
+ "Disable plugin and theme update/installation <code>DISALLOW_FILE_MODS</code>"
1794
  msgstr ""
1795
 
1796
+ #: lib/help.php:200
1797
  msgid ""
1798
+ "This option will block users being able to use the plugin and theme "
1799
  "installation/update functionality from the WordPress admin area. Setting "
1800
  "this constant also disables the Plugin and Theme editor."
1801
  msgstr ""
1802
 
1803
+ #: lib/help.php:202
1804
  msgid ""
1805
+ "Disable the fatal error handler <code>WP_DISABLE_FATAL_ERROR_HANDLER</code>"
1806
  msgstr ""
1807
 
1808
+ #: lib/help.php:202
1809
  msgid ""
1810
+ "This option will disable the WSOD protection introduced in WordPress 5.1."
1811
  msgstr ""
1812
 
1813
+ #: lib/help.php:206
1814
+ msgid ""
1815
+ "By default, any logged in WordPress administrator will not be blocked by "
1816
+ "NinjaFirewall. You can also add any logged in users to the whitelist (make "
1817
+ "sure you trust them all before doing so)."
1818
  msgstr ""
1819
 
1820
+ #: lib/help.php:219
1821
+ msgid "Whether to scan and/or sanitise the <code>GET</code> variable."
1822
  msgstr ""
1823
 
1824
+ #: lib/help.php:222
1825
+ msgid "Whether to scan and/or sanitise the <code>POST</code> variable."
1826
  msgstr ""
1827
 
1828
+ #: lib/help.php:223
1829
  msgid ""
1830
  "NinjaFirewall will decode and scan base64 encoded values in order to detect "
1831
  "obfuscated malicious code. This option is only available for the <code>POST</"
1832
  "code> variable."
1833
  msgstr ""
1834
 
1835
+ #: lib/help.php:226
1836
  msgid "Whether to sanitise the <code>REQUEST</code> variable."
1837
  msgstr ""
1838
 
1839
+ #: lib/help.php:229
1840
  msgid "Whether to scan and/or sanitise cookies."
1841
  msgstr ""
1842
 
1843
+ #: lib/help.php:232
1844
  msgid "Whether to scan and/or sanitise <code>HTTP_USER_AGENT</code> requests."
1845
  msgstr ""
1846
 
1847
+ #: lib/help.php:233
 
 
 
 
1848
  msgid ""
1849
+ "Rejects some known bots, scanners and various malicious scripts attempting "
1850
  "to access your blog."
1851
  msgstr ""
1852
 
1853
+ #: lib/help.php:236
1854
  msgid "Whether to scan and/or sanitise <code>HTTP_REFERER</code> requests."
1855
  msgstr ""
1856
 
1857
+ #: lib/help.php:237
1858
  msgid ""
1859
+ "Block POST requests that do not have an <code>HTTP_REFERER</code> header"
1860
  msgstr ""
1861
 
1862
+ #: lib/help.php:237
1863
  msgid ""
1864
+ "This option will block any <code>POST</code> request that does not have a "
1865
  "Referrer header (<code>HTTP_REFERER</code> variable). If you need external "
1866
  "applications to post to your scripts (e.g. Paypal IPN, WordPress WP-"
1867
  "Cron...), you are advised to keep this option disabled otherwise they will "
1870
  "default."
1871
  msgstr ""
1872
 
1873
+ #: lib/help.php:241
1874
+ msgid "Block localhost IP in <code>GET/POST</code> requests"
1875
  msgstr ""
1876
 
1877
+ #: lib/help.php:241
1878
  msgid ""
1879
  "this option will block any <code>GET</code> or <code>POST</code> request "
1880
  "containing the localhost IP (127.0.0.1). It can be useful to block SQL "
1881
  "dumpers and various hacker's shell scripts."
1882
  msgstr ""
1883
 
1884
+ #: lib/help.php:243
 
 
 
 
1885
  #, php-format
1886
  msgid ""
1887
+ "This option will reject any request using an IP instead of a domain name in "
1888
  "the <code>Host</code> header of the HTTP request. Unless you need to connect "
1889
  "to your site using its IP address, (e.g. %s), enabling this option will "
1890
  "block a lot of hackers scanners because such applications scan IPs rather "
1891
  "than domain names."
1892
  msgstr ""
1893
 
1894
+ #: lib/help.php:245
 
 
 
 
1895
  msgid ""
1896
  "this option will allow the firewall to scan traffic from all non-routable "
1897
  "private IPs (IPv4 and IPv6) as well as the localhost IP. We recommend to "
1899
  "interconnected)."
1900
  msgstr ""
1901
 
1902
+ #: lib/help.php:258
1903
  msgid ""
1904
  "In addition to filtering incoming requests, NinjaFirewall can also hook the "
1905
  "HTTP response in order to alter its headers. Those modifications can help to "
1906
  "mitigate threats such as XSS, phishing and clickjacking attacks."
1907
  msgstr ""
1908
 
1909
+ #: lib/help.php:260
1910
  msgid ""
1911
  "Set <code>X-Content-Type-Options</code> to protect against MIME type "
1912
+ "confusion attacks"
1913
  msgstr ""
1914
 
1915
+ #: lib/help.php:260
1916
  msgid ""
1917
+ "This header will send the nosniff value to instruct the browser to disable "
1918
  "content or MIME sniffing and to use the content-type returned by the server. "
1919
  "Some browsers try to guess (sniff) and override the content-type by looking "
1920
  "at the content itself which, in some cases, could lead to security issues "
1921
  "such as MIME Confusion Attacks."
1922
  msgstr ""
1923
 
1924
+ #: lib/help.php:262
1925
  msgid ""
1926
+ "Set <code>X-Frame-Options</code> to protect against clickjacking attempts"
1927
  msgstr ""
1928
 
1929
+ #: lib/help.php:262
1930
  msgid ""
1931
+ "This header indicates a policy whether a browser must not allow to render a "
1932
  "page in a &lt;frame&gt; or &lt;iframe&gt;. Hosts can declare this policy in "
1933
  "the header of their HTTP responses to prevent clickjacking attacks, by "
1934
  "ensuring that their content is not embedded into other pages or frames. "
1935
  "NinjaFirewall accepts two different values:"
1936
  msgstr ""
1937
 
1938
+ #: lib/help.php:264
1939
  msgid ""
1940
+ "A browser receiving content with this header must not display this content "
1941
  "in any frame from a page of different origin than the content itself."
1942
  msgstr ""
1943
 
1944
+ #: lib/help.php:265
1945
  msgid ""
1946
+ "A browser receiving content with this header must not display this content "
1947
  "in any frame."
1948
  msgstr ""
1949
 
1950
+ #: lib/help.php:267
1951
  msgid "NinjaFirewall does not support the <code>ALLOW-FROM</code> value."
1952
  msgstr ""
1953
 
1954
+ #: lib/help.php:268
1955
  msgid ""
1956
  "Since v3.1.3, WordPress sets this value to <code>SAMEORIGIN</code> for the "
1957
  "administrator and the login page only."
1958
  msgstr ""
1959
 
1960
+ #: lib/help.php:270
1961
  msgid ""
1962
  "Set <code>X-XSS-Protection</code> (IE/Edge, Chrome, Opera and Safari "
1963
+ "browsers)"
1964
  msgstr ""
1965
 
1966
+ #: lib/help.php:270
1967
  msgid ""
1968
+ "This header allows browsers to identify and block XSS attacks by preventing "
1969
  "malicious scripts from executing. It is enabled by default on all compatible "
1970
  "browsers."
1971
  msgstr ""
1972
 
1973
+ #: lib/help.php:271
1974
  msgid ""
1975
  "If a visitor disabled their browser's XSS filter, you cannot re-enable it "
1976
  "with that option."
1977
  msgstr ""
1978
 
1979
+ #: lib/help.php:273
1980
  msgid ""
1981
+ "Force <code>SameSite</code> flag on all cookies to mitigate CSRF attacks"
1982
  msgstr ""
1983
 
1984
+ #: lib/help.php:273
1985
  msgid ""
1986
+ "Adding this flag to cookies helps to mitigate the risk of CSRF (cross-site "
1987
  "request forgery) attacks because cookies can only be sent in requests "
1988
  "originating from the same origin as the target domain."
1989
  msgstr ""
1990
 
1991
+ #: lib/help.php:275
1992
+ msgid "Force <code>HttpOnly</code> flag on all cookies to mitigate XSS attacks"
 
1993
  msgstr ""
1994
 
1995
+ #: lib/help.php:275
1996
  msgid ""
1997
+ "Adding this flag to cookies helps to mitigate the risk of cross-site "
1998
  "scripting by preventing them from being accessed through client-side "
1999
  "scripts. NinjaFirewall can hook all cookies sent by your blog, its plugins "
2000
  "or any other PHP script, add the <code>HttpOnly</code> flag if it is "
2003
  "sets that flag on the logged in user cookies only."
2004
  msgstr ""
2005
 
2006
+ #: lib/help.php:276
2007
  msgid ""
2008
  "If your PHP scripts send cookies that need to be accessed from JavaScript, "
2009
  "you should keep that option disabled."
2010
  msgstr ""
2011
 
2012
+ #: lib/help.php:278
2013
  msgid ""
2014
  "Set <code>Strict-Transport-Security</code> (HSTS) to enforce secure "
2015
+ "connections to the server"
2016
  msgstr ""
2017
 
2018
+ #: lib/help.php:278
2019
  msgid ""
2020
+ "This policy enforces secure HTTPS connections to the server. Web browsers "
2021
  "will not allow the user to access the web application over insecure HTTP "
2022
  "protocol. It helps to defend against cookie hijacking and Man-in-the-middle "
2023
  "attacks. Most recent browsers support HSTS headers."
2024
  msgstr ""
2025
 
2026
+ #: lib/help.php:280
2027
+ msgid "Set <code>Content-Security-Policy</code>"
2028
  msgstr ""
2029
 
2030
+ #: lib/help.php:280
2031
  msgid ""
2032
+ "This policy helps to mitigate threats such as XSS, phishing and clickjacking "
2033
  "attacks. It covers JavaScript, CSS, HTML frames, web workers, fonts, images, "
2034
  "objects (Java, ActiveX, audio and video files), and other HTML5 features."
2035
  msgstr ""
2036
 
2037
+ #: lib/help.php:280
2038
  msgid ""
2039
  "NinjaFirewall lets you configure the CSP policy separately for the frontend "
2040
  "(blog, website) and the backend (WordPress admin dashboard)."
2041
  msgstr ""
2042
 
2043
+ #: lib/help.php:282
2044
+ msgid "Set <code>Referrer-Policy</code>"
2045
  msgstr ""
2046
 
2047
+ #: lib/help.php:282
2048
  msgid ""
2049
+ "This HTTP header governs which referrer information, sent in the Referer "
2050
  "header, should be included with requests made."
2051
  msgstr ""
2052
 
2053
+ #: lib/help.php:286
2054
+ msgid "Block PHP built-in wrappers"
2055
  msgstr ""
2056
 
2057
+ #: lib/help.php:286
2058
  msgid ""
2059
  "PHP has several wrappers for use with the filesystem functions. It is "
2060
  "possible for an attacker to use them to bypass firewalls and various IDS to "
2065
  "request, cookies, user agent and referrer variables."
2066
  msgstr ""
2067
 
2068
+ #: lib/help.php:288
2069
+ msgid "Block serialized PHP objects"
2070
  msgstr ""
2071
 
2072
+ #: lib/help.php:288
2073
  #, php-format
2074
  msgid ""
2075
  "Object Serialization is a PHP feature used by many applications to generate "
2080
  "code> request, cookies, user agent and referrer variables."
2081
  msgstr ""
2082
 
2083
+ #: lib/help.php:290
 
 
 
 
2084
  msgid ""
2085
+ "This option lets you hide errors returned by your scripts. Such errors can "
2086
  "leak sensitive informations which can be exploited by hackers."
2087
  msgstr ""
2088
 
2089
+ #: lib/help.php:292
2090
  msgid ""
2091
  "Sanitise <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, "
2092
+ "<code>PATH_INFO</code>"
2093
  msgstr ""
2094
 
2095
+ #: lib/help.php:292
2096
  msgid ""
2097
+ "This option can sanitise any dangerous characters found in those 3 server "
2098
  "variables to prevent various XSS and database injection attempts."
2099
  msgstr ""
2100
 
2101
+ #: lib/help.php:295
2102
  #, php-format
2103
  msgid ""
2104
+ "Block the <code>DOCUMENT_ROOT</code> server variable (%s) in HTTP requests"
2105
  msgstr ""
2106
 
2107
+ #: lib/help.php:295
2108
  msgid ""
2109
+ "This option will block scripts attempting to pass the <code>DOCUMENT_ROOT</"
2110
  "code> server variable in a <code>GET</code> or <code>POST</code> request. "
2111
  "Hackers use shell scripts that often need to pass this value, but most "
2112
  "legitimate programs do not."
2113
  msgstr ""
2114
 
2115
+ #: lib/help.php:297
 
 
 
 
2116
  msgid ""
2117
+ "This option will reject any <code>GET</code> or <code>POST</code> request, "
2118
  "<code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, <code>PHP_SELF</"
2119
  "code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> variables "
2120
  "containing the ASCII character 0x00 (NULL byte). Such a character is "
2121
  "dangerous and should always be rejected."
2122
  msgstr ""
2123
 
2124
+ #: lib/help.php:299
 
 
 
 
2125
  msgid ""
2126
+ "This option will reject any <code>GET</code> or <code>POST</code> request, "
2127
  "<code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> variables containing "
2128
  "ASCII characters from 1 to 8 and 14 to 31."
2129
  msgstr ""
2130
 
2131
+ #: lib/help.php:312 lib/monitoring.php:46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2132
  msgid "File Check"
2133
  msgstr ""
2134
 
2135
+ #: lib/help.php:313
2136
  msgid ""
2137
  "File Check lets you perform file integrity monitoring upon request or on a "
2138
  "specific interval."
2139
  msgstr ""
2140
 
2141
+ #: lib/help.php:315
2142
  msgid ""
2143
  "You need to create a snapshot of all your files and then, at a later time, "
2144
  "you can scan your system to compare it with the previous snapshot. Any "
2146
  "file ownership, timestamp as well as file creation and deletion."
2147
  msgstr ""
2148
 
2149
+ #: lib/help.php:317
2150
  #, php-format
2151
  msgid ""
2152
  "Create a snapshot of all files stored in that directory: by default, the "
2153
  "directory is set to WordPress <code>ABSPATH</code> (%s)"
2154
  msgstr ""
2155
 
2156
+ #: lib/help.php:318
2157
  msgid ""
2158
  "Exclude the following files/folders: you can enter a directory or a file "
2159
  "name (e.g., <code>/foo/bar/</code>), or a part of it (e.g., <code>foo</"
2160
  "code>). Or you can exclude a file extension (e.g., <code>.css</code>)."
2161
  msgstr ""
2162
 
2163
+ #: lib/help.php:320
2164
  msgid ""
2165
  "Multiple values must be comma-separated (e.g., <code>/foo/bar/,.css,.png</"
2166
  "code>)."
2167
  msgstr ""
2168
 
2169
+ #: lib/help.php:321
2170
  msgid ""
2171
  "Do not follow symbolic links: by default, NinjaFirewall will not follow "
2172
  "symbolic links."
2173
  msgstr ""
2174
 
2175
+ #: lib/help.php:324
2176
  msgid "Scheduled scans"
2177
  msgstr ""
2178
 
2179
+ #: lib/help.php:325
2180
  msgid ""
2181
  "NinjaFirewall can scan your system on a specific interval (hourly, "
2182
  "twicedaily or daily)."
2183
  msgstr ""
2184
 
2185
+ #: lib/help.php:327
2186
  msgid ""
2187
  "It can either send you a scan report only if changes are detected, or always "
2188
  "send you one after each scan."
2189
  msgstr ""
2190
 
2191
+ #: lib/help.php:329
2192
  msgid ""
2193
  "Reports will be sent to the contact email address defined in the \"Event "
2194
  "Notifications\" menu."
2195
  msgstr ""
2196
 
2197
+ #: lib/help.php:331
2198
  #, php-format
2199
  msgid ""
2200
  "Scheduled scans rely on <a href=\"%s\">WordPress pseudo cron</a> which works "
2201
  "only if your site gets sufficient traffic."
2202
  msgstr ""
2203
 
2204
+ #: lib/help.php:337 lib/monitoring.php:47
2205
+ msgid "File Guard"
2206
+ msgstr ""
2207
+
2208
+ #: lib/help.php:339
2209
+ msgid ""
2210
+ "File Guard can detect, in real-time, any access to a PHP file that was "
2211
+ "recently modified or created, and alert you about this."
2212
+ msgstr ""
2213
+
2214
+ #: lib/help.php:341
2215
+ msgid ""
2216
+ "If a hacker uploaded a shell script to your site (or injected a backdoor "
2217
+ "into an already existing file) and tried to directly access that file using "
2218
+ "his browser or a script, NinjaFirewall would hook the HTTP request and "
2219
+ "immediately detect that the file was recently modified/created. It would "
2220
+ "send you a detailed alert (script name, IP, request, date and time). Alerts "
2221
+ "will be sent to the contact email address defined in the \"Event "
2222
+ "Notifications\" menu."
2223
+ msgstr ""
2224
+
2225
+ #: lib/help.php:342
2226
+ msgid ""
2227
+ "If you do not want to monitor a folder, you can exclude its full path or a "
2228
+ "part of it (e.g., <code>/var/www/public_html/cache/</code> or <code>/cache/</"
2229
+ "code> etc). NinjaFirewall will compare this value to the <code>"
2230
+ "$_SERVER[\"SCRIPT_FILENAME\"]</code> server variable and, if it matches, "
2231
+ "will ignore it."
2232
+ msgstr ""
2233
+
2234
+ #: lib/help.php:343
2235
+ msgid ""
2236
+ "Multiple values must be comma-separated (e.g., <code>/foo/bar/,/cache/</"
2237
+ "code>)."
2238
+ msgstr ""
2239
+
2240
+ #: lib/help.php:344
2241
+ msgid ""
2242
+ "File Guard real-time detection is a totally unique feature, because "
2243
+ "NinjaFirewall is the only plugin for WordPress that can hook HTTP requests "
2244
+ "sent to any PHP script, even if that script is not part of the WordPress "
2245
+ "package (third-party software, shell script, backdoor etc)."
2246
+ msgstr ""
2247
+
2248
+ #: lib/help.php:353 lib/network.php:32 ninjafirewall.php:778
2249
  msgid "Network"
2250
  msgstr ""
2251
 
2252
+ #: lib/help.php:355
2253
  msgid ""
2254
  "Even if NinjaFirewall administration menu is only available to the Super "
2255
  "Admin (from the main site), you can still display its status to all sites in "
2257
  "be visible only to the administrators of those sites."
2258
  msgstr ""
2259
 
2260
+ #: lib/help.php:357
2261
  msgid ""
2262
  "It is recommended to enable this feature as it is the only way to know "
2263
  "whether the sites in your network are protected and if NinjaFirewall "
2264
  "installation was successful."
2265
  msgstr ""
2266
 
2267
+ #: lib/help.php:359
2268
  msgid ""
2269
  "Note that when it is disabled, the icon still remains visible to you, the "
2270
  "Super Admin."
2271
  msgstr ""
2272
 
2273
+ #: lib/help.php:371
2274
  msgid ""
2275
  "NinjaFirewall can alert you by email on specific events triggered within "
2276
  "your blog. They include installations, updates, activations etc, as well as "
2281
  "theme in order to take full control of your website."
2282
  msgstr ""
2283
 
2284
+ #: lib/help.php:382 lib/login_protection.php:21 ninjafirewall.php:786
2285
  msgid "Login Protection"
2286
  msgstr ""
2287
 
2288
+ #: lib/help.php:386
2289
  msgid ""
2290
  "By processing incoming HTTP requests before your blog and any of its "
2291
  "plugins, NinjaFirewall is the only plugin for WordPress able to protect it "
2293
  "from several thousands of different IPs."
2294
  msgstr ""
2295
 
2296
+ #: lib/help.php:388
2297
  msgid ""
2298
  "You can choose two different types of protection: a password or a captcha. "
2299
  "You can enable the protection only if an attack is detected or to keep it "
2300
  "always activated."
2301
  msgstr ""
2302
 
2303
+ #: lib/help.php:390
2304
  msgid "Yes, if under attack:"
2305
  msgstr ""
2306
 
2307
+ #: lib/help.php:392
2308
  msgid ""
2309
  "The protection will be triggered when too many login attempts are detected, "
2310
  "regardless of the offending IP. It blocks the attack instantly and prevents "
2313
  "combination or the captcha code. "
2314
  msgstr ""
2315
 
2316
+ #: lib/help.php:394
2317
  msgid "Always ON:"
2318
  msgstr ""
2319
 
2320
+ #: lib/help.php:396
2321
  msgid ""
2322
  "NinjaFirewall will always enforce the HTTP authentication or captcha "
2323
  "implementation each time you access the login page."
2324
  msgstr ""
2325
 
2326
+ #: lib/help.php:399
2327
  msgid "Type of protection:"
2328
  msgstr ""
2329
 
2330
+ #: lib/help.php:400
2331
  msgid ""
2332
  "<b>Password:</b> It password-protects the login page. NinjaFirewall uses its "
2333
  "own very fast authentication scheme and it is compatible with any HTTP "
2334
  "server (Apache, Nginx, Lighttpd etc)."
2335
  msgstr ""
2336
 
2337
+ #: lib/help.php:401
2338
  msgid "<b>Captcha:</b> It will display a 5-character captcha code."
2339
  msgstr ""
2340
 
2341
+ #: lib/help.php:402
2342
  msgid "Bot protection:"
2343
  msgstr ""
2344
 
2345
+ #: lib/help.php:403
2346
  msgid ""
2347
  "NinjaFirewall will attempt to block bots and scripts immediately, i.e., even "
2348
  "before they start a brute-force attack."
2349
  msgstr ""
2350
 
2351
+ #: lib/help.php:411
2352
  msgid "AUTH log"
2353
  msgstr ""
2354
 
2355
+ #: lib/help.php:414
2356
  msgid ""
2357
  "NinjaFirewall can write to the server Authentication log when the brute-"
2358
  "force protection is triggered. This can be useful to the system "
2359
  "administrator for monitoring purposes or banning IPs at the server level."
2360
  msgstr ""
2361
 
2362
+ #: lib/help.php:416
2363
  msgid ""
2364
  "If you have a shared hosting account, keep this option disabled as you do "
2365
  "not have any access to the server's logs."
2366
  msgstr ""
2367
 
2368
+ #: lib/help.php:418
2369
  msgid ""
2370
  "On Debian-based systems, the log is located in <code>/var/log/auth.log</"
2371
  "code>, and on Red Hat-based systems in <code>/var/log/secure</code>. The "
2372
  "logline uses the following format:"
2373
  msgstr ""
2374
 
2375
+ #: lib/help.php:421
2376
  msgid "AA: the process ID (PID)."
2377
  msgstr ""
2378
 
2379
+ #: lib/help.php:422
2380
  msgid "BB: the user IPv4 or IPv6 address."
2381
  msgstr ""
2382
 
2383
+ #: lib/help.php:423
2384
  msgid "CC: the blog (sub-)domain name."
2385
  msgstr ""
2386
 
2387
+ #: lib/help.php:424
2388
  msgid ""
2389
  "DD: the target: it can be either <code>wp-login.php</code> or <code>XML-RPC "
2390
  "API</code>."
2391
  msgstr ""
2392
 
2393
+ #: lib/help.php:425
2394
  msgid "EE: the time, in minutes, the protection will remain active."
2395
  msgstr ""
2396
 
2397
+ #: lib/help.php:427
2398
  msgid "Sample loglines:"
2399
  msgstr ""
2400
 
2401
+ #: lib/help.php:430
2402
  #, php-format
2403
  msgid ""
2404
  "Be careful if you are behind a load balancer, reverse-proxy or CDN because "
2409
  "otherwise you will likely block legitimate users."
2410
  msgstr ""
2411
 
2412
+ #: lib/help.php:444 lib/logs.php:39 lib/wpplus.php:206
2413
  msgid "Firewall Log"
2414
  msgstr ""
2415
 
2416
+ #: lib/help.php:447
2417
  msgid ""
2418
  "The firewall log displays blocked and sanitised requests as well as some "
2419
  "useful information. It has 6 columns:"
2420
  msgstr ""
2421
 
2422
+ #: lib/help.php:448
2423
  msgid "DATE : date and time of the incident."
2424
  msgstr ""
2425
 
2426
+ #: lib/help.php:449
2427
  msgid ""
2428
  "INCIDENT : unique incident number/ID as it was displayed to the blocked user."
2429
  msgstr ""
2430
 
2431
+ #: lib/help.php:450
2432
  msgid ""
2433
  "LEVEL : level of severity (<code>CRITICAL</code>, <code>HIGH</code> or "
2434
  "<code>MEDIUM</code>), information (<code>INFO</code>, <code>UPLOAD</code>) "
2435
  "and debugging mode (<code>DEBUG_ON</code>)."
2436
  msgstr ""
2437
 
2438
+ #: lib/help.php:451
2439
  msgid ""
2440
  "RULE : reference of the NinjaFirewall built-in security rule that triggered "
2441
  "the action. A hyphen (<code>-</code>) instead of a number means it was a "
2442
  "rule from the \"Firewall Policies\" page."
2443
  msgstr ""
2444
 
2445
+ #: lib/help.php:452
2446
  msgid "IP : the user IPv4 or IPv6 address."
2447
  msgstr ""
2448
 
2449
+ #: lib/help.php:453
2450
  msgid ""
2451
  "REQUEST : the HTTP request including offending variables and values as well "
2452
  "as the reason the action was logged."
2453
  msgstr ""
2454
 
2455
+ #: lib/help.php:456 lib/logs_firewall_log.php:165
2456
  msgid "Auto-delete log"
2457
  msgstr ""
2458
 
2459
+ #: lib/help.php:457
2460
  msgid ""
2461
  "This options lets you configure NinjaFirewall to delete its old logs "
2462
  "automatically. By default, logs are never deleted, <b>even when uninstall "
2464
  "delete old logs."
2465
  msgstr ""
2466
 
2467
+ #: lib/help.php:461
2468
  msgid ""
2469
  "Centralized Logging lets you remotely access the firewall log of all your "
2470
  "NinjaFirewall protected websites from one single installation. You do not "
2471
  "need any longer to log in to individual servers to analyse your log data."
2472
  msgstr ""
2473
 
2474
+ #: lib/help.php:461
2475
  #, php-format
2476
  msgid "<a href=\"%s\">Consult our blog</a> for more info about it."
2477
  msgstr ""
2478
 
2479
+ #: lib/help.php:462
2480
  msgid ""
2481
  "Enter your public key (optional): This is the public key that was created "
2482
  "from your main server."
2483
  msgstr ""
2484
 
2485
+ #: lib/help.php:466
2486
  msgid ""
2487
  "Centralized Logging will keep working even if NinjaFirewall is disabled. "
2488
  "Delete your public key below if you want to disable it."
2489
  msgstr ""
2490
 
2491
+ #: lib/help.php:473 lib/logs.php:40 lib/logs_live_log.php:37
2492
  msgid "Live Log"
2493
  msgstr ""
2494
 
2495
+ #: lib/help.php:476
2496
  msgid ""
2497
  "Live Log lets you watch your blog traffic in real time, just like the Unix "
2498
  "<code>tail -f</code> command. Note that requests sent to static elements "
2499
  "like JS/CSS files and images are not managed by NinjaFirewall."
2500
  msgstr ""
2501
 
2502
+ #: lib/help.php:478
2503
  msgid ""
2504
  "You can enable/disable the monitoring process, change the refresh rate, "
2505
  "clear the screen, enable automatic vertical scrolling, change the log "
2506
  "format, select which traffic you want to view (HTTP/HTTPS) and the timezone."
2507
  msgstr ""
2508
 
2509
+ #: lib/help.php:478
2510
  msgid ""
2511
  "You can also apply filters to include or exclude files and folders "
2512
  "(REQUEST_URI)."
2513
  msgstr ""
2514
 
2515
+ #: lib/help.php:481
2516
  msgid ""
2517
  "Live Log does not make use of any WordPress core file (e.g., <code>admin-"
2518
  "ajax.php</code>). It communicates directly with the firewall without loading "
2521
  "value."
2522
  msgstr ""
2523
 
2524
+ #: lib/help.php:483
2525
  msgid ""
2526
  "If you are using the optional <code>.htninja</code> configuration file to "
2527
  "whitelist your IP, the Live Log feature will not work."
2528
  msgstr ""
2529
 
2530
+ #: lib/help.php:487
2531
  msgid "Log Format"
2532
  msgstr ""
2533
 
2534
+ #: lib/help.php:488
2535
  msgid "You can easily customize the log format. Possible values are:"
2536
  msgstr ""
2537
 
2538
+ #: lib/help.php:489
2539
  msgid "<code>%time</code>: the server date, time and timezone."
2540
  msgstr ""
2541
 
2542
+ #: lib/help.php:490
2543
  msgid "<code>%name</code>: authenticated user (HTTP basic auth), if any."
2544
  msgstr ""
2545
 
2546
+ #: lib/help.php:491
2547
  #, php-format
2548
  msgid ""
2549
  "<code>%client</code>: the client REMOTE_ADDR. If you are behind a load "
2550
  "balancer or CDN, this will be its IP."
2551
  msgstr ""
2552
 
2553
+ #: lib/help.php:492
2554
  msgid "<code>%method</code>: HTTP method (e.g., GET, POST)."
2555
  msgstr ""
2556
 
2557
+ #: lib/help.php:493
2558
  #, php-format
2559
  msgid ""
2560
  "<code>%uri</code>: the URI which was given in order to access the page "
2561
  "(REQUEST_URI)."
2562
  msgstr ""
2563
 
2564
+ #: lib/help.php:494
2565
  msgid "<code>%referrer</code>: the referrer (HTTP_REFERER), if any."
2566
  msgstr ""
2567
 
2568
+ #: lib/help.php:495
2569
  #, php-format
2570
  msgid "<code>%ua</code>: the user-agent (HTTP_USER_AGENT), if any."
2571
  msgstr ""
2572
 
2573
+ #: lib/help.php:496
2574
  #, php-format
2575
  msgid ""
2576
  "<code>%forward</code>: HTTP_X_FORWARDED_FOR, if any. If you are behind a "
2577
  "load balancer or CDN, this will likely be the visitor true IP."
2578
  msgstr ""
2579
 
2580
+ #: lib/help.php:497
2581
  msgid "<code>%host</code>: the requested host (HTTP_HOST), if any."
2582
  msgstr ""
2583
 
2584
+ #: lib/help.php:499
2585
  msgid ""
2586
  "Additionally, you can include any of the following characters: <code>\"</"
2587
  "code>, <code>%</code>, <code>[</code>, <code>]</code>, <code>space</code> "
2588
  "and lowercase letters <code>a-z</code>."
2589
  msgstr ""
2590
 
2591
+ #: lib/help.php:510
2592
  msgid ""
2593
  "Your website can run NinjaFirewall and be compliant with the General Data "
2594
  "Protection Regulation (GDPR). For more info, please visit our blog:"
2595
  msgstr ""
2596
 
2597
+ #: lib/help.php:524 lib/security_rules.php:47
2598
  msgid "Rules Updates"
2599
  msgstr ""
2600
 
2601
+ #: lib/help.php:526
2602
  msgid ""
2603
  "To get the most efficient protection, you can ask NinjaFirewall to "
2604
  "automatically update its security rules."
2605
  msgstr ""
2606
 
2607
+ #: lib/help.php:528
2608
  msgid ""
2609
  "Each time a new vulnerability is found in WordPress or one of its plugins/"
2610
  "themes, a new set of security rules will be made available to protect "
2611
  "against such vulnerability if needed."
2612
  msgstr ""
2613
 
2614
+ #: lib/help.php:530
2615
  msgid ""
2616
  "Only security rules will be downloaded. If a new version of NinjaFirewall "
2617
  "(including new files, options and features) was available, it would have to "
2618
  "be updated from the dashboard plugins menu as usual."
2619
  msgstr ""
2620
 
2621
+ #: lib/help.php:532
2622
  msgid ""
2623
  "We recommend to enable this feature, as it is the <strong>best way to keep "
2624
  "your WordPress secure</strong> against new vulnerabilities."
2625
  msgstr ""
2626
 
2627
+ #: lib/help.php:537 lib/security_rules.php:48
2628
  msgid "Rules Editor"
2629
  msgstr ""
2630
 
2631
+ #: lib/help.php:539
2632
  msgid ""
2633
  "Besides the \"Firewall Policies\", NinjaFirewall includes also a large set "
2634
  "of built-in rules used to protect your blog against the most common "
2638
  "individually:"
2639
  msgstr ""
2640
 
2641
+ #: lib/help.php:541
2642
  msgid ""
2643
  "Check your firewall log and find the rule ID you want to disable (it is "
2644
  "displayed in the <code>RULE</code> column)."
2645
  msgstr ""
2646
 
2647
+ #: lib/help.php:542
2648
  msgid ""
2649
  "Select its ID from the enabled rules list below and click the \"Disable it\" "
2650
  "button."
2651
  msgstr ""
2652
 
2653
+ #: lib/help.php:544
2654
  msgid ""
2655
  "Note: if the <code>RULE</code> column from your log shows a hyphen <code>-</"
2656
  "code> instead of a number, that means that the rule can be changed in the "
2657
  "\"Firewall Policies\" page."
2658
  msgstr ""
2659
 
2660
+ #: lib/install.php:70
 
 
 
 
 
 
 
 
 
 
2661
  #, php-format
2662
  msgid ""
2663
  "Error: Your .htaccess file is not writable, please change its permissions: %s"
2664
  msgstr ""
2665
 
2666
+ #: lib/install.php:95 ninjafirewall.php:594 ninjafirewall.php:598
2667
  #, php-format
2668
  msgid "Error: wrong parameter value (%s)."
2669
  msgstr ""
2670
 
2671
+ #: lib/install.php:102 lib/install.php:183 lib/install.php:204
2672
  #, php-format
2673
  msgid ""
2674
  "Error: The following file is not writable, please change its permissions: %s"
2675
  msgstr ""
2676
 
2677
+ #: lib/install.php:125
2678
  #, php-format
2679
  msgid ""
2680
  "NinjaFirewall detected that the requested changes seemed to crash your blog. "
2681
  "%s"
2682
  msgstr ""
2683
 
2684
+ #: lib/install.php:126
2685
  msgid ""
2686
  "Changes have been undone. You may need to modify your selection and try "
2687
  "again."
2688
  msgstr ""
2689
 
2690
+ #: lib/install.php:136
2691
  #, php-format
2692
  msgid "The website front-end returned: HTTP %s %s."
2693
  msgstr ""
2694
 
2695
+ #: lib/install.php:148
2696
  #, php-format
2697
  msgid "The website front-end returned a fatal error: %s."
2698
  msgstr ""
2699
 
2700
+ #: lib/install.php:238 lib/install.php:263 lib/install.php:288
2701
+ #: lib/install.php:309
2702
  msgid "File is not writable"
2703
  msgstr ""
2704
 
2705
+ #: lib/install_default.php:167
2706
  msgid ""
2707
  "Error: The installer cannot download the security rules from wordpress.org "
2708
  "website."
2709
  msgstr ""
2710
 
2711
+ #: lib/install_default.php:168
2712
  msgid ""
2713
  "The server may be temporarily down or you may have network connectivity "
2714
  "problems? Please try again in a few minutes."
2715
  msgstr ""
2716
 
2717
+ #: lib/install_default.php:169
2718
  msgid ""
2719
  "NinjaFirewall downloads its rules over an HTTPS secure connection. Maybe "
2720
  "your server does not support SSL? You can force NinjaFirewall to use a non-"
2722
  "config.php</strong> file:"
2723
  msgstr ""
2724
 
2725
+ #: lib/install_default.php:232
2726
  #, php-format
2727
  msgid ""
2728
  "NinjaFirewall cannot create its <code>nfwlog/</code>log and cache folder; "
2901
  msgid "Error: unable to write to the %s configuration file"
2902
  msgstr ""
2903
 
2904
+ #: lib/logs.php:36 ninjafirewall.php:790
2905
  msgid "Logs"
2906
  msgstr ""
2907
 
3010
  "Administrator to the whitelist\" option is enabled."
3011
  msgstr ""
3012
 
3013
+ #: lib/logs_live_log.php:98 ninjafirewall.php:329
3014
+ msgid ""
3015
+ "Live Log lets you watch your blog traffic in real time. To enable it, click "
3016
+ "on the button below."
3017
+ msgstr ""
3018
+
3019
  #: lib/logs_live_log.php:104
3020
  msgid "Refresh rate:"
3021
  msgstr ""
3056
  msgid "Inclusion and exclusion filters (REQUEST_URI)"
3057
  msgstr ""
3058
 
3059
+ #: lib/logs_live_log.php:160 lib/monitoring_file_check.php:395
3060
  msgid "None"
3061
  msgstr ""
3062
 
3068
  msgid "Must not include"
3069
  msgstr ""
3070
 
3071
+ #: lib/logs_live_log.php:164 lib/monitoring_file_check.php:153
3072
  #: lib/monitoring_file_guard.php:89
3073
  msgid "e.g.,"
3074
  msgstr ""
3111
  msgid "Error: please enter the custom log format."
3112
  msgstr ""
3113
 
3114
+ #: lib/monitoring.php:43 ninjafirewall.php:764
3115
  msgid "Monitoring"
3116
  msgstr ""
3117
 
3127
  msgid "You must create a snapshot first."
3128
  msgstr ""
3129
 
3130
+ #: lib/monitoring_file_check.php:96 lib/monitoring_file_check.php:763
3131
  msgid "NinjaFirewall detected that changes were made to your files."
3132
  msgstr ""
3133
 
3135
  msgid "No changes detected."
3136
  msgstr ""
3137
 
3138
+ #: lib/monitoring_file_check.php:132
3139
+ msgid ""
3140
+ "File Check lets you perform file integrity monitoring upon request or on a "
3141
+ "specific interval. To start, create a snapshot of your files by clicking the "
3142
+ "button below."
3143
+ msgstr ""
3144
+
3145
+ #: lib/monitoring_file_check.php:139
3146
  msgid "Create a snapshot of all files stored in that directory"
3147
  msgstr ""
3148
 
3149
+ #: lib/monitoring_file_check.php:147
3150
  #, php-format
3151
  msgid "Default: %s"
3152
  msgstr ""
3153
 
3154
+ #: lib/monitoring_file_check.php:152 lib/monitoring_file_guard.php:88
3155
  msgid "Exclude the following files/folders (optional)"
3156
  msgstr ""
3157
 
3158
+ #: lib/monitoring_file_check.php:153
3159
  msgid ""
3160
  "Full or partial case-sensitive string(s). Multiple values must be comma-"
3161
  "separated"
3162
  msgstr ""
3163
 
3164
+ #: lib/monitoring_file_check.php:159
3165
  msgid "Do not follow symbolic links (default)"
3166
  msgstr ""
3167
 
3168
+ #: lib/monitoring_file_check.php:165
3169
  msgid "Create Snapshot"
3170
  msgstr ""
3171
 
3172
+ #: lib/monitoring_file_check.php:231
3173
  msgid "Last snapshot"
3174
  msgstr ""
3175
 
3176
+ #: lib/monitoring_file_check.php:233
3177
  #, php-format
3178
  msgid "Created on: %s"
3179
  msgstr ""
3180
 
3181
+ #: lib/monitoring_file_check.php:234
3182
  #, php-format
3183
  msgid "Total files: %s "
3184
  msgstr ""
3185
 
3186
+ #: lib/monitoring_file_check.php:236
3187
  msgid "Directory:"
3188
  msgstr ""
3189
 
3190
+ #: lib/monitoring_file_check.php:240
3191
  msgid "Exclusion:"
3192
  msgstr ""
3193
 
3194
+ #: lib/monitoring_file_check.php:246
3195
  msgid "Symlinks:"
3196
  msgstr ""
3197
 
3198
+ #: lib/monitoring_file_check.php:248
3199
  msgid "follow"
3200
  msgstr ""
3201
 
3202
+ #: lib/monitoring_file_check.php:250
3203
  msgid "do not follow"
3204
  msgstr ""
3205
 
3206
+ #: lib/monitoring_file_check.php:254
3207
  #, php-format
3208
  msgid "Processing time: %s seconds"
3209
  msgstr ""
3210
 
3211
+ #: lib/monitoring_file_check.php:259
3212
  msgid "Download Snapshot"
3213
  msgstr ""
3214
 
3215
+ #: lib/monitoring_file_check.php:259
3216
  msgid "Delete Snapshot"
3217
  msgstr ""
3218
 
3219
+ #: lib/monitoring_file_check.php:265
3220
  msgid "Last changes"
3221
  msgstr ""
3222
 
3223
+ #: lib/monitoring_file_check.php:272 lib/monitoring_file_check.php:771
3224
  #, php-format
3225
  msgid "New files: %s"
3226
  msgstr ""
3227
 
3228
+ #: lib/monitoring_file_check.php:273 lib/monitoring_file_check.php:773
3229
  #, php-format
3230
  msgid "Deleted files: %s"
3231
  msgstr ""
3232
 
3233
+ #: lib/monitoring_file_check.php:274 lib/monitoring_file_check.php:772
3234
  #, php-format
3235
  msgid "Modified files: %s"
3236
  msgstr ""
3237
 
3238
+ #: lib/monitoring_file_check.php:278
3239
  msgid "View Changes"
3240
  msgstr ""
3241
 
3242
+ #: lib/monitoring_file_check.php:282
3243
  msgid "Download Changes"
3244
  msgstr ""
3245
 
3246
+ #: lib/monitoring_file_check.php:294
3247
  msgid "Click a file to get more info about it."
3248
  msgstr ""
3249
 
3250
+ #: lib/monitoring_file_check.php:297
3251
  msgid "New files:"
3252
  msgstr ""
3253
 
3254
+ #: lib/monitoring_file_check.php:306 lib/monitoring_file_check.php:359
3255
  msgid "Size"
3256
  msgstr ""
3257
 
3258
+ #: lib/monitoring_file_check.php:310 lib/monitoring_file_check.php:364
3259
  msgid "Access"
3260
  msgstr ""
3261
 
3262
+ #: lib/monitoring_file_check.php:314 lib/monitoring_file_check.php:369
3263
  msgid "Uid / Gid"
3264
  msgstr ""
3265
 
3266
+ #: lib/monitoring_file_check.php:318 lib/monitoring_file_check.php:374
3267
  msgid "Modify"
3268
  msgstr ""
3269
 
3270
+ #: lib/monitoring_file_check.php:322 lib/monitoring_file_check.php:379
3271
  msgid "Change"
3272
  msgstr ""
3273
 
3274
+ #: lib/monitoring_file_check.php:332
3275
  msgid "Deleted files:"
3276
  msgstr ""
3277
 
3278
+ #: lib/monitoring_file_check.php:345
3279
  msgid "Modified files:"
3280
  msgstr ""
3281
 
3282
+ #: lib/monitoring_file_check.php:355
3283
  msgid "Old"
3284
  msgstr ""
3285
 
3286
+ #: lib/monitoring_file_check.php:356
3287
  msgid "New"
3288
  msgstr ""
3289
 
3290
+ #: lib/monitoring_file_check.php:405
3291
  msgid "Scan System For File Changes"
3292
  msgstr ""
3293
 
3294
+ #: lib/monitoring_file_check.php:423
3295
  msgid "Options"
3296
  msgstr ""
3297
 
3298
+ #: lib/monitoring_file_check.php:430
3299
  #, php-format
3300
  msgid ""
3301
  "It seems that %s is set. Ensure you have another way to run WP-Cron, "
3302
  "otherwise NinjaFirewall scheduled scans will not work."
3303
  msgstr ""
3304
 
3305
+ #: lib/monitoring_file_check.php:436
3306
  msgid "Enable scheduled scans"
3307
  msgstr ""
3308
 
3309
+ #: lib/monitoring_file_check.php:438
3310
  msgid "No (default)"
3311
  msgstr ""
3312
 
3313
+ #: lib/monitoring_file_check.php:439 lib/security_rules_update.php:153
3314
  msgid "Hourly"
3315
  msgstr ""
3316
 
3317
+ #: lib/monitoring_file_check.php:440 lib/security_rules_update.php:154
3318
  msgid "Twicedaily"
3319
  msgstr ""
3320
 
3321
+ #: lib/monitoring_file_check.php:441 lib/security_rules_update.php:155
3322
  msgid "Daily"
3323
  msgstr ""
3324
 
3325
+ #: lib/monitoring_file_check.php:448
3326
  #, php-format
3327
  msgid ""
3328
  "Next scan will start in approximately %s day(s), %s hour(s), %s minute(s) "
3329
  "and %s second(s)."
3330
  msgstr ""
3331
 
3332
+ #: lib/monitoring_file_check.php:455
3333
  msgid ""
3334
  "The next scheduled scan date is in the past! WordPress wp-cron may not be "
3335
  "working or may have been disabled."
3336
  msgstr ""
3337
 
3338
+ #: lib/monitoring_file_check.php:463
3339
  msgid "Scheduled scan report"
3340
  msgstr ""
3341
 
3342
+ #: lib/monitoring_file_check.php:465
3343
  msgid "Send me a report by email only if changes are detected (default)"
3344
  msgstr ""
3345
 
3346
+ #: lib/monitoring_file_check.php:466
3347
  msgid "Always send me a report by email after a scheduled scan"
3348
  msgstr ""
3349
 
3350
+ #: lib/monitoring_file_check.php:471
3351
  msgid "Save Scan Options"
3352
  msgstr ""
3353
 
3354
+ #: lib/monitoring_file_check.php:483
3355
  msgid "Enter the full path to the directory to be scanned."
3356
  msgstr ""
3357
 
3358
+ #: lib/monitoring_file_check.php:490
3359
  #, php-format
3360
  msgid "The directory %s does not exist."
3361
  msgstr ""
3362
 
3363
+ #: lib/monitoring_file_check.php:493
3364
  #, php-format
3365
  msgid "The directory %s is not readable."
3366
  msgstr ""
3367
 
3368
+ #: lib/monitoring_file_check.php:534
3369
  #, php-format
3370
  msgid "Cannot write to %s."
3371
  msgstr ""
3372
 
3373
+ #: lib/monitoring_file_check.php:564
3374
  #, php-format
3375
  msgid "Error : cannot open %s directory."
3376
  msgstr ""
3377
 
3378
+ #: lib/monitoring_file_check.php:567
3379
  #, php-format
3380
  msgid "Error : %s directory is not readable."
3381
  msgstr ""
3382
 
3383
+ #: lib/monitoring_file_check.php:582
3384
  #, php-format
3385
  msgid "Missing options line %s, please try again."
3386
  msgstr ""
3387
 
3388
+ #: lib/monitoring_file_check.php:592
3389
  #, php-format
3390
  msgid "Cannot create %s."
3391
  msgstr ""
3392
 
3393
+ #: lib/monitoring_file_check.php:609
3394
  msgid "Error reading old snapshot file."
3395
  msgstr ""
3396
 
3397
+ #: lib/monitoring_file_check.php:620
3398
  msgid "Error reading new snapshot file."
3399
  msgstr ""
3400
 
3401
+ #: lib/monitoring_file_check.php:736 ninjafirewall.php:421
3402
  msgid "New file"
3403
  msgstr ""
3404
 
3405
+ #: lib/monitoring_file_check.php:737 ninjafirewall.php:422
3406
  msgid "Modified file"
3407
  msgstr ""
3408
 
3409
+ #: lib/monitoring_file_check.php:738 ninjafirewall.php:423
3410
  msgid "Deleted file"
3411
  msgstr ""
3412
 
3413
+ #: lib/monitoring_file_check.php:762
3414
  msgid "[NinjaFirewall] Alert: File Check detection"
3415
  msgstr ""
3416
 
3417
+ #: lib/monitoring_file_check.php:765 lib/monitoring_file_check.php:767
3418
+ #: lib/monitoring_file_check.php:792 lib/monitoring_file_check.php:794
3419
+ #: lib/security_rules_update.php:553 lib/security_rules_update.php:555
3420
+ #: lib/utils.php:214 lib/utils.php:776 lib/utils.php:941 lib/utils.php:1273
3421
  msgid "Blog:"
3422
  msgstr ""
3423
 
3424
+ #: lib/monitoring_file_check.php:769 lib/monitoring_file_check.php:796
3425
+ #: lib/security_rules_update.php:558
3426
  #, php-format
3427
  msgid "Date: %s"
3428
  msgstr ""
3429
 
3430
+ #: lib/monitoring_file_check.php:775
3431
  msgid "See attached file for details."
3432
  msgstr ""
3433
 
3434
+ #: lib/monitoring_file_check.php:789
3435
  msgid "[NinjaFirewall] File Check report"
3436
  msgstr ""
3437
 
3438
+ #: lib/monitoring_file_check.php:790
3439
  msgid "NinjaFirewall did not detect changes in your files."
3440
  msgstr ""
3441
 
3480
  msgid "Save File Guard options"
3481
  msgstr ""
3482
 
3483
+ #: lib/network.php:24 ninjafirewall.php:1051 ninjafirewall.php:1055
3484
  #, php-format
3485
  msgid "You are not allowed to perform this task (%s)."
3486
  msgstr ""
3503
  msgid "Save Network options"
3504
  msgstr ""
3505
 
3506
+ #: lib/security_rules.php:44 lib/security_rules_update.php:559
3507
+ #: ninjafirewall.php:794
3508
  msgid "Security Rules"
3509
  msgstr ""
3510
 
3606
  msgid "Security rules have been updated."
3607
  msgstr ""
3608
 
3609
+ #: lib/security_rules_update.php:91 lib/security_rules_update.php:435
3610
  msgid "No security rules update available."
3611
  msgstr ""
3612
 
3617
  "otherwise NinjaFirewall automatic updates will not work."
3618
  msgstr ""
3619
 
3620
+ #: lib/security_rules_update.php:136
3621
  msgid "Automatically update NinjaFirewall security rules"
3622
  msgstr ""
3623
 
3624
+ #: lib/security_rules_update.php:148
3625
  msgid "Check for updates"
3626
  msgstr ""
3627
 
3628
+ #: lib/security_rules_update.php:151
3629
  msgid "Every 15 minutes"
3630
  msgstr ""
3631
 
3632
+ #: lib/security_rules_update.php:152
3633
  msgid "Every 30 minutes"
3634
  msgstr ""
3635
 
3636
+ #: lib/security_rules_update.php:169
3637
  msgid ""
3638
  "The next scheduled date is in the past! WordPress wp-cron may not be working "
3639
  "or may have been disabled."
3640
  msgstr ""
3641
 
3642
+ #: lib/security_rules_update.php:174
3643
  #, php-format
3644
  msgid ""
3645
  "Next scheduled update will start in approximately %s day, %s hour(s), %s "
3646
  "minute(s) and %s seconds."
3647
  msgstr ""
3648
 
3649
+ #: lib/security_rules_update.php:182
3650
  msgid "Notification"
3651
  msgstr ""
3652
 
3653
+ #: lib/security_rules_update.php:184
3654
  msgid "Send me a report by email when security rules have been updated."
3655
  msgstr ""
3656
 
3657
+ #: lib/security_rules_update.php:185
3658
  msgid ""
3659
  "Reports will be sent to the contact email address defined in the Event "
3660
  "Notifications menu."
3661
  msgstr ""
3662
 
3663
+ #: lib/security_rules_update.php:195 lib/security_rules_update.php:210
3664
  msgid "The updates log is currently empty."
3665
  msgstr ""
3666
 
3667
+ #: lib/security_rules_update.php:199
3668
  msgid "Updates Log"
3669
  msgstr ""
3670
 
3671
+ #: lib/security_rules_update.php:213
3672
  msgid "Log is flushed automatically."
3673
  msgstr ""
3674
 
3675
+ #: lib/security_rules_update.php:224
3676
  msgid "Save Updates Options"
3677
  msgstr ""
3678
 
3679
+ #: lib/security_rules_update.php:225
3680
  msgid "Check For Updates Now!"
3681
  msgstr ""
3682
 
3683
+ #: lib/security_rules_update.php:233
3684
  msgid "Delete Log"
3685
  msgstr ""
3686
 
3687
+ #: lib/security_rules_update.php:321
3688
  msgid "Error: Wrong rules format."
3689
  msgstr ""
3690
 
3691
+ #: lib/security_rules_update.php:330
3692
  msgid "Error: Unable to unserialize the new rules."
3693
  msgstr ""
3694
 
3695
+ #: lib/security_rules_update.php:338
3696
  msgid "Error: Unserialized rules seem corrupted."
3697
  msgstr ""
3698
 
3699
+ #: lib/security_rules_update.php:378
3700
  #, php-format
3701
  msgid "Security rules updated to version %s."
3702
  msgstr ""
3703
 
3704
+ #: lib/security_rules_update.php:424
 
 
 
 
 
 
3705
  msgid "Error: Unable to retrieve the new rules version."
3706
  msgstr ""
3707
 
3708
+ #: lib/security_rules_update.php:442
3709
  #, php-format
3710
  msgid "Error: Server returned a %s HTTP error code (#1)."
3711
  msgstr ""
3712
 
3713
+ #: lib/security_rules_update.php:449 lib/security_rules_update.php:515
3714
  msgid "Error: Unable to connect to the remote server"
3715
  msgstr ""
3716
 
3717
+ #: lib/security_rules_update.php:479
3718
  #, php-format
3719
  msgid "Error: The new rules versions do not match (%s != %s)."
3720
  msgstr ""
3721
 
3722
+ #: lib/security_rules_update.php:493
3723
  #, php-format
3724
  msgid ""
3725
  "Error: The new rules %s digital signature is not correct. Aborting update, "
3726
  "rules may have been tampered with."
3727
  msgstr ""
3728
 
3729
+ #: lib/security_rules_update.php:508
3730
  #, php-format
3731
  msgid "Error: Server returned a %s HTTP error code (#2)."
3732
  msgstr ""
3733
 
3734
+ #: lib/security_rules_update.php:550
3735
  msgid "[NinjaFirewall] Security rules update"
3736
  msgstr ""
3737
 
3738
+ #: lib/security_rules_update.php:551
3739
  msgid "NinjaFirewall security rules have been updated:"
3740
  msgstr ""
3741
 
3742
+ #: lib/security_rules_update.php:557
3743
  msgid "Rules version:"
3744
  msgstr ""
3745
 
3746
+ #: lib/security_rules_update.php:559
3747
+ #, php-format
3748
+ msgid "This notification can be turned off from NinjaFirewall \"%s\" page."
3749
  msgstr ""
3750
 
3751
+ #: lib/thickbox.php:42
3752
  msgid "Upgrade to Full WAF mode"
3753
  msgstr ""
3754
 
3755
+ #: lib/thickbox.php:47
3756
  msgid ""
3757
  "In <strong>Full WAF</strong> mode, all scripts located inside the blog "
3758
  "installation directories and sub-directories are protected by NinjaFirewall, "
3760
  "highest possible level of protection: security without compromise."
3761
  msgstr ""
3762
 
3763
+ #: lib/thickbox.php:49
3764
  #, php-format
3765
  msgid ""
3766
  "It works on most websites right out of the box, or may require <a href=\"%s"
3769
  "all."
3770
  msgstr ""
3771
 
3772
+ #: lib/thickbox.php:51
3773
  msgid ""
3774
  "If this happened to you, don't worry: you could still run it in "
3775
  "<strong>WordPress WAF</strong> mode. Despite being less powerful than the "
3777
  "higher than other security plugins."
3778
  msgstr ""
3779
 
3780
+ #: lib/thickbox.php:57
3781
  msgid "(recommended)"
3782
  msgstr ""
3783
 
3784
+ #: lib/thickbox.php:117
3785
  msgid "Select your HTTP server and your PHP server API"
3786
  msgstr ""
3787
 
3788
+ #: lib/thickbox.php:127
3789
  msgid "Other webserver + CGI/FastCGI or PHP-FPM"
3790
  msgstr ""
3791
 
3792
+ #: lib/thickbox.php:129
3793
  msgid "View PHPINFO"
3794
  msgstr ""
3795
 
3796
+ #: lib/thickbox.php:161
3797
  msgid "Select the PHP initialization file supported by your server"
3798
  msgstr ""
3799
 
3800
+ #: lib/thickbox.php:173
3801
  msgid "Let NinjaFirewall make the necessary changes (recommended)."
3802
  msgstr ""
3803
 
3804
+ #: lib/thickbox.php:174
3805
  msgid "I want to make the changes myself."
3806
  msgstr ""
3807
 
3808
+ #: lib/thickbox.php:176
3809
  msgid ""
3810
  "Ensure that you have FTP access to your website so that, if there were a "
3811
  "problem during the installation of the firewall, you could easily undo the "
3812
  "changes."
3813
  msgstr ""
3814
 
3815
+ #: lib/thickbox.php:179
3816
  msgid "Please make the changes below, then click on the \"Finish\" button."
3817
  msgstr ""
3818
 
3819
+ #: lib/thickbox.php:186
3820
  #, php-format
3821
  msgid ""
3822
  "The %s file must be created, and the following lines of code added to it:"
3823
  msgstr ""
3824
 
3825
+ #: lib/thickbox.php:187
3826
  #, php-format
3827
  msgid "The following lines of code must be added to your existing %s file:"
3828
  msgstr ""
3829
 
3830
+ #: lib/thickbox.php:247
3831
  msgid ""
3832
  "Log in to your Openlitespeed admin dashboard, click on \"Virtual Host\", "
3833
  "select your domain, add the following instructions to the \"php.ini Override"
3834
  "\" section in the \"General\" tab, and restart Openlitespeed:"
3835
  msgstr ""
3836
 
3837
+ #: lib/thickbox.php:254
3838
  msgid ""
3839
  "Important: if one day you wanted to uninstall NinjaFirewall, do not forget "
3840
  "to remove these instructions from your Openlitespeed admin dashboard "
3842
  "could not do it for you."
3843
  msgstr ""
3844
 
3845
+ #: lib/thickbox.php:272
3846
  msgid "Finish"
3847
  msgstr ""
3848
 
3854
  msgid "NinjaFirewall has blocked an attempt to create a user account:"
3855
  msgstr ""
3856
 
3857
+ #: lib/utils.php:215 lib/utils.php:946
3858
  msgid "Username:"
3859
  msgstr ""
3860
 
3861
+ #: lib/utils.php:216 lib/utils.php:951 lib/utils.php:1274
3862
  msgid "User IP:"
3863
  msgstr ""
3864
 
3865
+ #: lib/utils.php:228 lib/utils.php:963 lib/utils.php:1269
 
 
 
 
3866
  msgid "A PHP backtrace has been attached to this message for your convenience."
3867
  msgstr ""
3868
 
3869
+ #: lib/utils.php:251 lib/utils.php:252 lib/utils.php:987 lib/utils.php:988
3870
  msgid "You are not allowed to perform this task."
3871
  msgstr ""
3872
 
3873
+ #: lib/utils.php:525 lib/utils.php:529
3874
  msgid "NinjaFirewall error"
3875
  msgstr ""
3876
 
3877
+ #: lib/utils.php:526
3878
  #, php-format
3879
  msgid ""
3880
  "%s directory cannot be created. Please review your installation and ensure "
3881
  "that %s is writable."
3882
  msgstr ""
3883
 
3884
+ #: lib/utils.php:530
3885
  #, php-format
3886
  msgid ""
3887
  "%s directory is read-only. Please review your installation and ensure that "
3888
  "%s is writable."
3889
  msgstr ""
3890
 
3891
+ #: lib/utils.php:549
3892
  msgid "unknown error"
3893
  msgstr ""
3894
 
3895
+ #: lib/utils.php:551
3896
  msgid "NinjaFirewall fatal error:"
3897
  msgstr ""
3898
 
3899
+ #: lib/utils.php:552
3900
  msgid "Review your installation, your site is not protected."
3901
  msgstr ""
3902
 
3903
+ #: lib/utils.php:569
3904
  msgid "Alert: WordPress console login"
3905
  msgstr ""
3906
 
3907
+ #: lib/utils.php:575
 
 
 
 
3908
  msgid "Someone just logged in to your WordPress admin console:"
3909
  msgstr ""
3910
 
3911
+ #: lib/utils.php:581
 
 
 
 
 
 
 
 
 
 
 
 
3912
  msgid "Support forum"
3913
  msgstr ""
3914
 
3915
+ #: lib/utils.php:642 lib/utils.php:669
3916
  msgid "Forbidden access"
3917
  msgstr ""
3918
 
3919
+ #: lib/utils.php:688
3920
  #, php-format
3921
  msgid ""
3922
  "<strong>ERROR</strong>: Invalid username or password.<br /><a href=\"%s"
3923
  "\">Lost your password</a>?"
3924
  msgstr ""
3925
 
3926
+ #: lib/utils.php:772
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3927
  msgid "[NinjaFirewall] Alert: Database changes detected"
3928
  msgstr ""
3929
 
3930
+ #: lib/utils.php:773
3931
  msgid ""
3932
  "NinjaFirewall has detected that one or more administrator accounts were "
3933
  "modified in the database:"
3934
  msgstr ""
3935
 
3936
+ #: lib/utils.php:778
3937
  #, php-format
3938
  msgid "Total administrators : %s"
3939
  msgstr ""
3940
 
3941
+ #: lib/utils.php:787
3942
  msgid ""
3943
  "If you cannot see any modifications in the above fields, it is possible that "
3944
  "the administrator password was changed."
3945
  msgstr ""
3946
 
3947
+ #: lib/utils.php:926
3948
  msgid "Blocked privilege escalation attempt"
3949
  msgstr ""
3950
 
3951
+ #: lib/utils.php:939
3952
  msgid ""
3953
  "NinjaFirewall has blocked an attempt to modify a user capability by someone "
3954
  "who does not have administrative privileges:"
3955
  msgstr ""
3956
 
3957
+ #: lib/utils.php:966 lib/utils.php:1279
3958
+ msgid ""
3959
+ "This protection (and notification) can be turned off from NinjaFirewall "
3960
+ "\"Firewall Policies\" page."
3961
+ msgstr ""
3962
+
3963
+ #: lib/utils.php:999
3964
  msgid ""
3965
  "NinjaFirewall brute-force protection is enabled and you are temporarily "
3966
  "whitelisted."
3967
  msgstr ""
3968
 
3969
+ #: lib/utils.php:1014
3970
  #, php-format
3971
  msgid ""
3972
  "Hey, it seems that you've been using NinjaFirewall for some time. If you "
3975
  "rate it. Thank you!"
3976
  msgstr ""
3977
 
3978
+ #: lib/utils.php:1241
3979
  msgid ""
3980
  "The attempt was blocked and the option was reversed to its original value."
3981
  msgstr ""
3982
 
3983
+ #: lib/utils.php:1246
3984
  msgid "Attempt to modify WordPress settings"
3985
  msgstr ""
3986
 
3987
+ #: lib/utils.php:1247
3988
  msgid ""
3989
  "NinjaFirewall has blocked an attempt to modify some important WordPress "
3990
  "settings by a user that does not have administrative privileges:"
3991
  msgstr ""
3992
 
3993
+ #: lib/utils.php:1248 lib/utils.php:1257
3994
  #, php-format
3995
  msgid "Option: %s"
3996
  msgstr ""
3997
 
3998
+ #: lib/utils.php:1249
3999
  #, php-format
4000
  msgid "Original value: %s"
4001
  msgstr ""
4002
 
4003
+ #: lib/utils.php:1250
4004
  #, php-format
4005
  msgid "Modified value: %s"
4006
  msgstr ""
4007
 
4008
+ #: lib/utils.php:1251 lib/utils.php:1259
4009
  #, php-format
4010
  msgid "Action taken: %s"
4011
  msgstr ""
4012
 
4013
+ #: lib/utils.php:1255
4014
  msgid "Code injection attempt in WordPress options table"
4015
  msgstr ""
4016
 
4017
+ #: lib/utils.php:1256
4018
  msgid ""
4019
  "NinjaFirewall has blocked an attempt to inject code in the WordPress options "
4020
  "table by a user that does not have administrative privileges:"
4021
  msgstr ""
4022
 
4023
+ #: lib/utils.php:1258
4024
  #, php-format
4025
  msgid "Code: %s"
4026
  msgstr ""
4027
 
4028
+ #: lib/utils.php:1314
 
 
 
 
 
 
4029
  #, php-format
4030
  msgid "Error, cannot create the %s folder."
4031
  msgstr ""
4032
 
4033
+ #: lib/utils.php:1314 lib/utils.php:1322 lib/utils.php:1330
4034
  msgid "Check your server permissions and try again."
4035
  msgstr ""
4036
 
4037
+ #: lib/utils.php:1322
4038
  #, php-format
4039
  msgid "Error, the %s folder is not writable."
4040
  msgstr ""
4041
 
4042
+ #: lib/utils.php:1330
4043
  #, php-format
4044
  msgid "Error, cannot write %s."
4045
  msgstr ""
4413
  msgid "Cannot retrieve user rules from database (#4)"
4414
  msgstr ""
4415
 
4416
+ #: ninjafirewall.php:110
4417
  msgid ""
4418
  "You do not have \"unfiltered_html\" capability. Please enable it in order to "
4419
  "run NinjaFirewall (or make sure you do not have \"DISALLOW_UNFILTERED_HTML\" "
4420
  "in your wp-config.php script)."
4421
  msgstr ""
4422
 
4423
+ #: ninjafirewall.php:117
4424
  #, php-format
4425
  msgid ""
4426
  "NinjaFirewall requires WordPress 3.3 or greater but your current version is "
4427
  "%s."
4428
  msgstr ""
4429
 
4430
+ #: ninjafirewall.php:121
4431
  #, php-format
4432
  msgid ""
4433
  "NinjaFirewall requires PHP 5.3 or greater but your current version is %s."
4434
  msgstr ""
4435
 
4436
+ #: ninjafirewall.php:125
4437
  #, php-format
4438
  msgid "NinjaFirewall requires the PHP %s extension."
4439
  msgstr ""
4440
 
4441
+ #: ninjafirewall.php:129
4442
  msgid ""
4443
  "You have SAFE_MODE enabled. Please disable it, it is deprecated as of PHP "
4444
  "5.3.0 (see http://php.net/safe-mode)."
4445
  msgstr ""
4446
 
4447
+ #: ninjafirewall.php:133
4448
  msgid "You are not allowed to activate NinjaFirewall."
4449
  msgstr ""
4450
 
4451
+ #: ninjafirewall.php:137
4452
  msgid "NinjaFirewall is not compatible with Microsoft Windows."
4453
  msgstr ""
4454
 
4455
+ #: ninjafirewall.php:289
4456
  msgid ""
4457
  "All fields will be restored to their default values and any changes you made "
4458
  "will be lost. Continue?"
4459
  msgstr ""
4460
 
4461
+ #: ninjafirewall.php:293
4462
  msgid "Missing security nonce, try to reload the page."
4463
  msgstr ""
4464
 
4465
+ #: ninjafirewall.php:295
4466
  msgid "Please select the HTTP server in the list."
4467
  msgstr ""
4468
 
4469
+ #: ninjafirewall.php:299
4470
  msgid ""
4471
  "This action will restore the selected configuration file and will override "
4472
  "all your current firewall options, policies and rules. Continue?"
4473
  msgstr ""
4474
 
4475
+ #: ninjafirewall.php:303
4476
  msgid ""
4477
  "Any character that is not a letter [a-zA-Z], a digit [0-9], a dot [.], a "
4478
  "hyphen [-] or an underscore [_] will be removed from the filename and "
4479
  "replaced with the substitution character. Continue?"
4480
  msgstr ""
4481
 
4482
+ #: ninjafirewall.php:305
4483
  msgid ""
4484
  "Ensure that you can access your admin console over HTTPS before enabling "
4485
  "this option, otherwise you will lock yourself out of your site. Continue?"
4486
  msgstr ""
4487
 
4488
+ #: ninjafirewall.php:309
4489
  msgid "Delete the current snapshot ?"
4490
  msgstr ""
4491
 
4492
+ #: ninjafirewall.php:313
4493
  msgid "Invalid character."
4494
  msgstr ""
4495
 
4496
+ #: ninjafirewall.php:315
4497
  msgid "\"admin\" is not acceptable, please choose another user name."
4498
  msgstr ""
4499
 
4500
+ #: ninjafirewall.php:317
4501
  msgid "Please enter max 1024 character only."
4502
  msgstr ""
4503
 
4504
+ #: ninjafirewall.php:319
4505
  msgid "Select when to enable the login protection."
4506
  msgstr ""
4507
 
4508
+ #: ninjafirewall.php:321
4509
  msgid "Enter a name and a password for the HTTP authentication."
4510
  msgstr ""
4511
 
4512
+ #: ninjafirewall.php:325
4513
  msgid "Your public key is not valid."
4514
  msgstr ""
4515
 
4516
+ #: ninjafirewall.php:331
4517
  msgid "No traffic yet, please wait"
4518
  msgstr ""
4519
 
4520
+ #: ninjafirewall.php:333
4521
  msgid "seconds..."
4522
  msgstr ""
4523
 
4524
+ #: ninjafirewall.php:335
4525
  msgid "Error: Live Log did not receive the expected response from your server:"
4526
  msgstr ""
4527
 
4528
+ #: ninjafirewall.php:337
4529
  msgid "Error: URL does not seem to exist (404 Not Found):"
4530
  msgstr ""
4531
 
4532
+ #: ninjafirewall.php:339
4533
  msgid "Error: Cannot find your log file. Try to reload this page."
4534
  msgstr ""
4535
 
4536
+ #: ninjafirewall.php:341
4537
  msgid "Error: The HTTP server returned the following error code:"
4538
  msgstr ""
4539
 
4540
+ #: ninjafirewall.php:579 ninjafirewall.php:690
4541
  msgid "Error: Security nonces do not match. Reload the page and try again."
4542
  msgstr ""
4543
 
4550
  msgid "Error: missing parameter (%s)."
4551
  msgstr ""
4552
 
4553
+ #: ninjafirewall.php:752
4554
  msgid "NinjaFirewall: Dashboard"
4555
  msgstr ""
4556
 
4557
+ #: ninjafirewall.php:756
4558
  msgid "NinjaFirewall: Firewall Options"
4559
  msgstr ""
4560
 
4561
+ #: ninjafirewall.php:760
4562
  msgid "NinjaFirewall: Firewall Policies"
4563
  msgstr ""
4564
 
4565
+ #: ninjafirewall.php:764
4566
  msgid "NinjaFirewall: Monitoring"
4567
  msgstr ""
4568
 
4569
+ #: ninjafirewall.php:774
4570
  msgid "NinjaFirewall: Anti-Malware"
4571
  msgstr ""
4572
 
4573
+ #: ninjafirewall.php:778
4574
  msgid "NinjaFirewall: Network"
4575
  msgstr ""
4576
 
4577
+ #: ninjafirewall.php:782
4578
  msgid "NinjaFirewall: Event Notifications"
4579
  msgstr ""
4580
 
4581
+ #: ninjafirewall.php:786
4582
  msgid "NinjaFirewall: Log-in Protection"
4583
  msgstr ""
4584
 
4585
+ #: ninjafirewall.php:790
4586
  msgid "NinjaFirewall: Logs"
4587
  msgstr ""
4588
 
4589
+ #: ninjafirewall.php:794
4590
  msgid "NinjaFirewall: Security Rules"
4591
  msgstr ""
4592
 
4593
+ #: ninjafirewall.php:838
4594
  msgid "NinjaFirewall Settings"
4595
  msgstr ""
4596
 
4597
+ #: ninjafirewall.php:846
4598
  msgid "NinjaFirewall is enabled"
4599
  msgstr ""
4600
 
4601
+ #: ninjafirewall.php:986
4602
  msgid "Access Restricted"
4603
  msgstr ""
4604
 
4605
+ #: ninjafirewall.php:992
4606
  msgid "Settings"
4607
  msgstr ""
4608
 
4609
+ #: ninjafirewall.php:993
4610
  msgid "Upgrade to Premium"
4611
  msgstr ""
4612
 
4613
+ #: ninjafirewall.php:994
4614
  msgid "Rate it!"
4615
  msgstr ""
lib/dashboard.php CHANGED
@@ -123,6 +123,29 @@ if ( $res !== false ) {
123
  </h2>
124
  <br />
125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
126
  <!-- Dashboard -->
127
 
128
  <div id="dashboard-options"<?php echo $dashboard_div ?>>
@@ -173,7 +196,7 @@ if ( $res !== false ) {
173
  <?php
174
  if ( defined( 'NFW_WPWAF' ) ) {
175
  ?>
176
- <span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<?php printf( __('NinjaFirewall is running in %s mode.', 'ninjafirewall'), '<a href="https://blog.nintechnet.com/full_waf-vs-wordpress_waf/">'. __('WordPress WAF', 'ninjafirewall') .'</a>'); ?>
177
  <br />
178
  <?php printf( __('For better protection, <a %s>click here</a> to enable its Full WAF mode.', 'ninjafirewall'), 'id="nfw-thickbox" style="cursor:pointer;text-decoration:underline" title="'. __('Click to install NinjaFirewall in Full WAF mode.', 'ninjafirewall') .'"') ?>
179
  <?php
@@ -200,7 +223,7 @@ if ( $res !== false ) {
200
  ?>
201
  <tr>
202
  <th scope="row" class="row-med"><?php _e('Edition', 'ninjafirewall') ?></th>
203
- <td>WP Edition ~ <a href="?page=nfsubwplus"><?php _e('Need more security? Get Premium!', 'ninjafirewall' ) ?></a></td>
204
  </tr>
205
  <tr>
206
  <th scope="row" class="row-med"><?php _e('Version', 'ninjafirewall') ?></th>
123
  </h2>
124
  <br />
125
 
126
+ <?php
127
+ // One-time notice:
128
+ if ( isset( $nfw_options['welcome'] ) ) {
129
+ ?>
130
+ <div id="nfw-welcome">
131
+ <table class="form-table nfw-table" style="background:#fff">
132
+ <tr>
133
+ <td style="padding:20px;text-align:center;vertical-align:middle;width:50%">
134
+ <h3><?php _e('Thank you for using NinjaFirewall.', 'ninjafirewall' )?></h3>
135
+ <p style="font-size: 1.1em;"><?php printf( __('Every page of NinjaFirewall has a contextual help: whenever you need help about an option or feature, click on the %s tab located in the upper right corner of the corresponding page.', 'ninjafirewall' ), '<strong style="border:1px solid #ccc;padding:2px">'. __('Help') .'</strong>' ) ?></p>
136
+ <br />
137
+ <p><input type="button" class="button-primary" value="<?php _e('Got it!', 'ninjafirewall' )?>" onClick="nfwjs_welcomeajax('<?php echo wp_create_nonce('welcome_save') ?>');nfwjs_up_down('nfw-welcome');" /></p>
138
+ </td>
139
+ <td style="padding:20px;text-align:center;vertical-align:middle;width:50%">
140
+ <img class="wpplus img-fluid" src="<?php echo plugins_url( '/ninjafirewall/images/welcome.png') ?>" />
141
+ </td>
142
+ </tr>
143
+ </table>
144
+ </div>
145
+ <?php
146
+ }
147
+ ?>
148
+
149
  <!-- Dashboard -->
150
 
151
  <div id="dashboard-options"<?php echo $dashboard_div ?>>
196
  <?php
197
  if ( defined( 'NFW_WPWAF' ) ) {
198
  ?>
199
+ <?php printf( __('NinjaFirewall is running in %s mode.', 'ninjafirewall'), '<a href="https://blog.nintechnet.com/full_waf-vs-wordpress_waf/">'. __('WordPress WAF', 'ninjafirewall') .'</a>'); ?>
200
  <br />
201
  <?php printf( __('For better protection, <a %s>click here</a> to enable its Full WAF mode.', 'ninjafirewall'), 'id="nfw-thickbox" style="cursor:pointer;text-decoration:underline" title="'. __('Click to install NinjaFirewall in Full WAF mode.', 'ninjafirewall') .'"') ?>
202
  <?php
223
  ?>
224
  <tr>
225
  <th scope="row" class="row-med"><?php _e('Edition', 'ninjafirewall') ?></th>
226
+ <td>WP Edition ~ <a href="?page=nfsubwplus"><?php _e('Need more security? Explore our supercharged premium version: NinjaFirewall (WP+ Edition)', 'ninjafirewall' ) ?></a></td>
227
  </tr>
228
  <tr>
229
  <th scope="row" class="row-med"><?php _e('Version', 'ninjafirewall') ?></th>
lib/dashboard_about.php CHANGED
@@ -29,7 +29,7 @@ if (! defined( 'NFW_ENGINE_VERSION' ) ) { die( 'Forbidden' ); }
29
  <li><?php _e('Our blog:', 'ninjafirewall') ?> <a href="https://blog.nintechnet.com/">https://blog.nintechnet.com/</a></li>
30
  <li><?php _e('Stay informed about the latest vulnerabilities in WordPress plugins and themes:', 'ninjafirewall') ?> <a href="https://twitter.com/nintechnet">https://twitter.com/nintechnet</a></li>
31
  <li><a href="https://blog.nintechnet.com/ninjafirewall-general-data-protection-regulation-compliance/"><?php _e('GDPR Compliance', 'ninjafirewall') ?></a></li>
32
- <li><a href="https://wordpress.org/support/view/plugin-reviews/ninjafirewall?rate=5#postform"><?php _e('Rate it on WordPress.org!', 'ninjafirewall') ?></a></li>
33
  <li><a href="https://nintechnet.com/referral/"><?php _e('NinjaFirewall Referral Program', 'ninjafirewall') ?></a></li>
34
  </ul>
35
  </font>
29
  <li><?php _e('Our blog:', 'ninjafirewall') ?> <a href="https://blog.nintechnet.com/">https://blog.nintechnet.com/</a></li>
30
  <li><?php _e('Stay informed about the latest vulnerabilities in WordPress plugins and themes:', 'ninjafirewall') ?> <a href="https://twitter.com/nintechnet">https://twitter.com/nintechnet</a></li>
31
  <li><a href="https://blog.nintechnet.com/ninjafirewall-general-data-protection-regulation-compliance/"><?php _e('GDPR Compliance', 'ninjafirewall') ?></a></li>
32
+ <li><a href="https://wordpress.org/support/view/plugin-reviews/ninjafirewall?rate=5#postform"><?php _e('Rate it on WordPress.org!', 'ninjafirewall') ?></a> <img style="vertical-align:middle" src="<?php echo plugins_url() ?>/ninjafirewall/images/rate.png" /></li>
33
  <li><a href="https://nintechnet.com/referral/"><?php _e('NinjaFirewall Referral Program', 'ninjafirewall') ?></a></li>
34
  </ul>
35
  </font>
lib/event_notifications.php CHANGED
@@ -107,6 +107,23 @@ if (! isset( $nfw_options['a_0'] ) ) {
107
 
108
  <br />
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  <?php
111
  if (! isset( $nfw_options['a_51']) ) {
112
  $nfw_options['a_51'] = 1;
@@ -114,9 +131,6 @@ if (! isset( $nfw_options['a_0'] ) ) {
114
  if (! isset( $nfw_options['a_52']) ) {
115
  $nfw_options['a_52'] = 1;
116
  }
117
- if (! isset( $nfw_options['a_53']) ) {
118
- $nfw_options['a_53'] = 1;
119
- }
120
  ?>
121
  <h3><?php _e('Administrator account', 'ninjafirewall') ?></h3>
122
  <table class="form-table nfw-table">
@@ -124,7 +138,6 @@ if (! isset( $nfw_options['a_0'] ) ) {
124
  <th scope="row" class="row-med"><?php _e('Send me an alert whenever', 'ninjafirewall') ?></th>
125
  <td>
126
  <p><label><input type="checkbox" name="nfw_options[a_51]" value="1"<?php checked( $nfw_options['a_51'], 1) ?>>&nbsp;<?php _e('An administrator account is created, modified or deleted in the database (default)', 'ninjafirewall') ?></label></p>
127
- <p><label><input type="checkbox" name="nfw_options[a_53]" value="1"<?php checked( $nfw_options['a_53'], 1) ?>>&nbsp;<?php _e('A user attempts to gain administrative privileges (default)', 'ninjafirewall') ?></label></p>
128
  </td>
129
  </tr>
130
  </table>
@@ -324,6 +337,12 @@ function nf_sub_event_save() {
324
  $nfw_options['a_41'] = 1;
325
  }
326
 
 
 
 
 
 
 
327
  if ( empty( $_POST['nfw_options']['a_51']) ) {
328
  $nfw_options['a_51'] = 0;
329
  } else {
@@ -345,11 +364,6 @@ function nf_sub_event_save() {
345
  nfw_get_blogtimezone();
346
  wp_schedule_event( strtotime( date('Y-m-d 00:00:05', strtotime("+1 day")) ), 'daily', 'nfdailyreport');
347
  }
348
- if ( empty( $_POST['nfw_options']['a_53']) ) {
349
- $nfw_options['a_53'] = 0;
350
- } else {
351
- $nfw_options['a_53'] = 1;
352
- }
353
 
354
  if ( empty( $_POST['nfw_options']['a_61']) ) {
355
  $nfw_options['a_61'] = 0;
@@ -458,6 +472,8 @@ function nf_daily_report_log() {
458
 
459
  function nf_daily_report_email($recipient, $logstats) {
460
 
 
 
461
  $subject = __('[NinjaFirewall] Daily Activity Report', 'ninjafirewall');
462
  if ( is_multisite() ) {
463
  $url = network_home_url('/');
@@ -469,7 +485,7 @@ function nf_daily_report_email($recipient, $logstats) {
469
  }
470
 
471
  $message = "\n". sprintf( __('Daily activity report for: %s', 'ninjafirewall'), $url) . "\n";
472
- $message .= __('Date Range Processed: Yesterday', 'ninjafirewall') .", ". ucfirst( date_i18n('F j, Y',strtotime("-1 days")) ) ."\n\n";
473
 
474
  $message.= __('Blocked threats:', 'ninjafirewall') .' '.
475
  ($logstats[1] + $logstats[2] + $logstats[3]) .
107
 
108
  <br />
109
 
110
+ <?php
111
+ if (! isset( $nfw_options['secupdates'] ) ) {
112
+ $nfw_options['secupdates'] = 1;
113
+ }
114
+ ?>
115
+ <h3><?php _e('Security updates', 'ninjafirewall') ?></h3>
116
+ <table class="form-table nfw-table">
117
+ <tr>
118
+ <th scope="row" class="row-med"><?php _e('Send me an alert whenever', 'ninjafirewall') ?></th>
119
+ <td>
120
+ <p><label><input type="checkbox" name="nfw_options[secupdates]" value="1"<?php checked( $nfw_options['secupdates'], 1) ?>>&nbsp;<?php _e('An important security update is available for a plugin, theme or WordPress (default)', 'ninjafirewall') ?></label></p>
121
+ </td>
122
+ </tr>
123
+ </table>
124
+
125
+ <br />
126
+
127
  <?php
128
  if (! isset( $nfw_options['a_51']) ) {
129
  $nfw_options['a_51'] = 1;
131
  if (! isset( $nfw_options['a_52']) ) {
132
  $nfw_options['a_52'] = 1;
133
  }
 
 
 
134
  ?>
135
  <h3><?php _e('Administrator account', 'ninjafirewall') ?></h3>
136
  <table class="form-table nfw-table">
138
  <th scope="row" class="row-med"><?php _e('Send me an alert whenever', 'ninjafirewall') ?></th>
139
  <td>
140
  <p><label><input type="checkbox" name="nfw_options[a_51]" value="1"<?php checked( $nfw_options['a_51'], 1) ?>>&nbsp;<?php _e('An administrator account is created, modified or deleted in the database (default)', 'ninjafirewall') ?></label></p>
 
141
  </td>
142
  </tr>
143
  </table>
337
  $nfw_options['a_41'] = 1;
338
  }
339
 
340
+ if ( empty( $_POST['nfw_options']['secupdates']) ) {
341
+ $nfw_options['secupdates'] = 0;
342
+ } else {
343
+ $nfw_options['secupdates'] = 1;
344
+ }
345
+
346
  if ( empty( $_POST['nfw_options']['a_51']) ) {
347
  $nfw_options['a_51'] = 0;
348
  } else {
364
  nfw_get_blogtimezone();
365
  wp_schedule_event( strtotime( date('Y-m-d 00:00:05', strtotime("+1 day")) ), 'daily', 'nfdailyreport');
366
  }
 
 
 
 
 
367
 
368
  if ( empty( $_POST['nfw_options']['a_61']) ) {
369
  $nfw_options['a_61'] = 0;
472
 
473
  function nf_daily_report_email($recipient, $logstats) {
474
 
475
+ nfw_get_blogtimezone();
476
+
477
  $subject = __('[NinjaFirewall] Daily Activity Report', 'ninjafirewall');
478
  if ( is_multisite() ) {
479
  $url = network_home_url('/');
485
  }
486
 
487
  $message = "\n". sprintf( __('Daily activity report for: %s', 'ninjafirewall'), $url) . "\n";
488
+ $message .= __('Date Range Processed: Yesterday', 'ninjafirewall') .", ". ucfirst( date('F j, Y',strtotime("-1 days")) ) ."\n\n";
489
 
490
  $message.= __('Blocked threats:', 'ninjafirewall') .' '.
491
  ($logstats[1] + $logstats[2] + $logstats[3]) .
lib/event_updates.php ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ +---------------------------------------------------------------------+
4
+ | NinjaFirewall (WP Edition) |
5
+ | |
6
+ | (c) NinTechNet - https://nintechnet.com/ |
7
+ +---------------------------------------------------------------------+
8
+ | This program is free software: you can redistribute it and/or |
9
+ | modify it under the terms of the GNU General Public License as |
10
+ | published by the Free Software Foundation, either version 3 of |
11
+ | the License, or (at your option) any later version. |
12
+ | |
13
+ | This program is distributed in the hope that it will be useful, |
14
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16
+ | GNU General Public License for more details. |
17
+ +---------------------------------------------------------------------+ i18n+ / sa / 2
18
+ */
19
+
20
+ if (! defined( 'NFW_ENGINE_VERSION' ) ) { die( 'Forbidden' ); }
21
+
22
+ // ---------------------------------------------------------------------
23
+ // This function is called by NinjaFirewall's garbage collector
24
+ // which runs hourly.
25
+
26
+ function nfw_check_security_updates() {
27
+
28
+ $nfw_checked = nfw_get_option( 'nfw_checked' );
29
+ if ( empty( $nfw_checked ) ) { $nfw_checked = array(); }
30
+
31
+ $nfw_options = nfw_get_option('nfw_options');
32
+ if ( empty( $nfw_options['secupdates'] ) ) { return; }
33
+
34
+ $found = array();
35
+
36
+ // If your server can't remotely connect to a SSL port, add this
37
+ // to your wp-config.php script: `define('NFW_DONT_USE_SSL', 1);`
38
+ if ( defined( 'NFW_DONT_USE_SSL' ) ) {
39
+ $proto = "http";
40
+ } else {
41
+ $proto = "https";
42
+ }
43
+ $url = "$proto://updates.nintechnet.com/secupdates";
44
+
45
+ // Fetch latest data:
46
+ $list = array();
47
+ $list = nfw_fetch_security_updates( $url );
48
+
49
+ if (! isset( $list['wordpress'] ) || ! isset( $list['themes'] ) || ! isset( $list['plugins'] ) ) {
50
+ nfw_log_error("nfw_check_security_updates: json-encoded array is corrupted");
51
+ return false;
52
+ }
53
+
54
+ // Check WordPress updates
55
+ global $wp_version;
56
+ if ( isset( $list['wordpress']['version'] ) && version_compare( $wp_version, $list['wordpress']['version'], '<' ) ) {
57
+ // Versions are different, check if the user was already warned about that
58
+ if (! isset( $nfw_checked['wordpress']['version'] ) ||
59
+ version_compare( $nfw_checked['wordpress']['version'], $list['wordpress']['version'], '<' ) ) {
60
+ // Mark as checked
61
+ $nfw_checked['wordpress']['version'] = $list['wordpress']['version'];
62
+
63
+ $found['wordpress']['cur_version'] = $wp_version;
64
+ $found['wordpress']['new_version'] = $list['wordpress']['version'];
65
+ $found['wordpress']['level'] = $list['wordpress']['level'];
66
+ }
67
+ }
68
+
69
+ // Check themes updates
70
+ if ( ! function_exists( 'wp_get_themes' ) ) {
71
+ require_once ABSPATH . 'wp-includes/theme.php';
72
+ }
73
+ $themes = wp_get_themes();
74
+
75
+ foreach( $themes as $k => $v ) {
76
+ // No name or no version (unlike plugins, we're dealing with objects here)
77
+ if ( $v->Name == '' || $v->Version == '' ) {
78
+ continue;
79
+ }
80
+ $hash = hash( 'sha256', $k );
81
+
82
+ if ( isset( $list['themes'][$hash] ) && version_compare( $v->Version, $list['themes'][$hash]['version'], '<' ) ) {
83
+
84
+ // Make sure we didn't inform the user yet
85
+ if (! isset( $nfw_checked['themes'][$k] ) ||
86
+ version_compare( $nfw_checked['themes'][$k]['version'], $list['themes'][$hash]['version'], '<' ) ) {
87
+
88
+ // Mark as checked:
89
+ $nfw_checked['themes'][$k]['version'] = $list['themes'][$hash]['version'];
90
+
91
+ $found['themes'][$k]['name'] = $v->Name;
92
+ $found['themes'][$k]['cur_version'] = $v->Version;
93
+ $found['themes'][$k]['new_version'] = $list['themes'][$hash]['version'];
94
+ $found['themes'][$k]['level'] = $list['themes'][$hash]['level'];
95
+ }
96
+ }
97
+ }
98
+
99
+ // Check plugins updates
100
+ if ( ! function_exists( 'get_plugins' ) ) {
101
+ require_once ABSPATH .'wp-admin/includes/plugin.php';
102
+ }
103
+ $plugins = get_plugins();
104
+
105
+ foreach( $plugins as $k => $v ) {
106
+ // No name or no version (unlike themes, we're dealing with arrays here)
107
+ if ( empty( $v['Name'] ) || empty( $v['Version'] ) ) {
108
+ continue;
109
+ }
110
+ $hash = hash( 'sha256', $k );
111
+
112
+ if ( isset( $list['plugins'][$hash] ) && version_compare( $v['Version'], $list['plugins'][$hash]['version'], '<' ) ) {
113
+ // Make sure we didn't inform the user yet
114
+ if (! isset( $nfw_checked['plugins'][$k] ) ||
115
+ version_compare( $nfw_checked['plugins'][$k]['version'], $list['plugins'][$hash]['version'], '<' ) ) {
116
+
117
+ // Mark as checked
118
+ $nfw_checked['plugins'][$k]['version'] = $list['plugins'][$hash]['version'];
119
+
120
+ $found['plugins'][$k]['name'] = $v['Name'];
121
+ $found['plugins'][$k]['cur_version'] = $v['Version'];
122
+ $found['plugins'][$k]['new_version'] = $list['plugins'][$hash]['version'];
123
+ $found['plugins'][$k]['level'] = $list['plugins'][$hash]['level'];
124
+ }
125
+ }
126
+ }
127
+
128
+ // Nothing to do
129
+ if ( empty( $found ) ) {
130
+ return;
131
+ }
132
+
133
+ // Warn the user
134
+ nfw_alert_security_updates( $found );
135
+
136
+ // Update checked list
137
+ nfw_update_option( 'nfw_checked', $nfw_checked, false );
138
+
139
+ return;
140
+ }
141
+
142
+ // ---------------------------------------------------------------------
143
+ // Send an email alert to the admin
144
+
145
+ function nfw_alert_security_updates( $found = array() ) {
146
+
147
+ nfw_get_blogtimezone();
148
+
149
+ $nfw_options = nfw_get_option('nfw_options');
150
+
151
+ if ( is_multisite() && $nfw_options['alert_sa_only'] == 2 ) {
152
+ $recipient = get_option('admin_email');
153
+ } else {
154
+ $recipient = $nfw_options['alert_email'];
155
+ }
156
+
157
+ $subject = __('[NinjaFirewall] Warning: Security update available', 'ninjafirewall');
158
+
159
+ $message = __('NinjaFirewall has detected that there are security updates available for your website:', 'ninjafirewall') . "\n\n".
160
+ __('Date:', 'ninjafirewall') .' '. ucfirst( date_i18n('F j, Y @ H:i:s') ) . ' (UTC '. date('O') . ")\n";
161
+
162
+ if ( is_multisite() ) {
163
+ $message .= sprintf( __('Blog: %s', 'ninjafirewall'), network_home_url('/') ) ."\n\n";
164
+ } else {
165
+ $message .= sprintf( __('Blog: %s', 'ninjafirewall'), home_url('/') ) ."\n\n";
166
+ }
167
+
168
+ // WordPress
169
+ if (! empty( $found['wordpress'] ) ) {
170
+ $message .= "WordPress:\n" .
171
+ sprintf( __('Your version: %s', 'ninjafirewall'), $found['wordpress']['cur_version'] ) ."\n".
172
+ sprintf( __('New version: %s', 'ninjafirewall'), $found['wordpress']['new_version'] ) ."\n";
173
+ if ( $found['wordpress']['level'] == 2 ) {
174
+ $message .= __('Severity: This is an important security update', 'ninjafirewall') ."\n";
175
+ } elseif ( $found['wordpress']['level'] == 3 ) {
176
+ $message .= __('Severity: **This is a critical security update**', 'ninjafirewall') ."\n";
177
+ }
178
+ $message .= "\n";
179
+ }
180
+
181
+ // Plugins
182
+ if (! empty( $found['plugins'] ) ) {
183
+ foreach( $found['plugins'] as $k => $v ) {
184
+ $message .= sprintf( __('Plugin: %s', 'ninjafirewall'), $found['plugins'][$k]['name'] ) ."\n".
185
+ sprintf( __('Your version: %s', 'ninjafirewall'), $found['plugins'][$k]['cur_version'] ) ."\n".
186
+ sprintf( __('New version: %s', 'ninjafirewall'), $found['plugins'][$k]['new_version'] ) ."\n";
187
+
188
+ if ( $found['plugins'][$k]['level'] == 2 ) {
189
+ $message .= __('Severity: This is an important security update', 'ninjafirewall') ."\n";
190
+ } elseif ( $found['plugins'][$k]['level'] == 3 ) {
191
+ $message .= __('Severity: **This is a critical security update**', 'ninjafirewall') ."\n";
192
+ }
193
+ $message .= "\n";
194
+ }
195
+ }
196
+
197
+ // Themes
198
+ if (! empty( $found['themes'] ) ) {
199
+
200
+ foreach( $found['themes'] as $k => $v ) {
201
+ $message .= sprintf( __('Theme: %s', 'ninjafirewall'), $found['themes'][$k]['name'] ) ."\n".
202
+ sprintf( __('Your version: %s', 'ninjafirewall'), $found['themes'][$k]['cur_version'] ) ."\n".
203
+ sprintf( __('New version: %s', 'ninjafirewall'), $found['themes'][$k]['new_version'] ) ."\n";
204
+
205
+ if ( $found['themes'][$k]['level'] == 2 ) {
206
+ $message .= __('Severity: This is an important security update', 'ninjafirewall') ."\n";
207
+ } elseif ( $found['themes'][$k]['level'] == 3 ) {
208
+ $message .= __('Severity: **This is a critical security update**', 'ninjafirewall') ."\n";
209
+ }
210
+ $message .= "\n";
211
+ }
212
+ }
213
+
214
+ $message .= __("Don't leave your blog at risk, make sure to update as soon as possible.", 'ninjafirewall') .
215
+ "\n\n";
216
+ $message.= __('This notification can be turned off from NinjaFirewall "Event Notifications" page.', 'ninjafirewall') . "\n\n";
217
+ $message .= 'NinjaFirewall (WP Edition) - https://nintechnet.com/' . "\n" .
218
+ __('Support forum:', 'ninjafirewall') . ' http://wordpress.org/support/plugin/ninjafirewall' . "\n\n";
219
+
220
+ $message .= sprintf(
221
+ __('Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): %s', 'ninjafirewall'),
222
+ 'https://nintechnet.com/ninjafirewall/wp-edition/?comparison' );
223
+
224
+ wp_mail( $recipient, $subject, $message );
225
+
226
+ }
227
+
228
+ // ---------------------------------------------------------------------
229
+ // Download list from remote server
230
+
231
+ function nfw_fetch_security_updates( $url ) {
232
+
233
+ global $wp_version;
234
+ $res = wp_remote_get(
235
+ $url,
236
+ array(
237
+ 'timeout' => 20,
238
+ 'httpversion' => '1.1' ,
239
+ 'user-agent' => 'Mozilla/5.0 (compatible; NinjaFirewall/'.
240
+ NFW_ENGINE_VERSION .'; WordPress/'. $wp_version . ')',
241
+ 'sslverify' => true
242
+ )
243
+ );
244
+ if ( is_wp_error( $res ) ) {
245
+ nfw_log_error( sprintf( "nfw_fetch_security_updates: connection error: %s"), $result->get_error_message() );
246
+ return false;
247
+ }
248
+
249
+ if ( $res['response']['code'] != 200 ) {
250
+ nfw_log_error( sprintf( "nfw_fetch_security_updates: HTTP response error: %s"), $res['response']['code'] );
251
+ return false;
252
+ }
253
+
254
+ return json_decode( $res['body'], true );
255
+ }
256
+
257
+ // ---------------------------------------------------------------------
258
+ // EOF
lib/events.php ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ +---------------------------------------------------------------------+
4
+ | NinjaFirewall (WP Edition) |
5
+ | |
6
+ | (c) NinTechNet - https://nintechnet.com/ |
7
+ +---------------------------------------------------------------------+
8
+ | This program is free software: you can redistribute it and/or |
9
+ | modify it under the terms of the GNU General Public License as |
10
+ | published by the Free Software Foundation, either version 3 of |
11
+ | the License, or (at your option) any later version. |
12
+ | |
13
+ | This program is distributed in the hope that it will be useful, |
14
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16
+ | GNU General Public License for more details. |
17
+ +---------------------------------------------------------------------+ i18n+ / sa
18
+ */
19
+
20
+ if (! defined( 'NFW_ENGINE_VERSION' ) ) { die( 'Forbidden' ); }
21
+
22
+ function nfw_sys_events() {
23
+
24
+ $nfw_options = nfw_get_option( 'nfw_options' );
25
+
26
+ $script = $_SERVER['SCRIPT_NAME'];
27
+ $label_name = __('Name:', 'ninjafirewall');
28
+ $label_plugin = __('Plugin', 'ninjafirewall');
29
+ $label_theme = __('Theme', 'ninjafirewall');
30
+ $label_version = __('Version:', 'ninjafirewall');
31
+ $alert_action = 0;
32
+
33
+ // themes.php
34
+ if ( strpos( $script, '/themes.php' ) !== FALSE ) {
35
+
36
+ if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) {
37
+
38
+ if ( $_GET['action'] == 'activate' && ! empty( $nfw_options['a_23'] ) ) {
39
+ $theme = wp_get_theme( $_GET['stylesheet'] );
40
+ $alert_action = sprintf( '%s %s', $label_theme, __('activated', 'ninjafirewall') );
41
+ $alert_item = sprintf( '%s %s', $label_name, $theme );
42
+
43
+ } elseif ( $_GET['action'] == 'delete' && current_user_can( 'delete_themes' ) && ! empty( $nfw_options['a_24'] ) ) {
44
+ $theme = wp_get_theme( $_GET['stylesheet'] );
45
+ $alert_action = sprintf( '%s %s', $label_theme, __('deleted', 'ninjafirewall') );
46
+ $alert_item = sprintf( '%s %s', $label_name, $theme );
47
+ }
48
+ }
49
+
50
+ // plugins.php
51
+ } elseif ( current_user_can( 'activate_plugins' ) && strpos( $script, '/plugins.php' ) !== FALSE ) {
52
+
53
+ if ( isset( $_REQUEST['action2'] ) ) {
54
+ if (! isset( $_REQUEST['action'] ) || $_REQUEST['action'] == '-1' ) {
55
+ $_REQUEST['action'] = $_REQUEST['action2'];
56
+ }
57
+ $_REQUEST['action2'] = '-1';
58
+ }
59
+ if (! isset( $_REQUEST['action'] ) ) { return; }
60
+
61
+ if ( isset( $_REQUEST['plugin'] ) ) {
62
+ $plugin = $_REQUEST['plugin'];
63
+ } else {
64
+ $plugin = '';
65
+ }
66
+ if ( isset( $_POST['checked'] ) ) {
67
+ $plugin_list = implode( ", ", $_POST['checked'] );
68
+ } else {
69
+ $plugin_list = '';
70
+ }
71
+
72
+ if ( $_REQUEST['action'] == 'activate' && ! empty( $nfw_options['a_13'] ) ) {
73
+ $alert_action = sprintf( '%s %s', $label_plugin, __('activated', 'ninjafirewall') );
74
+ $alert_item = sprintf( '%s %s', $label_name, $plugin );
75
+
76
+ } elseif ( $_REQUEST['action'] == 'activate-selected' && ! empty( $nfw_options['a_13'] ) ) {
77
+ $alert_action = sprintf( '%s %s', $label_plugin, __('activated', 'ninjafirewall') );
78
+ $alert_item = sprintf( '%s %s', $label_name, $plugin_list );
79
+
80
+ } elseif ( $_REQUEST['action'] == 'update-selected' && ! empty( $nfw_options['a_14'] ) ) {
81
+ $alert_action = sprintf( '%s %s', $label_plugin, __('updated', 'ninjafirewall') );
82
+ $alert_item = sprintf( '%s %s', $label_name, $plugin_list );
83
+
84
+ } elseif ( $_REQUEST['action'] == 'deactivate' && current_user_can( 'deactivate_plugin' ) && ! empty( $nfw_options['a_15'] ) ) {
85
+ $alert_action = sprintf( '%s %s', $label_plugin, __('deactivated', 'ninjafirewall') );
86
+ $alert_item = sprintf( '%s %s', $label_name, $plugin );
87
+
88
+ } elseif ( $_REQUEST['action'] == 'deactivate-selected' && current_user_can( 'deactivate_plugin' ) && ! empty( $nfw_options['a_15'] ) ) {
89
+ $alert_action = sprintf( '%s %s', $label_plugin, __('deactivated', 'ninjafirewall') );
90
+ $alert_item = sprintf( '%s %s', $label_name, $plugin_list );
91
+
92
+ } elseif ( $_REQUEST['action'] == 'delete-selected' && current_user_can( 'delete_plugins' ) && ! empty( $nfw_options['a_16'] ) ) {
93
+ $alert_action = sprintf( '%s %s', $label_plugin, __('deleted', 'ninjafirewall') );
94
+ $alert_item = sprintf( '%s %s', $label_name, $plugin_list );
95
+ }
96
+
97
+ // update-core.php
98
+ } elseif ( strpos($_SERVER['SCRIPT_NAME'], '/update-core.php' ) !== FALSE ) {
99
+
100
+ if (! isset( $_GET['action'] ) ) { return; }
101
+
102
+ if ( $_GET['action'] == 'do-plugin-upgrade' && current_user_can( 'update_plugins' ) && ! empty( $nfw_options['a_14'] ) ) {
103
+ $plugin = implode( ", ", @$_POST['checked'] );
104
+ $alert_action = sprintf( '%s %s', $label_plugin, __('updated', 'ninjafirewall') );
105
+ $alert_item = sprintf( '%s %s', $label_name, $plugin );
106
+
107
+ } elseif ( $_GET['action'] == 'do-theme-upgrade' && current_user_can( 'update_themes' ) && ! empty( $nfw_options['a_25'] ) ) {
108
+ $theme = implode( ", ", @$_POST['checked'] );
109
+ $alert_action = sprintf( '%s %s', $label_theme, __('updated', 'ninjafirewall') );
110
+ $alert_item = sprintf( '%s %s', $label_name, $theme );
111
+
112
+ } elseif ( $_GET['action'] == 'do-core-upgrade' && current_user_can( 'update_core' ) && ! empty( $nfw_options['a_31'] ) ) {
113
+ $alert_action = sprintf( '%s %s', 'WordPress', __('updated', 'ninjafirewall') );
114
+ $alert_item = sprintf( '%s %s', $label_version, @$_POST['version'] );
115
+ }
116
+
117
+ // update.php
118
+ } elseif ( strpos($_SERVER['SCRIPT_NAME'], '/update.php' ) !== FALSE ) {
119
+
120
+ if (! isset( $_GET['action'] ) ) { return; }
121
+
122
+ if ( $_GET['action'] == 'update-selected' && current_user_can( 'update_plugins' ) && ! empty( $nfw_options['a_14'] ) ) {
123
+ if ( isset( $_GET['plugins'] ) ) {
124
+ $plugin = $_GET['plugins'];
125
+ } elseif ( isset( $_POST['checked'] ) ) {
126
+ $plugin = implode( ", ", $_POST['checked'] );
127
+ }
128
+ $alert_action = sprintf( '%s %s', $label_plugin, __('updated', 'ninjafirewall') );
129
+ $alert_item = sprintf( '%s %s', $label_name, $plugin );
130
+
131
+ } elseif ( $_GET['action'] == 'upgrade-plugin' && current_user_can( 'update_plugins' ) && ! empty( $nfw_options['a_14'] ) ) {
132
+ $alert_action = sprintf( '%s %s', $label_plugin, __('updated', 'ninjafirewall') );
133
+ $alert_item = sprintf( '%s %s', $label_name, @$_REQUEST['plugin'] );
134
+
135
+ } elseif ( $_GET['action'] == 'activate-plugin' && current_user_can( 'update_plugins' ) && ! empty( $nfw_options['a_13'] ) ) {
136
+ $alert_action = sprintf( '%s %s', $label_plugin, __('activated', 'ninjafirewall') );
137
+ $alert_item = sprintf( '%s %s', $label_name, @$_REQUEST['plugin'] );
138
+
139
+ } elseif ( $_GET['action'] == 'install-plugin' && current_user_can( 'install_plugins' ) && ! empty( $nfw_options['a_12'] ) ) {
140
+ $alert_action = sprintf( '%s %s', $label_plugin, __('installed', 'ninjafirewall') );
141
+ $alert_item = sprintf( '%s %s', $label_name, @$_REQUEST['plugin'] );
142
+
143
+ } elseif ( $_GET['action'] == 'upload-plugin' && current_user_can( 'upload_plugins' ) && ! empty( $nfw_options['a_11'] ) ) {
144
+ $alert_action = sprintf( '%s %s', $label_plugin, __('uploaded', 'ninjafirewall') );
145
+ $alert_item = sprintf( '%s %s', $label_name, @$_FILES['pluginzip']['name'] );
146
+
147
+ } elseif ( $_GET['action'] == 'upgrade-theme' && current_user_can( 'update_themes' ) && ! empty( $nfw_options['a_25'] ) ) {
148
+ $alert_action = sprintf( '%s %s', $label_theme, __('updated', 'ninjafirewall') );
149
+ $alert_item = sprintf( '%s %s', $label_name, @$_REQUEST['theme'] );
150
+
151
+ } elseif ( $_GET['action'] == 'update-selected-themes' && current_user_can( 'update_themes' ) && ! empty( $nfw_options['a_25'] ) ) {
152
+ if ( isset( $_GET['themes'] ) ) {
153
+ $theme = implode( ", ", $_GET['themes'] );
154
+ } elseif ( isset( $_POST['checked'] ) ) {
155
+ $theme = implode( ", ", $_POST['checked'] );
156
+ }
157
+ $alert_action = sprintf( '%s %s', $label_theme, __('updated', 'ninjafirewall') );
158
+ $alert_item = sprintf( '%s %s', $label_name, $theme );
159
+
160
+ } elseif ( $_GET['action'] == 'install-theme' && current_user_can( 'install_themes' ) && ! empty( $nfw_options['a_22'] ) ) {
161
+ $alert_action = sprintf( '%s %s', $label_theme, __('installed', 'ninjafirewall') );
162
+ $alert_item = sprintf( '%s %s', $label_name, @$_REQUEST['theme'] );
163
+
164
+ } elseif ( $_GET['action'] == 'upload-theme' && current_user_can( 'upload_themes' ) && ! empty( $nfw_options['a_21'] ) ) {
165
+ $alert_action = sprintf( '%s %s', $label_theme, __('uploaded', 'ninjafirewall') );
166
+ $alert_item = sprintf( '%s %s', $label_name, @$_FILES['themezip']['name'] );
167
+ }
168
+
169
+ // AJAX actions
170
+ } elseif ( strpos($_SERVER['SCRIPT_NAME'], '/admin-ajax.php' ) !== FALSE ) {
171
+
172
+ if (! isset( $_REQUEST['action'] ) ) { return; }
173
+
174
+ if ( $_REQUEST['action'] == 'install-theme' && current_user_can( 'install_themes' ) && ! empty( $nfw_options['a_22'] ) ) {
175
+ $alert_action = sprintf( '%s %s', $label_theme, __('installed', 'ninjafirewall') );
176
+ $alert_item = sprintf( '%s %s', $label_name, @$_POST['slug'] );
177
+
178
+ } elseif ( $_REQUEST['action'] == 'update-theme' && current_user_can( 'update_themes' ) && ! empty( $nfw_options['a_25'] ) ) {
179
+ $alert_action = sprintf( '%s %s', $label_theme, __('updated', 'ninjafirewall') );
180
+ $alert_item = sprintf( '%s %s', $label_name, @$_POST['slug'] );
181
+
182
+ } elseif ( $_REQUEST['action'] == 'delete-theme' && current_user_can( 'delete_themes' ) && ! empty( $nfw_options['a_24'] ) ) {
183
+ $alert_action = sprintf( '%s %s', $label_theme, __('deleted', 'ninjafirewall') );
184
+ $alert_item = sprintf( '%s %s', $label_name, @$_POST['slug'] );
185
+
186
+ } elseif ( $_REQUEST['action'] == 'install-plugin' && current_user_can( 'install_plugins' ) && ! empty( $nfw_options['a_12'] ) ) {
187
+ $alert_action = sprintf( '%s %s', $label_plugin, __('installed', 'ninjafirewall') );
188
+ $alert_item = sprintf( '%s %s', $label_name, @$_POST['slug'] );
189
+
190
+ } elseif ( $_REQUEST['action'] == 'update-plugin' && current_user_can( 'update_plugins' ) && ! empty( $nfw_options['a_14'] ) ) {
191
+ $alert_action = sprintf( '%s %s', $label_plugin, __('updated', 'ninjafirewall') );
192
+ $alert_item = sprintf( '%s %s', $label_name, @$_POST['plugin'] );
193
+
194
+ } elseif ( $_REQUEST['action'] == 'delete-plugin' && current_user_can( 'delete_plugins' ) && ! empty( $nfw_options['a_16'] ) ) {
195
+ $alert_action = sprintf( '%s %s', $label_plugin, __('deleted', 'ninjafirewall') );
196
+ $alert_item = sprintf( '%s %s', $label_name, @$_POST['plugin'] );
197
+ }
198
+ }
199
+
200
+ if (! empty( $alert_action ) ) {
201
+
202
+ if ( is_multisite() && $nfw_options['alert_sa_only'] == 2 ) {
203
+ $recipient = get_option('admin_email');
204
+ } else {
205
+ $recipient = $nfw_options['alert_email'];
206
+ }
207
+
208
+ global $current_user;
209
+ $current_user = wp_get_current_user();
210
+
211
+ $subject = sprintf( __('[NinjaFirewall] Alert: %s', 'ninjafirewall'), $alert_action );
212
+ if ( is_multisite() ) {
213
+ $url = __('-Blog:', 'ninjafirewall') .' '. network_home_url('/') ."\n\n";
214
+ } else {
215
+ $url = __('-Blog:', 'ninjafirewall') .' '. home_url('/') ."\n\n";
216
+ }
217
+
218
+ $message = __('NinjaFirewall has detected the following activity on your account:', 'ninjafirewall') . "\n\n".
219
+ "-$alert_action\n-$alert_item\n\n" .
220
+ __('-User:', 'ninjafirewall') .' '. $current_user->user_login .' ('. $current_user->roles[0] .")\n" .
221
+ __('-IP:', 'ninjafirewall') .' '. NFW_REMOTE_ADDR . "\n" .
222
+ __('-Date:', 'ninjafirewall') .' '. ucfirst( date_i18n('F j, Y @ H:i:s O') ) ."\n" .
223
+ $url .
224
+ 'NinjaFirewall (WP Edition) - https://nintechnet.com/' . "\n" .
225
+ __('Support forum:', 'ninjafirewall') . ' http://wordpress.org/support/plugin/ninjafirewall' . "\n\n";
226
+
227
+ $message .= sprintf(
228
+ __('Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): %s', 'ninjafirewall'),
229
+ 'https://nintechnet.com/ninjafirewall/wp-edition/?comparison' );
230
+
231
+ wp_mail( $recipient, $subject, $message );
232
+
233
+ if (! empty($nfw_options['a_41']) ) {
234
+ nfw_log2(
235
+ $alert_action .' by '. $current_user->user_login,
236
+ $alert_item,
237
+ 6,
238
+ 0
239
+ );
240
+ }
241
+ }
242
+ }
243
+
244
+ add_action('admin_init', 'nfw_sys_events', 999999);
245
+
246
+ /* ------------------------------------------------------------------ */
247
+ // EOF
lib/firewall.php CHANGED
@@ -124,93 +124,6 @@ if (! empty($nfw_['nfw_options']['disable_error_handler']) ) {
124
  define('WP_DISABLE_FATAL_ERROR_HANDLER', true);
125
  }
126
 
127
- $nfw_['a_msg'] = '';
128
- if ( strpos($_SERVER['SCRIPT_NAME'], '/plugins.php' ) !== FALSE ) {
129
- if ( isset( $_REQUEST['action2'] )) {
130
- if ( (! isset( $_REQUEST['action'] )) || ( $_REQUEST['action'] == '-1') ) {
131
- $_REQUEST['action'] = $_REQUEST['action2'];
132
- }
133
- $_REQUEST['action2'] = '-1';
134
- }
135
- if ( isset( $_REQUEST['action'] ) ) {
136
- if ( $_REQUEST['action'] == 'update-selected' ) {
137
- if (! empty( $_POST['checked'] ) ) {
138
- $nfw_['a_msg'] = '1:4:' . @implode(", ", $_POST['checked']);
139
- }
140
- } elseif ( $_REQUEST['action'] == 'activate' ) {
141
- $nfw_['a_msg'] = '1:3:' . @$_REQUEST['plugin'];
142
- } elseif ( $_REQUEST['action'] == 'activate-selected' ) {
143
- if (! empty( $_POST['checked'] ) ) {
144
- $nfw_['a_msg'] = '1:3:' . @implode(", ", $_POST['checked']);
145
- }
146
- } elseif ( $_REQUEST['action'] == 'deactivate' ) {
147
- $nfw_['a_msg'] = '1:5:' . @$_REQUEST['plugin'];
148
- } elseif ( ( $_REQUEST['action'] == 'deactivate-selected' ) ){
149
- if (! empty( $_POST['checked'] ) ) {
150
- $nfw_['a_msg'] = '1:5:' . @implode(", ", $_POST['checked']);
151
- }
152
- } elseif ( ( $_REQUEST['action'] == 'delete-selected' ) &&
153
- ( isset($_REQUEST['verify-delete'])) ) {
154
- if (! empty( $_POST['checked'] ) ) {
155
- $nfw_['a_msg'] = '1:6:' . @implode(", ", $_POST['checked']);
156
- }
157
- }
158
- }
159
- } elseif ( strpos($_SERVER['SCRIPT_NAME'], '/themes.php' ) !== FALSE ) {
160
- if ( isset( $_GET['action'] ) ) {
161
- if ( $_GET['action'] == 'activate' ) {
162
- $nfw_['a_msg'] = '2:3:' . @$_GET['stylesheet'];
163
- } elseif ( $_GET['action'] == 'delete' ) {
164
- $nfw_['a_msg'] = '2:4:' . @$_GET['stylesheet'];
165
- }
166
- }
167
- } elseif ( strpos($_SERVER['SCRIPT_NAME'], '/update.php' ) !== FALSE ) {
168
- if ( isset( $_GET['action'] ) ) {
169
- if ( $_REQUEST['action'] == 'update-selected' ) {
170
- if (! empty( $_POST['checked'] ) ) {
171
- $nfw_['a_msg'] = '1:4:' . @implode(", ", $_POST['checked']);
172
- }
173
- } elseif ( $_GET['action'] == 'upgrade-plugin' ) {
174
- $nfw_['a_msg'] = '1:4:' . @$_REQUEST['plugin'];
175
- } elseif ( $_GET['action'] == 'activate-plugin' ) {
176
- $nfw_['a_msg'] = '1:3:' . @$_GET['plugin'];
177
- } elseif ( $_GET['action'] == 'install-plugin' ) {
178
- $nfw_['a_msg'] = '1:2:' . @$_REQUEST['plugin'];
179
- } elseif ( $_GET['action'] == 'upload-plugin' ) {
180
- $nfw_['a_msg'] = '1:1:' . @$_FILES['pluginzip']['name'];
181
- } elseif ( $_GET['action'] == 'install-theme' ) {
182
- $nfw_['a_msg'] = '2:2:' . @$_REQUEST['theme'];
183
- } elseif ( $_GET['action'] == 'upload-theme' ) {
184
- $nfw_['a_msg'] = '2:1:' . @$_FILES['themezip']['name'];
185
- }
186
- }
187
- } elseif ( strpos($_SERVER['SCRIPT_NAME'], '/admin-ajax.php' ) !== FALSE ) {
188
- if ( isset( $_REQUEST['action']) && $_REQUEST['action'] == 'update-plugin' ) {
189
- if (! empty($_REQUEST['plugin']) ) {
190
- $nfw_['a_msg'] = '1:4:' . @$_REQUEST['plugin'];
191
- }
192
- }
193
- if ( isset( $_REQUEST['action']) && $_REQUEST['action'] == 'delete-plugin' ) {
194
- if (! empty($_REQUEST['plugin']) ) {
195
- $nfw_['a_msg'] = '1:6:' . @$_REQUEST['plugin'];
196
- }
197
- }
198
-
199
- } elseif ( strpos($_SERVER['SCRIPT_NAME'], '/update-core.php' ) !== FALSE ) {
200
- if ( isset( $_GET['action'] ) ) {
201
- if ( $_GET['action'] == 'do-plugin-upgrade' ) {
202
- if (! empty( $_POST['checked'] ) ) {
203
- $nfw_['a_msg'] = '1:4:' . @implode(", ", $_POST['checked']);
204
- }
205
- } elseif ( $_GET['action'] == 'do-core-upgrade' ) {
206
- $nfw_['a_msg'] = '3:1:' . @$_POST['version'];
207
- }
208
- }
209
- }
210
- if ( $nfw_['a_msg'] ) {
211
- define('NFW_ALERT', $nfw_['a_msg']);
212
- }
213
-
214
  nfw_check_ip();
215
 
216
  // We only start a session if users already have a PHP session
124
  define('WP_DISABLE_FATAL_ERROR_HANDLER', true);
125
  }
126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  nfw_check_ip();
128
 
129
  // We only start a session if users already have a PHP session
lib/firewall_options.php CHANGED
@@ -127,7 +127,7 @@ if ( isset( $_POST['nfw_options'] ) ) {
127
  <tr>
128
  <th scope="row" class="row-med"><?php _e('Blocked user message', 'ninjafirewall') ?></th>
129
  <td>
130
- <textarea id="blocked-msg" name="nfw_options[blocked_msg]" class="small-text code" cols="70" rows="14" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><?php echo htmlspecialchars( $msg ) ?></textarea>
131
  <p class="description"><?php _e('HTML code, including CSS and JS, is allowed.', 'ninjafirewall') ?></p>
132
  <input type="hidden" id="default-msg" value="<?php echo htmlspecialchars( NFW_DEFAULT_MSG ) ?>" />
133
  <p><input class="button-secondary" type="button" value="<?php _e('Default message', 'ninjafirewall') ?>" onclick="nfwjs_default_msg();" /></p>
127
  <tr>
128
  <th scope="row" class="row-med"><?php _e('Blocked user message', 'ninjafirewall') ?></th>
129
  <td>
130
+ <textarea id="blocked-msg" name="nfw_options[blocked_msg]" class="large-text code" rows="10" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><?php echo htmlspecialchars( $msg ) ?></textarea>
131
  <p class="description"><?php _e('HTML code, including CSS and JS, is allowed.', 'ninjafirewall') ?></p>
132
  <input type="hidden" id="default-msg" value="<?php echo htmlspecialchars( NFW_DEFAULT_MSG ) ?>" />
133
  <p><input class="button-secondary" type="button" value="<?php _e('Default message', 'ninjafirewall') ?>" onclick="nfwjs_default_msg();" /></p>
lib/firewall_policies.php CHANGED
@@ -186,6 +186,11 @@ wp_nonce_field('policies_save', 'nfwnonce', 0);
186
  } else {
187
  $disallow_creation = 1;
188
  }
 
 
 
 
 
189
  if ( empty( $nfw_options['disallow_settings']) ) {
190
  $disallow_settings = 0;
191
  } else {
@@ -331,6 +336,18 @@ wp_nonce_field('policies_save', 'nfwnonce', 0);
331
  <td>
332
  <p><label><input type="checkbox" name="nfw_options[disallow_settings]" value="1"<?php checked( $disallow_settings, 1 ) ?>>&nbsp;<?php echo _e('Block attempts to modify important WordPress settings', 'ninjafirewall') ?></label></p>
333
  <p><label><input type="checkbox" name="nfw_options[disallow_creation]" value="1"<?php checked( $disallow_creation, 1 ) ?>>&nbsp;<?php _e('Block user accounts creation', 'ninjafirewall') ?></label></p>
 
 
 
 
 
 
 
 
 
 
 
 
334
  </td>
335
  </tr>
336
 
@@ -345,7 +362,7 @@ wp_nonce_field('policies_save', 'nfwnonce', 0);
345
  <th scope="row" class="row-med"><?php _e('WordPress AJAX', 'ninjafirewall') ?></th>
346
  <td>
347
  <p><label><input type="checkbox" name="nfw_options[admin_ajax]" value="1"<?php checked( $admin_ajax, 1 ) ?>>&nbsp;<?php _e('Protect <code>admin-ajax.php</code> against suspicious bots', 'ninjafirewall') ?></label></p>
348
- <p class="description"><?php printf( __('Your server IP (%s), localhost and private IP addresses will not be affected by this policy.', 'ninjafirewall'), htmlspecialchars( NFW_REMOTE_ADDR ) ) ?></p>
349
  </td>
350
  </tr>
351
 
@@ -386,7 +403,7 @@ wp_nonce_field('policies_save', 'nfwnonce', 0);
386
  </td>
387
  </tr>
388
  <tr valign="top">
389
- <th scope="row" class="row-med"><a name="builtinconstants"></a><?php _e('Force SSL for admin and logins', 'ninjafirewall') ?> <code><a href="http://codex.wordpress.org/Editing_wp-config.php#Require_SSL_for_Admin_and_Logins" target="_blank">FORCE_SSL_ADMIN</a></code></th>
390
  <td>
391
  <?php nfw_toggle_switch( 'info', 'nfw_options[force_ssl]', $yes, $no, 'small', $force_ssl, $force_ssl_already_enabled, 'onclick="return nfwjs_ssl_warn(this,'. NFW_IS_HTTPS .');"' ) ?>
392
  </td>
@@ -834,7 +851,7 @@ wp_nonce_field('policies_save', 'nfwnonce', 0);
834
  <td>
835
  <?php nfw_toggle_switch( 'info', 'nfw_options[csp_frontend]', $yes, $no, 'small', $nfw_options['response_headers'][6], $err, 'onclick="nfwjs_csp_onoff(\'csp1_switch\',\'csp1\');"', 'csp1_switch' ) ?>
836
  <br />
837
- <textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" name="nfw_options[csp_frontend_data]" id="csp1" class="large-text code" rows="8"<?php readonly( $err, 1 ); readonly( $nfw_options['response_headers'][6], 0 ) ?> style="resize: vertical;"><?php echo htmlspecialchars( $nfw_options['csp_frontend_data'] ) ?></textarea>
838
  <p class="description"><?php _e('This CSP header will apply to the website frontend only.', 'ninjafirewall') ?></p>
839
  </td>
840
  </tr>
@@ -843,7 +860,7 @@ wp_nonce_field('policies_save', 'nfwnonce', 0);
843
  <td>
844
  <?php nfw_toggle_switch( 'info', 'nfw_options[csp_backend]', $yes, $no, 'small', $nfw_options['response_headers'][7], $err, 'onclick="nfwjs_csp_onoff(\'csp2_switch\',\'csp2\');"', 'csp2_switch' ) ?>
845
  <br />
846
- <textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" name="nfw_options[csp_backend_data]" id="csp2" class="large-text code" rows="8"<?php readonly( $err, 1 ); readonly( $nfw_options['response_headers'][7], 0 ) ?> style="resize: vertical;"><?php echo htmlspecialchars( $nfw_options['csp_backend_data'] ) ?></textarea>
847
  <p class="description"><?php _e('This CSP header will apply to the WordPress admin dashboard only.', 'ninjafirewall') ?></p>
848
  <?php echo $err_msg ?>
849
  </td>
@@ -1315,6 +1332,11 @@ function nf_sub_policies_save() {
1315
  } else {
1316
  $nfw_options['disallow_settings'] = 1;
1317
  }
 
 
 
 
 
1318
 
1319
  if (! isset( $_POST['nfw_options']['enum_archives']) ) {
1320
  $nfw_options['enum_archives'] = 0;
@@ -1527,6 +1549,7 @@ function nf_sub_policies_default() {
1527
  '/'. basename(WP_CONTENT_DIR) .'/(?:uploads|blogs\.dir)/';
1528
  $nfw_options['disallow_creation']= 0;
1529
  $nfw_options['disallow_settings']= 1;
 
1530
  $nfw_options['enum_archives'] = 0;
1531
  $nfw_options['enum_login'] = 0;
1532
  $nfw_options['admin_ajax'] = 0;
186
  } else {
187
  $disallow_creation = 1;
188
  }
189
+ if ( empty( $nfw_options['disallow_privesc']) ) {
190
+ $disallow_privesc = 0;
191
+ } else {
192
+ $disallow_privesc = 1;
193
+ }
194
  if ( empty( $nfw_options['disallow_settings']) ) {
195
  $disallow_settings = 0;
196
  } else {
336
  <td>
337
  <p><label><input type="checkbox" name="nfw_options[disallow_settings]" value="1"<?php checked( $disallow_settings, 1 ) ?>>&nbsp;<?php echo _e('Block attempts to modify important WordPress settings', 'ninjafirewall') ?></label></p>
338
  <p><label><input type="checkbox" name="nfw_options[disallow_creation]" value="1"<?php checked( $disallow_creation, 1 ) ?>>&nbsp;<?php _e('Block user accounts creation', 'ninjafirewall') ?></label></p>
339
+ <?php
340
+ if ( defined('NFW_DISABLE_PRVESC2') ) {
341
+ $msg = '<p class="description">'. sprintf( __('To enable this option, please remove the %s constant from your wp-config.php or .htninja script.', 'ninjafirewall'), '<code>NFW_DISABLE_PRVESC2</code>' ) .'</p>';
342
+ $disabled = 1;
343
+ $disallow_privesc = 0;
344
+ } else {
345
+ $msg ='';
346
+ $disabled = 0;
347
+ }
348
+ ?>
349
+ <p><label><input <?php disabled( $disabled, 1 ) ?>type="checkbox" name="nfw_options[disallow_privesc]" value="1"<?php checked( $disallow_privesc, 1 ) ?>>&nbsp;<?php _e('Block attempts to gain administrative privileges', 'ninjafirewall') ?></label></p>
350
+ <?php echo $msg ?>
351
  </td>
352
  </tr>
353
 
362
  <th scope="row" class="row-med"><?php _e('WordPress AJAX', 'ninjafirewall') ?></th>
363
  <td>
364
  <p><label><input type="checkbox" name="nfw_options[admin_ajax]" value="1"<?php checked( $admin_ajax, 1 ) ?>>&nbsp;<?php _e('Protect <code>admin-ajax.php</code> against suspicious bots', 'ninjafirewall') ?></label></p>
365
+ <p class="description"><?php printf( __('Your server IP (%s), localhost and private IP addresses will not be affected by this policy.', 'ninjafirewall'), htmlspecialchars( $_SERVER['SERVER_ADDR'] ) ) ?></p>
366
  </td>
367
  </tr>
368
 
403
  </td>
404
  </tr>
405
  <tr valign="top">
406
+ <th scope="row" class="row-med"><a name="builtinconstants"></a><?php _e('Force HTTPS for admin and logins', 'ninjafirewall') ?> <code><a href="http://codex.wordpress.org/Editing_wp-config.php#Require_SSL_for_Admin_and_Logins" target="_blank">FORCE_SSL_ADMIN</a></code></th>
407
  <td>
408
  <?php nfw_toggle_switch( 'info', 'nfw_options[force_ssl]', $yes, $no, 'small', $force_ssl, $force_ssl_already_enabled, 'onclick="return nfwjs_ssl_warn(this,'. NFW_IS_HTTPS .');"' ) ?>
409
  </td>
851
  <td>
852
  <?php nfw_toggle_switch( 'info', 'nfw_options[csp_frontend]', $yes, $no, 'small', $nfw_options['response_headers'][6], $err, 'onclick="nfwjs_csp_onoff(\'csp1_switch\',\'csp1\');"', 'csp1_switch' ) ?>
853
  <br />
854
+ <textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" name="nfw_options[csp_frontend_data]" id="csp1" class="large-text code" rows="8"<?php readonly( $err, 1 ); readonly( $nfw_options['response_headers'][6], 0 ) ?>><?php echo htmlspecialchars( $nfw_options['csp_frontend_data'] ) ?></textarea>
855
  <p class="description"><?php _e('This CSP header will apply to the website frontend only.', 'ninjafirewall') ?></p>
856
  </td>
857
  </tr>
860
  <td>
861
  <?php nfw_toggle_switch( 'info', 'nfw_options[csp_backend]', $yes, $no, 'small', $nfw_options['response_headers'][7], $err, 'onclick="nfwjs_csp_onoff(\'csp2_switch\',\'csp2\');"', 'csp2_switch' ) ?>
862
  <br />
863
+ <textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" name="nfw_options[csp_backend_data]" id="csp2" class="large-text code" rows="8"<?php readonly( $err, 1 ); readonly( $nfw_options['response_headers'][7], 0 ) ?>><?php echo htmlspecialchars( $nfw_options['csp_backend_data'] ) ?></textarea>
864
  <p class="description"><?php _e('This CSP header will apply to the WordPress admin dashboard only.', 'ninjafirewall') ?></p>
865
  <?php echo $err_msg ?>
866
  </td>
1332
  } else {
1333
  $nfw_options['disallow_settings'] = 1;
1334
  }
1335
+ if (! isset( $_POST['nfw_options']['disallow_privesc']) ) {
1336
+ $nfw_options['disallow_privesc'] = 0;
1337
+ } else {
1338
+ $nfw_options['disallow_privesc'] = 1;
1339
+ }
1340
 
1341
  if (! isset( $_POST['nfw_options']['enum_archives']) ) {
1342
  $nfw_options['enum_archives'] = 0;
1549
  '/'. basename(WP_CONTENT_DIR) .'/(?:uploads|blogs\.dir)/';
1550
  $nfw_options['disallow_creation']= 0;
1551
  $nfw_options['disallow_settings']= 1;
1552
+ $nfw_options['disallow_privesc'] = 1;
1553
  $nfw_options['enum_archives'] = 0;
1554
  $nfw_options['enum_login'] = 0;
1555
  $nfw_options['admin_ajax'] = 0;
lib/help.php CHANGED
@@ -33,8 +33,8 @@ function help_nfsubmain() {
33
 
34
  get_current_screen()->add_help_tab( array(
35
  'id' => 'main01',
36
- 'title' => __('Firewall Dashboard', 'nfwplus'),
37
- 'content' => '<br />' . __('This is NinjaFirewall Dashboard page; it shows information about the firewall status. We recommend you keep an eye on it because, in case of problems, all possible errors and warnings will be displayed here.', 'nfwplus') . '<br />&nbsp;'
38
  ) );
39
 
40
  get_current_screen()->add_help_tab( array(
@@ -53,7 +53,7 @@ function help_nfsubmain() {
53
  'title' => __('About...', 'ninjafirewall'),
54
  'content' => '<br />'.
55
 
56
- __('Everything you ever wanted to know about NinjaFirewall.', 'ninjafirewall') .'</p>'
57
  ) );
58
 
59
  }
@@ -87,13 +87,13 @@ get_current_screen()->add_help_tab( array(
87
  ) );
88
  get_current_screen()->add_help_tab( array(
89
  'id' => 'opt03',
90
- 'title' => __('Error code and message to return', 'ninjafirewall'),
91
  'content' => '<br />' .
92
  __('Lets you customize the HTTP error code returned by NinjaFirewall when blocking a dangerous request and the message to display to the user.' , 'ninjafirewall') . ' ' .
93
  __('You can use any HTML tags and 3 built-in variables:' , 'ninjafirewall') .
94
- '<li><code>%%REM_ADDRESS%%</code> : '. __('the blocked user IP.' , 'ninjafirewall') . '</li>
95
  <li><code>%%NUM_INCIDENT%%</code> : '. __('the unique incident number as it will appear in the firewall log "INCIDENT" column.' , 'ninjafirewall') . '</li>
96
- <li><code>%%NINJA_LOGO%%</code> : '. __('NinjaFirewall logo.' , 'ninjafirewall') . '</li>'
97
  ) );
98
  list ( $major_current ) = explode( '.', NFW_ENGINE_VERSION );
99
  get_current_screen()->add_help_tab( array(
@@ -101,8 +101,8 @@ get_current_screen()->add_help_tab( array(
101
  'title' => __('Export/import configuration', 'ninjafirewall'),
102
  'content' => '<br />' .
103
  sprintf( __('This options lets you export you current configuration or import it from another NinjaFirewall (WP Edition) installation. The imported file must match the major version of your current version (%s) otherwise it will be rejected. Note that importing will override all firewall rules and options.', 'ninjafirewall'), (int) $major_current .'.x' ) .
104
- '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">' .
105
- __('"File Check" configuration will not be exported/imported.', 'ninjafirewall') . '</span></p>'
106
  ) );
107
 
108
  get_current_screen()->add_help_tab( array(
@@ -119,11 +119,16 @@ function help_nfsubpolicies() {
119
 
120
  // Firewall policies menu help :
121
 
 
 
 
 
 
122
  // Show this text only if we are running in "Full WAF" mode:
123
  if ( defined('NFW_WPWAF') ) {
124
  $res= '';
125
  } else {
126
- $res = sprintf( __('Keep in mind, however, that the Firewall Policies apply to any PHP scripts located inside the %s directory and its sub-directories, and not only to your WordPress index page.', 'ninjafirewall'), '<code>' . ABSPATH . '</code>');
127
  }
128
 
129
  get_current_screen()->add_help_tab( array(
@@ -142,144 +147,165 @@ function help_nfsubpolicies() {
142
  'title' => __('Scan and Sanitise', 'ninjafirewall'),
143
  'content' => '<br />'.
144
  __('You can choose to scan and reject dangerous content but also to sanitise requests and variables. Those two actions are different and can be combined together for better security.', 'ninjafirewall') .
145
- '<li>'. __('Scan : if anything suspicious is detected, NinjaFirewall will block the request and return an HTTP error code and message (defined in the "Firewall Options" page). The user request will fail and the connection will be closed immediately.', 'ninjafirewall') .'</li>
146
- <li>'. sprintf( __('Sanitise : this option will not block but sanitise the user request by escaping characters that can be used to exploit vulnerabilities (%s) and replacing <code>&lt;</code> and <code>&gt;</code> with their corresponding HTML entities (<code>&amp;lt;</code>, <code>&amp;gt;</code>). If it is a variable, i.e. <code>?name=value</code>, both its name and value will be sanitised.', 'ninjafirewall'), '<code>\'</code>, <code>"</code>, <code>\\</code>, <code>\n</code>, <code>\r</code>, <code>`</code>, <code>\x1a</code>, <code>\x00</code>, <code>*</code>, <code>?</code>') .'
147
  <br />' .
148
  __('This action will be performed when the filtering process is over, right before NinjaFirewall forwards the request to your PHP script.', 'ninjafirewall') . '
149
  <br />
150
  <br />
151
- <span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">'. __('If you enabled <code>POST</code> requests sanitising, articles and messages posted by your visitors could be corrupted with excessive backslashes or substitution characters.', 'ninjafirewall'). '</span></li>'
152
  ) );
 
153
  get_current_screen()->add_help_tab( array(
154
- 'id' => 'policies04',
155
- 'title' => __('Firewall Policies', 'ninjafirewall'),
156
  'content' => '
157
  <div style="height:400px;">
158
 
159
- <!-- Basic Policies -->
160
- <h3>' . __('Basic Policies', 'ninjafirewall'). '</h3>
161
 
162
- <strong>HTTP / HTTPS</strong>
163
- <li>' . __('Whether to filter HTTP and/or HTTPS traffic', 'ninjafirewall'). '</li>
164
- <br />
165
- <strong>' . __('Uploads', 'ninjafirewall'). '</strong>
166
- <li>' . __('File Uploads:', 'ninjafirewall'). '<span class="description"> ' . __('whether to allow/disallow file uploads.', 'ninjafirewall'). '</span></li>
167
- <li>' . __('Sanitise filenames:', 'ninjafirewall'). '<span class="description"> ' . __('any character that is not a letter <code>a-zA-Z</code>, a digit <code>0-9</code>, a dot <code>.</code>, a hyphen <code>-</code> or an underscore <code>_</code> will be removed from the filename and replaced with the substitution character.', 'ninjafirewall'). '</span></li>
168
- <br />
169
- <strong>WordPress</strong>
170
- <li>' . __('Whether to block direct access to PHP files located in specific WordPress directories.', 'ninjafirewall'). '</li>
171
- <li>' . __('Block attempts to modify important WordPress settings', 'ninjafirewall'). ':<span class="description"> ' . __('enabling this policy will block any attempt (e.g., exploiting a vulnerability, using a backdoor etc) to modify some important WordPress settings. This policy will also send you an alert by email with all details regarding the issue. It is enabled by default.', 'ninjafirewall') . '</span></li>
172
- <li>' . __('Block user accounts creation', 'ninjafirewall'). ':<span class="description"> ' . __('enabling this policy will block any attempt (e.g., exploiting a vulnerability, using a backdoor etc) to create a user account. If you allow user registration, you should not enable it.', 'ninjafirewall'). '</span></li>
173
- <li>' . __('WordPress AJAX', 'ninjafirewall'). ':<span class="description"> ' . sprintf( __('many vulnerabilities in plugins are exploited via the admin-ajax.php script. This policy will try to detect and immediately block bots and malicious scanners trying to access it. The server IP address (%s) and private IP addresses will not be blocked.', 'ninjafirewall'), NFW_REMOTE_ADDR ). '</span></li>
174
- <li>' . __('Protect against username enumeration:', 'ninjafirewall'). '<span class="description"> ' . __('it is possible to enumerate usernames either through the WordPress author archives, the REST API or the login page. Although this is not a vulnerability but a WordPress feature, some hackers use it to retrieve usernames in order to launch more accurate brute-force attacks. If it is a failed login attempt, NinjaFirewall will sanitise the error message returned by WordPress. If it is an author archives scan, it will invalidate it and redirect the user to the blog index page. Regarding the WP REST API, it will block the request immediately.', 'ninjafirewall'). '</span></li>
175
- <li>' . __('WordPress REST API:', 'ninjafirewall'). '<span class="description"> ' . __('it allows you to access your WordPress site\'s data through an easy-to-use HTTP REST API. Since WordPress 4.7, it is enabled by default. NinjaFirewall allows you to block any access to that API if you do not intend to use it.', 'ninjafirewall'). '</span></li>
176
- <li>' . __('WordPress XML-RPC API:', 'ninjafirewall'). '<span class="description"> ' . __('XML-RPC is a remote procedure call (RPC) protocol which uses XML to encode its calls and HTTP as a transport mechanism. WordPress has an XMLRPC API that can be accessed through the <code>xmlrpc.php</code> file. Since WordPress version 3.5, it is always activated and cannot be turned off. NinjaFirewall allows you to immediately block any access to that file, or only to block an access using the <code>system.multicall</code> method often used in brute-force amplification attacks or to block Pingbacks.', 'ninjafirewall'). '</span></li>
177
- <li>' . __('Block <code>POST</code> requests in the themes folder <code>/wp-content/themes</code>:', 'ninjafirewall'). '<span class="description"> ' . __('this option can be useful to block hackers from installing backdoor in the PHP theme files. However, because some custom themes may include an HTML form (contact, search form etc), this option is not enabled by default.', 'ninjafirewall'). '</span></li>
178
- <li>' . __('Force SSL for admin and logins <code>FORCE_SSL_ADMIN</code>:', 'ninjafirewall'). '<span class="description"> ' . __('enable this option when you want to secure logins and the admin area so that both passwords and cookies are never sent in the clear. Ensure that you can access your admin console from HTTPS before enabling this option, otherwise you will lock yourself out of your site!', 'ninjafirewall'). '</span></li>
179
- <li>' . __('Disable the plugin and theme editor <code>DISALLOW_FILE_EDIT</code>:', 'ninjafirewall'). '<span class="description"> ' . __('disabling the plugin and theme editor provides an additional layer of security if a hacker gains access to a well-privileged user account.', 'ninjafirewall'). '</span></li>
180
- <li>' . __('Disable plugin and theme update/installation <code>DISALLOW_FILE_MODS</code>:', 'ninjafirewall'). '<span class="description"> ' . __('this option will block users being able to use the plugin and theme installation/update functionality from the WordPress admin area. Setting this constant also disables the Plugin and Theme editor.', 'ninjafirewall'). '</span></li>
181
- <li>' . __('Disable the fatal error handler <code>WP_DISABLE_FATAL_ERROR_HANDLER</code>:', 'ninjafirewall'). '<span class="description"> ' . __('this option will disable the WSOD protection introduced in WordPress 5.1.', 'ninjafirewall'). '</span></li>
182
 
183
- <br />
184
 
185
- <!-- Intermediate Policies -->
186
- <h3>' . __('Intermediate Policies', 'ninjafirewall'). '</h3>
187
 
188
- <strong>' . __('HTTP GET variable', 'ninjafirewall'). '</strong>
189
- <li>' . __('Whether to scan and/or sanitise the <code>GET</code> variable.', 'ninjafirewall'). '</li>
190
- <br />
191
- <strong>' . __('HTTP POST variable', 'ninjafirewall'). '</strong>
192
- <li>' . __('Whether to scan and/or sanitise the <code>POST</code> variable.', 'ninjafirewall'). '</li>
193
- <li>' . __('Decode Base64-encoded <code>POST</code> variable:', 'ninjafirewall'). '<span class="description"> ' . __('NinjaFirewall will decode and scan base64 encoded values in order to detect obfuscated malicious code. This option is only available for the <code>POST</code> variable.', 'ninjafirewall'). '</span></li>
194
- <br />
195
- <strong>' . __('HTTP REQUEST variable', 'ninjafirewall'). '</strong>
196
- <li>' . __('Whether to sanitise the <code>REQUEST</code> variable.', 'ninjafirewall'). '</li>
197
- <br />
198
- <strong>' . __('Cookies', 'ninjafirewall'). '</strong>
199
- <li>' . __('Whether to scan and/or sanitise cookies.', 'ninjafirewall'). '</li>
200
- <br />
201
- <strong>' . __('HTTP_USER_AGENT server variable', 'ninjafirewall'). '</strong>
202
- <li>' . __('Whether to scan and/or sanitise <code>HTTP_USER_AGENT</code> requests.', 'ninjafirewall'). '</li>
203
- <li>' . __('Block suspicious bots/scanners:', 'ninjafirewall'). '<span class="description"> ' . __('rejects some known bots, scanners and various malicious scripts attempting to access your blog.', 'ninjafirewall'). '</span></li>
204
- <br />
205
- <strong>' . __('HTTP_REFERER server variable', 'ninjafirewall'). '</strong>
206
- <li>' . __('Whether to scan and/or sanitise <code>HTTP_REFERER</code> requests.', 'ninjafirewall'). '</li>
207
- <li>' . __('Block POST requests that do not have an <code>HTTP_REFERER</code> header:', 'ninjafirewall'). '<span class="description"> ' . __('this option will block any <code>POST</code> request that does not have a Referrer header (<code>HTTP_REFERER</code> variable). If you need external applications to post to your scripts (e.g. Paypal IPN, WordPress WP-Cron...), you are advised to keep this option disabled otherwise they will likely be blocked. Note that <code>POST</code> requests are not required to have a Referrer header and, for that reason, this option is disabled by default.', 'ninjafirewall'). '</span></li>
208
- <br />
209
- <strong>IP</strong>
210
- <li>' . __('Block localhost IP in <code>GET/POST</code> requests:', 'ninjafirewall'). '<span class="description"> ' . __('this option will block any <code>GET</code> or <code>POST</code> request containing the localhost IP (127.0.0.1). It can be useful to block SQL dumpers and various hacker\'s shell scripts.', 'ninjafirewall'). '</span></li>
211
- <li>' . __('Block HTTP requests with an IP in the <code>HTTP_HOST</code> header:', 'ninjafirewall'). '<span class="description"> ' . sprintf( __('this option will reject any request using an IP instead of a domain name in the <code>Host</code> header of the HTTP request. Unless you need to connect to your site using its IP address, (e.g. %s), enabling this option will block a lot of hackers scanners because such applications scan IPs rather than domain names.', 'ninjafirewall'), 'http://' . htmlspecialchars($_SERVER['SERVER_ADDR']) . '/index.php'). '</span></li>
212
- <li>' . __('Scan traffic coming from localhost and private IP address spaces:', 'ninjafirewall'). '<span class="description"> ' . __('this option will allow the firewall to scan traffic from all non-routable private IPs (IPv4 and IPv6) as well as the localhost IP. We recommend to keep it enabled if you have a private network (2 or more servers interconnected).', 'ninjafirewall'). '</span></li>
213
 
214
- <br />
215
 
216
- <!-- Advanced Policies -->
217
- <h3>' . __('Advanced Policies', 'ninjafirewall'). '</h3>
218
 
219
- <strong>' . __('HTTP response headers', 'ninjafirewall'). '</strong>
220
- <br />
221
- ' . __('In addition to filtering incoming requests, NinjaFirewall can also hook the HTTP response in order to alter its headers. Those modifications can help to mitigate threats such as XSS, phishing and clickjacking attacks.', 'ninjafirewall'). '
222
- <br />
223
- <li>' . __('Set <code>X-Content-Type-Options</code> to protect against MIME type confusion attacks:', 'ninjafirewall'). '<span class="description"> ' . __('this header will send the nosniff value to instruct the browser to disable content or MIME sniffing and to use the content-type returned by the server. Some browsers try to guess (sniff) and override the content-type by looking at the content itself which, in some cases, could lead to security issues such as MIME Confusion Attacks.', 'ninjafirewall'). '</span></li>
224
- <li>' . __('Set <code>X-Frame-Options</code> to protect against clickjacking attempts:', 'ninjafirewall'). '<span class="description"> ' . __('this header indicates a policy whether a browser must not allow to render a page in a &lt;frame&gt; or &lt;iframe&gt;. Hosts can declare this policy in the header of their HTTP responses to prevent clickjacking attacks, by ensuring that their content is not embedded into other pages or frames. NinjaFirewall accepts two different values:', 'ninjafirewall'). '
225
- <ul>
226
- <li><code>SAMEORIGIN</code>: ' . __('a browser receiving content with this header must not display this content in any frame from a page of different origin than the content itself.', 'ninjafirewall'). '</li>
227
- <li><code>DENY</code>: ' . __('a browser receiving content with this header must not display this content in any frame.', 'ninjafirewall'). '</li>
228
- </ul>
229
- </span>
230
- ' . __('NinjaFirewall does not support the <code>ALLOW-FROM</code> value.', 'ninjafirewall'). '
231
- <br />' .
232
- __('Since v3.1.3, WordPress sets this value to <code>SAMEORIGIN</code> for the administrator and the login page only.', 'ninjafirewall'). '</li>
233
- <li>' . __('Set <code>X-XSS-Protection</code> (IE/Edge, Chrome, Opera and Safari browsers):', 'ninjafirewall'). '<span class="description"> ' . __('this header allows browsers to identify and block XSS attacks by preventing malicious scripts from executing. It is enabled by default on all compatible browsers.', 'ninjafirewall'). '</span></li>'.
234
- '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">' . __("If a visitor disabled their browser's XSS filter, you cannot re-enable it with that option.", 'ninjafirewall'). '</span></p>'.
235
-
236
- '<li>' . __('Force <code>SameSite</code> flag on all cookies to mitigate CSRF attacks:', 'ninjafirewall'). '<span class="description"> ' . __('adding this flag to cookies helps to mitigate the risk of CSRF (cross-site request forgery) attacks because cookies can only be sent in requests originating from the same origin as the target domain.', 'ninjafirewall'). '</span></li>'.
237
- '<li>' . __('Force <code>HttpOnly</code> flag on all cookies to mitigate XSS attacks:', 'ninjafirewall'). '<span class="description"> ' . __('adding this flag to cookies helps to mitigate the risk of cross-site scripting by preventing them from being accessed through client-side scripts. NinjaFirewall can hook all cookies sent by your blog, its plugins or any other PHP script, add the <code>HttpOnly</code> flag if it is missing, and re-inject those cookies back into your server HTTP response headers right before they are sent to your visitors. Note that WordPress sets that flag on the logged in user cookies only.', 'ninjafirewall'). '</span></li>
238
- <p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">' . __('If your PHP scripts send cookies that need to be accessed from JavaScript, you should keep that option disabled.', 'ninjafirewall'). '</span></p>
239
- <li>' . __('Set <code>Strict-Transport-Security</code> (HSTS) to enforce secure connections to the server:', 'ninjafirewall'). '<span class="description"> ' . __('this policy enforces secure HTTPS connections to the server. Web browsers will not allow the user to access the web application over insecure HTTP protocol. It helps to defend against cookie hijacking and Man-in-the-middle attacks. Most recent browsers support HSTS headers.', 'ninjafirewall'). '</span></li>
240
- <li>' . __('Set <code>Content-Security-Policy</code>:', 'ninjafirewall'). '<span class="description"> ' . __('this policy helps to mitigate threats such as XSS, phishing and clickjacking attacks. It covers JavaScript, CSS, HTML frames, web workers, fonts, images, objects (Java, ActiveX, audio and video files), and other HTML5 features.', 'ninjafirewall'). ' ' . __('NinjaFirewall lets you configure the CSP policy separately for the frontend (blog, website) and the backend (WordPress admin dashboard).', 'ninjafirewall') . '</span></li>
241
- <li>' . __('Set <code>Referrer-Policy</code>:', 'ninjafirewall'). '<span class="description"> ' . __('this HTTP header governs which referrer information, sent in the Referer header, should be included with requests made.', 'ninjafirewall') . '</span></li>
242
 
243
- <br />
244
- <strong>PHP</strong>
245
- <li>' . __('Block PHP built-in wrappers:', 'ninjafirewall'). '<span class="description"> ' . __('PHP has several wrappers for use with the filesystem functions. It is possible for an attacker to use them to bypass firewalls and various IDS to exploit remote and local file inclusions. This option lets you block any script attempting to pass a <code>expect://</code>, <code>file://</code>, <code>phar://</code>, <code>php://</code>, <code>zip://</code> or <code>data://</code> stream inside a <code>GET</code> or <code>POST</code> request, cookies, user agent and referrer variables.', 'ninjafirewall'). '</span></li>
246
- <li>' . sprintf( __('Block serialized PHP objects:', 'ninjafirewall'). '<span class="description"> ' . __('Object Serialization is a PHP feature used by many applications to generate a storable representation of a value. However, some insecure PHP applications and plugins can turn that feature into a critical vulnerability called <a href="%s">PHP Object Injection</a>. This option can block serialized PHP objects found inside a a <code>GET</code> or <code>POST</code> request, cookies, user agent and referrer variables.', 'ninjafirewall'), 'https://www.owasp.org/index.php/PHP_Object_Injection'). '</span></li>
247
- <li>' . __('Hide PHP notice and error messages:', 'ninjafirewall'). '<span class="description"> ' . __('this option lets you hide errors returned by your scripts. Such errors can leak sensitive informations which can be exploited by hackers.', 'ninjafirewall'). '</span></li>
248
- <li>' . __('Sanitise <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, <code>PATH_INFO</code>:', 'ninjafirewall'). '<span class="description"> ' . __('this option can sanitise any dangerous characters found in those 3 server variables to prevent various XSS and database injection attempts.', 'ninjafirewall'). '</span></li>
249
- <br />
250
- <strong>' . __('Various', 'ninjafirewall'). '</strong>
251
- <li>' . sprintf( __('Block the <code>DOCUMENT_ROOT</code> server variable (%s) in HTTP requests:', 'ninjafirewall'), '<code>' . $_SERVER['DOCUMENT_ROOT'] . '</code>'). '<span class="description"> ' . __('this option will block scripts attempting to pass the <code>DOCUMENT_ROOT</code> server variable in a <code>GET</code> or <code>POST</code> request. Hackers use shell scripts that often need to pass this value, but most legitimate programs do not.', 'ninjafirewall'). '</span></li>
252
- <li>' . __('Block ASCII character 0x00 (NULL byte):', 'ninjafirewall'). '<span class="description"> ' . __('this option will reject any <code>GET</code> or <code>POST</code> request, <code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, <code>PHP_SELF</code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> variables containing the ASCII character 0x00 (NULL byte). Such a character is dangerous and should always be rejected.', 'ninjafirewall'). '</span></li>
253
- <li>' . __('Block ASCII control characters 1 to 8 and 14 to 31:', 'ninjafirewall'). '<span class="description"> ' . __('this option will reject any <code>GET</code> or <code>POST</code> request, <code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> variables containing ASCII characters from 1 to 8 and 14 to 31.', 'ninjafirewall'). '</span></li>
 
 
 
 
254
 
 
 
 
 
 
 
 
 
 
 
 
 
255
  </div>'
256
  ) );
 
 
257
  get_current_screen()->add_help_tab( array(
258
- 'id' => 'policies03',
259
- 'title' => __('Users Whitelist', 'ninjafirewall'),
260
- 'content' => '<br />'.
261
- sprintf( __('By default, any logged in WordPress administrator will not be blocked by NinjaFirewall. You can also add any logged in users to the whitelist (make sure you trust them all before doing so).<br />This feature applies to all Firewall Policies listed below, except <code>FORCE_SSL_ADMIN</code>, <code>DISALLOW_FILE_EDIT</code>, <code>DISALLOW_FILE_MODS</code> options and the <a href="%s">Login Protection</a> which, if enabled, are always enforced.', 'ninjafirewall'), '?page=nfsubloginprot').
262
- '<br />'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
  ) );
264
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
  }
266
  /* ------------------------------------------------------------------ */ // i18n+
267
 
268
  function help_nfsubfileguard() {
269
 
270
- // File Guard :
271
- get_current_screen()->add_help_tab( array(
272
- 'id' => 'fileguard01',
273
- 'title' => __('File Guard', 'ninjafirewall'),
274
- 'content' => '<br/>' .
275
- __('File Guard can detect, in real-time, any access to a PHP file that was recently modified or created, and alert you about this.', 'ninjafirewall') .
276
- '<br />' .
277
- __('If a hacker uploaded a shell script to your site (or injected a backdoor into an already existing file) and tried to directly access that file using his browser or a script, NinjaFirewall would hook the HTTP request and immediately detect that the file was recently modified/created. It would send you a detailed alert (script name, IP, request, date and time). Alerts will be sent to the contact email address defined in the "Event Notifications" menu.', 'ninjafirewall') .
278
- '<p>' . __('If you do not want to monitor a folder, you can exclude its full path or a part of it (e.g., <code>/var/www/public_html/cache/</code> or <code>/cache/</code> etc). NinjaFirewall will compare this value to the <code>$_SERVER["SCRIPT_FILENAME"]</code> server variable and, if it matches, will ignore it.', 'ninjafirewall') . '</p>' .
279
- __('Multiple values must be comma-separated (e.g., <code>/foo/bar/,/cache/</code>).', 'ninjafirewall') .
280
- '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">' . __('File Guard real-time detection is a totally unique feature, because NinjaFirewall is the only plugin for WordPress that can hook HTTP requests sent to any PHP script, even if that script is not part of the WordPress package (third-party software, shell script, backdoor etc).', 'ninjafirewall') . '</span></p>'
281
- ) );
282
-
283
  // File check menu help :
284
  get_current_screen()->add_help_tab( array(
285
  'id' => 'filecheck01',
@@ -302,9 +328,21 @@ function help_nfsubfileguard() {
302
  '<br />'.
303
  __('Reports will be sent to the contact email address defined in the "Event Notifications" menu.', 'ninjafirewall'). '</p>'.
304
 
305
- '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">'. sprintf( __('Scheduled scans rely on <a href="%s">WordPress pseudo cron</a> which works only if your site gets sufficient traffic.', 'ninjafirewall'), 'http://codex.wordpress.org/Category:WP-Cron_Functions') . '</span></p>'
306
  ) );
307
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  }
309
  /* ------------------------------------------------------------------ */ // i18n+
310
  function help_nfsubnetwork() {
@@ -343,7 +381,7 @@ function help_nfsublogin() {
343
  'id' => 'login01',
344
  'title' => __('Login Protection', 'ninjafirewall'),
345
  'content' => '
346
- <div style="height:250px;">
347
 
348
  <p>' . __('By processing incoming HTTP requests before your blog and any of its plugins, NinjaFirewall is the only plugin for WordPress able to protect it against very large brute-force attacks, including distributed attacks coming from several thousands of different IPs.', 'ninjafirewall') .
349
 
@@ -372,7 +410,7 @@ function help_nfsublogin() {
372
  'id' => 'login02',
373
  'title' => __('AUTH log', 'ninjafirewall'),
374
  'content' => '
375
- <div style="height:250px;">
376
  <p>' . __('NinjaFirewall can write to the server Authentication log when the brute-force protection is triggered. This can be useful to the system administrator for monitoring purposes or banning IPs at the server level.', 'ninjafirewall') . '
377
  <br />' .
378
  __('If you have a shared hosting account, keep this option disabled as you do not have any access to the server\'s logs.', 'ninjafirewall') .
@@ -388,8 +426,8 @@ function help_nfsublogin() {
388
  </ul>'.
389
  __('Sample loglines:', 'ninjafirewall') .
390
  '<br />
391
- <textarea class="small-text code" style="width:100%;height:80px;" wrap="off">Aug 31 01:40:35 www ninjafirewall[6191]: Possible brute-force attack from 172.16.0.1 on mysite.com (wp-login.php). Blocking access for 5mn.'. "\n" . 'Aug 31 01:45:28 www ninjafirewall[6192]: Possible brute-force attack from fe80::6e88:14ff:fe3e:86f0 on blog.domain.com (XML-RPC API). Blocking access for 25mn.</textarea>
392
- <p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">' . sprintf( __('Be careful if you are behind a load balancer, reverse-proxy or CDN because the Login Protection feature will always record the <code>REMOTE_ADDR</code> IP. If you have an application parsing the AUTH log in order to ban IPs (e.g. Fail2ban), you <strong>must</strong> setup your HTTP server to forward the correct IP (or use the <code><a href="%s">.htninja</a></code> file), otherwise you will likely block legitimate users.', 'ninjafirewall'), 'https://nintechnet.com/ninjafirewall/wp-edition/help/?htninja') . '</span></p>
393
  </div>'
394
  ) );
395
 
@@ -416,7 +454,7 @@ function help_nfsublog() {
416
  </ul>'.
417
 
418
  '<p><strong>'. __('Auto-delete log', 'ninjafirewall') .'</strong></p>'.
419
- __('This options lets you configure NinjaFirewall to delete its old logs automatically. By default, logs are never deleted, <b>even when uninstall NinjaFirewall</b>. Leave this value to <code>0</code> if you don\'t want to delete old logs.', 'ninjafirewall'). '</p>'.
420
 
421
 
422
  '<p><strong>'. __('Centralized Logging', 'ninjafirewall') .'</strong></p>'.
@@ -424,9 +462,9 @@ function help_nfsublog() {
424
  '<ul><li>' . __('Enter your public key (optional): This is the public key that was created from your main server.', 'ninjafirewall') . '</li>
425
  </ul>' .
426
 
427
- '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">'.
428
  __('Centralized Logging will keep working even if NinjaFirewall is disabled. Delete your public key below if you want to disable it.', 'ninjafirewall') .
429
- '</span></p>'.
430
  '</div>'
431
  ) );
432
 
@@ -442,12 +480,12 @@ function help_nfsublog() {
442
 
443
  <p>' . __('Live Log does not make use of any WordPress core file (e.g., <code>admin-ajax.php</code>). It communicates directly with the firewall without loading WordPress bootstrap. Consequently, it is fast, lightweight and it should not affect your server load, even if you set its refresh rate to the lowest value.', 'ninjafirewall') . '</p>
444
 
445
- <p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;<span class="description">' . __('If you are using the optional <code>.htninja</code> configuration file to whitelist your IP, the Live Log feature will not work.', 'ninjafirewall') . '
446
- </span></p>'.
447
 
448
 
449
  '<p><strong>'. __('Log Format', 'ninjafirewall') .'</strong></p>'.
450
- __('You can easily customize the log format. Possible values are:', 'ninjafirewall') .'</p>' .
451
  '<ul><li>'. __('<code>%time</code>: the server date, time and timezone.', 'ninjafirewall') . '</li>' .
452
  '<li>'. __('<code>%name</code>: authenticated user (HTTP basic auth), if any.', 'ninjafirewall') . '</li>' .
453
  '<li>'. __('<code>%client</code>: the client REMOTE_ADDR. If you are behind a load balancer or CDN, this will be its IP.', 'ninjafirewall') . '</li>' .
@@ -499,56 +537,11 @@ function help_nfsubupdates() {
499
  'title' => __('Rules Editor', 'ninjafirewall'),
500
  'content' => '<br />' .
501
  __('Besides the "Firewall Policies", NinjaFirewall includes also a large set of built-in rules used to protect your blog against the most common vulnerabilities and hacking attempts. They are always enabled and you cannot edit them, but if you notice that your visitors are wrongly blocked by some of those rules, you can use the Rules Editor below to disable them individually:', 'ninjafirewall') . '
502
- <br />
503
  <li>'. __('Check your firewall log and find the rule ID you want to disable (it is displayed in the <code>RULE</code> column).', 'ninjafirewall') . '</li>
504
  <li>'. __('Select its ID from the enabled rules list below and click the "Disable it" button.', 'ninjafirewall') . '</li>
505
- <br />
506
- <span class="description">'. __('Note: if the <code>RULE</code> column from your log shows a hyphen <code>-</code> instead of a number, that means that the rule can be changed in the "Firewall Policies" page.', 'ninjafirewall') . '</span>'
507
- ) );
508
-
509
- get_current_screen()->add_help_tab( array(
510
- 'id' => 'editor02',
511
- 'title' => __('Credits', 'ninjafirewall'),
512
- 'content' =>
513
- '<p>' . __('NinjaFirewall security rules protect against many vulnerabilities. Some of them were reported by the following companies, individuals or mailing lists:', 'ninjafirewall') . '</p>
514
- <table cellpadding="2" cellspacing="3">
515
- <tr>
516
- <th scope="row" style="text-align:left">g0blin Research</th><td>https://g0blin.co.uk/</td>
517
- </tr>
518
- <tr>
519
- <th scope="row" style="text-align:left">HomeLab IT</th><td>https://homelab.it/</td>
520
- </tr>
521
- <tr>
522
- <th scope="row" style="text-align:left">Klikki Oy</th><td>https://klikki.fi/</td>
523
- </tr>
524
- <tr>
525
- <th scope="row" style="text-align:left">Netsparker</th><td>https://netsparker.com/</td>
526
- </tr>
527
- <tr>
528
- <th scope="row" style="text-align:left">Packet Storm</th><td>https://packetstormsecurity.com/</td>
529
- </tr>
530
- <tr>
531
- <th scope="row" style="text-align:left">Plugin Vulnerabilities</th><td>https://pluginvulnerabilities.com/</td>
532
- </tr>
533
- <tr>
534
- <th scope="row" style="text-align:left">Pritect Network</th><td>http://pritect.net/</td>
535
- </tr>
536
- <tr>
537
- <th scope="row" style="text-align:left">SecLists.Org</th><td>http://seclists.org/ (fulldisclosure &amp; oss-sec)</td>
538
- </tr>
539
- <tr>
540
- <th scope="row" style="text-align:left">SecurityFocus</th><td>http://securityfocus.com/</td>
541
- </tr>
542
- <tr>
543
- <th scope="row" style="text-align:left">Sucuri</th><td>https://sucuri.net/</td>
544
- </tr>
545
- <tr>
546
- <th scope="row" style="text-align:left">Summer Of Pwnage</th><td>https://sumofpwn.nl/</td>
547
- </tr>
548
- <tr>
549
- <th scope="row" style="text-align:left">WordPress Hütte</th><td>http://wphutte.com/</td>
550
- </tr>
551
- </table>'
552
  ) );
553
 
554
  }
33
 
34
  get_current_screen()->add_help_tab( array(
35
  'id' => 'main01',
36
+ 'title' => __('Firewall Dashboard', 'ninjafirewall'),
37
+ 'content' => '<br />' . __('This is NinjaFirewall Dashboard page; it shows information about the firewall status. We recommend you keep an eye on it because, in case of problems, all possible errors and warnings will be displayed here.', 'ninjafirewall') . '<br />&nbsp;'
38
  ) );
39
 
40
  get_current_screen()->add_help_tab( array(
53
  'title' => __('About...', 'ninjafirewall'),
54
  'content' => '<br />'.
55
 
56
+ __('Everything you ever wanted to know about NinjaFirewall.', 'ninjafirewall')
57
  ) );
58
 
59
  }
87
  ) );
88
  get_current_screen()->add_help_tab( array(
89
  'id' => 'opt03',
90
+ 'title' => __('Blocked user message', 'ninjafirewall'),
91
  'content' => '<br />' .
92
  __('Lets you customize the HTTP error code returned by NinjaFirewall when blocking a dangerous request and the message to display to the user.' , 'ninjafirewall') . ' ' .
93
  __('You can use any HTML tags and 3 built-in variables:' , 'ninjafirewall') .
94
+ '<ul><li><code>%%REM_ADDRESS%%</code> : '. __('the blocked user IP.' , 'ninjafirewall') . '</li>
95
  <li><code>%%NUM_INCIDENT%%</code> : '. __('the unique incident number as it will appear in the firewall log "INCIDENT" column.' , 'ninjafirewall') . '</li>
96
+ <li><code>%%NINJA_LOGO%%</code> : '. __('NinjaFirewall logo.' , 'ninjafirewall') . '</li></ul>'
97
  ) );
98
  list ( $major_current ) = explode( '.', NFW_ENGINE_VERSION );
99
  get_current_screen()->add_help_tab( array(
101
  'title' => __('Export/import configuration', 'ninjafirewall'),
102
  'content' => '<br />' .
103
  sprintf( __('This options lets you export you current configuration or import it from another NinjaFirewall (WP Edition) installation. The imported file must match the major version of your current version (%s) otherwise it will be rejected. Note that importing will override all firewall rules and options.', 'ninjafirewall'), (int) $major_current .'.x' ) .
104
+ '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;' .
105
+ __('"File Check" configuration will not be exported/imported.', 'ninjafirewall') . '</p>'
106
  ) );
107
 
108
  get_current_screen()->add_help_tab( array(
119
 
120
  // Firewall policies menu help :
121
 
122
+ if (! function_exists( 'get_home_path' ) ) {
123
+ include_once ABSPATH .'wp-admin/includes/file.php';
124
+ }
125
+ $NFW_ABSPATH = get_home_path();
126
+
127
  // Show this text only if we are running in "Full WAF" mode:
128
  if ( defined('NFW_WPWAF') ) {
129
  $res= '';
130
  } else {
131
+ $res = sprintf( __('Keep in mind, however, that the Firewall Policies apply to any PHP scripts located inside the %s directory and its sub-directories, and not only to your WordPress index page.', 'ninjafirewall'), '<code>' . $NFW_ABSPATH . '</code>');
132
  }
133
 
134
  get_current_screen()->add_help_tab( array(
147
  'title' => __('Scan and Sanitise', 'ninjafirewall'),
148
  'content' => '<br />'.
149
  __('You can choose to scan and reject dangerous content but also to sanitise requests and variables. Those two actions are different and can be combined together for better security.', 'ninjafirewall') .
150
+ '<ul><li>'. __('Scan: If anything suspicious is detected, NinjaFirewall will block the request and return an HTTP error code and message (defined in the "Firewall Options" page). The user request will fail and the connection will be closed immediately.', 'ninjafirewall') .'</li>
151
+ <li>'. sprintf( __('Sanitise: This option will not block but sanitise the user request by escaping characters that can be used to exploit vulnerabilities (%s) and replacing <code>&lt;</code> and <code>&gt;</code> with their corresponding HTML entities (<code>&amp;lt;</code>, <code>&amp;gt;</code>). If it is a variable, i.e. <code>?name=value</code>, both its name and value will be sanitised.', 'ninjafirewall'), '<code>\'</code>, <code>"</code>, <code>\\</code>, <code>\n</code>, <code>\r</code>, <code>`</code>, <code>\x1a</code>, <code>\x00</code>, <code>*</code>, <code>?</code>') .'
152
  <br />' .
153
  __('This action will be performed when the filtering process is over, right before NinjaFirewall forwards the request to your PHP script.', 'ninjafirewall') . '
154
  <br />
155
  <br />
156
+ <span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;'. __('If you enabled <code>POST</code> requests sanitising, articles and messages posted by your visitors could be corrupted with excessive backslashes or substitution characters.', 'ninjafirewall'). '</li></ul>'
157
  ) );
158
+
159
  get_current_screen()->add_help_tab( array(
160
+ 'id' => 'policies03',
161
+ 'title' => __('Basic Policies', 'ninjafirewall'),
162
  'content' => '
163
  <div style="height:400px;">
164
 
 
 
165
 
166
+ <h3>HTTP / HTTPS</h3>
167
+ ' . __('Whether to filter HTTP and/or HTTPS traffic', 'ninjafirewall'). '
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
 
169
+ <h3>' . __('Uploads', 'ninjafirewall'). '</h3>
170
 
171
+ <p><strong>' . __('File Uploads', 'ninjafirewall'). '</strong><br />' . __('Whether to allow/disallow file uploads.', 'ninjafirewall'). '</p>
 
172
 
173
+ <p><strong>' . __('Sanitise filenames', 'ninjafirewall'). '</strong><br />' . __('Any character that is not a letter <code>a-zA-Z</code>, a digit <code>0-9</code>, a dot <code>.</code>, a hyphen <code>-</code> or an underscore <code>_</code> will be removed from the filename and replaced with the substitution character.', 'ninjafirewall'). '</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
 
 
175
 
176
+ <h3>WordPress</h3>
 
177
 
178
+ <p><strong>' . __('Block direct access to any PHP file located in one of these directories') . '</strong><br />'. __('Whether to block direct access to PHP files located in specific WordPress directories.', 'ninjafirewall'). '</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
 
180
+ <p><strong>' . __('Block attempts to modify important WordPress settings', 'ninjafirewall'). '</strong><br />' . __('Enabling this policy will block any attempt (e.g., exploiting a vulnerability, using a backdoor etc) to modify some important WordPress settings. This policy will also send you an alert by email with all details regarding the issue. It is enabled by default.', 'ninjafirewall') . '<p>
181
+
182
+ <p><strong>' . __('Block user accounts creation', 'ninjafirewall'). '</strong><br />' . __('Enabling this policy will block any attempt (e.g., exploiting a vulnerability, using a backdoor etc) to create a user account. If you allow user registration, you should not enable it.', 'ninjafirewall'). '</p>
183
+
184
+ <p><strong>' . __('Block attempts to gain administrative privileges', 'ninjafirewall'). '</strong><br />' . __('This policy will block vulnerabilities that could be leveraged by attackers to gain administrative privileges.', 'ninjafirewall'). '</p>
185
+
186
+ <p><strong>' . __('WordPress AJAX', 'ninjafirewall'). '</strong><br />' . sprintf( __('Many vulnerabilities in plugins are exploited via the admin-ajax.php script. This policy will try to detect and immediately block bots and malicious scanners trying to access it. The server IP address (%s) and private IP addresses will not be blocked.', 'ninjafirewall'), NFW_REMOTE_ADDR ). '</p>
187
+
188
+ <p><strong>' . __('Protect against username enumeration', 'ninjafirewall'). '</strong><br />' . __('It is possible to enumerate usernames either through the WordPress author archives, the REST API or the login page. Although this is not a vulnerability but a WordPress feature, some hackers use it to retrieve usernames in order to launch more accurate brute-force attacks. If it is a failed login attempt, NinjaFirewall will sanitise the error message returned by WordPress. If it is an author archives scan, it will invalidate it and redirect the user to the blog index page. Regarding the WP REST API, it will block the request immediately.', 'ninjafirewall'). '</p>
189
+
190
+ <p><strong>' . __('WordPress REST API', 'ninjafirewall'). '</strong><br />' . __('It allows you to access your WordPress site\'s data through an easy-to-use HTTP REST API. Since WordPress 4.7, it is enabled by default. NinjaFirewall allows you to block any access to that API if you do not intend to use it.', 'ninjafirewall'). '</p>
191
+
192
+ <p><strong>' . __('WordPress XML-RPC API', 'ninjafirewall'). '</strong><br />' . __('XML-RPC is a remote procedure call (RPC) protocol which uses XML to encode its calls and HTTP as a transport mechanism. WordPress has an XMLRPC API that can be accessed through the <code>xmlrpc.php</code> file. Since WordPress version 3.5, it is always activated and cannot be turned off. NinjaFirewall allows you to immediately block any access to that file, or only to block an access using the <code>system.multicall</code> method often used in brute-force amplification attacks or to block Pingbacks.', 'ninjafirewall'). '</p>
193
+
194
+ <p><strong>' . __('Block <code>POST</code> requests in the themes folder <code>/wp-content/themes</code>', 'ninjafirewall') .'</strong><br />' . __('This option can be useful to block hackers from installing backdoor in the PHP theme files. However, because some custom themes may include an HTML form (contact, search form etc), this option is not enabled by default.', 'ninjafirewall'). '</p>
195
 
196
+ <p><strong>' . __('Force HTTPS for admin and logins <code>FORCE_SSL_ADMIN</code>', 'ninjafirewall'). '</strong><br />' . __('Enable this option when you want to secure logins and the admin area so that both passwords and cookies are never sent in the clear. Ensure that you can access your admin console from HTTPS before enabling this option, otherwise you will lock yourself out of your site!', 'ninjafirewall'). '</p>
197
+
198
+ <p><strong>' . __('Disable the plugin and theme editor <code>DISALLOW_FILE_EDIT</code>', 'ninjafirewall'). '</strong><br />' . __('Disabling the plugin and theme editor provides an additional layer of security if a hacker gains access to a well-privileged user account.', 'ninjafirewall'). '</p>
199
+
200
+ <p><strong>' . __('Disable plugin and theme update/installation <code>DISALLOW_FILE_MODS</code>', 'ninjafirewall'). '</strong><br />' . __('This option will block users being able to use the plugin and theme installation/update functionality from the WordPress admin area. Setting this constant also disables the Plugin and Theme editor.', 'ninjafirewall'). '</p>
201
+
202
+ <p><strong>' . __('Disable the fatal error handler <code>WP_DISABLE_FATAL_ERROR_HANDLER</code>', 'ninjafirewall'). '</strong><br />' . __('This option will disable the WSOD protection introduced in WordPress 5.1.', 'ninjafirewall'). '</p>
203
+
204
+ <h3>'. __('Users Whitelist', 'ninjafirewall') .'</h3>'.
205
+
206
+ __('By default, any logged in WordPress administrator will not be blocked by NinjaFirewall. You can also add any logged in users to the whitelist (make sure you trust them all before doing so).').
207
+ '<br />&nbsp;
208
  </div>'
209
  ) );
210
+
211
+
212
  get_current_screen()->add_help_tab( array(
213
+ 'id' => 'policies04',
214
+ 'title' => __('Intermediate Policies', 'ninjafirewall'),
215
+ 'content' => '
216
+ <div style="height:400px;">
217
+
218
+ <h3>' . __('HTTP GET variable', 'ninjafirewall'). '</h3>'.
219
+ __('Whether to scan and/or sanitise the <code>GET</code> variable.', 'ninjafirewall').
220
+
221
+ '<h3>' . __('HTTP POST variable', 'ninjafirewall'). '</h3>'.
222
+ __('Whether to scan and/or sanitise the <code>POST</code> variable.', 'ninjafirewall').
223
+ '<p><strong>' . __('Decode Base64-encoded <code>POST</code> variable', 'ninjafirewall'). '</strong><br />' . __('NinjaFirewall will decode and scan base64 encoded values in order to detect obfuscated malicious code. This option is only available for the <code>POST</code> variable.', 'ninjafirewall'). '</p>
224
+
225
+ <h3>' . __('HTTP REQUEST variable', 'ninjafirewall'). '</h3>'.
226
+ __('Whether to sanitise the <code>REQUEST</code> variable.', 'ninjafirewall').
227
+
228
+ '<h3>' . __('Cookies', 'ninjafirewall'). '</h3>'.
229
+ __('Whether to scan and/or sanitise cookies.', 'ninjafirewall').
230
+
231
+ '<h3>' . __('HTTP_USER_AGENT server variable', 'ninjafirewall'). '</h3>'.
232
+ __('Whether to scan and/or sanitise <code>HTTP_USER_AGENT</code> requests.', 'ninjafirewall').
233
+ '<p><strong>' . __('Block suspicious bots/scanners', 'ninjafirewall'). '</strong><br />' . __('Rejects some known bots, scanners and various malicious scripts attempting to access your blog.', 'ninjafirewall'). '</p>
234
+
235
+ <h3>' . __('HTTP_REFERER server variable', 'ninjafirewall'). '</h3>'.
236
+ __('Whether to scan and/or sanitise <code>HTTP_REFERER</code> requests.', 'ninjafirewall').
237
+ '<p><strong>' . __('Block POST requests that do not have an <code>HTTP_REFERER</code> header', 'ninjafirewall'). '</strong><br />' . __('This option will block any <code>POST</code> request that does not have a Referrer header (<code>HTTP_REFERER</code> variable). If you need external applications to post to your scripts (e.g. Paypal IPN, WordPress WP-Cron...), you are advised to keep this option disabled otherwise they will likely be blocked. Note that <code>POST</code> requests are not required to have a Referrer header and, for that reason, this option is disabled by default.', 'ninjafirewall'). '</p>
238
+
239
+ <h3>IP</h3>
240
+
241
+ <p><strong>' . __('Block localhost IP in <code>GET/POST</code> requests', 'ninjafirewall'). '</strong><br />' . __('this option will block any <code>GET</code> or <code>POST</code> request containing the localhost IP (127.0.0.1). It can be useful to block SQL dumpers and various hacker\'s shell scripts.', 'ninjafirewall'). '</p>
242
+
243
+ <p><strong>' . __('Block HTTP requests with an IP in the <code>HTTP_HOST</code> header', 'ninjafirewall'). '</strong><br />' . sprintf( __('This option will reject any request using an IP instead of a domain name in the <code>Host</code> header of the HTTP request. Unless you need to connect to your site using its IP address, (e.g. %s), enabling this option will block a lot of hackers scanners because such applications scan IPs rather than domain names.', 'ninjafirewall'), 'http://' . htmlspecialchars($_SERVER['SERVER_ADDR']) . '/index.php'). '</p>
244
+
245
+ <p><strong>' . __('Scan traffic coming from localhost and private IP address spaces', 'ninjafirewall'). '</strong><br />' . __('this option will allow the firewall to scan traffic from all non-routable private IPs (IPv4 and IPv6) as well as the localhost IP. We recommend to keep it enabled if you have a private network (2 or more servers interconnected).', 'ninjafirewall'). '</p>
246
+
247
+ </div>'
248
  ) );
249
 
250
+
251
+ get_current_screen()->add_help_tab( array(
252
+ 'id' => 'policies05',
253
+ 'title' => __('Advanced Policies', 'ninjafirewall'),
254
+ 'content' => '
255
+ <div style="height:400px;">
256
+
257
+ <h3>' . __('HTTP response headers', 'ninjafirewall'). '</h3>
258
+ ' . __('In addition to filtering incoming requests, NinjaFirewall can also hook the HTTP response in order to alter its headers. Those modifications can help to mitigate threats such as XSS, phishing and clickjacking attacks.', 'ninjafirewall'). '
259
+
260
+ <p><strong>' . __('Set <code>X-Content-Type-Options</code> to protect against MIME type confusion attacks', 'ninjafirewall'). '</strong><br />' . __('This header will send the nosniff value to instruct the browser to disable content or MIME sniffing and to use the content-type returned by the server. Some browsers try to guess (sniff) and override the content-type by looking at the content itself which, in some cases, could lead to security issues such as MIME Confusion Attacks.', 'ninjafirewall'). '</p>
261
+
262
+ <p><strong>' . __('Set <code>X-Frame-Options</code> to protect against clickjacking attempts', 'ninjafirewall'). '</strong><br />' . __('This header indicates a policy whether a browser must not allow to render a page in a &lt;frame&gt; or &lt;iframe&gt;. Hosts can declare this policy in the header of their HTTP responses to prevent clickjacking attacks, by ensuring that their content is not embedded into other pages or frames. NinjaFirewall accepts two different values:', 'ninjafirewall'). '</p>
263
+ <ul>
264
+ <li><code>SAMEORIGIN</code>: ' . __('A browser receiving content with this header must not display this content in any frame from a page of different origin than the content itself.', 'ninjafirewall'). '</li>
265
+ <li><code>DENY</code>: ' . __('A browser receiving content with this header must not display this content in any frame.', 'ninjafirewall').
266
+ '</ul>
267
+ <p>' . __('NinjaFirewall does not support the <code>ALLOW-FROM</code> value.', 'ninjafirewall'). '</p>
268
+ <p>' . __('Since v3.1.3, WordPress sets this value to <code>SAMEORIGIN</code> for the administrator and the login page only.', 'ninjafirewall'). '</p>
269
+
270
+ <p><strong>' . __('Set <code>X-XSS-Protection</code> (IE/Edge, Chrome, Opera and Safari browsers)', 'ninjafirewall'). '</strong><br />' . __('This header allows browsers to identify and block XSS attacks by preventing malicious scripts from executing. It is enabled by default on all compatible browsers.', 'ninjafirewall'). '</p>'.
271
+ '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;' . __("If a visitor disabled their browser's XSS filter, you cannot re-enable it with that option.", 'ninjafirewall'). '</p>'.
272
+
273
+ '<p><strong>' . __('Force <code>SameSite</code> flag on all cookies to mitigate CSRF attacks', 'ninjafirewall'). '</strong><br />' . __('Adding this flag to cookies helps to mitigate the risk of CSRF (cross-site request forgery) attacks because cookies can only be sent in requests originating from the same origin as the target domain.', 'ninjafirewall'). '</p>'.
274
+
275
+ '<p><strong>' . __('Force <code>HttpOnly</code> flag on all cookies to mitigate XSS attacks', 'ninjafirewall'). '</strong><br />' . __('Adding this flag to cookies helps to mitigate the risk of cross-site scripting by preventing them from being accessed through client-side scripts. NinjaFirewall can hook all cookies sent by your blog, its plugins or any other PHP script, add the <code>HttpOnly</code> flag if it is missing, and re-inject those cookies back into your server HTTP response headers right before they are sent to your visitors. Note that WordPress sets that flag on the logged in user cookies only.', 'ninjafirewall'). '</p>
276
+ <p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;' . __('If your PHP scripts send cookies that need to be accessed from JavaScript, you should keep that option disabled.', 'ninjafirewall'). '</p>
277
+
278
+ <p><strong>' . __('Set <code>Strict-Transport-Security</code> (HSTS) to enforce secure connections to the server', 'ninjafirewall'). '</strong><br />' . __('This policy enforces secure HTTPS connections to the server. Web browsers will not allow the user to access the web application over insecure HTTP protocol. It helps to defend against cookie hijacking and Man-in-the-middle attacks. Most recent browsers support HSTS headers.', 'ninjafirewall'). '</p>
279
+
280
+ <p><strong>' . __('Set <code>Content-Security-Policy</code>', 'ninjafirewall'). '</strong><br />' . __('This policy helps to mitigate threats such as XSS, phishing and clickjacking attacks. It covers JavaScript, CSS, HTML frames, web workers, fonts, images, objects (Java, ActiveX, audio and video files), and other HTML5 features.', 'ninjafirewall'). ' ' . __('NinjaFirewall lets you configure the CSP policy separately for the frontend (blog, website) and the backend (WordPress admin dashboard).', 'ninjafirewall') . '</p>
281
+
282
+ <p><strong>' . __('Set <code>Referrer-Policy</code>', 'ninjafirewall'). '</strong><br />' . __('This HTTP header governs which referrer information, sent in the Referer header, should be included with requests made.', 'ninjafirewall') . '</p>
283
+
284
+ <h3>PHP</h3>
285
+
286
+ <p><strong>' . __('Block PHP built-in wrappers', 'ninjafirewall'). '</strong><br />' . __('PHP has several wrappers for use with the filesystem functions. It is possible for an attacker to use them to bypass firewalls and various IDS to exploit remote and local file inclusions. This option lets you block any script attempting to pass a <code>expect://</code>, <code>file://</code>, <code>phar://</code>, <code>php://</code>, <code>zip://</code> or <code>data://</code> stream inside a <code>GET</code> or <code>POST</code> request, cookies, user agent and referrer variables.', 'ninjafirewall'). '</p>
287
+
288
+ <p><strong>' . sprintf( __('Block serialized PHP objects', 'ninjafirewall'). '</strong><br />' . __('Object Serialization is a PHP feature used by many applications to generate a storable representation of a value. However, some insecure PHP applications and plugins can turn that feature into a critical vulnerability called <a href="%s">PHP Object Injection</a>. This option can block serialized PHP objects found inside a a <code>GET</code> or <code>POST</code> request, cookies, user agent and referrer variables.', 'ninjafirewall'), 'https://www.owasp.org/index.php/PHP_Object_Injection'). '</p>
289
+
290
+ <p><strong>' . __('Hide PHP notice and error messages', 'ninjafirewall'). '</strong><br />' . __('This option lets you hide errors returned by your scripts. Such errors can leak sensitive informations which can be exploited by hackers.', 'ninjafirewall'). '</p>
291
+
292
+ <p><strong>' . __('Sanitise <code>PHP_SELF</code>, <code>PATH_TRANSLATED</code>, <code>PATH_INFO</code>', 'ninjafirewall'). '</strong><br />' . __('This option can sanitise any dangerous characters found in those 3 server variables to prevent various XSS and database injection attempts.', 'ninjafirewall'). '</p>
293
+
294
+ <h3>' . __('Various', 'ninjafirewall'). '</h3>
295
+ <p><strong>' . sprintf( __('Block the <code>DOCUMENT_ROOT</code> server variable (%s) in HTTP requests', 'ninjafirewall'), '<code>' . $_SERVER['DOCUMENT_ROOT'] . '</code>'). '</strong><br />' . __('This option will block scripts attempting to pass the <code>DOCUMENT_ROOT</code> server variable in a <code>GET</code> or <code>POST</code> request. Hackers use shell scripts that often need to pass this value, but most legitimate programs do not.', 'ninjafirewall'). '</p>
296
+
297
+ <p><strong>' . __('Block ASCII character 0x00 (NULL byte)', 'ninjafirewall'). '</strong><br />' . __('This option will reject any <code>GET</code> or <code>POST</code> request, <code>HTTP_USER_AGENT</code>, <code>REQUEST_URI</code>, <code>PHP_SELF</code>, <code>PATH_INFO</code>, <code>HTTP_REFERER</code> variables containing the ASCII character 0x00 (NULL byte). Such a character is dangerous and should always be rejected.', 'ninjafirewall'). '</p>
298
+
299
+ <p><strong>' . __('Block ASCII control characters 1 to 8 and 14 to 31', 'ninjafirewall'). '</strong><br />' . __('This option will reject any <code>GET</code> or <code>POST</code> request, <code>HTTP_USER_AGENT</code>, <code>HTTP_REFERER</code> variables containing ASCII characters from 1 to 8 and 14 to 31.', 'ninjafirewall'). '</p>
300
+ <br />&nbsp;
301
+
302
+ </div>'
303
+ ) );
304
  }
305
  /* ------------------------------------------------------------------ */ // i18n+
306
 
307
  function help_nfsubfileguard() {
308
 
 
 
 
 
 
 
 
 
 
 
 
 
 
309
  // File check menu help :
310
  get_current_screen()->add_help_tab( array(
311
  'id' => 'filecheck01',
328
  '<br />'.
329
  __('Reports will be sent to the contact email address defined in the "Event Notifications" menu.', 'ninjafirewall'). '</p>'.
330
 
331
+ '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;'. sprintf( __('Scheduled scans rely on <a href="%s">WordPress pseudo cron</a> which works only if your site gets sufficient traffic.', 'ninjafirewall'), 'http://codex.wordpress.org/Category:WP-Cron_Functions') . '</p>'
332
  ) );
333
 
334
+ // File Guard :
335
+ get_current_screen()->add_help_tab( array(
336
+ 'id' => 'fileguard01',
337
+ 'title' => __('File Guard', 'ninjafirewall'),
338
+ 'content' => '<br/>' .
339
+ __('File Guard can detect, in real-time, any access to a PHP file that was recently modified or created, and alert you about this.', 'ninjafirewall') .
340
+ '<br />' .
341
+ __('If a hacker uploaded a shell script to your site (or injected a backdoor into an already existing file) and tried to directly access that file using his browser or a script, NinjaFirewall would hook the HTTP request and immediately detect that the file was recently modified/created. It would send you a detailed alert (script name, IP, request, date and time). Alerts will be sent to the contact email address defined in the "Event Notifications" menu.', 'ninjafirewall') .
342
+ '<p>' . __('If you do not want to monitor a folder, you can exclude its full path or a part of it (e.g., <code>/var/www/public_html/cache/</code> or <code>/cache/</code> etc). NinjaFirewall will compare this value to the <code>$_SERVER["SCRIPT_FILENAME"]</code> server variable and, if it matches, will ignore it.', 'ninjafirewall') . '</p>' .
343
+ __('Multiple values must be comma-separated (e.g., <code>/foo/bar/,/cache/</code>).', 'ninjafirewall') .
344
+ '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;' . __('File Guard real-time detection is a totally unique feature, because NinjaFirewall is the only plugin for WordPress that can hook HTTP requests sent to any PHP script, even if that script is not part of the WordPress package (third-party software, shell script, backdoor etc).', 'ninjafirewall') . '</p>'
345
+ ) );
346
  }
347
  /* ------------------------------------------------------------------ */ // i18n+
348
  function help_nfsubnetwork() {
381
  'id' => 'login01',
382
  'title' => __('Login Protection', 'ninjafirewall'),
383
  'content' => '
384
+ <div style="height:400px;">
385
 
386
  <p>' . __('By processing incoming HTTP requests before your blog and any of its plugins, NinjaFirewall is the only plugin for WordPress able to protect it against very large brute-force attacks, including distributed attacks coming from several thousands of different IPs.', 'ninjafirewall') .
387
 
410
  'id' => 'login02',
411
  'title' => __('AUTH log', 'ninjafirewall'),
412
  'content' => '
413
+ <div style="height:400px;">
414
  <p>' . __('NinjaFirewall can write to the server Authentication log when the brute-force protection is triggered. This can be useful to the system administrator for monitoring purposes or banning IPs at the server level.', 'ninjafirewall') . '
415
  <br />' .
416
  __('If you have a shared hosting account, keep this option disabled as you do not have any access to the server\'s logs.', 'ninjafirewall') .
426
  </ul>'.
427
  __('Sample loglines:', 'ninjafirewall') .
428
  '<br />
429
+ <textarea class="large-text code" style="height:80px;" wrap="off">Aug 31 01:40:35 www ninjafirewall[6191]: Possible brute-force attack from 172.16.0.1 on mysite.com (wp-login.php). Blocking access for 5mn.'. "\n" . 'Aug 31 01:45:28 www ninjafirewall[6192]: Possible brute-force attack from fe80::6e88:14ff:fe3e:86f0 on blog.domain.com (XML-RPC API). Blocking access for 25mn.</textarea>
430
+ <p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;' . sprintf( __('Be careful if you are behind a load balancer, reverse-proxy or CDN because the Login Protection feature will always record the <code>REMOTE_ADDR</code> IP. If you have an application parsing the AUTH log in order to ban IPs (e.g. Fail2ban), you <strong>must</strong> setup your HTTP server to forward the correct IP (or use the <code><a href="%s">.htninja</a></code> file), otherwise you will likely block legitimate users.', 'ninjafirewall'), 'https://nintechnet.com/ninjafirewall/wp-edition/help/?htninja') . '</p>
431
  </div>'
432
  ) );
433
 
454
  </ul>'.
455
 
456
  '<p><strong>'. __('Auto-delete log', 'ninjafirewall') .'</strong></p>'.
457
+ __('This options lets you configure NinjaFirewall to delete its old logs automatically. By default, logs are never deleted, <b>even when uninstall NinjaFirewall</b>. Leave this value to <code>0</code> if you don\'t want to delete old logs.', 'ninjafirewall').
458
 
459
 
460
  '<p><strong>'. __('Centralized Logging', 'ninjafirewall') .'</strong></p>'.
462
  '<ul><li>' . __('Enter your public key (optional): This is the public key that was created from your main server.', 'ninjafirewall') . '</li>
463
  </ul>' .
464
 
465
+ '<p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;'.
466
  __('Centralized Logging will keep working even if NinjaFirewall is disabled. Delete your public key below if you want to disable it.', 'ninjafirewall') .
467
+ '</p>'.
468
  '</div>'
469
  ) );
470
 
480
 
481
  <p>' . __('Live Log does not make use of any WordPress core file (e.g., <code>admin-ajax.php</code>). It communicates directly with the firewall without loading WordPress bootstrap. Consequently, it is fast, lightweight and it should not affect your server load, even if you set its refresh rate to the lowest value.', 'ninjafirewall') . '</p>
482
 
483
+ <p><span class="dashicons dashicons-warning nfw-warning"></span>&nbsp;' . __('If you are using the optional <code>.htninja</code> configuration file to whitelist your IP, the Live Log feature will not work.', 'ninjafirewall') . '
484
+ </p>'.
485
 
486
 
487
  '<p><strong>'. __('Log Format', 'ninjafirewall') .'</strong></p>'.
488
+ __('You can easily customize the log format. Possible values are:', 'ninjafirewall') .
489
  '<ul><li>'. __('<code>%time</code>: the server date, time and timezone.', 'ninjafirewall') . '</li>' .
490
  '<li>'. __('<code>%name</code>: authenticated user (HTTP basic auth), if any.', 'ninjafirewall') . '</li>' .
491
  '<li>'. __('<code>%client</code>: the client REMOTE_ADDR. If you are behind a load balancer or CDN, this will be its IP.', 'ninjafirewall') . '</li>' .
537
  'title' => __('Rules Editor', 'ninjafirewall'),
538
  'content' => '<br />' .
539
  __('Besides the "Firewall Policies", NinjaFirewall includes also a large set of built-in rules used to protect your blog against the most common vulnerabilities and hacking attempts. They are always enabled and you cannot edit them, but if you notice that your visitors are wrongly blocked by some of those rules, you can use the Rules Editor below to disable them individually:', 'ninjafirewall') . '
540
+ <ul>
541
  <li>'. __('Check your firewall log and find the rule ID you want to disable (it is displayed in the <code>RULE</code> column).', 'ninjafirewall') . '</li>
542
  <li>'. __('Select its ID from the enabled rules list below and click the "Disable it" button.', 'ninjafirewall') . '</li>
543
+ </ul>
544
+ '. __('Note: if the <code>RULE</code> column from your log shows a hyphen <code>-</code> instead of a number, that means that the rule can be changed in the "Firewall Policies" page.', 'ninjafirewall')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
545
  ) );
546
 
547
  }
lib/init_update.php CHANGED
@@ -131,6 +131,22 @@ if (! empty($nfw_options['engine_version']) && version_compare($nfw_options['eng
131
  $nfw_options['allow_local_ip'] = 0;
132
  }
133
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  // -------------------------------------------------------------
135
  // All versions:
136
  // Old upgrades from 1.3.x to 1.4 didn't initialize the security
131
  $nfw_options['allow_local_ip'] = 0;
132
  }
133
  }
134
+ // v4.0.6 update -------------------------------------------------
135
+ if ( version_compare( $nfw_options['engine_version'], '4.0.6', '<' ) ) {
136
+ if (! isset( $nfw_options['disallow_privesc'] ) &&
137
+ ! defined('NFW_DISABLE_PRVESC2' ) &&
138
+ ! empty( $nfw_options['a_53'] ) ) {
139
+
140
+ $nfw_options['disallow_privesc'] = 1;
141
+ } else {
142
+ $nfw_options['disallow_privesc'] = 0;
143
+ }
144
+ unset( $nfw_options['a_53'] );
145
+ }
146
+ // v4.1 update ---------------------------------------------------
147
+ if ( version_compare( $nfw_options['engine_version'], '4.1', '<' ) ) {
148
+ $nfw_options['secupdates'] = 1;
149
+ }
150
  // -------------------------------------------------------------
151
  // All versions:
152
  // Old upgrades from 1.3.x to 1.4 didn't initialize the security
lib/install.php CHANGED
@@ -26,13 +26,18 @@ function nfw_get_constants() {
26
 
27
  if ( defined('NFW_HTACCESS_BEGIN') ) { return; }
28
 
 
 
 
 
 
29
  define( 'NFW_HTACCESS_BEGIN', '# BEGIN NinjaFirewall' );
30
  define( 'NFW_HTACCESS_DATA', '<IfModule mod_php'. PHP_MAJOR_VERSION .'.c>' ."\n" .
31
  ' php_value auto_prepend_file '. NFW_LOG_DIR .'/nfwlog/ninjafirewall.php' ."\n" .
32
  '</IfModule>');
33
  define( 'NFW_LITESPEED_DATA', 'php_value auto_prepend_file '. NFW_LOG_DIR .'/nfwlog/ninjafirewall.php');
34
  define( 'NFW_SUPHP_DATA', '<IfModule mod_suphp.c>' ."\n" .
35
- ' suPHP_ConfigPath '. rtrim( ABSPATH, '/') ."\n" .
36
  '</IfModule>');
37
  define( 'NFW_HTACCESS_END', '# END NinjaFirewall' );
38
  define( 'NFW_PHPINI_BEGIN', '; BEGIN NinjaFirewall' );
@@ -53,21 +58,26 @@ function nfw_fullwaf_htaccess( $httpserver ) {
53
 
54
  $htaccess_content = '';
55
 
 
 
 
 
 
56
  // Back-up existing .htaccess
57
- if ( file_exists( ABSPATH .'.htaccess' ) ) {
58
- if (! is_writable( ABSPATH .'.htaccess' ) ) {
59
  return sprintf(
60
  __('Error: Your .htaccess file is not writable, please change its permissions: %s', 'ninjafirewall' ),
61
- htmlspecialchars( ABSPATH .'.htaccess' )
62
  );
63
  }
64
  $backup_file = time();
65
- @copy( ABSPATH .'.htaccess', ABSPATH .".htaccess.ninja{$backup_file}" );
66
 
67
  // Remove potential NF directives
68
  nfw_remove_directives();
69
 
70
- $htaccess_content = file_get_contents( ABSPATH .'.htaccess' );
71
  }
72
 
73
  // Write new content depending on HTTP server type
@@ -86,11 +96,11 @@ function nfw_fullwaf_htaccess( $httpserver ) {
86
  }
87
 
88
  // Write content
89
- $res = @file_put_contents( ABSPATH .'.htaccess', $data, LOCK_EX );
90
  if ( $res === false ) {
91
  return sprintf(
92
  __('Error: The following file is not writable, please change its permissions: %s', 'ninjafirewall' ),
93
- htmlspecialchars( ABSPATH .'.htaccess' )
94
  );
95
  }
96
 
@@ -98,7 +108,7 @@ function nfw_fullwaf_htaccess( $httpserver ) {
98
  $res = nfw_waf_sandbox();
99
  if ( $res !== true ) {
100
  // Undo
101
- @file_put_contents( ABSPATH .'.htaccess', $htaccess_content, LOCK_EX );
102
  return $res;
103
  }
104
 
@@ -151,6 +161,11 @@ function nfw_fullwaf_ini( $httpserver, $initype ) {
151
 
152
  nfw_get_constants();
153
 
 
 
 
 
 
154
  $ini_content = '';
155
 
156
  // [1] .user.ini
@@ -162,32 +177,32 @@ function nfw_fullwaf_ini( $httpserver, $initype ) {
162
  }
163
 
164
  // Back-up existing INI file
165
- if ( file_exists( ABSPATH . $initype ) ) {
166
- if (! is_writable( ABSPATH . $initype ) ) {
167
  return sprintf(
168
  __('Error: The following file is not writable, please change its permissions: %s', 'ninjafirewall' ),
169
- htmlspecialchars( ABSPATH . $initype )
170
  );
171
  }
172
  $backup_file = time();
173
- @copy( ABSPATH .$initype, ABSPATH ."{$initype}.ninja{$backup_file}" );
174
 
175
  // Remove potential NF directives
176
  nfw_remove_directives();
177
 
178
- $ini_content = file_get_contents( ABSPATH . $initype );
179
  }
180
 
181
  // Write new content
182
  $res = @file_put_contents(
183
- ABSPATH . $initype,
184
  NFW_PHPINI_BEGIN . "\n" . NFW_PHPINI_DATA . "\n" . NFW_PHPINI_END . "\n\n" . $ini_content,
185
  LOCK_EX
186
  );
187
  if ( $res === false ) {
188
  return sprintf(
189
  __('Error: The following file is not writable, please change its permissions: %s', 'ninjafirewall' ),
190
- htmlspecialchars( ABSPATH . $initype )
191
  );
192
  }
193
  return true;
@@ -202,6 +217,11 @@ function nfw_remove_directives( $ini = true, $htaccess = true, $wp_config = true
202
 
203
  define('NFW_REMOVED_DIRECTIVES', true);
204
 
 
 
 
 
 
205
  $res = array( 'ini' => true, 'htaccess' => true, 'wp-config' => true );
206
 
207
  // wp-config.php
@@ -222,7 +242,7 @@ function nfw_remove_directives( $ini = true, $htaccess = true, $wp_config = true
222
 
223
  // .htaccess
224
  if ( $htaccess == true ) {
225
- $htaccess = ABSPATH .'.htaccess';
226
  $mods = 0;
227
  if ( file_exists( $htaccess ) ) {
228
  if ( is_writable( $htaccess ) ) {
@@ -247,7 +267,7 @@ function nfw_remove_directives( $ini = true, $htaccess = true, $wp_config = true
247
 
248
  // .ini
249
  if ( $ini == true ) {
250
- $ini = ABSPATH .'php.ini';
251
  $mods = 0;
252
  if ( file_exists( $ini ) ) {
253
  if ( is_writable( $ini ) ) {
@@ -268,7 +288,7 @@ function nfw_remove_directives( $ini = true, $htaccess = true, $wp_config = true
268
  $res['ini'] = __('File is not writable', 'ninjafirewall');
269
  }
270
  }
271
- $ini = ABSPATH .'.user.ini';
272
  $mods = 0;
273
  if ( file_exists( $ini ) ) {
274
  if ( is_writable( $ini ) ) {
26
 
27
  if ( defined('NFW_HTACCESS_BEGIN') ) { return; }
28
 
29
+ if (! function_exists( 'get_home_path' ) ) {
30
+ include_once ABSPATH .'wp-admin/includes/file.php';
31
+ }
32
+ $NFW_ABSPATH = get_home_path();
33
+
34
  define( 'NFW_HTACCESS_BEGIN', '# BEGIN NinjaFirewall' );
35
  define( 'NFW_HTACCESS_DATA', '<IfModule mod_php'. PHP_MAJOR_VERSION .'.c>' ."\n" .
36
  ' php_value auto_prepend_file '. NFW_LOG_DIR .'/nfwlog/ninjafirewall.php' ."\n" .
37
  '</IfModule>');
38
  define( 'NFW_LITESPEED_DATA', 'php_value auto_prepend_file '. NFW_LOG_DIR .'/nfwlog/ninjafirewall.php');
39
  define( 'NFW_SUPHP_DATA', '<IfModule mod_suphp.c>' ."\n" .
40
+ ' suPHP_ConfigPath '. rtrim( $NFW_ABSPATH, '/') ."\n" .
41
  '</IfModule>');
42
  define( 'NFW_HTACCESS_END', '# END NinjaFirewall' );
43
  define( 'NFW_PHPINI_BEGIN', '; BEGIN NinjaFirewall' );
58
 
59
  $htaccess_content = '';
60
 
61
+ if (! function_exists( 'get_home_path' ) ) {
62
+ include_once ABSPATH .'wp-admin/includes/file.php';
63
+ }
64
+ $NFW_ABSPATH = get_home_path();
65
+
66
  // Back-up existing .htaccess
67
+ if ( file_exists( $NFW_ABSPATH .'.htaccess' ) ) {
68
+ if (! is_writable( $NFW_ABSPATH .'.htaccess' ) ) {
69
  return sprintf(
70
  __('Error: Your .htaccess file is not writable, please change its permissions: %s', 'ninjafirewall' ),
71
+ htmlspecialchars( $NFW_ABSPATH .'.htaccess' )
72
  );
73
  }
74
  $backup_file = time();
75
+ @copy( $NFW_ABSPATH .'.htaccess', $NFW_ABSPATH .".htaccess.ninja{$backup_file}" );
76
 
77
  // Remove potential NF directives
78
  nfw_remove_directives();
79
 
80
+ $htaccess_content = file_get_contents( $NFW_ABSPATH .'.htaccess' );
81
  }
82
 
83
  // Write new content depending on HTTP server type
96
  }
97
 
98
  // Write content
99
+ $res = @file_put_contents( $NFW_ABSPATH .'.htaccess', $data, LOCK_EX );
100
  if ( $res === false ) {
101
  return sprintf(
102
  __('Error: The following file is not writable, please change its permissions: %s', 'ninjafirewall' ),
103
+ htmlspecialchars( $NFW_ABSPATH .'.htaccess' )
104
  );
105
  }
106
 
108
  $res = nfw_waf_sandbox();
109
  if ( $res !== true ) {
110
  // Undo
111
+ @file_put_contents( $NFW_ABSPATH .'.htaccess', $htaccess_content, LOCK_EX );
112
  return $res;
113
  }
114
 
161
 
162
  nfw_get_constants();
163
 
164
+ if (! function_exists( 'get_home_path' ) ) {
165
+ include_once ABSPATH .'wp-admin/includes/file.php';
166
+ }
167
+ $NFW_ABSPATH = get_home_path();
168
+
169
  $ini_content = '';
170
 
171
  // [1] .user.ini
177
  }
178
 
179
  // Back-up existing INI file
180
+ if ( file_exists( $NFW_ABSPATH . $initype ) ) {
181
+ if (! is_writable( $NFW_ABSPATH . $initype ) ) {
182
  return sprintf(
183
  __('Error: The following file is not writable, please change its permissions: %s', 'ninjafirewall' ),
184
+ htmlspecialchars( $NFW_ABSPATH . $initype )
185
  );
186
  }
187
  $backup_file = time();
188
+ @copy( $NFW_ABSPATH .$initype, $NFW_ABSPATH ."{$initype}.ninja{$backup_file}" );
189
 
190
  // Remove potential NF directives
191
  nfw_remove_directives();
192
 
193
+ $ini_content = file_get_contents( $NFW_ABSPATH . $initype );
194
  }
195
 
196
  // Write new content
197
  $res = @file_put_contents(
198
+ $NFW_ABSPATH . $initype,
199
  NFW_PHPINI_BEGIN . "\n" . NFW_PHPINI_DATA . "\n" . NFW_PHPINI_END . "\n\n" . $ini_content,
200
  LOCK_EX
201
  );
202
  if ( $res === false ) {
203
  return sprintf(
204
  __('Error: The following file is not writable, please change its permissions: %s', 'ninjafirewall' ),
205
+ htmlspecialchars( $NFW_ABSPATH . $initype )
206
  );
207
  }
208
  return true;
217
 
218
  define('NFW_REMOVED_DIRECTIVES', true);
219
 
220
+ if (! function_exists( 'get_home_path' ) ) {
221
+ include_once ABSPATH .'wp-admin/includes/file.php';
222
+ }
223
+ $NFW_ABSPATH = get_home_path();
224
+
225
  $res = array( 'ini' => true, 'htaccess' => true, 'wp-config' => true );
226
 
227
  // wp-config.php
242
 
243
  // .htaccess
244
  if ( $htaccess == true ) {
245
+ $htaccess = $NFW_ABSPATH .'.htaccess';
246
  $mods = 0;
247
  if ( file_exists( $htaccess ) ) {
248
  if ( is_writable( $htaccess ) ) {
267
 
268
  // .ini
269
  if ( $ini == true ) {
270
+ $ini = $NFW_ABSPATH .'php.ini';
271
  $mods = 0;
272
  if ( file_exists( $ini ) ) {
273
  if ( is_writable( $ini ) ) {
288
  $res['ini'] = __('File is not writable', 'ninjafirewall');
289
  }
290
  }
291
+ $ini = $NFW_ABSPATH .'.user.ini';
292
  $mods = 0;
293
  if ( file_exists( $ini ) ) {
294
  if ( is_writable( $ini ) ) {
lib/install_default.php CHANGED
@@ -102,10 +102,10 @@ function nfw_load_default_conf() {
102
  'a_51' => 1,
103
  'sched_scan' => 0,
104
  'report_scan' => 0,
 
 
105
  // v1.7 (daily report cronjob) :
106
  'a_52' => 1,
107
- // v3.4:
108
- 'a_53' => 1,
109
  // v3.8.3 :
110
  'a_61' => 1,
111
 
@@ -118,6 +118,8 @@ function nfw_load_default_conf() {
118
  'disallow_creation' => 0,
119
  // v3.7.2:
120
  'disallow_settings' => 1,
 
 
121
 
122
  // v1.1.2 :
123
  'no_xmlrpc' => 0,
@@ -146,6 +148,7 @@ function nfw_load_default_conf() {
146
  'clogs_pubkey' => '',
147
 
148
  'rate_notice' => time() + 86400 * 15,
 
149
  );
150
  // v1.3.1 :
151
  // Some compatibility checks:
@@ -167,9 +170,28 @@ function nfw_load_default_conf() {
167
  exit( '<font style="font-size:14px;">'. $err_msg .'</font>' );
168
  }
169
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
  $nfw_options['engine_version'] = NFW_ENGINE_VERSION;
171
  $nfw_options['rules_version'] = NFW_NEWRULES_VERSION; // downloaded rules
172
 
 
 
 
 
173
  // Create but disable by default "Block the DOCUMENT_ROOT server variable in HTTP request" rule
174
  if ( strlen( $_SERVER['DOCUMENT_ROOT'] ) > 5 ) {
175
  $nfw_rules[NFW_DOC_ROOT]['cha'][1]['wha'] = str_replace( '/', '/[./]*', $_SERVER['DOCUMENT_ROOT'] );
102
  'a_51' => 1,
103
  'sched_scan' => 0,
104
  'report_scan' => 0,
105
+ // 4.1
106
+ 'secupdates' => 1,
107
  // v1.7 (daily report cronjob) :
108
  'a_52' => 1,
 
 
109
  // v3.8.3 :
110
  'a_61' => 1,
111
 
118
  'disallow_creation' => 0,
119
  // v3.7.2:
120
  'disallow_settings' => 1,
121
+ // v4.0.6
122
+ 'disallow_privesc' => 1,
123
 
124
  // v1.1.2 :
125
  'no_xmlrpc' => 0,
148
  'clogs_pubkey' => '',
149
 
150
  'rate_notice' => time() + 86400 * 15,
151
+ 'welcome' => 1,
152
  );
153
  // v1.3.1 :
154
  // Some compatibility checks:
170
  exit( '<font style="font-size:14px;">'. $err_msg .'</font>' );
171
  }
172
 
173
+ // dropins code:
174
+ if ( isset( $nfw_rules['dropins'] ) ) {
175
+ if ( $nfw_rules['dropins'] == 'delete' ) {
176
+ if ( file_exists( NFW_LOG_DIR .'/nfwlog/dropins.php' ) ) {
177
+ @unlink( NFW_LOG_DIR .'/nfwlog/dropins.php' );
178
+ }
179
+ } else {
180
+ $dropins = base64_decode( $nfw_rules['dropins'], true );
181
+ if ( $dropins !== false ) {
182
+ @file_put_contents( NFW_LOG_DIR .'/nfwlog/dropins.php', $dropins, LOCK_EX );
183
+ }
184
+ }
185
+ unset( $nfw_rules['dropins'] );
186
+ }
187
+
188
  $nfw_options['engine_version'] = NFW_ENGINE_VERSION;
189
  $nfw_options['rules_version'] = NFW_NEWRULES_VERSION; // downloaded rules
190
 
191
+ // If the user is using WP-CLI, we populate DOCUMENT_ROOT with ABSPATH:
192
+ if ( defined('WP_CLI') && WP_CLI ) {
193
+ $_SERVER['DOCUMENT_ROOT'] = ABSPATH;
194
+ }
195
  // Create but disable by default "Block the DOCUMENT_ROOT server variable in HTTP request" rule
196
  if ( strlen( $_SERVER['DOCUMENT_ROOT'] ) > 5 ) {
197
  $nfw_rules[NFW_DOC_ROOT]['cha'][1]['wha'] = str_replace( '/', '/[./]*', $_SERVER['DOCUMENT_ROOT'] );
lib/login_protection.php CHANGED
@@ -269,7 +269,7 @@ if ( $gd_disabled && $bfconfig['bf_type'] == 1 ) {
269
  <?php _e('User:', 'ninjafirewall') ?>&nbsp;<input maxlength="32" type="text" autocomplete="off" value="<?php echo htmlspecialchars( $bfconfig['auth_name'] ) ?>" size="12" name="nfw_options[auth_name]" onkeyup="nfwjs_auth_user_valid();" />&nbsp;&nbsp;&nbsp;&nbsp;<?php _e('Password:', 'ninjafirewall') ?>&nbsp;<input maxlength="32" placeholder="<?php echo $placeholder ?>" type="password" autocomplete="off" value="" size="12" name="nfw_options[auth_pass]" />
270
  <br /><p class="description">&nbsp;<?php _e('User and Password must be from 6 to 32 characters.', 'ninjafirewall') ?></p>
271
  <br /><br /><?php _e('Message (max. 1024 characters, HTML tags allowed)', 'ninjafirewall') ?>:<br />
272
- <textarea id="realm" name="nfw_options[auth_msgtxt]" class="small-text code" cols="60" rows="5" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" oninput="nfwjs_realm_valid();"><?php echo htmlspecialchars( $bfconfig['auth_msgtxt'] ) ?></textarea>
273
  </td>
274
  </tr>
275
  </table>
269
  <?php _e('User:', 'ninjafirewall') ?>&nbsp;<input maxlength="32" type="text" autocomplete="off" value="<?php echo htmlspecialchars( $bfconfig['auth_name'] ) ?>" size="12" name="nfw_options[auth_name]" onkeyup="nfwjs_auth_user_valid();" />&nbsp;&nbsp;&nbsp;&nbsp;<?php _e('Password:', 'ninjafirewall') ?>&nbsp;<input maxlength="32" placeholder="<?php echo $placeholder ?>" type="password" autocomplete="off" value="" size="12" name="nfw_options[auth_pass]" />
270
  <br /><p class="description">&nbsp;<?php _e('User and Password must be from 6 to 32 characters.', 'ninjafirewall') ?></p>
271
  <br /><br /><?php _e('Message (max. 1024 characters, HTML tags allowed)', 'ninjafirewall') ?>:<br />
272
+ <textarea id="realm" name="nfw_options[auth_msgtxt]" class="large-text code" rows="5" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" oninput="nfwjs_realm_valid();"><?php echo htmlspecialchars( $bfconfig['auth_msgtxt'] ) ?></textarea>
273
  </td>
274
  </tr>
275
  </table>
lib/logs.php CHANGED
@@ -50,7 +50,7 @@ if ( $_REQUEST['tab'] == 'livelog' ) {
50
  <div id="livelog-options"<?php echo $livelog_div ?>>
51
  <?php include __DIR__ .'/logs_live_log.php'; ?>
52
  </div>
53
-
54
  <?php
55
 
56
  // ---------------------------------------------------------------------
50
  <div id="livelog-options"<?php echo $livelog_div ?>>
51
  <?php include __DIR__ .'/logs_live_log.php'; ?>
52
  </div>
53
+ </div>
54
  <?php
55
 
56
  // ---------------------------------------------------------------------
lib/logs_firewall_log.php CHANGED
@@ -132,7 +132,7 @@ if ( defined('NFW_TEXTAREA_HEIGHT') ) {
132
  <table class="form-table">
133
  <tr>
134
  <td width="100%">
135
- <textarea name="txtlog" class="small-text code" style="width:100%;height:<?php echo $th; ?>px;" wrap="off" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><?php
136
  if ( ! empty( $logline ) ) {
137
  echo ' DATE INCIDENT LEVEL RULE IP REQUEST' . "\n";
138
  echo $logline;
132
  <table class="form-table">
133
  <tr>
134
  <td width="100%">
135
+ <textarea name="txtlog" class="large-text code" style="height:<?php echo $th; ?>px;" wrap="off" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><?php
136
  if ( ! empty( $logline ) ) {
137
  echo ' DATE INCIDENT LEVEL RULE IP REQUEST' . "\n";
138
  echo $logline;
lib/logs_live_log.php CHANGED
@@ -95,7 +95,7 @@ if ( defined('NFW_TEXTAREA_HEIGHT') ) {
95
  <td style="width:100%;text-align:center;">
96
  <progress id="nfw-progress" value="1" max="<?php echo ($nfwintval/1000) ?>" class="nfw-progress" style="display:none"></progress>
97
  <br />
98
- <textarea disabled name="txtlog" id="idtxtlog" class="small-text code" style="width:100%;height:<?php echo $th; ?>px;" wrap="off" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"></textarea>
99
  <br />
100
  <div style="float:left;width:40%;padding-top:10px;" class="nfw-right">
101
  <?php nfw_toggle_switch( 'danger', 'nfw_options[wf_case]', __('Enabled', 'ninjafirewall'), __('Disabled', 'ninjafirewall'), 'large', 0, false, 'onclick="nfwjs_livelog()"', 'livelog-switch', 'right' ) ?>
95
  <td style="width:100%;text-align:center;">
96
  <progress id="nfw-progress" value="1" max="<?php echo ($nfwintval/1000) ?>" class="nfw-progress" style="display:none"></progress>
97
  <br />
98
+ <textarea name="txtlog" id="idtxtlog" class="large-text code" style="height:<?php echo $th; ?>px;" wrap="off" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><?php _e('Live Log lets you watch your blog traffic in real time. To enable it, click on the button below.', 'ninjafirewall') ?></textarea>
99
  <br />
100
  <div style="float:left;width:40%;padding-top:10px;" class="nfw-right">
101
  <?php nfw_toggle_switch( 'danger', 'nfw_options[wf_case]', __('Enabled', 'ninjafirewall'), __('Disabled', 'ninjafirewall'), 'large', 0, false, 'onclick="nfwjs_livelog()"', 'livelog-switch', 'right' ) ?>
lib/monitoring.php CHANGED
@@ -26,7 +26,7 @@ if (defined('NFSCANDO') ) {
26
  }
27
 
28
  // Tab and div display
29
- if ( empty( $_REQUEST['tab'] ) ) { $_REQUEST['tab'] = 'fileguard'; }
30
 
31
  if ( $_REQUEST['tab'] == 'filecheck' ) {
32
  $fileguard_tab = ''; $fileguard_div = ' style="display:none"';
@@ -43,8 +43,8 @@ if ( $_REQUEST['tab'] == 'filecheck' ) {
43
  <h1><img style="vertical-align:top;width:33px;height:33px;" src="<?php echo plugins_url( '/ninjafirewall/images/ninjafirewall_32.png' ) ?>">&nbsp;<?php _e('Monitoring', 'ninjafirewall') ?></h1>
44
  <br />
45
  <h2 class="nav-tab-wrapper wp-clearfix" style="cursor:pointer">
46
- <a id="tab-fileguard" class="nav-tab<?php echo $fileguard_tab ?>" onClick="nfwjs_switch_tabs('fileguard', 'fileguard:filecheck')"><?php _e( 'File Guard', 'ninjafirewall' ) ?></a>
47
  <a id="tab-filecheck" class="nav-tab<?php echo $filecheck_tab ?>" onClick="nfwjs_switch_tabs('filecheck', 'fileguard:filecheck')"><?php _e( 'File Check', 'ninjafirewall' ) ?></a>
 
48
  </h2>
49
  <br />
50
 
26
  }
27
 
28
  // Tab and div display
29
+ if ( empty( $_REQUEST['tab'] ) ) { $_REQUEST['tab'] = 'filecheck'; }
30
 
31
  if ( $_REQUEST['tab'] == 'filecheck' ) {
32
  $fileguard_tab = ''; $fileguard_div = ' style="display:none"';
43
  <h1><img style="vertical-align:top;width:33px;height:33px;" src="<?php echo plugins_url( '/ninjafirewall/images/ninjafirewall_32.png' ) ?>">&nbsp;<?php _e('Monitoring', 'ninjafirewall') ?></h1>
44
  <br />
45
  <h2 class="nav-tab-wrapper wp-clearfix" style="cursor:pointer">
 
46
  <a id="tab-filecheck" class="nav-tab<?php echo $filecheck_tab ?>" onClick="nfwjs_switch_tabs('filecheck', 'fileguard:filecheck')"><?php _e( 'File Check', 'ninjafirewall' ) ?></a>
47
+ <a id="tab-fileguard" class="nav-tab<?php echo $fileguard_tab ?>" onClick="nfwjs_switch_tabs('fileguard', 'fileguard:filecheck')"><?php _e( 'File Guard', 'ninjafirewall' ) ?></a>
48
  </h2>
49
  <br />
50
 
lib/monitoring_file_check.php CHANGED
@@ -128,6 +128,10 @@ if ( $err ) {
128
  // If we don't have a snapshopt, offer to create one :
129
  if (! file_exists($nfmon_snapshot) ) {
130
  ?>
 
 
 
 
131
  <form method="post" name="monitor_form">
132
  <?php wp_nonce_field('filecheck_save', 'nfwnonce', 0); ?>
133
  <table class="form-table nfw-table">
@@ -291,7 +295,7 @@ if (file_exists($nfmon_diff) ) {
291
  if ($new_file) {
292
  echo '<tr><td>';
293
  echo __('New files:', 'ninjafirewall') . ' ' . count($new_file). '<br />';
294
- echo '<select id="select-1" name="sometext" multiple="multiple" style="width:100%;height:150px" onchange="nfwjs_file_info(this.value, 1);">';
295
  foreach($new_file as $k => $v) {
296
  echo '<option value="' . htmlspecialchars($v) . '" title="' . htmlspecialchars($k) . '">' . htmlspecialchars($k) . '</option>';
297
  }
@@ -326,7 +330,7 @@ if (file_exists($nfmon_diff) ) {
326
  echo '
327
  <tr>
328
  <td>' . __('Deleted files:', 'ninjafirewall') .' '. count($del_file). '<br />' .
329
- '<select name="sometext" multiple="multiple" style="width:100%;height:150px">';
330
  foreach($del_file as $k => $v) {
331
  echo '<option title="' . htmlspecialchars($k) . '">' . htmlspecialchars($k) . '</option>';
332
  }
@@ -339,7 +343,7 @@ if (file_exists($nfmon_diff) ) {
339
  echo '
340
  <tr>
341
  <td>' . __('Modified files:', 'ninjafirewall') .' '. count($mod_file). '<br />' .
342
- '<select id="select-2" name="sometext" multiple="multiple" style="width:100%;height:150px" onchange="nfwjs_file_info(this.value, 2);">';
343
  foreach($mod_file as $k => $v) {
344
  echo '<option value="' . htmlspecialchars($v) . '" title="' . htmlspecialchars($k) . '">' . htmlspecialchars($k) . '</option>';
345
  }
128
  // If we don't have a snapshopt, offer to create one :
129
  if (! file_exists($nfmon_snapshot) ) {
130
  ?>
131
+ <div class="nfw-notice nfw-notice-orange">
132
+ <p><?php _e('File Check lets you perform file integrity monitoring upon request or on a specific interval. To start, create a snapshot of your files by clicking the button below.', 'ninjafirewall' ) ?></p>
133
+ </div>
134
+
135
  <form method="post" name="monitor_form">
136
  <?php wp_nonce_field('filecheck_save', 'nfwnonce', 0); ?>
137
  <table class="form-table nfw-table">
295
  if ($new_file) {
296
  echo '<tr><td>';
297
  echo __('New files:', 'ninjafirewall') . ' ' . count($new_file). '<br />';
298
+ echo '<select id="select-1" name="sometext" multiple="multiple" style="min-width:100%;width:100%;height:150px" onchange="nfwjs_file_info(this.value, 1);">';
299
  foreach($new_file as $k => $v) {
300
  echo '<option value="' . htmlspecialchars($v) . '" title="' . htmlspecialchars($k) . '">' . htmlspecialchars($k) . '</option>';
301
  }
330
  echo '
331
  <tr>
332
  <td>' . __('Deleted files:', 'ninjafirewall') .' '. count($del_file). '<br />' .
333
+ '<select name="sometext" multiple="multiple" style="min-width:100%;width:100%;height:150px">';
334
  foreach($del_file as $k => $v) {
335
  echo '<option title="' . htmlspecialchars($k) . '">' . htmlspecialchars($k) . '</option>';
336
  }
343
  echo '
344
  <tr>
345
  <td>' . __('Modified files:', 'ninjafirewall') .' '. count($mod_file). '<br />' .
346
+ '<select id="select-2" name="sometext" multiple="multiple" style="min-width:100%;width:100%;height:150px" onchange="nfwjs_file_info(this.value, 2);">';
347
  foreach($mod_file as $k => $v) {
348
  echo '<option value="' . htmlspecialchars($v) . '" title="' . htmlspecialchars($k) . '">' . htmlspecialchars($k) . '</option>';
349
  }
lib/security_rules_update.php CHANGED
@@ -48,15 +48,15 @@ if ( defined( 'NFUPDATESDO' ) && NFUPDATESDO == 2 ) {
48
  $update_url = array(
49
  $proto . '://plugins.svn.wordpress.org/ninjafirewall/updates/',
50
  'version3.txt',
51
- 'rules3s.txt'
52
  );
53
  } else {
54
  // Scheduled updates or plugin update
55
  $caching_id = sha1( home_url() );
56
  $update_url = array(
57
  $proto . '://updates.nintechnet.com/index.php',
58
- "?version=3&cid={$caching_id}&edn=wp&rt={$rules_type}&su={$sched_updates}",
59
- "?rules=3s&cid={$caching_id}&edn=wp&rt={$rules_type}&su={$sched_updates}"
60
  );
61
  }
62
 
@@ -107,6 +107,7 @@ if (! empty( $_POST['nfw_act'] ) ) {
107
  // If WP cron is disabled, we simply warn the user
108
  if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON == true ) {
109
  echo '<div class="notice-warning notice is-dismissible"><p>' . sprintf( __('It seems that %s is set. Ensure you have another way to run WP-Cron, otherwise NinjaFirewall automatic updates will not work.', 'ninjafirewall'), '<code>DISABLE_WP_CRON</code>' ) . '</p></div>';
 
110
  }
111
 
112
  if ( empty($nfw_options['enable_updates']) ) {
@@ -162,9 +163,12 @@ if ( empty($nfw_options['notify_updates']) && isset($nfw_options['notify_updates
162
  // not in the past, otherwise send a warning because wp-cron
163
  // is obviously not working as expected
164
  if ( $nextcron < time() ) {
 
 
165
  ?>
166
  <p class="description" style="color:red"><?php _e('The next scheduled date is in the past! WordPress wp-cron may not be working or may have been disabled.', 'ninjafirewall'); ?></p>
167
  <?php
 
168
  } else {
169
  ?>
170
  <p class="description"><?php printf( __('Next scheduled update will start in approximately %s day, %s hour(s), %s minute(s) and %s seconds.', 'ninjafirewall'), $diff->format('%a') % 7, $diff->format('%h'), $diff->format('%i'), $diff->format('%s') ) ?></p>
@@ -194,7 +198,7 @@ if ( empty($nfw_options['notify_updates']) && isset($nfw_options['notify_updates
194
  <tr>
195
  <th scope="row" class="row-med"><?php _e('Updates Log', 'ninjafirewall') ?></th>
196
  <td>
197
- <textarea class="small-text code" style="width:100%;height:200px;" wrap="off" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><?php
198
  $reversed = array_reverse($log_data);
199
  $count = 0;
200
  foreach ($reversed as $key) {
@@ -336,6 +340,21 @@ function nf_sub_do_updates($update_url, $update_log, $NFUPDATESDO = 1) {
336
  return 0;
337
  }
338
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
339
  $nfw_rules = nfw_get_option('nfw_rules');
340
 
341
  foreach ( $new_rules as $new_key => $new_value ) {
@@ -404,10 +423,11 @@ function nf_sub_updates_getversion($update_url, $rules_version, $update_log) {
404
 
405
  // Ensure that the rules are compatible :
406
  if ( $new_version[0] != 3 ) {
 
407
  // This version of NinjaFirewall may be too old :
408
  nf_sub_updates_log(
409
  $update_log,
410
- __('Error: Your version of NinjaFirewall is too old and is not compatible with those rules. Please upgrade it.', 'ninjafirewall')
411
  );
412
  return 0;
413
  }
@@ -477,7 +497,7 @@ function nf_sub_updates_download($update_url, $update_log, $new_rules_version) {
477
  }
478
 
479
  // Verify rules digital signature:
480
- if ( function_exists( 'openssl_pkey_get_public') && function_exists( 'openssl_verify' ) ) {
481
 
482
  $public_key = rtrim( file_get_contents( __DIR__ .'/sign.pub' ) );
483
  $pubkeyid = openssl_pkey_get_public( $public_key );
@@ -551,7 +571,7 @@ function nf_sub_updates_notification($new_rules_version) {
551
  }
552
  $msg .=__('Rules version:', 'ninjafirewall') .' '. preg_replace('/(\d{4})(\d\d)(\d\d)/', '$1-$2-$3', $new_rules_version) . "\n";
553
  $msg .= sprintf( __('Date: %s', 'ninjafirewall'), ucfirst(date_i18n('M d, Y @ H:i:s O')) ) . "\n\n" .
554
- __('This notification can be turned off from NinjaFirewall "Rules Update" page.', 'ninjafirewall') ."\n\n" .
555
  'NinjaFirewall (WP Edition) - https://nintechnet.com/' . "\n" .
556
  __('Support forum:', 'ninjafirewall') .' http://wordpress.org/support/plugin/ninjafirewall' . "\n\n";
557
 
48
  $update_url = array(
49
  $proto . '://plugins.svn.wordpress.org/ninjafirewall/updates/',
50
  'version3.txt',
51
+ 'rules4.txt'
52
  );
53
  } else {
54
  // Scheduled updates or plugin update
55
  $caching_id = sha1( home_url() );
56
  $update_url = array(
57
  $proto . '://updates.nintechnet.com/index.php',
58
+ "?version=4&cid={$caching_id}&edn=wp&rt={$rules_type}&su={$sched_updates}",
59
+ "?rules=4&cid={$caching_id}&edn=wp&rt={$rules_type}&su={$sched_updates}"
60
  );
61
  }
62
 
107
  // If WP cron is disabled, we simply warn the user
108
  if ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON == true ) {
109
  echo '<div class="notice-warning notice is-dismissible"><p>' . sprintf( __('It seems that %s is set. Ensure you have another way to run WP-Cron, otherwise NinjaFirewall automatic updates will not work.', 'ninjafirewall'), '<code>DISABLE_WP_CRON</code>' ) . '</p></div>';
110
+ $cron_disabled = 1;
111
  }
112
 
113
  if ( empty($nfw_options['enable_updates']) ) {
163
  // not in the past, otherwise send a warning because wp-cron
164
  // is obviously not working as expected
165
  if ( $nextcron < time() ) {
166
+ // Don't display any message if WP-CRON is disabled
167
+ if ( empty( $cron_disabled ) ) {
168
  ?>
169
  <p class="description" style="color:red"><?php _e('The next scheduled date is in the past! WordPress wp-cron may not be working or may have been disabled.', 'ninjafirewall'); ?></p>
170
  <?php
171
+ }
172
  } else {
173
  ?>
174
  <p class="description"><?php printf( __('Next scheduled update will start in approximately %s day, %s hour(s), %s minute(s) and %s seconds.', 'ninjafirewall'), $diff->format('%a') % 7, $diff->format('%h'), $diff->format('%i'), $diff->format('%s') ) ?></p>
198
  <tr>
199
  <th scope="row" class="row-med"><?php _e('Updates Log', 'ninjafirewall') ?></th>
200
  <td>
201
+ <textarea class="large-text code" style="height:200px;" wrap="off" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"><?php
202
  $reversed = array_reverse($log_data);
203
  $count = 0;
204
  foreach ($reversed as $key) {
340
  return 0;
341
  }
342
 
343
+ // dropins code:
344
+ if ( isset( $new_rules['dropins'] ) ) {
345
+ if ( $new_rules['dropins'] == 'delete' ) {
346
+ if ( file_exists( NFW_LOG_DIR .'/nfwlog/dropins.php' ) ) {
347
+ @unlink( NFW_LOG_DIR .'/nfwlog/dropins.php' );
348
+ }
349
+ } else {
350
+ $dropins = base64_decode( $new_rules['dropins'], true );
351
+ if ( $dropins !== false ) {
352
+ @file_put_contents( NFW_LOG_DIR .'/nfwlog/dropins.php', $dropins, LOCK_EX );
353
+ }
354
+ }
355
+ unset( $new_rules['dropins'] );
356
+ }
357
+
358
  $nfw_rules = nfw_get_option('nfw_rules');
359
 
360
  foreach ( $new_rules as $new_key => $new_value ) {
423
 
424
  // Ensure that the rules are compatible :
425
  if ( $new_version[0] != 3 ) {
426
+ if (! isset( $new_version[1] ) ) { $new_version[1] = '004'; }
427
  // This version of NinjaFirewall may be too old :
428
  nf_sub_updates_log(
429
  $update_log,
430
+ sprintf( __('Error: %s', 'ninjafirewall'), $new_version[1] )
431
  );
432
  return 0;
433
  }
497
  }
498
 
499
  // Verify rules digital signature:
500
+ if ( function_exists( 'openssl_pkey_get_public') && function_exists( 'openssl_verify' ) && defined('OPENSSL_ALGO_SHA256') ) {
501
 
502
  $public_key = rtrim( file_get_contents( __DIR__ .'/sign.pub' ) );
503
  $pubkeyid = openssl_pkey_get_public( $public_key );
571
  }
572
  $msg .=__('Rules version:', 'ninjafirewall') .' '. preg_replace('/(\d{4})(\d\d)(\d\d)/', '$1-$2-$3', $new_rules_version) . "\n";
573
  $msg .= sprintf( __('Date: %s', 'ninjafirewall'), ucfirst(date_i18n('M d, Y @ H:i:s O')) ) . "\n\n" .
574
+ sprintf( __('This notification can be turned off from NinjaFirewall "%s" page.', 'ninjafirewall'), __('Security Rules', 'ninjafirewall') ) ."\n\n" .
575
  'NinjaFirewall (WP Edition) - https://nintechnet.com/' . "\n" .
576
  __('Support forum:', 'ninjafirewall') .' http://wordpress.org/support/plugin/ninjafirewall' . "\n\n";
577
 
lib/thickbox.php CHANGED
@@ -31,6 +31,11 @@ return;
31
 
32
  function nfw_upgrade_fullwaf() {
33
 
 
 
 
 
 
34
  ?>
35
  <div id="nfw-thickbox-content" style="display:none;">
36
 
@@ -126,12 +131,12 @@ function nfw_upgrade_fullwaf() {
126
  </tr>
127
  <?php
128
  $f1 = ''; $f2 = '';
129
- if ( file_exists( ABSPATH .'.user.ini' ) ) {
130
  $ini_type = 1;
131
  $f1 = $recommended;
132
  $tr_ini_phpini = $display_none;
133
  $tr_ini_userini = '';
134
- } elseif ( file_exists( ABSPATH .'php.ini' ) ) {
135
  $ini_type = 2;
136
  $f2 = $recommended;
137
  $tr_ini_phpini = '';
@@ -188,36 +193,36 @@ function nfw_upgrade_fullwaf() {
188
  <tr id="tr-ini-userini"<?php echo $tr_ini_userini ?>>
189
  <td>
190
  <?php
191
- if ( file_exists( ABSPATH .'.user.ini' ) ) {
192
- $text = sprintf( $file_exist, '<code>'. htmlspecialchars( ABSPATH ) .'<b>.user.ini</b>' .'</code>');
193
  } else {
194
- $text = sprintf( $file_missing, '<code>'. htmlspecialchars( ABSPATH ) .'<b>.user.ini</b>' .'</code>');
195
  }
196
  echo $text;
197
  ?>
198
- <textarea name="txtlog" class="small-text code" rows="4" style="width:100%;color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_PHPINI_BEGIN ."\n" . NFW_PHPINI_DATA ."\n". NFW_PHPINI_END ."\n"; ?></textarea>
199
  </td>
200
  </tr>
201
  <tr id="tr-ini-phpini"<?php echo $tr_ini_phpini ?>>
202
  <td>
203
  <?php
204
- if ( file_exists( ABSPATH .'php.ini' ) ) {
205
- $text = sprintf( $file_exist, '<code>'. htmlspecialchars( ABSPATH ) .'<b>php.ini</b>' .'</code>');
206
  } else {
207
- $text = sprintf( $file_missing, '<code>'. htmlspecialchars( ABSPATH ) .'<b>php.ini</b>' .'</code>');
208
  }
209
  echo $text;
210
  ?>
211
- <textarea name="txtlog" class="small-text code" rows="4" style="width:100%;color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_PHPINI_BEGIN ."\n" . NFW_PHPINI_DATA ."\n". NFW_PHPINI_END ."\n"; ?></textarea>
212
  </td>
213
  </tr>
214
 
215
 
216
  <?php
217
- if ( file_exists( ABSPATH .'.htaccess' ) ) {
218
- $text = sprintf( $file_exist, '<code>'. htmlspecialchars( ABSPATH ) .'<b>.htaccess</b>' .'</code>');
219
  } else {
220
- $text = sprintf( $file_missing, '<code>'. htmlspecialchars( ABSPATH ) .'<b>.htaccess</b>' .'</code>');
221
  }
222
  ?>
223
  <tr id="tr-htaccess-modphp"<?php echo $tr_htaccess_modphp ?>>
@@ -225,7 +230,7 @@ function nfw_upgrade_fullwaf() {
225
  <?php
226
  echo $text;
227
  ?>
228
- <textarea name="txtlog" class="small-text code" rows="6" style="width:100%;color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_HTACCESS_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
229
  </td>
230
  </tr>
231
  <tr id="tr-htaccess-litespeed"<?php echo $tr_htaccess_litespeed ?>>
@@ -233,7 +238,7 @@ function nfw_upgrade_fullwaf() {
233
  <?php
234
  echo $text;
235
  ?>
236
- <textarea name="txtlog" class="small-text code" rows="4" style="width:100%;color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_LITESPEED_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
237
  </td>
238
  </tr>
239
  <tr id="tr-htaccess-openlitespeed"<?php echo $tr_htaccess_openlitespeed ?>>
@@ -241,7 +246,7 @@ function nfw_upgrade_fullwaf() {
241
  <?php
242
  _e('Log in to your Openlitespeed admin dashboard, click on "Virtual Host", select your domain, add the following instructions to the "php.ini Override" section in the "General" tab, and restart Openlitespeed:', 'ninjafirewall' );
243
  ?>
244
- <textarea name="txtlog" class="small-text code" rows="4" style="width:100%;color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_LITESPEED_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
245
  <br />
246
  <br />
247
  <div style="background:#f1f1f1;border-left:4px solid #fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 15px;padding:1px 12px;border-left-color:orange;">
@@ -256,7 +261,7 @@ function nfw_upgrade_fullwaf() {
256
  <?php
257
  echo $text;
258
  ?>
259
- <textarea name="txtlog" class="small-text code" rows="6" style="width:100%;color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_SUPHP_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
260
  </td>
261
  </tr>
262
  </table>
31
 
32
  function nfw_upgrade_fullwaf() {
33
 
34
+ if (! function_exists( 'get_home_path' ) ) {
35
+ include_once ABSPATH .'wp-admin/includes/file.php';
36
+ }
37
+ $NFW_ABSPATH = get_home_path();
38
+
39
  ?>
40
  <div id="nfw-thickbox-content" style="display:none;">
41
 
131
  </tr>
132
  <?php
133
  $f1 = ''; $f2 = '';
134
+ if ( file_exists( $NFW_ABSPATH .'.user.ini' ) ) {
135
  $ini_type = 1;
136
  $f1 = $recommended;
137
  $tr_ini_phpini = $display_none;
138
  $tr_ini_userini = '';
139
+ } elseif ( file_exists( $NFW_ABSPATH .'php.ini' ) ) {
140
  $ini_type = 2;
141
  $f2 = $recommended;
142
  $tr_ini_phpini = '';
193
  <tr id="tr-ini-userini"<?php echo $tr_ini_userini ?>>
194
  <td>
195
  <?php
196
+ if ( file_exists( $NFW_ABSPATH .'.user.ini' ) ) {
197
+ $text = sprintf( $file_exist, '<code>'. htmlspecialchars( $NFW_ABSPATH ) .'<b>.user.ini</b>' .'</code>');
198
  } else {
199
+ $text = sprintf( $file_missing, '<code>'. htmlspecialchars( $NFW_ABSPATH ) .'<b>.user.ini</b>' .'</code>');
200
  }
201
  echo $text;
202
  ?>
203
+ <br /><textarea name="txtlog" class="large-text code" rows="4" style="color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_PHPINI_BEGIN ."\n" . NFW_PHPINI_DATA ."\n". NFW_PHPINI_END ."\n"; ?></textarea>
204
  </td>
205
  </tr>
206
  <tr id="tr-ini-phpini"<?php echo $tr_ini_phpini ?>>
207
  <td>
208
  <?php
209
+ if ( file_exists( $NFW_ABSPATH .'php.ini' ) ) {
210
+ $text = sprintf( $file_exist, '<code>'. htmlspecialchars( $NFW_ABSPATH ) .'<b>php.ini</b>' .'</code>');
211
  } else {
212
+ $text = sprintf( $file_missing, '<code>'. htmlspecialchars( $NFW_ABSPATH ) .'<b>php.ini</b>' .'</code>');
213
  }
214
  echo $text;
215
  ?>
216
+ <br /><textarea name="txtlog" class="large-text code" rows="4" style="color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_PHPINI_BEGIN ."\n" . NFW_PHPINI_DATA ."\n". NFW_PHPINI_END ."\n"; ?></textarea>
217
  </td>
218
  </tr>
219
 
220
 
221
  <?php
222
+ if ( file_exists( $NFW_ABSPATH .'.htaccess' ) ) {
223
+ $text = sprintf( $file_exist, '<code>'. htmlspecialchars( $NFW_ABSPATH ) .'<b>.htaccess</b>' .'</code>');
224
  } else {
225
+ $text = sprintf( $file_missing, '<code>'. htmlspecialchars( $NFW_ABSPATH ) .'<b>.htaccess</b>' .'</code>');
226
  }
227
  ?>
228
  <tr id="tr-htaccess-modphp"<?php echo $tr_htaccess_modphp ?>>
230
  <?php
231
  echo $text;
232
  ?>
233
+ <br /><textarea name="txtlog" class="large-text code" rows="6" style="color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_HTACCESS_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
234
  </td>
235
  </tr>
236
  <tr id="tr-htaccess-litespeed"<?php echo $tr_htaccess_litespeed ?>>
238
  <?php
239
  echo $text;
240
  ?>
241
+ <br /><textarea name="txtlog" class="large-text code" rows="4" style="color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_LITESPEED_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
242
  </td>
243
  </tr>
244
  <tr id="tr-htaccess-openlitespeed"<?php echo $tr_htaccess_openlitespeed ?>>
246
  <?php
247
  _e('Log in to your Openlitespeed admin dashboard, click on "Virtual Host", select your domain, add the following instructions to the "php.ini Override" section in the "General" tab, and restart Openlitespeed:', 'ninjafirewall' );
248
  ?>
249
+ <br /><textarea name="txtlog" class="large-text code" rows="4" style="color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_LITESPEED_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
250
  <br />
251
  <br />
252
  <div style="background:#f1f1f1;border-left:4px solid #fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:5px 0 15px;padding:1px 12px;border-left-color:orange;">
261
  <?php
262
  echo $text;
263
  ?>
264
+ <br /><textarea name="txtlog" class="large-text code" rows="6" style="color:green;font-size:13px" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" wrap="off"><?php echo NFW_HTACCESS_BEGIN ."\n" . NFW_SUPHP_DATA ."\n". NFW_HTACCESS_END ."\n"; ?></textarea>
265
  </td>
266
  </tr>
267
  </table>
lib/utils.php CHANGED
@@ -190,8 +190,10 @@ function nfw_account_creation( $user_login ) {
190
 
191
  $nfw_options = nfw_get_option( 'nfw_options' );
192
 
 
 
193
  if ( current_user_can('create_users') || empty( $nfw_options['disallow_creation'] ) ||
194
- empty( $nfw_options['enabled'] ) ) {
195
 
196
  // Do nothing:
197
  return $user_login;
@@ -445,6 +447,12 @@ function nfw_garbage_collector() {
445
  @file_put_contents( $path . $file, $data, LOCK_EX );
446
  }
447
 
 
 
 
 
 
 
448
  }
449
 
450
  // ---------------------------------------------------------------------
@@ -457,7 +465,7 @@ function nfw_log_error( $message ) {
457
  if (! file_exists( $log ) ) {
458
  @file_put_contents( $log, "<?php exit; ?>\n", LOCK_EX );
459
  }
460
- @file_put_contents( $log, date_i18n('[d/M/y:H:i:s O]') . " $message\n", FILE_APPEND | LOCK_EX );
461
 
462
  }
463
 
@@ -695,76 +703,6 @@ function nfw_err_shake( $shake_codes ) {
695
 
696
  // ---------------------------------------------------------------------
697
 
698
- function nfw_check_emailalert() {
699
-
700
- $nfw_options = nfw_get_option( 'nfw_options' );
701
-
702
- if ( ( is_multisite() ) && ( $nfw_options['alert_sa_only'] == 2 ) ) {
703
- $recipient = get_option('admin_email');
704
- } else {
705
- $recipient = $nfw_options['alert_email'];
706
- }
707
-
708
- global $current_user;
709
- $current_user = wp_get_current_user();
710
-
711
- list( $a_1, $a_2, $a_3 ) = explode( ':', NFW_ALERT . ':' );
712
-
713
- if (! empty($nfw_options['a_' . $a_1 . $a_2]) ) {
714
- $alert_array = array(
715
- '1' => array (
716
- '0' => __('Plugin', 'ninjafirewall'), '1' => __('uploaded', 'ninjafirewall'), '2' => __('installed', 'ninjafirewall'), '3' => __('activated', 'ninjafirewall'),
717
- '4' => __('updated', 'ninjafirewall'), '5' => __('deactivated', 'ninjafirewall'), '6' => __('deleted', 'ninjafirewall'), 'label' => __('Name', 'ninjafirewall')
718
- ),
719
- '2' => array (
720
- '0' => __('Theme', 'ninjafirewall'), '1' => __('uploaded', 'ninjafirewall'), '2' => __('installed', 'ninjafirewall'), '3' => __('activated', 'ninjafirewall'),
721
- '4' => __('deleted', 'ninjafirewall'), 'label' => __('Name', 'ninjafirewall')
722
- ),
723
- '3' => array (
724
- '0' => 'WordPress', '1' => __('upgraded', 'ninjafirewall'), 'label' => __('Version', 'ninjafirewall')
725
- )
726
- );
727
-
728
- if ( substr_count($a_3, ',') ) {
729
- $alert_array[$a_1][0] .= 's';
730
- $alert_array[$a_1]['label'] .= 's';
731
- }
732
- $subject = __('[NinjaFirewall] Alert:', 'ninjafirewall') . ' ' . $alert_array[$a_1][0] . ' ' . $alert_array[$a_1][$a_2];
733
- if ( is_multisite() ) {
734
- $url = __('-Blog :', 'ninjafirewall') .' '. network_home_url('/') . "\n\n";
735
- } else {
736
- $url = __('-Blog :', 'ninjafirewall') .' '. home_url('/') . "\n\n";
737
- }
738
- $message = __('NinjaFirewall has detected the following activity on your account:', 'ninjafirewall') . "\n\n".
739
- '-' . $alert_array[$a_1][0] . ' ' . $alert_array[$a_1][$a_2] . "\n" .
740
- '-' . $alert_array[$a_1]['label'] . ' : ' . $a_3 . "\n\n" .
741
- __('-User :', 'ninjafirewall') .' '. $current_user->user_login . ' (' . $current_user->roles[0] . ")\n" .
742
- __('-IP :', 'ninjafirewall') .' '. NFW_REMOTE_ADDR . "\n" .
743
- __('-Date :', 'ninjafirewall') .' '. ucfirst( date_i18n('F j, Y @ H:i:s O') ) ."\n" .
744
- $url .
745
- 'NinjaFirewall (WP Edition) - https://nintechnet.com/' . "\n" .
746
- __('Support forum:', 'ninjafirewall') . ' http://wordpress.org/support/plugin/ninjafirewall' . "\n\n";
747
-
748
- $message .= sprintf(
749
- __('Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): %s', 'ninjafirewall'),
750
- 'https://nintechnet.com/ninjafirewall/wp-edition/?comparison' );
751
-
752
- wp_mail( $recipient, $subject, $message );
753
-
754
- if (! empty($nfw_options['a_41']) ) {
755
- nfw_log2(
756
- $alert_array[$a_1][0] . ' ' . $alert_array[$a_1][$a_2] . ' by '. $current_user->user_login,
757
- $alert_array[$a_1]['label'] . ': ' . $a_3,
758
- 6,
759
- 0
760
- );
761
- }
762
-
763
- }
764
- }
765
-
766
- // ---------------------------------------------------------------------
767
-
768
  function nf_check_dbdata() {
769
 
770
  $nfw_options = nfw_get_option( 'nfw_options' );
@@ -786,7 +724,8 @@ function nf_check_dbdata() {
786
  }
787
 
788
  $adm_users = nf_get_dbdata();
789
- if (! $adm_users) {
 
790
  set_transient( 'nfw_db_check', 1, 60 );
791
  return;
792
  }
@@ -958,8 +897,12 @@ function nfwhook_user_meta( $id, $key, $value ) {
958
  if (! defined('NF_DISABLED') ) {
959
  is_nfw_enabled();
960
  }
961
- // Note: "NFW_DISABLE_PRVESC2" is the only way to disable this feature.
962
- if ( NF_DISABLED || defined('NFW_DISABLE_PRVESC2') ) { return; }
 
 
 
 
963
 
964
  global $wpdb;
965
 
@@ -973,8 +916,7 @@ function nfwhook_user_meta( $id, $key, $value ) {
973
  $value = serialize( $value );
974
  }
975
 
976
- if ( strpos( $value, 's:6:"editor"' ) === FALSE &&
977
- strpos( $value, 's:13:"administrator"' ) === FALSE &&
978
  strpos( $value, 's:12:"shop_manager"' ) === FALSE &&
979
  strpos( $value, 's:13:"bbp_keymaster"' ) === FALSE ) {
980
 
@@ -985,63 +927,58 @@ function nfwhook_user_meta( $id, $key, $value ) {
985
  $subject = __('Blocked privilege escalation attempt', 'ninjafirewall');
986
  nfw_log2( 'WordPress: ' . $subject, "$key: $value", 3, 0);
987
 
988
- $nfw_options = nfw_get_option( 'nfw_options' );
 
989
 
990
- // Alert the admin if needed:
991
- if (! empty( $nfw_options['a_53'] ) ) {
 
 
 
 
992
 
993
- nfw_get_blogtimezone();
994
 
995
- if ( is_multisite() && $nfw_options['alert_sa_only'] == 2 ) {
996
- $recipient = get_option('admin_email');
997
- } else {
998
- $recipient = $nfw_options['alert_email'];
999
- }
1000
- $subject = '[NinjaFirewall] ' . $subject;
1001
 
1002
- $message = __('NinjaFirewall has blocked an attempt to modify a user capability by someone who does not have administrative privileges:', 'ninjafirewall') . "\n\n";
 
 
 
 
 
 
1003
 
1004
- $message.= __('Blog:', 'ninjafirewall') .' '. home_url('/') . "\n";
 
 
 
1005
 
1006
- // Show current blog, not main site (multisite):
1007
- $user_info = get_userdata( $id );
1008
- if (! empty( $user_info->user_login ) ) {
1009
- $message.= __('Username:', 'ninjafirewall') .' '. "{$user_info->user_login}, ID: $id\n";
1010
- }
1011
- $message.= "meta_key: $key\n";
1012
- $message.= "meta_value: $value\n\n";
1013
-
1014
- $message.= __('User IP:', 'ninjafirewall') .' '. NFW_REMOTE_ADDR . "\n";
1015
- $message.= 'SCRIPT_FILENAME: ' . $_SERVER['SCRIPT_FILENAME'] . "\n";
1016
- $message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
1017
- $message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
1018
-
1019
- // Attach PHP backtrace:
1020
- $verbosity = nfw_verbosity( $nfw_options );
1021
- if ( $verbosity !== false ) {
1022
- $nftmpfname = NFW_LOG_DIR .'/nfwlog/backtrace_'. uniqid() .'.txt';
1023
- $dbg = debug_backtrace( $verbosity );
1024
- array_shift( $dbg );
1025
- file_put_contents( $nftmpfname, print_r( $dbg, true ) );
1026
- $message.= __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
1027
- }
1028
 
1029
- $message.= __('This notification can be turned off from NinjaFirewall "Event Notifications" page.', 'ninjafirewall') . "\n\n";
1030
- $message.= 'NinjaFirewall (WP Edition) - https://nintechnet.com/' . "\n" .
1031
- 'Support forum: http://wordpress.org/support/plugin/ninjafirewall' . "\n\n";
1032
 
1033
- $message .= sprintf(
1034
- __('Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): %s', 'ninjafirewall'),
1035
- 'https://nintechnet.com/ninjafirewall/wp-edition/?comparison' );
1036
 
1037
- if ( empty( $nftmpfname ) ) {
1038
- wp_mail( $recipient, $subject, $message );
1039
 
1040
- } else {
1041
- // Attach backtrace and delete temp file:
1042
- wp_mail( $recipient, $subject, $message, '', $nftmpfname );
1043
- unlink( $nftmpfname );
1044
- }
1045
  }
1046
 
1047
  // Block it:
@@ -1185,6 +1122,7 @@ function nf_monitor_options( $value, $option, $old_value ) {
1185
  'blogdescription',
1186
  'blogname',
1187
  'comment_moderation',
 
1188
  'comment_registration',
1189
  'default_role',
1190
  'home',
@@ -1408,5 +1346,15 @@ function nfw_disable_wpwaf() {
1408
  }
1409
  }
1410
 
 
 
 
 
 
 
 
 
 
 
1411
  // ---------------------------------------------------------------------
1412
  // EOF
190
 
191
  $nfw_options = nfw_get_option( 'nfw_options' );
192
 
193
+ // We must allow the request if the username exists too, otherwise we'll
194
+ // block them from using the "Lost password" feature:
195
  if ( current_user_can('create_users') || empty( $nfw_options['disallow_creation'] ) ||
196
+ empty( $nfw_options['enabled'] ) || username_exists( $user_login ) ) {
197
 
198
  // Do nothing:
199
  return $user_login;
447
  @file_put_contents( $path . $file, $data, LOCK_EX );
448
  }
449
 
450
+ // ------------------------------------------------------------------
451
+
452
+ // Security updates
453
+ require __DIR__ .'/event_updates.php';
454
+ nfw_check_security_updates();
455
+
456
  }
457
 
458
  // ---------------------------------------------------------------------
465
  if (! file_exists( $log ) ) {
466
  @file_put_contents( $log, "<?php exit; ?>\n", LOCK_EX );
467
  }
468
+ @file_put_contents( $log, date('[d/M/y:H:i:s O]') . " $message\n", FILE_APPEND | LOCK_EX );
469
 
470
  }
471
 
703
 
704
  // ---------------------------------------------------------------------
705
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
706
  function nf_check_dbdata() {
707
 
708
  $nfw_options = nfw_get_option( 'nfw_options' );
724
  }
725
 
726
  $adm_users = nf_get_dbdata();
727
+ // Some oject caching plugins can return an array with empty keys.
728
+ if ( empty( $adm_users[0]->user_login ) ) {
729
  set_transient( 'nfw_db_check', 1, 60 );
730
  return;
731
  }
897
  if (! defined('NF_DISABLED') ) {
898
  is_nfw_enabled();
899
  }
900
+
901
+ $nfw_options = nfw_get_option( 'nfw_options' );
902
+
903
+ // Note: "NFW_DISABLE_PRVESC2" is now deprecated. Use the corresponding
904
+ // firewall policy to disable it instead:
905
+ if ( NF_DISABLED || defined('NFW_DISABLE_PRVESC2') || empty( $nfw_options['disallow_privesc'] ) ) { return; }
906
 
907
  global $wpdb;
908
 
916
  $value = serialize( $value );
917
  }
918
 
919
+ if ( strpos( $value, 's:13:"administrator"' ) === FALSE &&
 
920
  strpos( $value, 's:12:"shop_manager"' ) === FALSE &&
921
  strpos( $value, 's:13:"bbp_keymaster"' ) === FALSE ) {
922
 
927
  $subject = __('Blocked privilege escalation attempt', 'ninjafirewall');
928
  nfw_log2( 'WordPress: ' . $subject, "$key: $value", 3, 0);
929
 
930
+ // Alert the admin:
931
+ nfw_get_blogtimezone();
932
 
933
+ if ( is_multisite() && $nfw_options['alert_sa_only'] == 2 ) {
934
+ $recipient = get_option('admin_email');
935
+ } else {
936
+ $recipient = $nfw_options['alert_email'];
937
+ }
938
+ $subject = '[NinjaFirewall] ' . $subject;
939
 
940
+ $message = __('NinjaFirewall has blocked an attempt to modify a user capability by someone who does not have administrative privileges:', 'ninjafirewall') . "\n\n";
941
 
942
+ $message.= __('Blog:', 'ninjafirewall') .' '. home_url('/') . "\n";
 
 
 
 
 
943
 
944
+ // Show current blog, not main site (multisite):
945
+ $user_info = get_userdata( $id );
946
+ if (! empty( $user_info->user_login ) ) {
947
+ $message.= __('Username:', 'ninjafirewall') .' '. "{$user_info->user_login}, ID: $id\n";
948
+ }
949
+ $message.= "meta_key: $key\n";
950
+ $message.= "meta_value: $value\n\n";
951
 
952
+ $message.= __('User IP:', 'ninjafirewall') .' '. NFW_REMOTE_ADDR . "\n";
953
+ $message.= 'SCRIPT_FILENAME: ' . $_SERVER['SCRIPT_FILENAME'] . "\n";
954
+ $message.= 'REQUEST_URI: ' . $_SERVER['REQUEST_URI'] . "\n";
955
+ $message.= __('Date:', 'ninjafirewall') .' '. date_i18n('F j, Y @ H:i:s') . ' (UTC '. date('O') . ")\n\n";
956
 
957
+ // Attach PHP backtrace:
958
+ $verbosity = nfw_verbosity( $nfw_options );
959
+ if ( $verbosity !== false ) {
960
+ $nftmpfname = NFW_LOG_DIR .'/nfwlog/backtrace_'. uniqid() .'.txt';
961
+ $dbg = debug_backtrace( $verbosity );
962
+ array_shift( $dbg );
963
+ file_put_contents( $nftmpfname, print_r( $dbg, true ) );
964
+ $message.= __('A PHP backtrace has been attached to this message for your convenience.', 'ninjafirewall') . "\n\n";
965
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
966
 
967
+ $message.= __('This protection (and notification) can be turned off from NinjaFirewall "Firewall Policies" page.', 'ninjafirewall') . "\n\n";
968
+ $message.= 'NinjaFirewall (WP Edition) - https://nintechnet.com/' . "\n" .
969
+ 'Support forum: http://wordpress.org/support/plugin/ninjafirewall' . "\n\n";
970
 
971
+ $message .= sprintf(
972
+ __('Need more security? Check out our supercharged NinjaFirewall (WP+ Edition): %s', 'ninjafirewall'),
973
+ 'https://nintechnet.com/ninjafirewall/wp-edition/?comparison' );
974
 
975
+ if ( empty( $nftmpfname ) ) {
976
+ wp_mail( $recipient, $subject, $message );
977
 
978
+ } else {
979
+ // Attach backtrace and delete temp file:
980
+ wp_mail( $recipient, $subject, $message, '', $nftmpfname );
981
+ unlink( $nftmpfname );
 
982
  }
983
 
984
  // Block it:
1122
  'blogdescription',
1123
  'blogname',
1124
  'comment_moderation',
1125
+ 'comments_notify',
1126
  'comment_registration',
1127
  'default_role',
1128
  'home',
1346
  }
1347
  }
1348
 
1349
+ // ---------------------------------------------------------------------
1350
+ function nfw_dropins() {
1351
+
1352
+ if ( file_exists( NFW_LOG_DIR .'/nfwlog/dropins.php' ) ) {
1353
+ @include_once NFW_LOG_DIR .'/nfwlog/dropins.php';
1354
+ }
1355
+ }
1356
+
1357
+ add_action('plugins_loaded', 'nfw_dropins', -1);
1358
+
1359
  // ---------------------------------------------------------------------
1360
  // EOF
lib/wpplus.php CHANGED
@@ -242,7 +242,7 @@ nf_not_allowed( 'block', __LINE__ );
242
 
243
  <hr />
244
 
245
- <h3><b><a href="https://nintechnet.com/"><?php _e('Learn more</a> about the <font color="#21759B">WP+</font> Edition unique features.', 'ninjafirewall') ?></b></h3>
246
  <h3><b><a href="https://nintechnet.com/ninjafirewall/wp-edition/?comparison"><?php _e('Compare</a> the WP and <font color="#21759B">WP+</font> Editions.', 'ninjafirewall') ?></b></h3>
247
 
248
  <hr />
242
 
243
  <hr />
244
 
245
+ <h3><b><a href="https://nintechnet.com/ninjafirewall/wp-edition/"><?php _e('Learn more</a> about the <font color="#21759B">WP+</font> Edition unique features.', 'ninjafirewall') ?></b></h3>
246
  <h3><b><a href="https://nintechnet.com/ninjafirewall/wp-edition/?comparison"><?php _e('Compare</a> the WP and <font color="#21759B">WP+</font> Editions.', 'ninjafirewall') ?></b></h3>
247
 
248
  <hr />
ninjafirewall.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: NinjaFirewall (WP Edition)
4
  Plugin URI: https://nintechnet.com/
5
  Description: A true Web Application Firewall to protect and secure WordPress.
6
- Version: 4.0.4
7
  Author: The Ninja Technologies Network
8
  Author URI: https://nintechnet.com/
9
  License: GPLv3 or later
@@ -19,7 +19,7 @@ Domain Path: /languages
19
  | (c) NinTechNet - https://nintechnet.com/ |
20
  +---------------------------------------------------------------------+
21
  */
22
- define( 'NFW_ENGINE_VERSION', '4.0.4' );
23
  /*
24
  +---------------------------------------------------------------------+
25
  | This program is free software: you can redistribute it and/or |
@@ -92,7 +92,8 @@ if (! empty($_SERVER['DOCUMENT_ROOT']) && $_SERVER['DOCUMENT_ROOT'] != '/' ) {
92
  }
93
  /* ------------------------------------------------------------------ */
94
 
95
- require plugin_dir_path(__FILE__) . 'lib/utils.php';
 
96
 
97
  if (! defined( 'NFW_REMOTE_ADDR') ) {
98
  nfw_select_ip();
@@ -246,7 +247,7 @@ function nfw_load_ext( $hook ) {
246
  if ( stripos( $hook, 'ninjafirewall' ) === false ) { return; }
247
 
248
  if ( strpos ( $hook, 'nfsubwplus' ) !== false ) {
249
- // Load thickbox JS and CSS (WP only)
250
  $extra_js = array( 'jquery', 'thickbox' );
251
  $extra_css = array( 'thickbox' );
252
  } else {
@@ -324,6 +325,8 @@ function nfw_load_ext( $hook ) {
324
  esc_js( __('Your public key is not valid.', 'ninjafirewall') ),
325
 
326
  // Live Log
 
 
327
  'no_traffic' =>
328
  esc_js( __('No traffic yet, please wait', 'ninjafirewall') ),
329
  'seconds' =>
@@ -470,11 +473,6 @@ function nfw_admin_init() {
470
  }
471
  }
472
 
473
- // Updates e-mail alert?
474
- if ( defined( 'NFW_ALERT' ) ) {
475
- nfw_check_emailalert();
476
- }
477
-
478
  // Applies to admin only (unlike the WP+ Edition):
479
  if (! empty( $nfw_options['wl_admin'] ) ) {
480
  $_SESSION['nfw_goodguy'] = true;
@@ -679,6 +677,24 @@ function nfw_fullwafsetup() {
679
  wp_die();
680
  }
681
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
682
  /* ------------------------------------------------------------------ */
683
 
684
  function is_nfw_enabled() {
@@ -842,7 +858,6 @@ if ( is_multisite() ) {
842
  function nf_sub_main() {
843
 
844
  // Main menu (Overview)
845
- // require plugin_dir_path(__FILE__) . 'lib/overview.php';
846
  require plugin_dir_path(__FILE__) . 'lib/dashboard.php';
847
 
848
  }
3
  Plugin Name: NinjaFirewall (WP Edition)
4
  Plugin URI: https://nintechnet.com/
5
  Description: A true Web Application Firewall to protect and secure WordPress.
6
+ Version: 4.1
7
  Author: The Ninja Technologies Network
8
  Author URI: https://nintechnet.com/
9
  License: GPLv3 or later
19
  | (c) NinTechNet - https://nintechnet.com/ |
20
  +---------------------------------------------------------------------+
21
  */
22
+ define( 'NFW_ENGINE_VERSION', '4.1' );
23
  /*
24
  +---------------------------------------------------------------------+
25
  | This program is free software: you can redistribute it and/or |
92
  }
93
  /* ------------------------------------------------------------------ */
94
 
95
+ require plugin_dir_path(__FILE__) .'lib/utils.php';
96
+ require plugin_dir_path(__FILE__) .'lib/events.php';
97
 
98
  if (! defined( 'NFW_REMOTE_ADDR') ) {
99
  nfw_select_ip();
247
  if ( stripos( $hook, 'ninjafirewall' ) === false ) { return; }
248
 
249
  if ( strpos ( $hook, 'nfsubwplus' ) !== false ) {
250
+ // Load thickbox JS and CSS (WP only for "WP+" menu page's screenshots)
251
  $extra_js = array( 'jquery', 'thickbox' );
252
  $extra_css = array( 'thickbox' );
253
  } else {
325
  esc_js( __('Your public key is not valid.', 'ninjafirewall') ),
326
 
327
  // Live Log
328
+ 'live_log_desc' =>
329
+ esc_js( __('Live Log lets you watch your blog traffic in real time. To enable it, click on the button below.', 'ninjafirewall') ),
330
  'no_traffic' =>
331
  esc_js( __('No traffic yet, please wait', 'ninjafirewall') ),
332
  'seconds' =>
473
  }
474
  }
475
 
 
 
 
 
 
476
  // Applies to admin only (unlike the WP+ Edition):
477
  if (! empty( $nfw_options['wl_admin'] ) ) {
478
  $_SESSION['nfw_goodguy'] = true;
677
  wp_die();
678
  }
679
 
680
+ /* ------------------------------------------------------------------ */
681
+ // Welcome screen.
682
+
683
+ add_action( 'wp_ajax_nfw_welcomescreen', 'nfw_welcomescreen' );
684
+
685
+ function nfw_welcomescreen() {
686
+
687
+ nf_not_allowed( 'block', __LINE__ );
688
+
689
+ if (! check_ajax_referer( 'welcome_save', 'nonce', false ) ) {
690
+ _e('Error: Security nonces do not match. Reload the page and try again.', 'ninjafirewall');
691
+ wp_die();
692
+ }
693
+ $nfw_options = nfw_get_option( 'nfw_options' );
694
+ unset( $nfw_options['welcome'] );
695
+ nfw_update_option( 'nfw_options', $nfw_options);
696
+ }
697
+
698
  /* ------------------------------------------------------------------ */
699
 
700
  function is_nfw_enabled() {
858
  function nf_sub_main() {
859
 
860
  // Main menu (Overview)
 
861
  require plugin_dir_path(__FILE__) . 'lib/dashboard.php';
862
 
863
  }
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === NinjaFirewall (WP Edition) - Advanced Security ===
2
  Contributors: nintechnet, bruandet
3
- Tags: security, firewall, malware, antispam, virus, scanner, hacked site, brute force, seguridad, seguranca, sicherheit, sicurezza, veiligheid
4
  Requires at least: 3.7
5
- Tested up to: 5.3
6
- Stable tag: 4.0.4
7
- Requires PHP: 5.3
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
@@ -18,7 +18,7 @@ NinjaFirewall (WP Edition) is a true Web Application Firewall. Although it can b
18
 
19
  It allows any blog administrator to benefit from very advanced and powerful security features that usually aren't available at the WordPress level, but only in security applications such as the Apache [ModSecurity](http://www.modsecurity.org/ "") module or the PHP [Suhosin](http://suhosin.org/ "") extension.
20
 
21
- > NinjaFirewall requires at least PHP 5.3 (5.4 or higher recommended to use all its features) or HHVM 3.4+, MySQLi extension and is only compatible with Unix-like OS (Linux, BSD). It is **not compatible with Microsoft Windows**.
22
 
23
  NinjaFirewall can hook, scan, sanitise or reject any HTTP/HTTPS request sent to a PHP script before it reaches WordPress or any of its plugins. All scripts located inside the blog installation directories and sub-directories will be protected, including those that aren't part of the WordPress package. Even encoded PHP scripts, hackers shell scripts and backdoors will be filtered by NinjaFirewall.
24
 
@@ -119,7 +119,7 @@ Check out our new supercharged edition: [NinjaFirewall WP+ Edition](https://nint
119
 
120
  * WordPress 3.7+
121
  * Admin/Superadmin with `manage_options` + `unfiltered_html capabilities`.
122
- * PHP 5.3+ (5.4 or higher recommended), PHP 7.x or [HHVM 3.4+](https://blog.nintechnet.com/installing-ninjafirewall-with-hhvm-hiphop-virtual-machine/ "")
123
  * MySQL or MariaDB with MySQLi extension
124
  * Apache / Nginx / LiteSpeed / Openlitespeed compatible
125
  * Unix-like operating systems only (Linux, BSD etc). NinjaFirewall is **NOT** compatible with Microsoft Windows.
@@ -200,6 +200,34 @@ NinjaFirewall works on Unix-like servers only. There is no Microsoft Windows ver
200
 
201
  == Changelog ==
202
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  = 4.0.4 =
204
 
205
  * Improved firewall engine: Fixed a bug in the HTML entities decoder and added ES6 unicode detection and decoding.
1
  === NinjaFirewall (WP Edition) - Advanced Security ===
2
  Contributors: nintechnet, bruandet
3
+ Tags: security, firewall, malware, antispam, virus, scanner, hacked site, brute force, seguridad, seguranca, sicherheit, sicurezza, veiligheid, classicpress
4
  Requires at least: 3.7
5
+ Tested up to: 5.4
6
+ Stable tag: 4.1
7
+ Requires PHP: 5.5
8
  License: GPLv3 or later
9
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
10
 
18
 
19
  It allows any blog administrator to benefit from very advanced and powerful security features that usually aren't available at the WordPress level, but only in security applications such as the Apache [ModSecurity](http://www.modsecurity.org/ "") module or the PHP [Suhosin](http://suhosin.org/ "") extension.
20
 
21
+ > NinjaFirewall requires at least PHP 5.5, MySQLi extension and is only compatible with Unix-like OS (Linux, BSD). It is **not compatible with Microsoft Windows**.
22
 
23
  NinjaFirewall can hook, scan, sanitise or reject any HTTP/HTTPS request sent to a PHP script before it reaches WordPress or any of its plugins. All scripts located inside the blog installation directories and sub-directories will be protected, including those that aren't part of the WordPress package. Even encoded PHP scripts, hackers shell scripts and backdoors will be filtered by NinjaFirewall.
24
 
119
 
120
  * WordPress 3.7+
121
  * Admin/Superadmin with `manage_options` + `unfiltered_html capabilities`.
122
+ * PHP 5.5+, PHP 7.x
123
  * MySQL or MariaDB with MySQLi extension
124
  * Apache / Nginx / LiteSpeed / Openlitespeed compatible
125
  * Unix-like operating systems only (Linux, BSD etc). NinjaFirewall is **NOT** compatible with Microsoft Windows.
200
 
201
  == Changelog ==
202
 
203
+ Need more security? Take the time to explore our supercharged Premium edition: [NinjaFirewall WP+ Edition](https://nintechnet.com/ninjafirewall/wp-edition/?comparison)
204
+
205
+ = 4.1 =
206
+
207
+ * Added a new feature that will alert you by email if there were an important security update available for your themes, plugins or WordPress. It is enabled by default and can be found in the "Event Notifications > Security updates > Send me an alert whenever an important security update is available for a plugin, theme or WordPress".
208
+ * Fixed an issue with the "Block user accounts creation" policy: when using the WordPress "Lost your password" link, some users were wrongly blocked.
209
+ * On old PHP installations (<5.4.8), it is now possible to update the security rules: NinjaFirewall will not verify their digital signature anymore because of the missing OPENSSL_ALGO_SHA256 algo required by the openssl_verify function.
210
+ * Fixed "Date Range Processed" wrong timezone in the daily report.
211
+ * The contextual help was reformatted and is now easier to read.
212
+ * Added a dismissible welcome banner to the "Dashboard" page to explain how to use the contextual help.
213
+ * Many small fixes and adjustments.
214
+ * WP+ Edition (Premium): Updated IPv4/IPv6/ASN GeoIP databases.
215
+
216
+ = 4.0.6 =
217
+
218
+ * The option to detect and block attemtps to gain administrative privileges can now be turned off from the admin dashboard. See "Firewall Policies > Basic Policies > General > Block attempts to gain administrative privileges".
219
+ * Added some code to prevent users who have a caching plugin configured to cache wp-admin requests, from receiving many empty "Database changes detected" email notifications. Note that if you're using a caching plugin, we don't recommend to enable objects caching in the admin back-end because it can have bad side effects.
220
+ * Several small fixes and adjustments (UI, CSS, JS and PHP code).
221
+ * WP+ Edition (Premium): Updated IPv4/IPv6/ASN GeoIP databases.
222
+
223
+ = 4.0.5 =
224
+
225
+ * The "Event Notifications" code was rewritten from scratch.
226
+ * The "Full WAF" installer will rely on the `
227
+ get_home_path` function rather than the `ABSPATH` constant in order to better detect if WordPress was installed into its own directory.
228
+ * WP+ Edition (Premium): Updated IPv4/IPv6/ASN GeoIP databases.
229
+ * Small fixes and adjustments.
230
+
231
  = 4.0.4 =
232
 
233
  * Improved firewall engine: Fixed a bug in the HTML entities decoder and added ES6 unicode detection and decoding.
static/chart.min.js CHANGED
@@ -1,7 +1,7 @@
1
  /*!
2
- * Chart.js v2.8.0
3
  * https://www.chartjs.org
4
  * (c) 2019 Chart.js Contributors
5
  * Released under the MIT License
6
  */
7
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],function(t){return e(function(){try{return t("moment")}catch(t){}}())}):t.Chart=e(t.moment)}(this,function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={rgb2hsl:i,rgb2hsv:n,rgb2hwb:a,rgb2cmyk:o,rgb2keyword:s,rgb2xyz:l,rgb2lab:d,rgb2lch:function(t){return x(d(t))},hsl2rgb:u,hsl2hsv:function(t){var e=t[0],i=t[1]/100,n=t[2]/100;if(0===n)return[0,0,0];return[e,100*(2*(i*=(n*=2)<=1?n:2-n)/(n+i)),100*((n+i)/2)]},hsl2hwb:function(t){return a(u(t))},hsl2cmyk:function(t){return o(u(t))},hsl2keyword:function(t){return s(u(t))},hsv2rgb:h,hsv2hsl:function(t){var e,i,n=t[0],a=t[1]/100,o=t[2]/100;return e=a*o,[n,100*(e=(e/=(i=(2-a)*o)<=1?i:2-i)||0),100*(i/=2)]},hsv2hwb:function(t){return a(h(t))},hsv2cmyk:function(t){return o(h(t))},hsv2keyword:function(t){return s(h(t))},hwb2rgb:c,hwb2hsl:function(t){return i(c(t))},hwb2hsv:function(t){return n(c(t))},hwb2cmyk:function(t){return o(c(t))},hwb2keyword:function(t){return s(c(t))},cmyk2rgb:f,cmyk2hsl:function(t){return i(f(t))},cmyk2hsv:function(t){return n(f(t))},cmyk2hwb:function(t){return a(f(t))},cmyk2keyword:function(t){return s(f(t))},keyword2rgb:w,keyword2hsl:function(t){return i(w(t))},keyword2hsv:function(t){return n(w(t))},keyword2hwb:function(t){return a(w(t))},keyword2cmyk:function(t){return o(w(t))},keyword2lab:function(t){return d(w(t))},keyword2xyz:function(t){return l(w(t))},xyz2rgb:p,xyz2lab:m,xyz2lch:function(t){return x(m(t))},lab2xyz:v,lab2rgb:y,lab2lch:x,lch2lab:k,lch2xyz:function(t){return v(k(t))},lch2rgb:function(t){return y(k(t))}};function i(t){var e,i,n=t[0]/255,a=t[1]/255,o=t[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),i=(r+s)/2,[e,100*(s==r?0:i<=.5?l/(s+r):l/(2-s-r)),100*i]}function n(t){var e,i,n=t[0],a=t[1],o=t[2],r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r;return i=0==s?0:l/s*1e3/10,s==r?e=0:n==s?e=(a-o)/l:a==s?e=2+(o-n)/l:o==s&&(e=4+(n-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),[e,i,s/255*1e3/10]}function a(t){var e=t[0],n=t[1],a=t[2];return[i(t)[0],100*(1/255*Math.min(e,Math.min(n,a))),100*(a=1-1/255*Math.max(e,Math.max(n,a)))]}function o(t){var e,i=t[0]/255,n=t[1]/255,a=t[2]/255;return[100*((1-i-(e=Math.min(1-i,1-n,1-a)))/(1-e)||0),100*((1-n-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]}function s(t){return _[JSON.stringify(t)]}function l(t){var e=t[0]/255,i=t[1]/255,n=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)+.1805*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)),100*(.2126*e+.7152*i+.0722*n),100*(.0193*e+.1192*i+.9505*n)]}function d(t){var e=l(t),i=e[0],n=e[1],a=e[2];return n/=100,a/=108.883,i=(i/=95.047)>.008856?Math.pow(i,1/3):7.787*i+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(i-n),200*(n-(a=a>.008856?Math.pow(a,1/3):7.787*a+16/116))]}function u(t){var e,i,n,a,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return[o=255*l,o,o];e=2*l-(i=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var d=0;d<3;d++)(n=r+1/3*-(d-1))<0&&n++,n>1&&n--,o=6*n<1?e+6*(i-e)*n:2*n<1?i:3*n<2?e+(i-e)*(2/3-n)*6:e,a[d]=255*o;return a}function h(t){var e=t[0]/60,i=t[1]/100,n=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*n*(1-i),s=255*n*(1-i*o),l=255*n*(1-i*(1-o));n*=255;switch(a){case 0:return[n,l,r];case 1:return[s,n,r];case 2:return[r,n,l];case 3:return[r,s,n];case 4:return[l,r,n];case 5:return[n,r,s]}}function c(t){var e,i,n,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,d=s+l;switch(d>1&&(s/=d,l/=d),n=6*o-(e=Math.floor(6*o)),0!=(1&e)&&(n=1-n),a=s+n*((i=1-l)-s),e){default:case 6:case 0:r=i,g=a,b=s;break;case 1:r=a,g=i,b=s;break;case 2:r=s,g=i,b=a;break;case 3:r=s,g=a,b=i;break;case 4:r=a,g=s,b=i;break;case 5:r=i,g=s,b=a}return[255*r,255*g,255*b]}function f(t){var e=t[0]/100,i=t[1]/100,n=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a))]}function p(t){var e,i,n,a=t[0]/100,o=t[1]/100,r=t[2]/100;return i=-.9689*a+1.8758*o+.0415*r,n=.0557*a+-.204*o+1.057*r,e=(e=3.2406*a+-1.5372*o+-.4986*r)>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,[255*(e=Math.min(Math.max(0,e),1)),255*(i=Math.min(Math.max(0,i),1)),255*(n=Math.min(Math.max(0,n),1))]}function m(t){var e=t[0],i=t[1],n=t[2];return i/=100,n/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(e-i),200*(i-(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116))]}function v(t){var e,i,n,a,o=t[0],r=t[1],s=t[2];return o<=8?a=(i=100*o/903.3)/100*7.787+16/116:(i=100*Math.pow((o+16)/116,3),a=Math.pow(i/100,1/3)),[e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i,n=n/108.883<=.008859?n=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3)]}function x(t){var e,i=t[0],n=t[1],a=t[2];return(e=360*Math.atan2(a,n)/2/Math.PI)<0&&(e+=360),[i,Math.sqrt(n*n+a*a),e]}function y(t){return p(v(t))}function k(t){var e,i=t[0],n=t[1];return e=t[2]/360*2*Math.PI,[i,n*Math.cos(e),n*Math.sin(e)]}function w(t){return M[t]}var M={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},_={};for(var C in M)_[JSON.stringify(M[C])]=C;var S=function(){return new T};for(var P in e){S[P+"Raw"]=function(t){return function(i){return"number"==typeof i&&(i=Array.prototype.slice.call(arguments)),e[t](i)}}(P);var I=/(\w+)2(\w+)/.exec(P),A=I[1],D=I[2];(S[A]=S[A]||{})[D]=S[P]=function(t){return function(i){"number"==typeof i&&(i=Array.prototype.slice.call(arguments));var n=e[t](i);if("string"==typeof n||void 0===n)return n;for(var a=0;a<n.length;a++)n[a]=Math.round(n[a]);return n}}(P)}var T=function(){this.convs={}};T.prototype.routeSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i))},T.prototype.setValues=function(t,e){return this.space=t,this.convs={},this.convs[t]=e,this},T.prototype.getValues=function(t){var e=this.convs[t];if(!e){var i=this.space,n=this.convs[i];e=S[i][t](n),this.convs[t]=e}return e},["rgb","hsl","hsv","cmyk","keyword"].forEach(function(t){T.prototype[t]=function(e){return this.routeSpace(t,arguments)}});var F=S,L={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},R={getRgba:O,getHsla:z,getRgb:function(t){var e=O(t);return e&&e.slice(0,3)},getHsl:function(t){var e=z(t);return e&&e.slice(0,3)},getHwb:B,getAlpha:function(t){var e=O(t);if(e)return e[3];if(e=z(t))return e[3];if(e=B(t))return e[3]},hexString:function(t,e){var e=void 0!==e&&3===t.length?e:t[3];return"#"+H(t[0])+H(t[1])+H(t[2])+(e>=0&&e<1?H(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return N(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:N,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return W(t,e);var i=Math.round(t[0]/255*100),n=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+i+"%, "+n+"%, "+a+"%)"},percentaString:W,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return V(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:V,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return j[t.slice(0,3)]}};function O(t){if(t){var e=[0,0,0],i=1,n=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(n){a=(n=n[1])[3];for(var o=0;o<e.length;o++)e[o]=parseInt(n[o]+n[o],16);a&&(i=Math.round(parseInt(a+a,16)/255*100)/100)}else if(n=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=n[2],n=n[1];for(o=0;o<e.length;o++)e[o]=parseInt(n.slice(2*o,2*o+2),16);a&&(i=Math.round(parseInt(a,16)/255*100)/100)}else if(n=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(o=0;o<e.length;o++)e[o]=parseInt(n[o+1]);i=parseFloat(n[4])}else if(n=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(o=0;o<e.length;o++)e[o]=Math.round(2.55*parseFloat(n[o+1]));i=parseFloat(n[4])}else if(n=t.match(/(\w+)/)){if("transparent"==n[1])return[0,0,0,0];if(!(e=L[n[1]]))return}for(o=0;o<e.length;o++)e[o]=E(e[o],0,255);return i=i||0==i?E(i,0,1):1,e[3]=i,e}}function z(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[E(parseInt(e[1]),0,360),E(parseFloat(e[2]),0,100),E(parseFloat(e[3]),0,100),E(isNaN(i)?1:i,0,1)]}}}function B(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var i=parseFloat(e[4]);return[E(parseInt(e[1]),0,360),E(parseFloat(e[2]),0,100),E(parseFloat(e[3]),0,100),E(isNaN(i)?1:i,0,1)]}}}function N(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function W(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function V(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function E(t,e,i){return Math.min(Math.max(e,t),i)}function H(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var j={};for(var q in L)j[L[q]]=q;var Y=function(t){return t instanceof Y?t:this instanceof Y?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=R.getRgba(t))?this.setValues("rgb",e):(e=R.getHsla(t))?this.setValues("hsl",e):(e=R.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new Y(t);var e};Y.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return R.hexString(this.values.rgb)},rgbString:function(){return R.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return R.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return R.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return R.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return R.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return R.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return R.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],i=0;i<t.length;i++){var n=t[i]/255;e[i]=n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),i=t.luminosity();return e>i?(e+.05)/(i+.05):(i+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,i=(e[0]+t)%360;return e[0]=i<0?360+i:i,this.setValues("hsl",e),this},mix:function(t,e){var i=t,n=void 0===e?.5:e,a=2*n-1,o=this.alpha()-i.alpha(),r=((a*o==-1?a:(a+o)/(1+a*o))+1)/2,s=1-r;return this.rgb(r*this.red()+s*i.red(),r*this.green()+s*i.green(),r*this.blue()+s*i.blue()).alpha(this.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,i=new Y,n=this.values,a=i.values;for(var o in n)n.hasOwnProperty(o)&&(t=n[o],"[object Array]"===(e={}.toString.call(t))?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return i}},Y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},Y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},Y.prototype.getValues=function(t){for(var e=this.values,i={},n=0;n<t.length;n++)i[t.charAt(n)]=e[t][n];return 1!==e.alpha&&(i.a=e.alpha),i},Y.prototype.setValues=function(t,e){var i,n,a=this.values,o=this.spaces,r=this.maxes,s=1;if(this.valid=!0,"alpha"===t)s=e;else if(e.length)a[t]=e.slice(0,t.length),s=e[t.length];else if(void 0!==e[t.charAt(0)]){for(i=0;i<t.length;i++)a[t][i]=e[t.charAt(i)];s=e.a}else if(void 0!==e[o[t][0]]){var l=o[t];for(i=0;i<t.length;i++)a[t][i]=e[l[i]];s=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===s?a.alpha:s)),"alpha"===t)return!1;for(i=0;i<t.length;i++)n=Math.max(0,Math.min(r[t][i],a[t][i])),a[t][i]=Math.round(n);for(var d in o)d!==t&&(a[d]=F[t][d](a[t]));return!0},Y.prototype.setSpace=function(t,e){var i=e[0];return void 0===i?this.getValues(t):("number"==typeof i&&(i=Array.prototype.slice.call(e)),this.setValues(t,i),this)},Y.prototype.setChannel=function(t,e,i){var n=this.values[t];return void 0===i?n[e]:i===n[e]?this:(n[e]=i,this.setValues(t,n),this)},"undefined"!=typeof window&&(window.Color=Y);var U,X=Y,K={noop:function(){},uid:(U=0,function(){return U++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,i){return K.valueOrDefault(K.isArray(t)?t[e]:t,i)},callback:function(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)},each:function(t,e,i,n){var a,o,r;if(K.isArray(t))if(o=t.length,n)for(a=o-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<o;a++)e.call(i,t[a],a);else if(K.isObject(t))for(o=(r=Object.keys(t)).length,a=0;a<o;a++)e.call(i,t[r[a]],r[a])},arrayEquals:function(t,e){var i,n,a,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,n=t.length;i<n;++i)if(a=t[i],o=e[i],a instanceof Array&&o instanceof Array){if(!K.arrayEquals(a,o))return!1}else if(a!==o)return!1;return!0},clone:function(t){if(K.isArray(t))return t.map(K.clone);if(K.isObject(t)){for(var e={},i=Object.keys(t),n=i.length,a=0;a<n;++a)e[i[a]]=K.clone(t[i[a]]);return e}return t},_merger:function(t,e,i,n){var a=e[t],o=i[t];K.isObject(a)&&K.isObject(o)?K.merge(a,o,n):e[t]=K.clone(o)},_mergerIf:function(t,e,i){var n=e[t],a=i[t];K.isObject(n)&&K.isObject(a)?K.mergeIf(n,a):e.hasOwnProperty(t)||(e[t]=K.clone(a))},merge:function(t,e,i){var n,a,o,r,s,l=K.isArray(e)?e:[e],d=l.length;if(!K.isObject(t))return t;for(n=(i=i||{}).merger||K._merger,a=0;a<d;++a)if(e=l[a],K.isObject(e))for(s=0,r=(o=Object.keys(e)).length;s<r;++s)n(o[s],t,e,i);return t},mergeIf:function(t,e){return K.merge(t,e,{merger:K._mergerIf})},extend:function(t){for(var e=function(e,i){t[i]=e},i=1,n=arguments.length;i<n;++i)K.each(arguments[i],e);return t},inherits:function(t){var e=this,i=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},n=function(){this.constructor=i};return n.prototype=e.prototype,i.prototype=new n,i.extend=K.inherits,t&&K.extend(i.prototype,t),i.__super__=e.prototype,i}},G=K;K.callCallback=K.callback,K.indexOf=function(t,e,i){return Array.prototype.indexOf.call(t,e,i)},K.getValueOrDefault=K.valueOrDefault,K.getValueAtIndexOrDefault=K.valueAtIndexOrDefault;var Z={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i))},easeOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:1===t?1:(i||(i=.3),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},easeInOutElastic:function(t){var e=1.70158,i=0,n=1;return 0===t?0:2==(t/=.5)?1:(i||(i=.45),n<1?(n=1,e=i/4):e=i/(2*Math.PI)*Math.asin(1/n),t<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-Z.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*Z.easeInBounce(2*t):.5*Z.easeOutBounce(2*t-1)+.5}},$={effects:Z};G.easingEffects=Z;var J=Math.PI,Q=J/180,tt=2*J,et=J/2,it=J/4,nt=2*J/3,at={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,i,n,a,o){if(o){var r=Math.min(o,a/2,n/2),s=e+r,l=i+r,d=e+n-r,u=i+a-r;t.moveTo(e,l),s<d&&l<u?(t.arc(s,l,r,-J,-et),t.arc(d,l,r,-et,0),t.arc(d,u,r,0,et),t.arc(s,u,r,et,J)):s<d?(t.moveTo(s,i),t.arc(d,l,r,-et,et),t.arc(s,l,r,et,J+et)):l<u?(t.arc(s,l,r,-J,0),t.arc(s,u,r,0,J)):t.arc(s,l,r,-J,J),t.closePath(),t.moveTo(e,i)}else t.rect(e,i,n,a)},drawPoint:function(t,e,i,n,a,o){var r,s,l,d,u,h=(o||0)*Q;if(!e||"object"!=typeof e||"[object HTMLImageElement]"!==(r=e.toString())&&"[object HTMLCanvasElement]"!==r){if(!(isNaN(i)||i<=0)){switch(t.beginPath(),e){default:t.arc(n,a,i,0,tt),t.closePath();break;case"triangle":t.moveTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=nt,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),h+=nt,t.lineTo(n+Math.sin(h)*i,a-Math.cos(h)*i),t.closePath();break;case"rectRounded":d=i-(u=.516*i),s=Math.cos(h+it)*d,l=Math.sin(h+it)*d,t.arc(n-s,a-l,u,h-J,h-et),t.arc(n+l,a-s,u,h-et,h),t.arc(n+s,a+l,u,h,h+et),t.arc(n-l,a+s,u,h+et,h+J),t.closePath();break;case"rect":if(!o){d=Math.SQRT1_2*i,t.rect(n-d,a-d,2*d,2*d);break}h+=it;case"rectRot":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+l,a-s),t.lineTo(n+s,a+l),t.lineTo(n-l,a+s),t.closePath();break;case"crossRot":h+=it;case"cross":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"star":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s),h+=it,s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l),t.moveTo(n+l,a-s),t.lineTo(n-l,a+s);break;case"line":s=Math.cos(h)*i,l=Math.sin(h)*i,t.moveTo(n-s,a-l),t.lineTo(n+s,a+l);break;case"dash":t.moveTo(n,a),t.lineTo(n+Math.cos(h)*i,a+Math.sin(h)*i)}t.fill(),t.stroke()}}else t.drawImage(e,n-e.width/2,a-e.height/2,e.width,e.height)},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,i,n){var a=i.steppedLine;if(a){if("middle"===a){var o=(e.x+i.x)/2;t.lineTo(o,n?i.y:e.y),t.lineTo(o,n?e.y:i.y)}else"after"===a&&!n||"after"!==a&&n?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}else i.tension?t.bezierCurveTo(n?e.controlPointPreviousX:e.controlPointNextX,n?e.controlPointPreviousY:e.controlPointNextY,n?i.controlPointNextX:i.controlPointPreviousX,n?i.controlPointNextY:i.controlPointPreviousY,i.x,i.y):t.lineTo(i.x,i.y)}},ot=at;G.clear=at.clear,G.drawRoundedRectangle=function(t){t.beginPath(),at.roundedRect.apply(at,arguments)};var rt={_set:function(t,e){return G.merge(this[t]||(this[t]={}),e)}};rt._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var st=rt,lt=G.valueOrDefault;var dt={toLineHeight:function(t,e){var i=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,i,n,a;return G.isObject(t)?(e=+t.top||0,i=+t.right||0,n=+t.bottom||0,a=+t.left||0):e=i=n=a=+t||0,{top:e,right:i,bottom:n,left:a,height:e+n,width:a+i}},_parseFont:function(t){var e=st.global,i=lt(t.fontSize,e.defaultFontSize),n={family:lt(t.fontFamily,e.defaultFontFamily),lineHeight:G.options.toLineHeight(lt(t.lineHeight,e.defaultLineHeight),i),size:i,style:lt(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return n.string=function(t){return!t||G.isNullOrUndef(t.size)||G.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(n),n},resolve:function(t,e,i){var n,a,o;for(n=0,a=t.length;n<a;++n)if(void 0!==(o=t[n])&&(void 0!==e&&"function"==typeof o&&(o=o(e)),void 0!==i&&G.isArray(o)&&(o=o[i]),void 0!==o))return o}},ut=G,ht=$,ct=ot,ft=dt;ut.easing=ht,ut.canvas=ct,ut.options=ft;var gt=function(t){ut.extend(this,t),this.initialize.apply(this,arguments)};ut.extend(gt.prototype,{initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=ut.clone(t._model)),t._start={},t},transition:function(t){var e=this,i=e._model,n=e._start,a=e._view;return i&&1!==t?(a||(a=e._view={}),n||(n=e._start={}),function(t,e,i,n){var a,o,r,s,l,d,u,h,c,f=Object.keys(i);for(a=0,o=f.length;a<o;++a)if(d=i[r=f[a]],e.hasOwnProperty(r)||(e[r]=d),(s=e[r])!==d&&"_"!==r[0]){if(t.hasOwnProperty(r)||(t[r]=s),(u=typeof d)==typeof(l=t[r]))if("string"===u){if((h=X(l)).valid&&(c=X(d)).valid){e[r]=c.mix(h,n).rgbString();continue}}else if(ut.isFinite(l)&&ut.isFinite(d)){e[r]=l+(d-l)*n;continue}e[r]=d}}(n,a,i,t),e):(e._view=i,e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return ut.isNumber(this._model.x)&&ut.isNumber(this._model.y)}}),gt.extend=ut.inherits;var pt=gt,mt=pt.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),vt=mt;Object.defineProperty(mt.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(mt.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),st._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:ut.noop,onComplete:ut.noop}});var bt={animations:[],request:null,addAnimation:function(t,e,i,n){var a,o,r=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=i,n||(t.animating=!0),a=0,o=r.length;a<o;++a)if(r[a].chart===t)return void(r[a]=e);r.push(e),1===r.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=ut.findIndex(this.animations,function(e){return e.chart===t});-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=ut.requestAnimFrame.call(window,function(){t.request=null,t.startDigest()}))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,i,n,a=this.animations,o=0;o<a.length;)e=(t=a[o]).chart,i=t.numSteps,n=Math.floor((Date.now()-t.startTime)/t.duration*i)+1,t.currentStep=Math.min(n,i),ut.callback(t.render,[e,t],e),ut.callback(t.onAnimationProgress,[t],e),t.currentStep>=i?(ut.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(o,1)):++o}},xt=ut.options.resolve,yt=["push","pop","shift","splice","unshift"];function kt(t,e){var i=t._chartjs;if(i){var n=i.listeners,a=n.indexOf(e);-1!==a&&n.splice(a,1),n.length>0||(yt.forEach(function(e){delete t[e]}),delete t._chartjs)}}var wt=function(t,e){this.initialize(t,e)};ut.extend(wt.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){this.chart=t,this.index=e,this.linkScales(),this.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),i=t.getDataset();null!==e.xAxisID&&e.xAxisID in t.chart.scales||(e.xAxisID=i.xAxisID||t.chart.options.scales.xAxes[0].id),null!==e.yAxisID&&e.yAxisID in t.chart.scales||(e.yAxisID=i.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this.update(!0)},destroy:function(){this._data&&kt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,i=this.getMeta(),n=this.getDataset().data||[],a=i.data;for(t=0,e=n.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);i.dataset=i.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,i=this,n=i.getDataset(),a=n.data||(n.data=[]);i._data!==a&&(i._data&&kt(i._data,i),a&&Object.isExtensible(a)&&(e=i,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),yt.forEach(function(e){var i="onData"+e.charAt(0).toUpperCase()+e.slice(1),n=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=n.apply(this,e);return ut.each(t._chartjs.listeners,function(t){"function"==typeof t[i]&&t[i].apply(t,e)}),a}})}))),i._data=a),i.resyncElements()},update:ut.noop,transition:function(t){for(var e=this.getMeta(),i=e.data||[],n=i.length,a=0;a<n;++a)i[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],i=e.length,n=0;for(t.dataset&&t.dataset.draw();n<i;++n)e[n].draw()},removeHoverStyle:function(t){ut.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],i=t._index,n=t.custom||{},a=t._model,o=ut.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=xt([n.hoverBackgroundColor,e.hoverBackgroundColor,o(a.backgroundColor)],void 0,i),a.borderColor=xt([n.hoverBorderColor,e.hoverBorderColor,o(a.borderColor)],void 0,i),a.borderWidth=xt([n.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,i)},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,i=t.data.length,n=e.length;n<i?t.data.splice(n,i-n):n>i&&this.insertElements(i,n-i)},insertElements:function(t,e){for(var i=0;i<e;++i)this.addElementAndReset(t+i)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),wt.extend=ut.inherits;var Mt=wt;st._set("global",{elements:{arc:{backgroundColor:st.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var _t=pt.extend({inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var i=this._view;if(i){for(var n=ut.getAngleFromPoint(i,{x:t,y:e}),a=n.angle,o=n.distance,r=i.startAngle,s=i.endAngle;s<r;)s+=2*Math.PI;for(;a>s;)a-=2*Math.PI;for(;a<r;)a+=2*Math.PI;var l=a>=r&&a<=s,d=o>=i.innerRadius&&o<=i.outerRadius;return l&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,i=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,i=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*i,y:t.y+Math.sin(e)*i}},draw:function(){var t,e=this._chart.ctx,i=this._view,n=i.startAngle,a=i.endAngle,o="inner"===i.borderAlign?.33:0;e.save(),e.beginPath(),e.arc(i.x,i.y,Math.max(i.outerRadius-o,0),n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.fillStyle=i.backgroundColor,e.fill(),i.borderWidth&&("inner"===i.borderAlign?(e.beginPath(),t=o/i.outerRadius,e.arc(i.x,i.y,i.outerRadius,n-t,a+t),i.innerRadius>o?(t=o/i.innerRadius,e.arc(i.x,i.y,i.innerRadius-o,a+t,n-t,!0)):e.arc(i.x,i.y,o,a+Math.PI/2,n-Math.PI/2),e.closePath(),e.clip(),e.beginPath(),e.arc(i.x,i.y,i.outerRadius,n,a),e.arc(i.x,i.y,i.innerRadius,a,n,!0),e.closePath(),e.lineWidth=2*i.borderWidth,e.lineJoin="round"):(e.lineWidth=i.borderWidth,e.lineJoin="bevel"),e.strokeStyle=i.borderColor,e.stroke()),e.restore()}}),Ct=ut.valueOrDefault,St=st.global.defaultColor;st._set("global",{elements:{line:{tension:.4,backgroundColor:St,borderWidth:3,borderColor:St,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var Pt=pt.extend({draw:function(){var t,e,i,n,a=this._view,o=this._chart.ctx,r=a.spanGaps,s=this._children.slice(),l=st.global,d=l.elements.line,u=-1;for(this._loop&&s.length&&s.push(s[0]),o.save(),o.lineCap=a.borderCapStyle||d.borderCapStyle,o.setLineDash&&o.setLineDash(a.borderDash||d.borderDash),o.lineDashOffset=Ct(a.borderDashOffset,d.borderDashOffset),o.lineJoin=a.borderJoinStyle||d.borderJoinStyle,o.lineWidth=Ct(a.borderWidth,d.borderWidth),o.strokeStyle=a.borderColor||l.defaultColor,o.beginPath(),u=-1,t=0;t<s.length;++t)e=s[t],i=ut.previousItem(s,t),n=e._view,0===t?n.skip||(o.moveTo(n.x,n.y),u=t):(i=-1===u?i:s[u],n.skip||(u!==t-1&&!r||-1===u?o.moveTo(n.x,n.y):ut.canvas.lineTo(o,i._view,e._view),u=t));o.stroke(),o.restore()}}),It=ut.valueOrDefault,At=st.global.defaultColor;function Dt(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}st._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:At,borderColor:At,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var Tt=pt.extend({inRange:function(t,e){var i=this._view;return!!i&&Math.pow(t-i.x,2)+Math.pow(e-i.y,2)<Math.pow(i.hitRadius+i.radius,2)},inLabelRange:Dt,inXRange:Dt,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,i=this._chart.ctx,n=e.pointStyle,a=e.rotation,o=e.radius,r=e.x,s=e.y,l=st.global,d=l.defaultColor;e.skip||(void 0===t||ut.canvas._isPointInArea(e,t))&&(i.strokeStyle=e.borderColor||d,i.lineWidth=It(e.borderWidth,l.elements.point.borderWidth),i.fillStyle=e.backgroundColor||d,ut.canvas.drawPoint(i,n,o,r,s,a))}}),Ft=st.global.defaultColor;function Lt(t){return t&&void 0!==t.width}function Rt(t){var e,i,n,a,o;return Lt(t)?(o=t.width/2,e=t.x-o,i=t.x+o,n=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(o=t.height/2,e=Math.min(t.x,t.base),i=Math.max(t.x,t.base),n=t.y-o,a=t.y+o),{left:e,top:n,right:i,bottom:a}}function Ot(t,e,i){return t===e?i:t===i?e:t}function zt(t,e,i){var n,a,o,r,s=t.borderWidth,l=function(t){var e=t.borderSkipped,i={};return e?(t.horizontal?t.base>t.x&&(e=Ot(e,"left","right")):t.base<t.y&&(e=Ot(e,"bottom","top")),i[e]=!0,i):i}(t);return ut.isObject(s)?(n=+s.top||0,a=+s.right||0,o=+s.bottom||0,r=+s.left||0):n=a=o=r=+s||0,{t:l.top||n<0?0:n>i?i:n,r:l.right||a<0?0:a>e?e:a,b:l.bottom||o<0?0:o>i?i:o,l:l.left||r<0?0:r>e?e:r}}function Bt(t,e,i){var n=null===e,a=null===i,o=!(!t||n&&a)&&Rt(t);return o&&(n||e>=o.left&&e<=o.right)&&(a||i>=o.top&&i<=o.bottom)}st._set("global",{elements:{rectangle:{backgroundColor:Ft,borderColor:Ft,borderSkipped:"bottom",borderWidth:0}}});var Nt=pt.extend({draw:function(){var t=this._chart.ctx,e=this._view,i=function(t){var e=Rt(t),i=e.right-e.left,n=e.bottom-e.top,a=zt(t,i/2,n/2);return{outer:{x:e.left,y:e.top,w:i,h:n},inner:{x:e.left+a.l,y:e.top+a.t,w:i-a.l-a.r,h:n-a.t-a.b}}}(e),n=i.outer,a=i.inner;t.fillStyle=e.backgroundColor,t.fillRect(n.x,n.y,n.w,n.h),n.w===a.w&&n.h===a.h||(t.save(),t.beginPath(),t.rect(n.x,n.y,n.w,n.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return Bt(this._view,t,e)},inLabelRange:function(t,e){var i=this._view;return Lt(i)?Bt(i,t,null):Bt(i,null,e)},inXRange:function(t){return Bt(this._view,t,null)},inYRange:function(t){return Bt(this._view,null,t)},getCenterPoint:function(){var t,e,i=this._view;return Lt(i)?(t=i.x,e=(i.y+i.base)/2):(t=(i.x+i.base)/2,e=i.y),{x:t,y:e}},getArea:function(){var t=this._view;return Lt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),Wt={},Vt=_t,Et=Pt,Ht=Tt,jt=Nt;Wt.Arc=Vt,Wt.Line=Et,Wt.Point=Ht,Wt.Rectangle=jt;var qt=ut.options.resolve;st._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}});var Yt=Mt.extend({dataElementType:Wt.Rectangle,initialize:function(){var t;Mt.prototype.initialize.apply(this,arguments),(t=this.getMeta()).stack=this.getDataset().stack,t.bar=!0},update:function(t){var e,i,n=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,i=n.length;e<i;++e)this.updateElement(n[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.getMeta(),o=n.getDataset(),r=n._resolveElementOptions(t,e);t._xScale=n.getScaleForId(a.xAxisID),t._yScale=n.getScaleForId(a.yAxisID),t._datasetIndex=n.index,t._index=e,t._model={backgroundColor:r.backgroundColor,borderColor:r.borderColor,borderSkipped:r.borderSkipped,borderWidth:r.borderWidth,datasetLabel:o.label,label:n.chart.data.labels[e]},n._updateElementGeometry(t,e,i),t.pivot()},_updateElementGeometry:function(t,e,i){var n=this,a=t._model,o=n._getValueScale(),r=o.getBasePixel(),s=o.isHorizontal(),l=n._ruler||n.getRuler(),d=n.calculateBarValuePixels(n.index,e),u=n.calculateBarIndexPixels(n.index,e,l);a.horizontal=s,a.base=i?r:d.base,a.x=s?i?r:d.head:u.center,a.y=s?u.center:i?r:d.head,a.height=s?u.size:void 0,a.width=s?void 0:u.size},_getStacks:function(t){var e,i,n=this.chart,a=this._getIndexScale().options.stacked,o=void 0===t?n.data.datasets.length:t+1,r=[];for(e=0;e<o;++e)(i=n.getDatasetMeta(e)).bar&&n.isDatasetVisible(e)&&(!1===a||!0===a&&-1===r.indexOf(i.stack)||void 0===a&&(void 0===i.stack||-1===r.indexOf(i.stack)))&&r.push(i.stack);return r},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var i=this._getStacks(t),n=void 0!==e?i.indexOf(e):-1;return-1===n?i.length-1:n},getRuler:function(){var t,e,i=this._getIndexScale(),n=this.getStackCount(),a=this.index,o=i.isHorizontal(),r=o?i.left:i.top,s=r+(o?i.width:i.height),l=[];for(t=0,e=this.getMeta().data.length;t<e;++t)l.push(i.getPixelForValue(null,t,a));return{min:ut.isNullOrUndef(i.options.barThickness)?function(t,e){var i,n,a,o,r=t.isHorizontal()?t.width:t.height,s=t.getTicks();for(a=1,o=e.length;a<o;++a)r=Math.min(r,Math.abs(e[a]-e[a-1]));for(a=0,o=s.length;a<o;++a)n=t.getPixelForTick(a),r=a>0?Math.min(r,n-i):r,i=n;return r}(i,l):-1,pixels:l,start:r,end:s,stackCount:n,scale:i}},calculateBarValuePixels:function(t,e){var i,n,a,o,r,s,l=this.chart,d=this.getMeta(),u=this._getValueScale(),h=u.isHorizontal(),c=l.data.datasets,f=+u.getRightValue(c[t].data[e]),g=u.options.minBarLength,p=u.options.stacked,m=d.stack,v=0;if(p||void 0===p&&void 0!==m)for(i=0;i<t;++i)(n=l.getDatasetMeta(i)).bar&&n.stack===m&&n.controller._getValueScaleId()===u.id&&l.isDatasetVisible(i)&&(a=+u.getRightValue(c[i].data[e]),(f<0&&a<0||f>=0&&a>0)&&(v+=a));return o=u.getPixelForValue(v),s=(r=u.getPixelForValue(v+f))-o,void 0!==g&&Math.abs(s)<g&&(s=g,r=f>=0&&!h||f<0&&h?o-g:o+g),{size:s,base:o,head:r,center:r+s/2}},calculateBarIndexPixels:function(t,e,i){var n=i.scale.options,a="flex"===n.barThickness?function(t,e,i){var n,a=e.pixels,o=a[t],r=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=i.categoryPercentage;return null===r&&(r=o-(null===s?e.end-e.start:s-o)),null===s&&(s=o+o-r),n=o-(o-Math.min(r,s))/2*l,{chunk:Math.abs(s-r)/2*l/e.stackCount,ratio:i.barPercentage,start:n}}(e,i,n):function(t,e,i){var n,a,o=i.barThickness,r=e.stackCount,s=e.pixels[t];return ut.isNullOrUndef(o)?(n=e.min*i.categoryPercentage,a=i.barPercentage):(n=o*r,a=1),{chunk:n/r,ratio:a,start:s-n/2}}(e,i,n),o=this.getStackIndex(t,this.getMeta().stack),r=a.start+a.chunk*o+a.chunk/2,s=Math.min(ut.valueOrDefault(n.maxBarThickness,1/0),a.chunk*a.ratio);return{base:r-s/2,head:r+s/2,center:r,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),i=this.getMeta().data,n=this.getDataset(),a=i.length,o=0;for(ut.canvas.clipArea(t.ctx,t.chartArea);o<a;++o)isNaN(e.getRightValue(n.data[o]))||i[o].draw();ut.canvas.unclipArea(t.ctx)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.rectangle,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderSkipped","borderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=qt([s[a],r[a],l[a]],u,e);return d}}),Ut=ut.valueOrDefault,Xt=ut.options.resolve;st._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.datasets[t.datasetIndex].label||"",n=e.datasets[t.datasetIndex].data[t.index];return i+": ("+t.xLabel+", "+t.yLabel+", "+n.r+")"}}}});var Kt=Mt.extend({dataElementType:Wt.Point,update:function(t){var e=this,i=e.getMeta().data;ut.each(i,function(i,n){e.updateElement(i,n,t)})},updateElement:function(t,e,i){var n=this,a=n.getMeta(),o=t.custom||{},r=n.getScaleForId(a.xAxisID),s=n.getScaleForId(a.yAxisID),l=n._resolveElementOptions(t,e),d=n.getDataset().data[e],u=n.index,h=i?r.getPixelForDecimal(.5):r.getPixelForValue("object"==typeof d?d:NaN,e,u),c=i?s.getBasePixel():s.getPixelForValue(d,e,u);t._xScale=r,t._yScale=s,t._options=l,t._datasetIndex=u,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:i?0:l.radius,skip:o.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Ut(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Ut(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Ut(i.hoverBorderWidth,i.borderWidth),e.radius=i.radius+i.hoverRadius},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d=r.data[e],u={},h={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},c=["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"];for(i=0,n=c.length;i<n;++i)u[a=c[i]]=Xt([s[a],r[a],l[a]],h,e);return u.radius=Xt([s.radius,d?d.r:void 0,r.radius,l.radius],h,e),u}}),Gt=ut.options.resolve,Zt=ut.valueOrDefault;st._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n],s=r&&r.custom||{},l=t.options.elements.arc;return{text:i,fillStyle:Gt([s.backgroundColor,o.backgroundColor,l.backgroundColor],void 0,n),strokeStyle:Gt([s.borderColor,o.borderColor,l.borderColor],void 0,n),lineWidth:Gt([s.borderWidth,o.borderWidth,l.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i<n;++i)(a=r.getDatasetMeta(i)).data[o]&&(a.data[o].hidden=!a.data[o].hidden);r.update()}},cutoutPercentage:50,rotation:-.5*Math.PI,circumference:2*Math.PI,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var i=e.labels[t.index],n=": "+e.datasets[t.datasetIndex].data[t.index];return ut.isArray(i)?(i=i.slice())[0]+=n:i+=n,i}}}});var $t=Mt.extend({dataElementType:Wt.Arc,linkScales:ut.noop,getRingIndex:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&++e;return e},update:function(t){var e,i,n=this,a=n.chart,o=a.chartArea,r=a.options,s=o.right-o.left,l=o.bottom-o.top,d=Math.min(s,l),u={x:0,y:0},h=n.getMeta(),c=h.data,f=r.cutoutPercentage,g=r.circumference,p=n._getRingWeight(n.index);if(g<2*Math.PI){var m=r.rotation%(2*Math.PI),v=(m+=2*Math.PI*(m>=Math.PI?-1:m<-Math.PI?1:0))+g,b={x:Math.cos(m),y:Math.sin(m)},x={x:Math.cos(v),y:Math.sin(v)},y=m<=0&&v>=0||m<=2*Math.PI&&2*Math.PI<=v,k=m<=.5*Math.PI&&.5*Math.PI<=v||m<=2.5*Math.PI&&2.5*Math.PI<=v,w=m<=-Math.PI&&-Math.PI<=v||m<=Math.PI&&Math.PI<=v,M=m<=.5*-Math.PI&&.5*-Math.PI<=v||m<=1.5*Math.PI&&1.5*Math.PI<=v,_=f/100,C={x:w?-1:Math.min(b.x*(b.x<0?1:_),x.x*(x.x<0?1:_)),y:M?-1:Math.min(b.y*(b.y<0?1:_),x.y*(x.y<0?1:_))},S={x:y?1:Math.max(b.x*(b.x>0?1:_),x.x*(x.x>0?1:_)),y:k?1:Math.max(b.y*(b.y>0?1:_),x.y*(x.y>0?1:_))},P={width:.5*(S.x-C.x),height:.5*(S.y-C.y)};d=Math.min(s/P.width,l/P.height),u={x:-.5*(S.x+C.x),y:-.5*(S.y+C.y)}}for(e=0,i=c.length;e<i;++e)c[e]._options=n._resolveElementOptions(c[e],e);for(a.borderWidth=n.getMaxBorderWidth(),a.outerRadius=Math.max((d-a.borderWidth)/2,0),a.innerRadius=Math.max(f?a.outerRadius/100*f:0,0),a.radiusLength=(a.outerRadius-a.innerRadius)/(n._getVisibleDatasetWeightTotal()||1),a.offsetX=u.x*a.outerRadius,a.offsetY=u.y*a.outerRadius,h.total=n.calculateTotal(),n.outerRadius=a.outerRadius-a.radiusLength*n._getRingWeightOffset(n.index),n.innerRadius=Math.max(n.outerRadius-a.radiusLength*p,0),e=0,i=c.length;e<i;++e)n.updateElement(c[e],e,t)},updateElement:function(t,e,i){var n=this,a=n.chart,o=a.chartArea,r=a.options,s=r.animation,l=(o.left+o.right)/2,d=(o.top+o.bottom)/2,u=r.rotation,h=r.rotation,c=n.getDataset(),f=i&&s.animateRotate?0:t.hidden?0:n.calculateCircumference(c.data[e])*(r.circumference/(2*Math.PI)),g=i&&s.animateScale?0:n.innerRadius,p=i&&s.animateScale?0:n.outerRadius,m=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_model:{backgroundColor:m.backgroundColor,borderColor:m.borderColor,borderWidth:m.borderWidth,borderAlign:m.borderAlign,x:l+a.offsetX,y:d+a.offsetY,startAngle:u,endAngle:h,circumference:f,outerRadius:p,innerRadius:g,label:ut.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;i&&s.animateRotate||(v.startAngle=0===e?r.rotation:n.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),i=this.getMeta(),n=0;return ut.each(i.data,function(i,a){t=e.data[a],isNaN(t)||i.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,i,n,a,o,r,s,l,d=0,u=this.chart;if(!t)for(e=0,i=u.data.datasets.length;e<i;++e)if(u.isDatasetVisible(e)){t=(n=u.getDatasetMeta(e)).data,e!==this.index&&(o=n.controller);break}if(!t)return 0;for(e=0,i=t.length;e<i;++e)a=t[e],"inner"!==(r=o?o._resolveElementOptions(a,e):a._options).borderAlign&&(s=r.borderWidth,d=(l=r.hoverBorderWidth)>(d=s>d?s:d)?l:d);return d},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Zt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Zt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Zt(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=Gt([s[a],r[a],l[a]],u,e);return d},_getRingWeightOffset:function(t){for(var e=0,i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e},_getRingWeight:function(t){return Math.max(Zt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});st._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",categoryPercentage:.8,barPercentage:.9,offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}});var Jt=Yt.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Qt=ut.valueOrDefault,te=ut.options.resolve,ee=ut.canvas._isPointInArea;function ie(t,e){return Qt(t.showLine,e.showLines)}st._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var ne=Mt.extend({datasetElementType:Wt.Line,dataElementType:Wt.Point,update:function(t){var e,i,n=this,a=n.getMeta(),o=a.dataset,r=a.data||[],s=n.getScaleForId(a.yAxisID),l=n.getDataset(),d=ie(l,n.chart.options);for(d&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o._scale=s,o._datasetIndex=n.index,o._children=r,o._model=n._resolveLineOptions(o),o.pivot()),e=0,i=r.length;e<i;++e)n.updateElement(r[e],e,t);for(d&&0!==o._model.tension&&n.updateBezierControlPoints(),e=0,i=r.length;e<i;++e)r[e].pivot()},updateElement:function(t,e,i){var n,a,o=this,r=o.getMeta(),s=t.custom||{},l=o.getDataset(),d=o.index,u=l.data[e],h=o.getScaleForId(r.yAxisID),c=o.getScaleForId(r.xAxisID),f=r.dataset._model,g=o._resolvePointOptions(t,e);n=c.getPixelForValue("object"==typeof u?u:NaN,e,d),a=i?h.getBasePixel():o.calculatePointY(u,e,d),t._xScale=c,t._yScale=h,t._options=g,t._datasetIndex=d,t._index=e,t._model={x:n,y:a,skip:s.skip||isNaN(n)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Qt(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)d[a=c[i]]=te([s[a],r[h[a]],r[a],l[a]],u,e);return d},_resolveLineOptions:function(t){var e,i,n,a=this.chart,o=a.data.datasets[this.index],r=t.custom||{},s=a.options,l=s.elements.line,d={},u=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill","cubicInterpolationMode"];for(e=0,i=u.length;e<i;++e)d[n=u[e]]=te([r[n],o[n],l[n]]);return d.spanGaps=Qt(o.spanGaps,s.spanGaps),d.tension=Qt(o.lineTension,l.tension),d.steppedLine=te([r.steppedLine,o.steppedLine,l.stepped]),d},calculatePointY:function(t,e,i){var n,a,o,r=this.chart,s=this.getMeta(),l=this.getScaleForId(s.yAxisID),d=0,u=0;if(l.options.stacked){for(n=0;n<i;n++)if(a=r.data.datasets[n],"line"===(o=r.getDatasetMeta(n)).type&&o.yAxisID===l.id&&r.isDatasetVisible(n)){var h=Number(l.getRightValue(a.data[e]));h<0?u+=h||0:d+=h||0}var c=Number(l.getRightValue(t));return c<0?l.getPixelForValue(u+c):l.getPixelForValue(d+c)}return l.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,i,n,a=this.chart,o=this.getMeta(),r=o.dataset._model,s=a.chartArea,l=o.data||[];function d(t,e,i){return Math.max(Math.min(t,i),e)}if(r.spanGaps&&(l=l.filter(function(t){return!t._model.skip})),"monotone"===r.cubicInterpolationMode)ut.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)i=l[t]._model,n=ut.splineCurve(ut.previousItem(l,t)._model,i,ut.nextItem(l,t)._model,r.tension),i.controlPointPreviousX=n.previous.x,i.controlPointPreviousY=n.previous.y,i.controlPointNextX=n.next.x,i.controlPointNextY=n.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)i=l[t]._model,ee(i,s)&&(t>0&&ee(l[t-1]._model,s)&&(i.controlPointPreviousX=d(i.controlPointPreviousX,s.left,s.right),i.controlPointPreviousY=d(i.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&ee(l[t+1]._model,s)&&(i.controlPointNextX=d(i.controlPointNextX,s.left,s.right),i.controlPointNextY=d(i.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,i=this.getMeta(),n=i.data||[],a=e.chartArea,o=n.length,r=0;for(ie(this.getDataset(),e.options)&&(t=(i.dataset._model.borderWidth||0)/2,ut.canvas.clipArea(e.ctx,{left:a.left,right:a.right,top:a.top-t,bottom:a.bottom+t}),i.dataset.draw(),ut.canvas.unclipArea(e.ctx));r<o;++r)n[r].draw(a)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Qt(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=Qt(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=Qt(i.hoverBorderWidth,i.borderWidth),e.radius=Qt(i.hoverRadius,i.radius)}}),ae=ut.options.resolve;st._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');var i=t.data,n=i.datasets,a=i.labels;if(n.length)for(var o=0;o<n[0].data.length;++o)e.push('<li><span style="background-color:'+n[0].backgroundColor[o]+'"></span>'),a[o]&&e.push(a[o]),e.push("</li>");return e.push("</ul>"),e.join("")},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map(function(i,n){var a=t.getDatasetMeta(0),o=e.datasets[0],r=a.data[n].custom||{},s=t.options.elements.arc;return{text:i,fillStyle:ae([r.backgroundColor,o.backgroundColor,s.backgroundColor],void 0,n),strokeStyle:ae([r.borderColor,o.borderColor,s.borderColor],void 0,n),lineWidth:ae([r.borderWidth,o.borderWidth,s.borderWidth],void 0,n),hidden:isNaN(o.data[n])||a.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var i,n,a,o=e.index,r=this.chart;for(i=0,n=(r.data.datasets||[]).length;i<n;++i)(a=r.getDatasetMeta(i)).data[o].hidden=!a.data[o].hidden;r.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var oe=Mt.extend({dataElementType:Wt.Arc,linkScales:ut.noop,update:function(t){var e,i,n,a=this,o=a.getDataset(),r=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],d=a._angles=[],u=r.data;for(a._updateRadius(),r.count=a.countVisibleElements(),e=0,i=o.data.length;e<i;e++)l[e]=s,n=a._computeAngle(e),d[e]=n,s+=n;for(e=0,i=u.length;e<i;++e)u[e]._options=a._resolveElementOptions(u[e],e),a.updateElement(u[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,i=e.chartArea,n=e.options,a=Math.min(i.right-i.left,i.bottom-i.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(n.cutoutPercentage?e.outerRadius/100*n.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,i){var n=this,a=n.chart,o=n.getDataset(),r=a.options,s=r.animation,l=a.scale,d=a.data.labels,u=l.xCenter,h=l.yCenter,c=r.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(o.data[e]),g=n._starts[e],p=g+(t.hidden?0:n._angles[e]),m=s.animateScale?0:l.getDistanceFromCenterForValue(o.data[e]),v=t._options||{};ut.extend(t,{_datasetIndex:n.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:u,y:h,innerRadius:0,outerRadius:i?m:f,startAngle:i&&s.animateRotate?c:g,endAngle:i&&s.animateRotate?c:p,label:ut.valueAtIndexOrDefault(d,e,d[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),i=0;return ut.each(e.data,function(e,n){isNaN(t.data[n])||e.hidden||i++}),i},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor,a=ut.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=a(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=a(i.hoverBorderWidth,i.borderWidth)},_resolveElementOptions:function(t,e){var i,n,a,o=this.chart,r=this.getDataset(),s=t.custom||{},l=o.options.elements.arc,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h=["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"];for(i=0,n=h.length;i<n;++i)d[a=h[i]]=ae([s[a],r[a],l[a]],u,e);return d},_computeAngle:function(t){var e=this,i=this.getMeta().count,n=e.getDataset(),a=e.getMeta();if(isNaN(n.data[t])||a.data[t].hidden)return 0;var o={chart:e.chart,dataIndex:t,dataset:n,datasetIndex:e.index};return ae([e.chart.options.elements.arc.angle,2*Math.PI/i],o,t)}});st._set("pie",ut.clone(st.doughnut)),st._set("pie",{cutoutPercentage:0});var re=$t,se=ut.valueOrDefault,le=ut.options.resolve;st._set("radar",{scale:{type:"radialLinear"},elements:{line:{tension:0}}});var de=Mt.extend({datasetElementType:Wt.Line,dataElementType:Wt.Point,linkScales:ut.noop,update:function(t){var e,i,n=this,a=n.getMeta(),o=a.dataset,r=a.data||[],s=n.chart.scale,l=n.getDataset();for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),o._scale=s,o._datasetIndex=n.index,o._children=r,o._loop=!0,o._model=n._resolveLineOptions(o),o.pivot(),e=0,i=r.length;e<i;++e)n.updateElement(r[e],e,t);for(n.updateBezierControlPoints(),e=0,i=r.length;e<i;++e)r[e].pivot()},updateElement:function(t,e,i){var n=this,a=t.custom||{},o=n.getDataset(),r=n.chart.scale,s=r.getPointPositionForValue(e,o.data[e]),l=n._resolvePointOptions(t,e),d=n.getMeta().dataset._model,u=i?r.xCenter:s.x,h=i?r.yCenter:s.y;t._scale=r,t._options=l,t._datasetIndex=n.index,t._index=e,t._model={x:u,y:h,skip:a.skip||isNaN(u)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:se(a.tension,d?d.tension:0),hitRadius:l.hitRadius}},_resolvePointOptions:function(t,e){var i,n,a,o=this.chart,r=o.data.datasets[this.index],s=t.custom||{},l=o.options.elements.point,d={},u={chart:o,dataIndex:e,dataset:r,datasetIndex:this.index},h={backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},c=Object.keys(h);for(i=0,n=c.length;i<n;++i)d[a=c[i]]=le([s[a],r[h[a]],r[a],l[a]],u,e);return d},_resolveLineOptions:function(t){var e,i,n,a=this.chart,o=a.data.datasets[this.index],r=t.custom||{},s=a.options.elements.line,l={},d=["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"];for(e=0,i=d.length;e<i;++e)l[n=d[e]]=le([r[n],o[n],s[n]]);return l.tension=se(o.lineTension,s.tension),l},updateBezierControlPoints:function(){var t,e,i,n,a=this.getMeta(),o=this.chart.chartArea,r=a.data||[];function s(t,e,i){return Math.max(Math.min(t,i),e)}for(t=0,e=r.length;t<e;++t)i=r[t]._model,n=ut.splineCurve(ut.previousItem(r,t,!0)._model,i,ut.nextItem(r,t,!0)._model,i.tension),i.controlPointPreviousX=s(n.previous.x,o.left,o.right),i.controlPointPreviousY=s(n.previous.y,o.top,o.bottom),i.controlPointNextX=s(n.next.x,o.left,o.right),i.controlPointNextY=s(n.next.y,o.top,o.bottom)},setHoverStyle:function(t){var e=t._model,i=t._options,n=ut.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=se(i.hoverBackgroundColor,n(i.backgroundColor)),e.borderColor=se(i.hoverBorderColor,n(i.borderColor)),e.borderWidth=se(i.hoverBorderWidth,i.borderWidth),e.radius=se(i.hoverRadius,i.radius)}});st._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},showLines:!1,tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}});var ue={bar:Yt,bubble:Kt,doughnut:$t,horizontalBar:Jt,line:ne,polarArea:oe,pie:re,radar:de,scatter:ne};function he(t,e){return t.native?{x:t.x,y:t.y}:ut.getRelativePosition(t,e)}function ce(t,e){var i,n,a,o,r;for(n=0,o=t.data.datasets.length;n<o;++n)if(t.isDatasetVisible(n))for(a=0,r=(i=t.getDatasetMeta(n)).data.length;a<r;++a){var s=i.data[a];s._view.skip||e(s)}}function fe(t,e){var i=[];return ce(t,function(t){t.inRange(e.x,e.y)&&i.push(t)}),i}function ge(t,e,i,n){var a=Number.POSITIVE_INFINITY,o=[];return ce(t,function(t){if(!i||t.inRange(e.x,e.y)){var r=t.getCenterPoint(),s=n(e,r);s<a?(o=[t],a=s):s===a&&o.push(t)}}),o}function pe(t){var e=-1!==t.indexOf("x"),i=-1!==t.indexOf("y");return function(t,n){var a=e?Math.abs(t.x-n.x):0,o=i?Math.abs(t.y-n.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(o,2))}}function me(t,e,i){var n=he(e,t);i.axis=i.axis||"x";var a=pe(i.axis),o=i.intersect?fe(t,n):ge(t,n,!1,a),r=[];return o.length?(t.data.datasets.forEach(function(e,i){if(t.isDatasetVisible(i)){var n=t.getDatasetMeta(i).data[o[0]._index];n&&!n._view.skip&&r.push(n)}}),r):[]}var ve={modes:{single:function(t,e){var i=he(e,t),n=[];return ce(t,function(t){if(t.inRange(i.x,i.y))return n.push(t),n}),n.slice(0,1)},label:me,index:me,dataset:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis),o=i.intersect?fe(t,n):ge(t,n,!1,a);return o.length>0&&(o=t.getDatasetMeta(o[0]._datasetIndex).data),o},"x-axis":function(t,e){return me(t,e,{intersect:!1})},point:function(t,e){return fe(t,he(e,t))},nearest:function(t,e,i){var n=he(e,t);i.axis=i.axis||"xy";var a=pe(i.axis);return ge(t,n,i.intersect,a)},x:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inXRange(n.x)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a},y:function(t,e,i){var n=he(e,t),a=[],o=!1;return ce(t,function(t){t.inYRange(n.y)&&a.push(t),t.inRange(n.x,n.y)&&(o=!0)}),i.intersect&&!o&&(a=[]),a}}};function be(t,e){return ut.where(t,function(t){return t.position===e})}function xe(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,i){var n=e?i:t,a=e?t:i;return n.weight===a.weight?n._tmpIndex_-a._tmpIndex_:n.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}function ye(t,e){ut.each(t,function(t){e[t.position]+=t.isHorizontal()?t.height:t.width})}st._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var ke={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure:function(t,e,i){for(var n,a=["fullWidth","position","weight"],o=a.length,r=0;r<o;++r)n=a[r],i.hasOwnProperty(n)&&(e[n]=i[n])},update:function(t,e,i){if(t){var n=t.options.layout||{},a=ut.options.toPadding(n.padding),o=a.left,r=a.right,s=a.top,l=a.bottom,d=be(t.boxes,"left"),u=be(t.boxes,"right"),h=be(t.boxes,"top"),c=be(t.boxes,"bottom"),f=be(t.boxes,"chartArea");xe(d,!0),xe(u,!1),xe(h,!0),xe(c,!1);var g,p=d.concat(u),m=h.concat(c),v=p.concat(m),b=e-o-r,x=i-s-l,y=(e-b/2)/p.length,k=b,w=x,M={top:s,left:o,bottom:l,right:r},_=[];ut.each(v,function(t){var e,i=t.isHorizontal();i?(e=t.update(t.fullWidth?b:k,x/2),w-=e.height):(e=t.update(y,w),k-=e.width),_.push({horizontal:i,width:e.width,box:t})}),g=function(t){var e=0,i=0,n=0,a=0;return ut.each(t,function(t){if(t.getPadding){var o=t.getPadding();e=Math.max(e,o.top),i=Math.max(i,o.left),n=Math.max(n,o.bottom),a=Math.max(a,o.right)}}),{top:e,left:i,bottom:n,right:a}}(v),ut.each(p,T),ye(p,M),ut.each(m,T),ye(m,M),ut.each(p,function(t){var e=ut.findNextWhere(_,function(e){return e.box===t}),i={left:0,right:0,top:M.top,bottom:M.bottom};e&&t.update(e.width,w,i)}),ye(v,M={top:s,left:o,bottom:l,right:r});var C=Math.max(g.left-M.left,0);M.left+=C,M.right+=Math.max(g.right-M.right,0);var S=Math.max(g.top-M.top,0);M.top+=S,M.bottom+=Math.max(g.bottom-M.bottom,0);var P=i-M.top-M.bottom,I=e-M.left-M.right;I===k&&P===w||(ut.each(p,function(t){t.height=P}),ut.each(m,function(t){t.fullWidth||(t.width=I)}),w=P,k=I);var A=o+C,D=s+S;ut.each(d.concat(h),F),A+=k,D+=w,ut.each(u,F),ut.each(c,F),t.chartArea={left:M.left,top:M.top,right:M.left+k,bottom:M.top+w},ut.each(f,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(k,w)})}function T(t){var e=ut.findNextWhere(_,function(e){return e.box===t});if(e)if(e.horizontal){var i={left:Math.max(M.left,g.left),right:Math.max(M.right,g.right),top:0,bottom:0};t.update(t.fullWidth?b:k,x/2,i)}else t.update(e.width,w)}function F(t){t.isHorizontal()?(t.left=t.fullWidth?o:M.left,t.right=t.fullWidth?e-r:M.left+k,t.top=D,t.bottom=D+t.height,D=t.bottom):(t.left=A,t.right=A+t.width,t.top=M.top,t.bottom=M.top+w,A=t.right)}}};var we,Me=(we=Object.freeze({default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&we.default||we,_e="$chartjs",Ce="chartjs-size-monitor",Se="chartjs-render-monitor",Pe="chartjs-render-animation",Ie=["animationstart","webkitAnimationStart"],Ae={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function De(t,e){var i=ut.getStyle(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?Number(n[1]):void 0}var Te=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Fe(t,e,i){t.addEventListener(e,i,Te)}function Le(t,e,i){t.removeEventListener(e,i,Te)}function Re(t,e,i,n,a){return{type:t,chart:e,native:a||null,x:void 0!==i?i:null,y:void 0!==n?n:null}}function Oe(t){var e=document.createElement("div");return e.className=t||"",e}function ze(t,e,i){var n,a,o,r,s=t[_e]||(t[_e]={}),l=s.resizer=function(t){var e=Oe(Ce),i=Oe(Ce+"-expand"),n=Oe(Ce+"-shrink");i.appendChild(Oe()),n.appendChild(Oe()),e.appendChild(i),e.appendChild(n),e._reset=function(){i.scrollLeft=1e6,i.scrollTop=1e6,n.scrollLeft=1e6,n.scrollTop=1e6};var a=function(){e._reset(),t()};return Fe(i,"scroll",a.bind(i,"expand")),Fe(n,"scroll",a.bind(n,"shrink")),e}((n=function(){if(s.resizer){var n=i.options.maintainAspectRatio&&t.parentNode,a=n?n.clientWidth:0;e(Re("resize",i)),n&&n.clientWidth<a&&i.canvas&&e(Re("resize",i))}},o=!1,r=[],function(){r=Array.prototype.slice.call(arguments),a=a||this,o||(o=!0,ut.requestAnimFrame.call(window,function(){o=!1,n.apply(a,r)}))}));!function(t,e){var i=t[_e]||(t[_e]={}),n=i.renderProxy=function(t){t.animationName===Pe&&e()};ut.each(Ie,function(e){Fe(t,e,n)}),i.reflow=!!t.offsetParent,t.classList.add(Se)}(t,function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}})}function Be(t){var e=t[_e]||{},i=e.resizer;delete e.resizer,function(t){var e=t[_e]||{},i=e.renderProxy;i&&(ut.each(Ie,function(e){Le(t,e,i)}),delete e.renderProxy),t.classList.remove(Se)}(t),i&&i.parentNode&&i.parentNode.removeChild(i)}var Ne={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(){var t,e,i;this._loaded||(this._loaded=!0,this.disableCSSInjection||(e=Me,i=(t=this)._style||document.createElement("style"),t._style||(t._style=i,e="/* Chart.js */\n"+e,i.setAttribute("type","text/css"),document.getElementsByTagName("head")[0].appendChild(i)),i.appendChild(document.createTextNode(e))))},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return this._ensureLoaded(),i&&i.canvas===t?(function(t,e){var i=t.style,n=t.getAttribute("height"),a=t.getAttribute("width");if(t[_e]={initial:{height:n,width:a,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===a||""===a){var o=De(t,"width");void 0!==o&&(t.width=o)}if(null===n||""===n)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var r=De(t,"height");void 0!==o&&(t.height=r)}}(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e[_e]){var i=e[_e].initial;["height","width"].forEach(function(t){var n=i[t];ut.isNullOrUndef(n)?e.removeAttribute(t):e.setAttribute(t,n)}),ut.each(i.style||{},function(t,i){e.style[i]=t}),e.width=e.width,delete e[_e]}},addEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=i[_e]||(i[_e]={});Fe(n,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){i(function(t,e){var i=Ae[t.type]||t.type,n=ut.getRelativePosition(t,e);return Re(i,e,n.x,n.y,t)}(e,t))})}else ze(n,i,t)},removeEventListener:function(t,e,i){var n=t.canvas;if("resize"!==e){var a=((i[_e]||{}).proxies||{})[t.id+"_"+e];a&&Le(n,e,a)}else Be(n)}};ut.addEvent=Fe,ut.removeEvent=Le;var We=Ne._enabled?Ne:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Ve=ut.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},We);st._set("global",{plugins:{}});var Ee={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){-1===e.indexOf(t)&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var i=e.indexOf(t);-1!==i&&e.splice(i,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,i){var n,a,o,r,s,l=this.descriptors(t),d=l.length;for(n=0;n<d;++n)if("function"==typeof(s=(o=(a=l[n]).plugin)[e])&&((r=[t].concat(i||[])).push(a.options),!1===s.apply(o,r)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var i=[],n=[],a=t&&t.config||{},o=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach(function(t){if(-1===i.indexOf(t)){var e=t.id,a=o[e];!1!==a&&(!0===a&&(a=ut.clone(st.global.plugins[e])),i.push(t),n.push({plugin:t,options:a||{}}))}}),e.descriptors=n,e.id=this._cacheId,n},_invalidate:function(t){delete t.$plugins}},He={constructors:{},defaults:{},registerScaleType:function(t,e,i){this.constructors[t]=e,this.defaults[t]=ut.clone(i)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?ut.merge({},[st.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=ut.extend(this.defaults[t],e))},addScalesToLayout:function(t){ut.each(t.scales,function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,ke.addBox(t,e)})}},je=ut.valueOrDefault;st._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:ut.noop,title:function(t,e){var i="",n=e.labels,a=n?n.length:0;if(t.length>0){var o=t[0];o.label?i=o.label:o.xLabel?i=o.xLabel:a>0&&o.index<a&&(i=n[o.index])}return i},afterTitle:ut.noop,beforeBody:ut.noop,beforeLabel:ut.noop,label:function(t,e){var i=e.datasets[t.datasetIndex].label||"";return i&&(i+=": "),ut.isNullOrUndef(t.value)?i+=t.yLabel:i+=t.value,i},labelColor:function(t,e){var i=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:i.borderColor,backgroundColor:i.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:ut.noop,afterBody:ut.noop,beforeFooter:ut.noop,footer:ut.noop,afterFooter:ut.noop}}});var qe={average:function(t){if(!t.length)return!1;var e,i,n=0,a=0,o=0;for(e=0,i=t.length;e<i;++e){var r=t[e];if(r&&r.hasValue()){var s=r.tooltipPosition();n+=s.x,a+=s.y,++o}}return{x:n/o,y:a/o}},nearest:function(t,e){var i,n,a,o=e.x,r=e.y,s=Number.POSITIVE_INFINITY;for(i=0,n=t.length;i<n;++i){var l=t[i];if(l&&l.hasValue()){var d=l.getCenterPoint(),u=ut.distanceBetweenPoints(e,d);u<s&&(s=u,a=l)}}if(a){var h=a.tooltipPosition();o=h.x,r=h.y}return{x:o,y:r}}};function Ye(t,e){return e&&(ut.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Ue(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function Xe(t){var e=st.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,bodyFontColor:t.bodyFontColor,_bodyFontFamily:je(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:je(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:je(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:je(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:je(t.titleFontStyle,e.defaultFontStyle),titleFontSize:je(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:je(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:je(t.footerFontStyle,e.defaultFontStyle),footerFontSize:je(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ke(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function Ge(t){return Ye([],Ue(t))}var Ze=pt.extend({initialize:function(){this._model=Xe(this._options),this._lastActive=[]},getTitle:function(){var t=this._options.callbacks,e=t.beforeTitle.apply(this,arguments),i=t.title.apply(this,arguments),n=t.afterTitle.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},getBeforeBody:function(){return Ge(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var i=this,n=i._options.callbacks,a=[];return ut.each(t,function(t){var o={before:[],lines:[],after:[]};Ye(o.before,Ue(n.beforeLabel.call(i,t,e))),Ye(o.lines,n.label.call(i,t,e)),Ye(o.after,Ue(n.afterLabel.call(i,t,e))),a.push(o)}),a},getAfterBody:function(){return Ge(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this._options.callbacks,e=t.beforeFooter.apply(this,arguments),i=t.footer.apply(this,arguments),n=t.afterFooter.apply(this,arguments),a=[];return a=Ye(a,Ue(e)),a=Ye(a,Ue(i)),a=Ye(a,Ue(n))},update:function(t){var e,i,n,a,o,r,s,l,d,u,h=this,c=h._options,f=h._model,g=h._model=Xe(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var k=[],w=[];y=qe[c.position].call(h,p,h._eventPosition);var M=[];for(e=0,i=p.length;e<i;++e)M.push((n=p[e],a=void 0,o=void 0,r=void 0,s=void 0,l=void 0,d=void 0,u=void 0,a=n._xScale,o=n._yScale||n._scale,r=n._index,s=n._datasetIndex,l=n._chart.getDatasetMeta(s).controller,d=l._getIndexScale(),u=l._getValueScale(),{xLabel:a?a.getLabelForIndex(r,s):"",yLabel:o?o.getLabelForIndex(r,s):"",label:d?""+d.getLabelForIndex(r,s):"",value:u?""+u.getLabelForIndex(r,s):"",index:r,datasetIndex:s,x:n._model.x,y:n._model.y}));c.filter&&(M=M.filter(function(t){return c.filter(t,m)})),c.itemSort&&(M=M.sort(function(t,e){return c.itemSort(t,e,m)})),ut.each(M,function(t){k.push(c.callbacks.labelColor.call(h,t,h._chart)),w.push(c.callbacks.labelTextColor.call(h,t,h._chart))}),g.title=h.getTitle(M,m),g.beforeBody=h.getBeforeBody(M,m),g.body=h.getBody(M,m),g.afterBody=h.getAfterBody(M,m),g.footer=h.getFooter(M,m),g.x=y.x,g.y=y.y,g.caretPadding=c.caretPadding,g.labelColors=k,g.labelTextColors=w,g.dataPoints=M,x=function(t,e){var i=t._chart.ctx,n=2*e.yPadding,a=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,d=e.titleFontSize,u=e.bodyFontSize,h=e.footerFontSize;n+=s*d,n+=s?(s-1)*e.titleSpacing:0,n+=s?e.titleMarginBottom:0,n+=r*u,n+=r?(r-1)*e.bodySpacing:0,n+=l?e.footerMarginTop:0,n+=l*h,n+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,i.measureText(t).width+c)};return i.font=ut.fontString(d,e._titleFontStyle,e._titleFontFamily),ut.each(e.title,f),i.font=ut.fontString(u,e._bodyFontStyle,e._bodyFontFamily),ut.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?u+2:0,ut.each(o,function(t){ut.each(t.before,f),ut.each(t.lines,f),ut.each(t.after,f)}),c=0,i.font=ut.fontString(h,e._footerFontStyle,e._footerFontFamily),ut.each(e.footer,f),{width:a+=2*e.xPadding,height:n}}(this,g),b=function(t,e,i,n){var a=t.x,o=t.y,r=t.caretSize,s=t.caretPadding,l=t.cornerRadius,d=i.xAlign,u=i.yAlign,h=r+s,c=l+s;return"right"===d?a-=e.width:"center"===d&&((a-=e.width/2)+e.width>n.width&&(a=n.width-e.width),a<0&&(a=0)),"top"===u?o+=h:o-="bottom"===u?e.height+h:e.height/2,"center"===u?"left"===d?a+=h:"right"===d&&(a-=h):"left"===d?a-=c:"right"===d&&(a+=c),{x:a,y:o}}(g,x,v=function(t,e){var i,n,a,o,r,s=t._model,l=t._chart,d=t._chart.chartArea,u="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(d.left+d.right)/2,f=(d.top+d.bottom)/2;"center"===h?(i=function(t){return t<=c},n=function(t){return t>c}):(i=function(t){return t<=e.width/2},n=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},o=function(t){return t-e.width-s.caretSize-s.caretPadding<0},r=function(t){return t<=f?"top":"bottom"},i(s.x)?(u="left",a(s.x)&&(u="center",h=r(s.y))):n(s.x)&&(u="right",o(s.x)&&(u="center",h=r(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:u,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var i=this._chart.ctx,n=this._view,a=this.getCaretPosition(t,e,n);i.lineTo(a.x1,a.y1),i.lineTo(a.x2,a.y2),i.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,i){var n,a,o,r,s,l,d=i.caretSize,u=i.cornerRadius,h=i.xAlign,c=i.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(n=f)-d,o=n,r=s+d,l=s-d):(a=(n=f+p)+d,o=n,r=s-d,l=s+d);else if("left"===h?(n=(a=f+u+d)-d,o=a+d):"right"===h?(n=(a=f+p-u-d)-d,o=a+d):(n=(a=i.caretX)-d,o=a+d),"top"===c)s=(r=g)-d,l=r;else{s=(r=g+m)+d,l=r;var v=o;o=n,n=v}return{x1:n,x2:a,x3:o,y1:r,y2:s,y3:l}},drawTitle:function(t,e,i){var n=e.title;if(n.length){t.x=Ke(e,e._titleAlign),i.textAlign=e._titleAlign,i.textBaseline="top";var a,o,r=e.titleFontSize,s=e.titleSpacing;for(i.fillStyle=e.titleFontColor,i.font=ut.fontString(r,e._titleFontStyle,e._titleFontFamily),a=0,o=n.length;a<o;++a)i.fillText(n[a],t.x,t.y),t.y+=r+s,a+1===n.length&&(t.y+=e.titleMarginBottom-s)}},drawBody:function(t,e,i){var n,a=e.bodyFontSize,o=e.bodySpacing,r=e._bodyAlign,s=e.body,l=e.displayColors,d=e.labelColors,u=0,h=l?Ke(e,"left"):0;i.textAlign=r,i.textBaseline="top",i.font=ut.fontString(a,e._bodyFontStyle,e._bodyFontFamily),t.x=Ke(e,r);var c=function(e){i.fillText(e,t.x+u,t.y),t.y+=a+o};i.fillStyle=e.bodyFontColor,ut.each(e.beforeBody,c),u=l&&"right"!==r?"center"===r?a/2+1:a+2:0,ut.each(s,function(o,r){n=e.labelTextColors[r],i.fillStyle=n,ut.each(o.before,c),ut.each(o.lines,function(o){l&&(i.fillStyle=e.legendColorBackground,i.fillRect(h,t.y,a,a),i.lineWidth=1,i.strokeStyle=d[r].borderColor,i.strokeRect(h,t.y,a,a),i.fillStyle=d[r].backgroundColor,i.fillRect(h+1,t.y+1,a-2,a-2),i.fillStyle=n),c(o)}),ut.each(o.after,c)}),u=0,ut.each(e.afterBody,c),t.y-=o},drawFooter:function(t,e,i){var n=e.footer;n.length&&(t.x=Ke(e,e._footerAlign),t.y+=e.footerMarginTop,i.textAlign=e._footerAlign,i.textBaseline="top",i.fillStyle=e.footerFontColor,i.font=ut.fontString(e.footerFontSize,e._footerFontStyle,e._footerFontFamily),ut.each(n,function(n){i.fillText(n,t.x,t.y),t.y+=e.footerFontSize+e.footerSpacing}))},drawBackground:function(t,e,i,n){i.fillStyle=e.backgroundColor,i.strokeStyle=e.borderColor,i.lineWidth=e.borderWidth;var a=e.xAlign,o=e.yAlign,r=t.x,s=t.y,l=n.width,d=n.height,u=e.cornerRadius;i.beginPath(),i.moveTo(r+u,s),"top"===o&&this.drawCaret(t,n),i.lineTo(r+l-u,s),i.quadraticCurveTo(r+l,s,r+l,s+u),"center"===o&&"right"===a&&this.drawCaret(t,n),i.lineTo(r+l,s+d-u),i.quadraticCurveTo(r+l,s+d,r+l-u,s+d),"bottom"===o&&this.drawCaret(t,n),i.lineTo(r+u,s+d),i.quadraticCurveTo(r,s+d,r,s+d-u),"center"===o&&"left"===a&&this.drawCaret(t,n),i.lineTo(r,s+u),i.quadraticCurveTo(r,s,r+u,s),i.closePath(),i.fill(),e.borderWidth>0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var i={width:e.width,height:e.height},n={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(t.save(),t.globalAlpha=a,this.drawBackground(n,e,t,i),n.y+=e.yPadding,this.drawTitle(n,e,t),this.drawBody(n,e,t),this.drawFooter(n,e,t),t.restore())}},handleEvent:function(t){var e,i=this,n=i._options;return i._lastActive=i._lastActive||[],"mouseout"===t.type?i._active=[]:i._active=i._chart.getElementsAtEventForMode(t,n.mode,n),(e=!ut.arrayEquals(i._active,i._lastActive))&&(i._lastActive=i._active,(n.enabled||n.custom)&&(i._eventPosition={x:t.x,y:t.y},i.update(!0),i.pivot())),e}}),$e=qe,Je=Ze;Je.positioners=$e;var Qe=ut.valueOrDefault;function ti(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){if("xAxes"===t||"yAxes"===t){var a,o,r,s=i[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)r=i[t][a],o=Qe(r.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||r.type&&r.type!==e[t][a].type?ut.merge(e[t][a],[He.getScaleDefaults(o),r]):ut.merge(e[t][a],r)}else ut._merger(t,e,i,n)}})}function ei(){return ut.merge({},[].slice.call(arguments),{merger:function(t,e,i,n){var a=e[t]||{},o=i[t];"scales"===t?e[t]=ti(a,o):"scale"===t?e[t]=ut.merge(a,[He.getScaleDefaults(o.type),o]):ut._merger(t,e,i,n)}})}function ii(t){return"top"===t||"bottom"===t}st._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var ni=function(t,e){return this.construct(t,e),this};ut.extend(ni.prototype,{construct:function(t,e){var i=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=ei(st.global,st[t.type],t.options||{}),t}(e);var n=Ve.acquireContext(t,e),a=n&&n.canvas,o=a&&a.height,r=a&&a.width;i.id=ut.uid(),i.ctx=n,i.canvas=a,i.config=e,i.width=r,i.height=o,i.aspectRatio=o?r/o:null,i.options=e.options,i._bufferedRender=!1,i.chart=i,i.controller=i,ni.instances[i.id]=i,Object.defineProperty(i,"data",{get:function(){return i.config.data},set:function(t){i.config.data=t}}),n&&a?(i.initialize(),i.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Ee.notify(t,"beforeInit"),ut.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.initToolTip(),Ee.notify(t,"afterInit"),t},clear:function(){return ut.canvas.clear(this),this},stop:function(){return bt.cancelAnimation(this),this},resize:function(t){var e=this,i=e.options,n=e.canvas,a=i.maintainAspectRatio&&e.aspectRatio||null,o=Math.max(0,Math.floor(ut.getMaximumWidth(n))),r=Math.max(0,Math.floor(a?o/a:ut.getMaximumHeight(n)));if((e.width!==o||e.height!==r)&&(n.width=e.width=o,n.height=e.height=r,n.style.width=o+"px",n.style.height=r+"px",ut.retinaScale(e,i.devicePixelRatio),!t)){var s={width:o,height:r};Ee.notify(e,"resize",[s]),i.onResize&&i.onResize(e,s),e.stop(),e.update({duration:i.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},i=t.scale;ut.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),ut.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),i&&(i.id=i.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,i=t.scales||{},n=[],a=Object.keys(i).reduce(function(t,e){return t[e]=!1,t},{});e.scales&&(n=n.concat((e.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(e.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),e.scale&&n.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),ut.each(n,function(e){var n=e.options,o=n.id,r=Qe(n.type,e.dtype);ii(n.position)!==ii(e.dposition)&&(n.position=e.dposition),a[o]=!0;var s=null;if(o in i&&i[o].type===r)(s=i[o]).options=n,s.ctx=t.ctx,s.chart=t;else{var l=He.getScaleConstructor(r);if(!l)return;s=new l({id:o,type:r,options:n,ctx:t.ctx,chart:t}),i[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)}),ut.each(a,function(t,e){t||delete i[e]}),t.scales=i,He.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t=this,e=[];return ut.each(t.data.datasets,function(i,n){var a=t.getDatasetMeta(n),o=i.type||t.config.type;if(a.type&&a.type!==o&&(t.destroyDatasetMeta(n),a=t.getDatasetMeta(n)),a.type=o,a.controller)a.controller.updateIndex(n),a.controller.linkScales();else{var r=ue[a.type];if(void 0===r)throw new Error('"'+a.type+'" is not a chart type.');a.controller=new r(t,n),e.push(a.controller)}},t),e},resetElements:function(){var t=this;ut.each(t.data.datasets,function(e,i){t.getDatasetMeta(i).controller.reset()},t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,i,n=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),i=(e=n).options,ut.each(e.scales,function(t){ke.removeBox(e,t)}),i=ei(st.global,st[e.config.type],i),e.options=e.config.options=i,e.ensureScalesHaveIDs(),e.buildOrUpdateScales(),e.tooltip._options=i.tooltips,e.tooltip.initialize(),Ee._invalidate(n),!1!==Ee.notify(n,"beforeUpdate")){n.tooltip._data=n.data;var a=n.buildOrUpdateControllers();ut.each(n.data.datasets,function(t,e){n.getDatasetMeta(e).controller.buildOrUpdateElements()},n),n.updateLayout(),n.options.animation&&n.options.animation.duration&&ut.each(a,function(t){t.reset()}),n.updateDatasets(),n.tooltip.initialize(),n.lastActive=[],Ee.notify(n,"afterUpdate"),n._bufferedRender?n._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:n.render(t)}},updateLayout:function(){!1!==Ee.notify(this,"beforeLayout")&&(ke.update(this,this.width,this.height),Ee.notify(this,"afterScaleUpdate"),Ee.notify(this,"afterLayout"))},updateDatasets:function(){if(!1!==Ee.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);Ee.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),i={meta:e,index:t};!1!==Ee.notify(this,"beforeDatasetUpdate",[i])&&(e.controller.update(),Ee.notify(this,"afterDatasetUpdate",[i]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var i=e.options.animation,n=Qe(t.duration,i&&i.duration),a=t.lazy;if(!1!==Ee.notify(e,"beforeRender")){var o=function(t){Ee.notify(e,"afterRender"),ut.callback(i&&i.onComplete,[t],e)};if(i&&n){var r=new vt({numSteps:n/16.66,easing:t.easing||i.easing,render:function(t,e){var i=ut.easing.effects[e.easing],n=e.currentStep,a=n/e.numSteps;t.draw(i(a),a,n)},onAnimationProgress:i.onProgress,onAnimationComplete:o});bt.addAnimation(e,r,n,a)}else e.draw(),o(new vt({numSteps:0,chart:e}));return e}},draw:function(t){var e=this;e.clear(),ut.isNullOrUndef(t)&&(t=1),e.transition(t),e.width<=0||e.height<=0||!1!==Ee.notify(e,"beforeDraw",[t])&&(ut.each(e.boxes,function(t){t.draw(e.chartArea)},e),e.drawDatasets(t),e._drawTooltip(t),Ee.notify(e,"afterDraw",[t]))},transition:function(t){for(var e=0,i=(this.data.datasets||[]).length;e<i;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},drawDatasets:function(t){var e=this;if(!1!==Ee.notify(e,"beforeDatasetsDraw",[t])){for(var i=(e.data.datasets||[]).length-1;i>=0;--i)e.isDatasetVisible(i)&&e.drawDataset(i,t);Ee.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var i=this.getDatasetMeta(t),n={meta:i,index:t,easingValue:e};!1!==Ee.notify(this,"beforeDatasetDraw",[n])&&(i.controller.draw(e),Ee.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,i={tooltip:e,easingValue:t};!1!==Ee.notify(this,"beforeTooltipDraw",[i])&&(e.draw(),Ee.notify(this,"afterTooltipDraw",[i]))},getElementAtEvent:function(t){return ve.modes.single(this,t)},getElementsAtEvent:function(t){return ve.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ve.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,i){var n=ve.modes[e];return"function"==typeof n?n(this,t,i):[]},getDatasetAtEvent:function(t){return ve.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var i=e._meta[this.id];return i||(i=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,i=this.data.datasets.length;e<i;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,i=this.data.datasets[t],n=i._meta&&i._meta[e];n&&(n.controller.destroy(),delete i._meta[e])},destroy:function(){var t,e,i=this,n=i.canvas;for(i.stop(),t=0,e=i.data.datasets.length;t<e;++t)i.destroyDatasetMeta(t);n&&(i.unbindEvents(),ut.canvas.clear(i),Ve.releaseContext(i.ctx),i.canvas=null,i.ctx=null),Ee.notify(i,"destroy"),delete ni.instances[i.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new Je({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},i=function(){t.eventHandler.apply(t,arguments)};ut.each(t.options.events,function(n){Ve.addEventListener(t,n,i),e[n]=i}),t.options.responsive&&(i=function(){t.resize()},Ve.addEventListener(t,"resize",i),e.resize=i)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,ut.each(e,function(e,i){Ve.removeEventListener(t,i,e)}))},updateHoverStyle:function(t,e,i){var n,a,o,r=i?"setHoverStyle":"removeHoverStyle";for(a=0,o=t.length;a<o;++a)(n=t[a])&&this.getDatasetMeta(n._datasetIndex).controller[r](n)},eventHandler:function(t){var e=this,i=e.tooltip;if(!1!==Ee.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var n=e.handleEvent(t);i&&(n=i._start?i.handleEvent(t):n|i.handleEvent(t)),Ee.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):n&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,i=this,n=i.options||{},a=n.hover;return i.lastActive=i.lastActive||[],"mouseout"===t.type?i.active=[]:i.active=i.getElementsAtEventForMode(t,a.mode,a),ut.callback(n.onHover||n.hover.onHover,[t.native,i.active],i),"mouseup"!==t.type&&"click"!==t.type||n.onClick&&n.onClick.call(i,t.native,i.active),i.lastActive.length&&i.updateHoverStyle(i.lastActive,a.mode,!1),i.active.length&&a.mode&&i.updateHoverStyle(i.active,a.mode,!0),e=!ut.arrayEquals(i.active,i.lastActive),i.lastActive=i.active,e}}),ni.instances={};var ai=ni;ni.Controller=ni,ni.types={},ut.configMerge=ei,ut.scaleMerge=ti;function oi(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function ri(t){this.options=t||{}}ut.extend(ri.prototype,{formats:oi,parse:oi,format:oi,add:oi,diff:oi,startOf:oi,endOf:oi,_create:function(t){return t}}),ri.override=function(t){ut.extend(ri.prototype,t)};var si={_date:ri},li={formatters:{values:function(t){return ut.isArray(t)?t:""+t},linear:function(t,e,i){var n=i.length>3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var a=ut.log10(Math.abs(n)),o="";if(0!==t)if(Math.max(Math.abs(i[0]),Math.abs(i[i.length-1]))<1e-4){var r=ut.log10(Math.abs(t));o=t.toExponential(Math.floor(r)-Math.floor(a))}else{var s=-1*Math.floor(a);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o},logarithmic:function(t,e,i){var n=t/Math.pow(10,Math.floor(ut.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===e||e===i.length-1?t.toExponential():""}}},di=ut.valueOrDefault,ui=ut.valueAtIndexOrDefault;function hi(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(t[e].label);return n}function ci(t,e,i){return ut.isArray(e)?ut.longestText(t,i,e):t.measureText(e).width}st._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:li.formatters.values,minor:{},major:{}}});var fi=pt.extend({getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},mergeTicksOptions:function(){var t=this.options.ticks;for(var e in!1===t.minor&&(t.minor={display:!1}),!1===t.major&&(t.major={display:!1}),t)"major"!==e&&"minor"!==e&&(void 0===t.minor[e]&&(t.minor[e]=t[e]),void 0===t.major[e]&&(t.major[e]=t[e]))},beforeUpdate:function(){ut.callback(this.options.beforeUpdate,[this])},update:function(t,e,i){var n,a,o,r,s,l,d=this;for(d.beforeUpdate(),d.maxWidth=t,d.maxHeight=e,d.margins=ut.extend({left:0,right:0,top:0,bottom:0},i),d._maxLabelLines=0,d.longestLabelWidth=0,d.longestTextCache=d.longestTextCache||{},d.beforeSetDimensions(),d.setDimensions(),d.afterSetDimensions(),d.beforeDataLimits(),d.determineDataLimits(),d.afterDataLimits(),d.beforeBuildTicks(),s=d.buildTicks()||[],s=d.afterBuildTicks(s)||s,d.beforeTickToLabelConversion(),o=d.convertTicksToLabels(s)||d.ticks,d.afterTickToLabelConversion(),d.ticks=o,n=0,a=o.length;n<a;++n)r=o[n],(l=s[n])?l.label=r:s.push(l={label:r,major:!1});return d._ticks=s,d.beforeCalculateTickRotation(),d.calculateTickRotation(),d.afterCalculateTickRotation(),d.beforeFit(),d.fit(),d.afterFit(),d.afterUpdate(),d.minSize},afterUpdate:function(){ut.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){ut.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){ut.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){ut.callback(this.options.beforeDataLimits,[this])},determineDataLimits:ut.noop,afterDataLimits:function(){ut.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){ut.callback(this.options.beforeBuildTicks,[this])},buildTicks:ut.noop,afterBuildTicks:function(t){var e=this;return ut.isArray(t)&&t.length?ut.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=ut.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){ut.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){ut.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){ut.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t=this,e=t.ctx,i=t.options.ticks,n=hi(t._ticks),a=ut.options._parseFont(i);e.font=a.string;var o=i.minRotation||0;if(n.length&&t.options.display&&t.isHorizontal())for(var r,s=ut.longestText(e,a.string,n,t.longestTextCache),l=s,d=t.getPixelForTick(1)-t.getPixelForTick(0)-6;l>d&&o<i.maxRotation;){var u=ut.toRadians(o);if(r=Math.cos(u),Math.sin(u)*s>t.maxHeight){o--;break}o++,l=r*s}t.labelRotation=o},afterCalculateTickRotation:function(){ut.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){ut.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},i=hi(t._ticks),n=t.options,a=n.ticks,o=n.scaleLabel,r=n.gridLines,s=t._isVisible(),l=n.position,d=t.isHorizontal(),u=ut.options._parseFont,h=u(a),c=n.gridLines.tickMarkLength;if(e.width=d?t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:s&&r.drawTicks?c:0,e.height=d?s&&r.drawTicks?c:0:t.maxHeight,o.display&&s){var f=u(o),g=ut.options.toPadding(o.padding),p=f.lineHeight+g.height;d?e.height+=p:e.width+=p}if(a.display&&s){var m=ut.longestText(t.ctx,h.string,i,t.longestTextCache),v=ut.numberOfLabelLines(i),b=.5*h.size,x=t.options.ticks.padding;if(t._maxLabelLines=v,t.longestLabelWidth=m,d){var y=ut.toRadians(t.labelRotation),k=Math.cos(y),w=Math.sin(y)*m+h.lineHeight*v+b;e.height=Math.min(t.maxHeight,e.height+w+x),t.ctx.font=h.string;var M,_,C=ci(t.ctx,i[0],h.string),S=ci(t.ctx,i[i.length-1],h.string),P=t.getPixelForTick(0)-t.left,I=t.right-t.getPixelForTick(i.length-1);0!==t.labelRotation?(M="bottom"===l?k*C:k*b,_="bottom"===l?k*b:k*S):(M=C/2,_=S/2),t.paddingLeft=Math.max(M-P,0)+3,t.paddingRight=Math.max(_-I,0)+3}else a.mirror?m=0:m+=x+b,e.width=Math.min(t.maxWidth,e.width+m),t.paddingTop=h.size/2,t.paddingBottom=h.size/2}t.handleMargins(),t.width=e.width,t.height=e.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){ut.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(ut.isNullOrUndef(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},getLabelForIndex:ut.noop,getPixelForValue:ut.noop,getValueForPixel:ut.noop,getPixelForTick:function(t){var e=this,i=e.options.offset;if(e.isHorizontal()){var n=(e.width-(e.paddingLeft+e.paddingRight))/Math.max(e._ticks.length-(i?0:1),1),a=n*t+e.paddingLeft;i&&(a+=n/2);var o=e.left+a;return o+=e.isFullWidth()?e.margins.left:0}var r=e.height-(e.paddingTop+e.paddingBottom);return e.top+t*(r/(e._ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var i=(e.width-(e.paddingLeft+e.paddingRight))*t+e.paddingLeft,n=e.left+i;return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,i,n=this,a=n.isHorizontal(),o=n.options.ticks.minor,r=t.length,s=!1,l=o.maxTicksLimit,d=n._tickSize()*(r-1),u=a?n.width-(n.paddingLeft+n.paddingRight):n.height-(n.paddingTop+n.PaddingBottom),h=[];for(d>u&&(s=1+Math.floor(d/u)),r>l&&(s=Math.max(s,1+Math.floor(r/l))),e=0;e<r;e++)i=t[e],s>1&&e%s>0&&delete i.label,h.push(i);return h},_tickSize:function(){var t=this,e=t.isHorizontal(),i=t.options.ticks.minor,n=ut.toRadians(t.labelRotation),a=Math.abs(Math.cos(n)),o=Math.abs(Math.sin(n)),r=i.autoSkipPadding||0,s=t.longestLabelWidth+r||0,l=ut.options._parseFont(i),d=t._maxLabelLines*l.lineHeight+r||0;return e?d*a>s*o?s/a:d/o:d*o<s*a?d/a:s/o},_isVisible:function(){var t,e,i,n=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=n.data.datasets.length;t<e;++t)if(n.isDatasetVisible(t)&&((i=n.getDatasetMeta(t)).xAxisID===this.id||i.yAxisID===this.id))return!0;return!1},draw:function(t){var e=this,i=e.options;if(e._isVisible()){var n,a,o,r=e.chart,s=e.ctx,l=st.global.defaultFontColor,d=i.ticks.minor,u=i.ticks.major||d,h=i.gridLines,c=i.scaleLabel,f=i.position,g=0!==e.labelRotation,p=d.mirror,m=e.isHorizontal(),v=ut.options._parseFont,b=d.display&&d.autoSkip?e._autoSkip(e.getTicks()):e.getTicks(),x=di(d.fontColor,l),y=v(d),k=y.lineHeight,w=di(u.fontColor,l),M=v(u),_=d.padding,C=d.labelOffset,S=h.drawTicks?h.tickMarkLength:0,P=di(c.fontColor,l),I=v(c),A=ut.options.toPadding(c.padding),D=ut.toRadians(e.labelRotation),T=[],F=h.drawBorder?ui(h.lineWidth,0,0):0,L=ut._alignPixel;"top"===f?(n=L(r,e.bottom,F),a=e.bottom-S,o=n-F/2):"bottom"===f?(n=L(r,e.top,F),a=n+F/2,o=e.top+S):"left"===f?(n=L(r,e.right,F),a=e.right-S,o=n-F/2):(n=L(r,e.left,F),a=n+F/2,o=e.left+S);if(ut.each(b,function(n,s){if(!ut.isNullOrUndef(n.label)){var l,d,u,c,v,b,x,y,w,M,P,I,A,R,O,z,B=n.label;s===e.zeroLineIndex&&i.offset===h.offsetGridLines?(l=h.zeroLineWidth,d=h.zeroLineColor,u=h.zeroLineBorderDash||[],c=h.zeroLineBorderDashOffset||0):(l=ui(h.lineWidth,s),d=ui(h.color,s),u=h.borderDash||[],c=h.borderDashOffset||0);var N=ut.isArray(B)?B.length:1,W=function(t,e,i){var n=t.getPixelForTick(e);return i&&(1===t.getTicks().length?n-=t.isHorizontal()?Math.max(n-t.left,t.right-n):Math.max(n-t.top,t.bottom-n):n-=0===e?(t.getPixelForTick(1)-n)/2:(n-t.getPixelForTick(e-1))/2),n}(e,s,h.offsetGridLines);if(m){var V=S+_;W<e.left-1e-7&&(d="rgba(0,0,0,0)"),v=x=w=P=L(r,W,l),b=a,y=o,A=e.getPixelForTick(s)+C,"top"===f?(M=L(r,t.top,F)+F/2,I=t.bottom,O=((g?1:.5)-N)*k,z=g?"left":"center",R=e.bottom-V):(M=t.top,I=L(r,t.bottom,F)-F/2,O=(g?0:.5)*k,z=g?"right":"center",R=e.top+V)}else{var E=(p?0:S)+_;W<e.top-1e-7&&(d="rgba(0,0,0,0)"),v=a,x=o,b=y=M=I=L(r,W,l),R=e.getPixelForTick(s)+C,O=(1-N)*k/2,"left"===f?(w=L(r,t.left,F)+F/2,P=t.right,z=p?"left":"right",A=e.right-E):(w=t.left,P=L(r,t.right,F)-F/2,z=p?"right":"left",A=e.left+E)}T.push({tx1:v,ty1:b,tx2:x,ty2:y,x1:w,y1:M,x2:P,y2:I,labelX:A,labelY:R,glWidth:l,glColor:d,glBorderDash:u,glBorderDashOffset:c,rotation:-1*D,label:B,major:n.major,textOffset:O,textAlign:z})}}),ut.each(T,function(t){var e=t.glWidth,i=t.glColor;if(h.display&&e&&i&&(s.save(),s.lineWidth=e,s.strokeStyle=i,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),h.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),h.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=t.major?M.string:y.string,s.fillStyle=t.major?w:x,s.textBaseline="middle",s.textAlign=t.textAlign;var n=t.label,a=t.textOffset;if(ut.isArray(n))for(var o=0;o<n.length;++o)s.fillText(""+n[o],0,a),a+=k;else s.fillText(n,0,a);s.restore()}}),c.display){var R,O,z=0,B=I.lineHeight/2;if(m)R=e.left+(e.right-e.left)/2,O="bottom"===f?e.bottom-B-A.bottom:e.top+B+A.top;else{var N="left"===f;R=N?e.left+B+A.top:e.right-B-A.top,O=e.top+(e.bottom-e.top)/2,z=N?-.5*Math.PI:.5*Math.PI}s.save(),s.translate(R,O),s.rotate(z),s.textAlign="center",s.textBaseline="middle",s.fillStyle=P,s.font=I.string,s.fillText(c.labelString,0,0),s.restore()}if(F){var W,V,E,H,j=F,q=ui(h.lineWidth,b.length-1,0);m?(W=L(r,e.left,j)-j/2,V=L(r,e.right,q)+q/2,E=H=n):(E=L(r,e.top,j)-j/2,H=L(r,e.bottom,q)+q/2,W=V=n),s.lineWidth=F,s.strokeStyle=ui(h.color,0),s.beginPath(),s.moveTo(W,E),s.lineTo(V,H),s.stroke()}}}}),gi=fi.extend({getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t,e=this,i=e.getLabels();e.minIndex=0,e.maxIndex=i.length-1,void 0!==e.options.ticks.min&&(t=i.indexOf(e.options.ticks.min),e.minIndex=-1!==t?t:e.minIndex),void 0!==e.options.ticks.max&&(t=i.indexOf(e.options.ticks.max),e.maxIndex=-1!==t?t:e.maxIndex),e.min=i[e.minIndex],e.max=i[e.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var i=this,n=i.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===i.id?i.getRightValue(n.data.datasets[e].data[t]):i.ticks[t-i.minIndex]},getPixelForValue:function(t,e){var i,n=this,a=n.options.offset,o=Math.max(n.maxIndex+1-n.minIndex-(a?0:1),1);if(null!=t&&(i=n.isHorizontal()?t.x:t.y),void 0!==i||void 0!==t&&isNaN(e)){t=i||t;var r=n.getLabels().indexOf(t);e=-1!==r?r:e}if(n.isHorizontal()){var s=n.width/o,l=s*(e-n.minIndex);return a&&(l+=s/2),n.left+l}var d=n.height/o,u=d*(e-n.minIndex);return a&&(u+=d/2),n.top+u},getPixelForTick:function(t){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null)},getValueForPixel:function(t){var e=this,i=e.options.offset,n=Math.max(e._ticks.length-(i?0:1),1),a=e.isHorizontal(),o=(a?e.width:e.height)/n;return t-=a?e.left:e.top,i&&(t-=o/2),(t<=0?0:Math.round(t/o))+e.minIndex},getBasePixel:function(){return this.bottom}}),pi={position:"bottom"};gi._defaults=pi;var mi=ut.noop,vi=ut.isNullOrUndef;var bi=fi.extend({getRightValue:function(t){return"string"==typeof t?+t:fi.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var i=ut.sign(t.min),n=ut.sign(t.max);i<0&&n<0?t.max=0:i>0&&n>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,o=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==o&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,i=e.stepSize,n=e.maxTicksLimit;return i?t=Math.ceil(this.max/i)-Math.floor(this.min/i)+1:(t=this._computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:mi,buildTicks:function(){var t=this,e=t.options.ticks,i=t.getTickLimit(),n={maxTicks:i=Math.max(2,i),min:e.min,max:e.max,precision:e.precision,stepSize:ut.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var i,n,a,o,r=[],s=t.stepSize,l=s||1,d=t.maxTicks-1,u=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=ut.niceNum((g-f)/d/l)*l;if(p<1e-14&&vi(u)&&vi(h))return[f,g];(o=Math.ceil(g/p)-Math.floor(f/p))>d&&(p=ut.niceNum(o*p/d/l)*l),s||vi(c)?i=Math.pow(10,ut._decimalPlaces(p)):(i=Math.pow(10,c),p=Math.ceil(p*i)/i),n=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!vi(u)&&ut.almostWhole(u/p,p/1e3)&&(n=u),!vi(h)&&ut.almostWhole(h/p,p/1e3)&&(a=h)),o=(a-n)/p,o=ut.almostEquals(o,Math.round(o),p/1e3)?Math.round(o):Math.ceil(o),n=Math.round(n*i)/i,a=Math.round(a*i)/i,r.push(vi(u)?n:u);for(var m=1;m<o;++m)r.push(Math.round((n+m*p)*i)/i);return r.push(vi(h)?a:h),r}(n,t);t.handleDirectionalChanges(),t.max=ut.max(a),t.min=ut.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),fi.prototype.convertTicksToLabels.call(t)}}),xi={position:"left",ticks:{callback:li.formatters.linear}},yi=bi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");void 0===s[l]&&(s[l]={positiveValues:[],negativeValues:[]});var d=s[l].positiveValues,u=s[l].negativeValues;i.isDatasetVisible(a)&&o(r)&&ut.each(n.data,function(i,n){var a=+t.getRightValue(i);isNaN(a)||r.data[n].hidden||(d[n]=d[n]||0,u[n]=u[n]||0,e.relativePoints?d[n]=100:a<0?u[n]+=a:d[n]+=a)})}),ut.each(s,function(e){var i=e.positiveValues.concat(e.negativeValues),n=ut.min(i),a=ut.max(i);t.min=null===t.min?n:Math.min(t.min,n),t.max=null===t.max?a:Math.max(t.max,a)})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n))})});t.min=isFinite(t.min)&&!isNaN(t.min)?t.min:0,t.max=isFinite(t.max)&&!isNaN(t.max)?t.max:1,this.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=ut.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e=this,i=e.start,n=+e.getRightValue(t),a=e.end-i;return e.isHorizontal()?e.left+e.width/a*(n-i):e.bottom-e.height/a*(n-i)},getValueForPixel:function(t){var e=this,i=e.isHorizontal(),n=i?e.width:e.height,a=(i?t-e.left:e.bottom-t)/n;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}}),ki=xi;yi._defaults=ki;var wi=ut.valueOrDefault;var Mi={position:"left",ticks:{callback:li.formatters.logarithmic}};function _i(t,e){return ut.isFinite(t)&&t>=0?t:e}var Ci=fi.extend({determineDataLimits:function(){var t=this,e=t.options,i=t.chart,n=i.data.datasets,a=t.isHorizontal();function o(e){return a?e.xAxisID===t.id:e.yAxisID===t.id}t.min=null,t.max=null,t.minNotZero=null;var r=e.stacked;if(void 0===r&&ut.each(n,function(t,e){if(!r){var n=i.getDatasetMeta(e);i.isDatasetVisible(e)&&o(n)&&void 0!==n.stack&&(r=!0)}}),e.stacked||r){var s={};ut.each(n,function(n,a){var r=i.getDatasetMeta(a),l=[r.type,void 0===e.stacked&&void 0===r.stack?a:"",r.stack].join(".");i.isDatasetVisible(a)&&o(r)&&(void 0===s[l]&&(s[l]=[]),ut.each(n.data,function(e,i){var n=s[l],a=+t.getRightValue(e);isNaN(a)||r.data[i].hidden||a<0||(n[i]=n[i]||0,n[i]+=a)}))}),ut.each(s,function(e){if(e.length>0){var i=ut.min(e),n=ut.max(e);t.min=null===t.min?i:Math.min(t.min,i),t.max=null===t.max?n:Math.max(t.max,n)}})}else ut.each(n,function(e,n){var a=i.getDatasetMeta(n);i.isDatasetVisible(n)&&o(a)&&ut.each(e.data,function(e,i){var n=+t.getRightValue(e);isNaN(n)||a.data[i].hidden||n<0||(null===t.min?t.min=n:n<t.min&&(t.min=n),null===t.max?t.max=n:n>t.max&&(t.max=n),0!==n&&(null===t.minNotZero||n<t.minNotZero)&&(t.minNotZero=n))})});this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=_i(e.min,t.min),t.max=_i(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(ut.log10(t.min))-1),t.max=Math.pow(10,Math.floor(ut.log10(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(ut.log10(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(ut.log10(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(ut.log10(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,i=!t.isHorizontal(),n={min:_i(e.min),max:_i(e.max)},a=t.ticks=function(t,e){var i,n,a=[],o=wi(t.min,Math.pow(10,Math.floor(ut.log10(e.min)))),r=Math.floor(ut.log10(e.max)),s=Math.ceil(e.max/Math.pow(10,r));0===o?(i=Math.floor(ut.log10(e.minNotZero)),n=Math.floor(e.minNotZero/Math.pow(10,i)),a.push(o),o=n*Math.pow(10,i)):(i=Math.floor(ut.log10(o)),n=Math.floor(o/Math.pow(10,i)));var l=i<0?Math.pow(10,Math.abs(i)):1;do{a.push(o),10==++n&&(n=1,l=++i>=0?1:l),o=Math.round(n*Math.pow(10,i)*l)/l}while(i<r||i===r&&n<s);var d=wi(t.max,o);return a.push(d),a}(n,t);t.max=ut.max(a),t.min=ut.min(a),e.reverse?(i=!i,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),i&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),fi.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){return this.getPixelForValue(this.tickValues[t])},_getFirstTickValue:function(t){var e=Math.floor(ut.log10(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},getPixelForValue:function(t){var e,i,n,a,o,r=this,s=r.options.ticks,l=s.reverse,d=ut.log10,u=r._getFirstTickValue(r.minNotZero),h=0;return t=+r.getRightValue(t),l?(n=r.end,a=r.start,o=-1):(n=r.start,a=r.end,o=1),r.isHorizontal()?(e=r.width,i=l?r.right:r.left):(e=r.height,o*=-1,i=l?r.top:r.bottom),t!==n&&(0===n&&(e-=h=wi(s.fontSize,st.global.defaultFontSize),n=u),0!==t&&(h+=e/(d(a)-d(n))*(d(t)-d(n))),i+=o*h),i},getValueForPixel:function(t){var e,i,n,a,o=this,r=o.options.ticks,s=r.reverse,l=ut.log10,d=o._getFirstTickValue(o.minNotZero);if(s?(i=o.end,n=o.start):(i=o.start,n=o.end),o.isHorizontal()?(e=o.width,a=s?o.right-t:t-o.left):(e=o.height,a=s?t-o.top:o.bottom-t),a!==i){if(0===i){var u=wi(r.fontSize,st.global.defaultFontSize);a-=u,e-=u,i=d}a*=l(n)-l(i),a/=e,a=Math.pow(10,l(i)+a)}return a}}),Si=Mi;Ci._defaults=Si;var Pi=ut.valueOrDefault,Ii=ut.valueAtIndexOrDefault,Ai=ut.options.resolve,Di={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0, 0, 0, 0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:li.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Ti(t){var e=t.options;return e.angleLines.display||e.pointLabels.display?t.chart.data.labels.length:0}function Fi(t){var e=t.ticks;return e.display&&t.display?Pi(e.fontSize,st.global.defaultFontSize)+2*e.backdropPaddingY:0}function Li(t,e,i,n,a){return t===n||t===a?{start:e-i/2,end:e+i/2}:t<n||t>a?{start:e-i,end:e}:{start:e,end:e+i}}function Ri(t){return 0===t||180===t?"center":t<180?"left":"right"}function Oi(t,e,i,n){var a,o,r=i.y+n/2;if(ut.isArray(e))for(a=0,o=e.length;a<o;++a)t.fillText(e[a],i.x,r),r+=n;else t.fillText(e,i.x,r)}function zi(t,e,i){90===t||270===t?i.y-=e.h/2:(t>270||t<90)&&(i.y-=e.h)}function Bi(t){return ut.isNumber(t)?t:0}var Ni=bi.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Fi(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,i=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;ut.each(e.data.datasets,function(a,o){if(e.isDatasetVisible(o)){var r=e.getDatasetMeta(o);ut.each(a.data,function(e,a){var o=+t.getRightValue(e);isNaN(o)||r.data[a].hidden||(i=Math.min(o,i),n=Math.max(o,n))})}}),t.min=i===Number.POSITIVE_INFINITY?0:i,t.max=n===Number.NEGATIVE_INFINITY?0:n,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Fi(this.options))},convertTicksToLabels:function(){var t=this;bi.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map(t.options.pointLabels.callback,t)},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,i,n,a=ut.options._parseFont(t.options.pointLabels),o={l:0,r:t.width,t:0,b:t.height-t.paddingTop},r={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,d,u=Ti(t);for(e=0;e<u;e++){n=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,d=t.pointLabels[e]||"",i=ut.isArray(d)?{w:ut.longestText(s,s.font,d),h:d.length*l}:{w:s.measureText(d).width,h:l},t._pointLabelSizes[e]=i;var h=t.getIndexAngle(e),c=ut.toDegrees(h)%360,f=Li(c,n.x,i.w,0,180),g=Li(c,n.y,i.h,90,270);f.start<o.l&&(o.l=f.start,r.l=h),f.end>o.r&&(o.r=f.end,r.r=h),g.start<o.t&&(o.t=g.start,r.t=h),g.end>o.b&&(o.b=g.end,r.b=h)}t.setReductions(t.drawingArea,o,r)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,i){var n=this,a=e.l/Math.sin(i.l),o=Math.max(e.r-n.width,0)/Math.sin(i.r),r=-e.t/Math.cos(i.t),s=-Math.max(e.b-(n.height-n.paddingTop),0)/Math.cos(i.b);a=Bi(a),o=Bi(o),r=Bi(r),s=Bi(s),n.drawingArea=Math.min(Math.floor(t-(a+o)/2),Math.floor(t-(r+s)/2)),n.setCenterPoint(a,o,r,s)},setCenterPoint:function(t,e,i,n){var a=this,o=a.width-e-a.drawingArea,r=t+a.drawingArea,s=i+a.drawingArea,l=a.height-a.paddingTop-n-a.drawingArea;a.xCenter=Math.floor((r+o)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){return t*(2*Math.PI/Ti(this))+(this.chart.options&&this.chart.options.startAngle?this.chart.options.startAngle:0)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(null===t)return 0;var i=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*i:(t-e.min)*i},getPointPosition:function(t,e){var i=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(i)*e+this.xCenter,y:Math.sin(i)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(){var t=this.min,e=this.max;return this.getPointPositionForValue(0,this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0)},draw:function(){var t=this,e=t.options,i=e.gridLines,n=e.ticks;if(e.display){var a=t.ctx,o=this.getIndexAngle(0),r=ut.options._parseFont(n);(e.angleLines.display||e.pointLabels.display)&&function(t){var e=t.ctx,i=t.options,n=i.angleLines,a=i.gridLines,o=i.pointLabels,r=Pi(n.lineWidth,a.lineWidth),s=Pi(n.color,a.color),l=Fi(i);e.save(),e.lineWidth=r,e.strokeStyle=s,e.setLineDash&&(e.setLineDash(Ai([n.borderDash,a.borderDash,[]])),e.lineDashOffset=Ai([n.borderDashOffset,a.borderDashOffset,0]));var d=t.getDistanceFromCenterForValue(i.ticks.reverse?t.min:t.max),u=ut.options._parseFont(o);e.font=u.string,e.textBaseline="middle";for(var h=Ti(t)-1;h>=0;h--){if(n.display&&r&&s){var c=t.getPointPosition(h,d);e.beginPath(),e.moveTo(t.xCenter,t.yCenter),e.lineTo(c.x,c.y),e.stroke()}if(o.display){var f=0===h?l/2:0,g=t.getPointPosition(h,d+f+5),p=Ii(o.fontColor,h,st.global.defaultFontColor);e.fillStyle=p;var m=t.getIndexAngle(h),v=ut.toDegrees(m);e.textAlign=Ri(v),zi(v,t._pointLabelSizes[h],g),Oi(e,t.pointLabels[h]||"",g,u.lineHeight)}}e.restore()}(t),ut.each(t.ticks,function(e,s){if(s>0||n.reverse){var l=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]);if(i.display&&0!==s&&function(t,e,i,n){var a,o=t.ctx,r=e.circular,s=Ti(t),l=Ii(e.color,n-1),d=Ii(e.lineWidth,n-1);if((r||s)&&l&&d){if(o.save(),o.strokeStyle=l,o.lineWidth=d,o.setLineDash&&(o.setLineDash(e.borderDash||[]),o.lineDashOffset=e.borderDashOffset||0),o.beginPath(),r)o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI);else{a=t.getPointPosition(0,i),o.moveTo(a.x,a.y);for(var u=1;u<s;u++)a=t.getPointPosition(u,i),o.lineTo(a.x,a.y)}o.closePath(),o.stroke(),o.restore()}}(t,i,l,s),n.display){var d=Pi(n.fontColor,st.global.defaultFontColor);if(a.font=r.string,a.save(),a.translate(t.xCenter,t.yCenter),a.rotate(o),n.showLabelBackdrop){var u=a.measureText(e).width;a.fillStyle=n.backdropColor,a.fillRect(-u/2-n.backdropPaddingX,-l-r.size/2-n.backdropPaddingY,u+2*n.backdropPaddingX,r.size+2*n.backdropPaddingY)}a.textAlign="center",a.textBaseline="middle",a.fillStyle=d,a.fillText(e,0,-l),a.restore()}}})}}}),Wi=Di;Ni._defaults=Wi;var Vi=ut.valueOrDefault,Ei=Number.MIN_SAFE_INTEGER||-9007199254740991,Hi=Number.MAX_SAFE_INTEGER||9007199254740991,ji={millisecond:{common:!0,size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{common:!0,size:1e3,steps:[1,2,5,10,15,30]},minute:{common:!0,size:6e4,steps:[1,2,5,10,15,30]},hour:{common:!0,size:36e5,steps:[1,2,3,6,12]},day:{common:!0,size:864e5,steps:[1,2,5]},week:{common:!1,size:6048e5,steps:[1,2,3,4]},month:{common:!0,size:2628e6,steps:[1,2,3]},quarter:{common:!1,size:7884e6,steps:[1,2,3,4]},year:{common:!0,size:3154e7}},qi=Object.keys(ji);function Yi(t,e){return t-e}function Ui(t){var e,i,n,a={},o=[];for(e=0,i=t.length;e<i;++e)a[n=t[e]]||(a[n]=!0,o.push(n));return o}function Xi(t,e,i,n){var a=function(t,e,i){for(var n,a,o,r=0,s=t.length-1;r>=0&&r<=s;){if(a=t[(n=r+s>>1)-1]||null,o=t[n],!a)return{lo:null,hi:o};if(o[e]<i)r=n+1;else{if(!(a[e]>i))return{lo:a,hi:o};s=n-1}}return{lo:o,hi:null}}(t,e,i),o=a.lo?a.hi?a.lo:t[t.length-2]:t[0],r=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=r[e]-o[e],l=s?(i-o[e])/s:0,d=(r[n]-o[n])*l;return o[n]+d}function Ki(t,e){var i=t._adapter,n=t.options.time,a=n.parser,o=a||n.format,r=e;return"function"==typeof a&&(r=a(r)),ut.isFinite(r)||(r="string"==typeof o?i.parse(r,o):i.parse(r)),null!==r?+r:(a||"function"!=typeof o||(r=o(e),ut.isFinite(r)||(r=i.parse(r))),r)}function Gi(t,e){if(ut.isNullOrUndef(e))return null;var i=t.options.time,n=Ki(t,t.getRightValue(e));return null===n?n:(i.round&&(n=+t._adapter.startOf(n,i.round)),n)}function Zi(t){for(var e=qi.indexOf(t)+1,i=qi.length;e<i;++e)if(ji[qi[e]].common)return qi[e]}function $i(t,e,i,n){var a,o=t._adapter,r=t.options,s=r.time,l=s.unit||function(t,e,i,n){var a,o,r,s=qi.length;for(a=qi.indexOf(t);a<s-1;++a)if(r=(o=ji[qi[a]]).steps?o.steps[o.steps.length-1]:Hi,o.common&&Math.ceil((i-e)/(r*o.size))<=n)return qi[a];return qi[s-1]}(s.minUnit,e,i,n),d=Zi(l),u=Vi(s.stepSize,s.unitStepSize),h="week"===l&&s.isoWeekday,c=r.ticks.major.enabled,f=ji[l],g=e,p=i,m=[];for(u||(u=function(t,e,i,n){var a,o,r,s=e-t,l=ji[i],d=l.size,u=l.steps;if(!u)return Math.ceil(s/(n*d));for(a=0,o=u.length;a<o&&(r=u[a],!(Math.ceil(s/(d*r))<=n));++a);return r}(e,i,l,n)),h&&(g=+o.startOf(g,"isoWeek",h),p=+o.startOf(p,"isoWeek",h)),g=+o.startOf(g,h?"day":l),(p=+o.startOf(p,h?"day":l))<i&&(p=+o.add(p,1,l)),a=g,c&&d&&!h&&!s.round&&(a=+o.startOf(a,d),a=+o.add(a,~~((g-a)/(f.size*u))*u,l));a<p;a=+o.add(a,u,l))m.push(+a);return m.push(+a),m}var Ji=fi.extend({initialize:function(){this.mergeTicksOptions(),fi.prototype.initialize.call(this)},update:function(){var t=this.options,e=t.time||(t.time={}),i=this._adapter=new si._date(t.adapters.date);return e.format&&console.warn("options.time.format is deprecated and replaced by options.time.parser."),ut.mergeIf(e.displayFormats,i.formats()),fi.prototype.update.apply(this,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),fi.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,i,n,a,o,r=this,s=r.chart,l=r._adapter,d=r.options.time,u=d.unit||"day",h=Hi,c=Ei,f=[],g=[],p=[],m=s.data.labels||[];for(t=0,i=m.length;t<i;++t)p.push(Gi(r,m[t]));for(t=0,i=(s.data.datasets||[]).length;t<i;++t)if(s.isDatasetVisible(t))if(a=s.data.datasets[t].data,ut.isObject(a[0]))for(g[t]=[],e=0,n=a.length;e<n;++e)o=Gi(r,a[e]),f.push(o),g[t][e]=o;else{for(e=0,n=p.length;e<n;++e)f.push(p[e]);g[t]=p.slice(0)}else g[t]=[];p.length&&(p=Ui(p).sort(Yi),h=Math.min(h,p[0]),c=Math.max(c,p[p.length-1])),f.length&&(f=Ui(f).sort(Yi),h=Math.min(h,f[0]),c=Math.max(c,f[f.length-1])),h=Gi(r,d.min)||h,c=Gi(r,d.max)||c,h=h===Hi?+l.startOf(Date.now(),u):h,c=c===Ei?+l.endOf(Date.now(),u)+1:c,r.min=Math.min(h,c),r.max=Math.max(h+1,c),r._horizontal=r.isHorizontal(),r._table=[],r._timestamps={data:f,datasets:g,labels:p}},buildTicks:function(){var t,e,i,n=this,a=n.min,o=n.max,r=n.options,s=r.time,l=[],d=[];switch(r.ticks.source){case"data":l=n._timestamps.data;break;case"labels":l=n._timestamps.labels;break;case"auto":default:l=$i(n,a,o,n.getLabelCapacity(a))}for("ticks"===r.bounds&&l.length&&(a=l[0],o=l[l.length-1]),a=Gi(n,s.min)||a,o=Gi(n,s.max)||o,t=0,e=l.length;t<e;++t)(i=l[t])>=a&&i<=o&&d.push(i);return n.min=a,n.max=o,n._unit=s.unit||function(t,e,i,n,a){var o,r;for(o=qi.length-1;o>=qi.indexOf(i);o--)if(r=qi[o],ji[r].common&&t._adapter.diff(a,n,r)>=e.length)return r;return qi[i?qi.indexOf(i):0]}(n,d,s.minUnit,n.min,n.max),n._majorUnit=Zi(n._unit),n._table=function(t,e,i,n){if("linear"===n||!t.length)return[{time:e,pos:0},{time:i,pos:1}];var a,o,r,s,l,d=[],u=[e];for(a=0,o=t.length;a<o;++a)(s=t[a])>e&&s<i&&u.push(s);for(u.push(i),a=0,o=u.length;a<o;++a)l=u[a+1],r=u[a-1],s=u[a],void 0!==r&&void 0!==l&&Math.round((l+r)/2)===s||d.push({time:s,pos:a/(o-1)});return d}(n._timestamps.data,a,o,r.distribution),n._offsets=function(t,e,i,n,a){var o,r,s=0,l=0;return a.offset&&e.length&&(a.time.min||(o=Xi(t,"time",e[0],"pos"),s=1===e.length?1-o:(Xi(t,"time",e[1],"pos")-o)/2),a.time.max||(r=Xi(t,"time",e[e.length-1],"pos"),l=1===e.length?r:(r-Xi(t,"time",e[e.length-2],"pos"))/2)),{start:s,end:l}}(n._table,d,0,0,r),r.ticks.reverse&&d.reverse(),function(t,e,i){var n,a,o,r,s=[];for(n=0,a=e.length;n<a;++n)o=e[n],r=!!i&&o===+t._adapter.startOf(o,i),s.push({value:o,major:r});return s}(n,d,n._majorUnit)},getLabelForIndex:function(t,e){var i=this,n=i._adapter,a=i.chart.data,o=i.options.time,r=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return ut.isObject(s)&&(r=i.getRightValue(s)),o.tooltipFormat?n.format(Ki(i,r),o.tooltipFormat):"string"==typeof r?r:n.format(Ki(i,r),o.displayFormats.datetime)},tickFormatFunction:function(t,e,i,n){var a=this._adapter,o=this.options,r=o.time.displayFormats,s=r[this._unit],l=this._majorUnit,d=r[l],u=+a.startOf(t,l),h=o.ticks.major,c=h.enabled&&l&&d&&t===u,f=a.format(t,n||(c?d:s)),g=c?h:o.ticks.minor,p=Vi(g.callback,g.userCallback);return p?p(f,e,i):f},convertTicksToLabels:function(t){var e,i,n=[];for(e=0,i=t.length;e<i;++e)n.push(this.tickFormatFunction(t[e].value,e,t));return n},getPixelForOffset:function(t){var e=this,i=e.options.ticks.reverse,n=e._horizontal?e.width:e.height,a=e._horizontal?i?e.right:e.left:i?e.bottom:e.top,o=Xi(e._table,"time",t,"pos"),r=n*(e._offsets.start+o)/(e._offsets.start+1+e._offsets.end);return i?a-r:a+r},getPixelForValue:function(t,e,i){var n=null;if(void 0!==e&&void 0!==i&&(n=this._timestamps.datasets[i][e]),null===n&&(n=Gi(this,t)),null!==n)return this.getPixelForOffset(n)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this,i=e._horizontal?e.width:e.height,n=e._horizontal?e.left:e.top,a=(i?(t-n)/i:0)*(e._offsets.start+1+e._offsets.start)-e._offsets.end,o=Xi(e._table,"pos",a,"time");return e._adapter._create(o)},getLabelWidth:function(t){var e=this.options.ticks,i=this.ctx.measureText(t).width,n=ut.toRadians(e.maxRotation),a=Math.cos(n),o=Math.sin(n);return i*a+Vi(e.fontSize,st.global.defaultFontSize)*o},getLabelCapacity:function(t){var e=this,i=e.options.time.displayFormats.millisecond,n=e.tickFormatFunction(t,0,[],i),a=e.getLabelWidth(n),o=e.isHorizontal()?e.width:e.height,r=Math.floor(o/a);return r>0?r:1}}),Qi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};Ji._defaults=Qi;var tn={category:gi,linear:yi,logarithmic:Ci,radialLinear:Ni,time:Ji},en={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};si._date.override("function"==typeof t?{_id:"moment",formats:function(){return en},parse:function(e,i){return"string"==typeof e&&"string"==typeof i?e=t(e,i):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,i){return t(e).format(i)},add:function(e,i,n){return t(e).add(i,n).valueOf()},diff:function(e,i,n){return t.duration(t(e).diff(t(i))).as(n)},startOf:function(e,i,n){return e=t(e),"isoWeek"===i?e.isoWeekday(n).valueOf():e.startOf(i).valueOf()},endOf:function(e,i){return t(e).endOf(i).valueOf()},_create:function(e){return t(e)}}:{}),st._set("global",{plugins:{filler:{propagate:!0}}});var nn={dataset:function(t){var e=t.fill,i=t.chart,n=i.getDatasetMeta(e),a=n&&i.isDatasetVisible(e)&&n.dataset._children||[],o=a.length||0;return o?function(t,e){return e<o&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,i=e?e.x:null,n=e?e.y:null;return function(t){return{x:null===i?t.x:i,y:null===n?t.y:n}}}};function an(t,e,i){var n,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),!1===o||null===o)return!1;if(!0===o)return"origin";if(n=parseFloat(o,10),isFinite(n)&&Math.floor(n)===n)return"-"!==o[0]&&"+"!==o[0]||(n=e+n),!(n===e||n<0||n>=i)&&n;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function on(t){var e,i=t.el._model||{},n=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===i.scaleBottom?n.bottom:i.scaleBottom:"end"===a?o=void 0===i.scaleTop?n.top:i.scaleTop:void 0!==i.scaleZero?o=i.scaleZero:n.getBasePosition?o=n.getBasePosition():n.getBasePixel&&(o=n.getBasePixel()),null!=o){if(void 0!==o.x&&void 0!==o.y)return o;if(ut.isFinite(o))return{x:(e=n.isHorizontal())?o:null,y:e?null:o}}return null}function rn(t,e,i){var n,a=t[e].fill,o=[e];if(!i)return a;for(;!1!==a&&-1===o.indexOf(a);){if(!isFinite(a))return a;if(!(n=t[a]))return!1;if(n.visible)return a;o.push(a),a=n.fill}return!1}function sn(t){var e=t.fill,i="dataset";return!1===e?null:(isFinite(e)||(i="boundary"),nn[i](t))}function ln(t){return t&&!t.skip}function dn(t,e,i,n,a){var o;if(n&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o<n;++o)ut.canvas.lineTo(t,e[o-1],e[o]);for(t.lineTo(i[a-1].x,i[a-1].y),o=a-1;o>0;--o)ut.canvas.lineTo(t,i[o],i[o-1],!0)}}var un={id:"filler",afterDatasetsUpdate:function(t,e){var i,n,a,o,r=(t.data.datasets||[]).length,s=e.propagate,l=[];for(n=0;n<r;++n)o=null,(a=(i=t.getDatasetMeta(n)).dataset)&&a._model&&a instanceof Wt.Line&&(o={visible:t.isDatasetVisible(n),fill:an(a,n,r),chart:t,el:a}),i.$filler=o,l.push(o);for(n=0;n<r;++n)(o=l[n])&&(o.fill=rn(l,n,s),o.boundary=on(o),o.mapper=sn(o))},beforeDatasetDraw:function(t,e){var i=e.meta.$filler;if(i){var n=t.ctx,a=i.el,o=a._view,r=a._children||[],s=i.mapper,l=o.backgroundColor||st.global.defaultColor;s&&l&&r.length&&(ut.canvas.clipArea(n,t.chartArea),function(t,e,i,n,a,o){var r,s,l,d,u,h,c,f=e.length,g=n.spanGaps,p=[],m=[],v=0,b=0;for(t.beginPath(),r=0,s=f+!!o;r<s;++r)u=i(d=e[l=r%f]._view,l,n),h=ln(d),c=ln(u),h&&c?(v=p.push(d),b=m.push(u)):v&&b&&(g?(h&&p.push(d),c&&m.push(u)):(dn(t,p,m,v,b),v=b=0,p=[],m=[]));dn(t,p,m,v,b),t.closePath(),t.fillStyle=a,t.fill()}(n,r,s,o,l,a._loop),ut.canvas.unclipArea(n))}}},hn=ut.noop,cn=ut.valueOrDefault;function fn(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}st._set("global",{legend:{display:!0,position:"top",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var i=e.datasetIndex,n=this.chart,a=n.getDatasetMeta(i);a.hidden=null===a.hidden?!n.data.datasets[i].hidden:null,n.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return ut.isArray(e.datasets)?e.datasets.map(function(e,i){return{text:e.label,fillStyle:ut.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(i),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:i}},this):[]}}},legendCallback:function(t){var e=[];e.push('<ul class="'+t.id+'-legend">');for(var i=0;i<t.data.datasets.length;i++)e.push('<li><span style="background-color:'+t.data.datasets[i].backgroundColor+'"></span>'),t.data.datasets[i].label&&e.push(t.data.datasets[i].label),e.push("</li>");return e.push("</ul>"),e.join("")}});var gn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:hn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:hn,beforeSetDimensions:hn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:hn,beforeBuildLabels:hn,buildLabels:function(){var t=this,e=t.options.labels||{},i=ut.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(i=i.filter(function(i){return e.filter(i,t.chart.data)})),t.options.reverse&&i.reverse(),t.legendItems=i},afterBuildLabels:hn,beforeFit:hn,fit:function(){var t=this,e=t.options,i=e.labels,n=e.display,a=t.ctx,o=ut.options._parseFont(i),r=o.size,s=t.legendHitBoxes=[],l=t.minSize,d=t.isHorizontal();if(d?(l.width=t.maxWidth,l.height=n?10:0):(l.width=n?10:0,l.height=t.maxHeight),n)if(a.font=o.string,d){var u=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="top",ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;(0===e||u[u.length-1]+n+i.padding>l.width)&&(h+=r+i.padding,u[u.length-(e>0?0:1)]=i.padding),s[e]={left:0,top:0,width:n,height:r},u[u.length-1]+=n+i.padding}),l.height+=h}else{var c=i.padding,f=t.columnWidths=[],g=i.padding,p=0,m=0,v=r+c;ut.each(t.legendItems,function(t,e){var n=fn(i,r)+r/2+a.measureText(t.text).width;e>0&&m+v>l.height-c&&(g+=p+i.padding,f.push(p),p=0,m=0),p=Math.max(p,n),m+=v,s[e]={left:0,top:0,width:n,height:r}}),g+=p,f.push(p),l.width+=g}t.width=l.width,t.height=l.height},afterFit:hn,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,i=e.labels,n=st.global,a=n.defaultColor,o=n.elements.line,r=t.width,s=t.lineWidths;if(e.display){var l,d=t.ctx,u=cn(i.fontColor,n.defaultFontColor),h=ut.options._parseFont(i),c=h.size;d.textAlign="left",d.textBaseline="middle",d.lineWidth=.5,d.strokeStyle=u,d.fillStyle=u,d.font=h.string;var f=fn(i,c),g=t.legendHitBoxes,p=t.isHorizontal();l=p?{x:t.left+(r-s[0])/2+i.padding,y:t.top+i.padding,line:0}:{x:t.left+i.padding,y:t.top+i.padding,line:0};var m=c+i.padding;ut.each(t.legendItems,function(n,u){var h=d.measureText(n.text).width,v=f+c/2+h,b=l.x,x=l.y;p?u>0&&b+v+i.padding>t.left+t.minSize.width&&(x=l.y+=m,l.line++,b=l.x=t.left+(r-s[l.line])/2+i.padding):u>0&&x+m>t.top+t.minSize.height&&(b=l.x=b+t.columnWidths[l.line]+i.padding,x=l.y=t.top+i.padding,l.line++),function(t,i,n){if(!(isNaN(f)||f<=0)){d.save();var r=cn(n.lineWidth,o.borderWidth);if(d.fillStyle=cn(n.fillStyle,a),d.lineCap=cn(n.lineCap,o.borderCapStyle),d.lineDashOffset=cn(n.lineDashOffset,o.borderDashOffset),d.lineJoin=cn(n.lineJoin,o.borderJoinStyle),d.lineWidth=r,d.strokeStyle=cn(n.strokeStyle,a),d.setLineDash&&d.setLineDash(cn(n.lineDash,o.borderDash)),e.labels&&e.labels.usePointStyle){var s=f*Math.SQRT2/2,l=t+f/2,u=i+c/2;ut.canvas.drawPoint(d,n.pointStyle,s,l,u)}else 0!==r&&d.strokeRect(t,i,f,c),d.fillRect(t,i,f,c);d.restore()}}(b,x,n),g[u].left=b,g[u].top=x,function(t,e,i,n){var a=c/2,o=f+a+t,r=e+a;d.fillText(i.text,o,r),i.hidden&&(d.beginPath(),d.lineWidth=2,d.moveTo(o,r),d.lineTo(o+n,r),d.stroke())}(b,x,n,h),p?l.x+=v+i.padding:l.y+=m})}},_getLegendItemAt:function(t,e){var i,n,a,o=this;if(t>=o.left&&t<=o.right&&e>=o.top&&e<=o.bottom)for(a=o.legendHitBoxes,i=0;i<a.length;++i)if(t>=(n=a[i]).left&&t<=n.left+n.width&&e>=n.top&&e<=n.top+n.height)return o.legendItems[i];return null},handleEvent:function(t){var e,i=this,n=i.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!n.onHover&&!n.onLeave)return}else{if("click"!==a)return;if(!n.onClick)return}e=i._getLegendItemAt(t.x,t.y),"click"===a?e&&n.onClick&&n.onClick.call(i,t.native,e):(n.onLeave&&e!==i._hoveredItem&&(i._hoveredItem&&n.onLeave.call(i,t.native,i._hoveredItem),i._hoveredItem=e),n.onHover&&e&&n.onHover.call(i,t.native,e))}});function pn(t,e){var i=new gn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.legend=i}var mn={id:"legend",_element:gn,beforeInit:function(t){var e=t.options.legend;e&&pn(t,e)},beforeUpdate:function(t){var e=t.options.legend,i=t.legend;e?(ut.mergeIf(e,st.global.legend),i?(ke.configure(t,i,e),i.options=e):pn(t,e)):i&&(ke.removeBox(t,i),delete t.legend)},afterEvent:function(t,e){var i=t.legend;i&&i.handleEvent(e)}},vn=ut.noop;st._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var bn=pt.extend({initialize:function(t){ut.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:vn,update:function(t,e,i){var n=this;return n.beforeUpdate(),n.maxWidth=t,n.maxHeight=e,n.margins=i,n.beforeSetDimensions(),n.setDimensions(),n.afterSetDimensions(),n.beforeBuildLabels(),n.buildLabels(),n.afterBuildLabels(),n.beforeFit(),n.fit(),n.afterFit(),n.afterUpdate(),n.minSize},afterUpdate:vn,beforeSetDimensions:vn,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:vn,beforeBuildLabels:vn,buildLabels:vn,afterBuildLabels:vn,beforeFit:vn,fit:function(){var t=this,e=t.options,i=e.display,n=t.minSize,a=ut.isArray(e.text)?e.text.length:1,o=ut.options._parseFont(e),r=i?a*o.lineHeight+2*e.padding:0;t.isHorizontal()?(n.width=t.maxWidth,n.height=r):(n.width=r,n.height=t.maxHeight),t.width=n.width,t.height=n.height},afterFit:vn,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,i=t.options;if(i.display){var n,a,o,r=ut.options._parseFont(i),s=r.lineHeight,l=s/2+i.padding,d=0,u=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=ut.valueOrDefault(i.fontColor,st.global.defaultFontColor),e.font=r.string,t.isHorizontal()?(a=h+(f-h)/2,o=u+l,n=f-h):(a="left"===i.position?h+l:f-l,o=u+(c-u)/2,n=c-u,d=Math.PI*("left"===i.position?-.5:.5)),e.save(),e.translate(a,o),e.rotate(d),e.textAlign="center",e.textBaseline="middle";var g=i.text;if(ut.isArray(g))for(var p=0,m=0;m<g.length;++m)e.fillText(g[m],0,p,n),p+=s;else e.fillText(g,0,0,n);e.restore()}}});function xn(t,e){var i=new bn({ctx:t.ctx,options:e,chart:t});ke.configure(t,i,e),ke.addBox(t,i),t.titleBlock=i}var yn={},kn=un,wn=mn,Mn={id:"title",_element:bn,beforeInit:function(t){var e=t.options.title;e&&xn(t,e)},beforeUpdate:function(t){var e=t.options.title,i=t.titleBlock;e?(ut.mergeIf(e,st.global.title),i?(ke.configure(t,i,e),i.options=e):xn(t,e)):i&&(ke.removeBox(t,i),delete t.titleBlock)}};for(var _n in yn.filler=kn,yn.legend=wn,yn.title=Mn,ai.helpers=ut,function(){function t(t,e,i){var n;return"string"==typeof t?(n=parseInt(t,10),-1!==t.indexOf("%")&&(n=n/100*e.parentNode[i])):n=t,n}function e(t){return null!=t&&"none"!==t}function i(i,n,a){var o=document.defaultView,r=ut._getParentNode(i),s=o.getComputedStyle(i)[n],l=o.getComputedStyle(r)[n],d=e(s),u=e(l),h=Number.POSITIVE_INFINITY;return d||u?Math.min(d?t(s,i,a):h,u?t(l,r,a):h):"none"}ut.where=function(t,e){if(ut.isArray(t)&&Array.prototype.filter)return t.filter(e);var i=[];return ut.each(t,function(t){e(t)&&i.push(t)}),i},ut.findIndex=Array.prototype.findIndex?function(t,e,i){return t.findIndex(e,i)}:function(t,e,i){i=void 0===i?t:i;for(var n=0,a=t.length;n<a;++n)if(e.call(i,t[n],n,t))return n;return-1},ut.findNextWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=-1);for(var n=i+1;n<t.length;n++){var a=t[n];if(e(a))return a}},ut.findPreviousWhere=function(t,e,i){ut.isNullOrUndef(i)&&(i=t.length);for(var n=i-1;n>=0;n--){var a=t[n];if(e(a))return a}},ut.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},ut.almostEquals=function(t,e,i){return Math.abs(t-e)<i},ut.almostWhole=function(t,e){var i=Math.round(t);return i-e<t&&i+e>t},ut.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},ut.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},ut.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0==(t=+t)||isNaN(t)?t:t>0?1:-1},ut.log10=Math.log10?function(t){return Math.log10(t)}:function(t){var e=Math.log(t)*Math.LOG10E,i=Math.round(e);return t===Math.pow(10,i)?i:e},ut.toRadians=function(t){return t*(Math.PI/180)},ut.toDegrees=function(t){return t*(180/Math.PI)},ut._decimalPlaces=function(t){if(ut.isFinite(t)){for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}},ut.getAngleFromPoint=function(t,e){var i=e.x-t.x,n=e.y-t.y,a=Math.sqrt(i*i+n*n),o=Math.atan2(n,i);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},ut.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},ut.aliasPixel=function(t){return t%2==0?0:.5},ut._alignPixel=function(t,e,i){var n=t.currentDevicePixelRatio,a=i/2;return Math.round((e-a)*n)/n+a},ut.splineCurve=function(t,e,i,n){var a=t.skip?e:t,o=e,r=i.skip?e:i,s=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),d=s/(s+l),u=l/(s+l),h=n*(d=isNaN(d)?0:d),c=n*(u=isNaN(u)?0:u);return{previous:{x:o.x-h*(r.x-a.x),y:o.y-h*(r.y-a.y)},next:{x:o.x+c*(r.x-a.x),y:o.y+c*(r.y-a.y)}}},ut.EPSILON=Number.EPSILON||1e-14,ut.splineCurveMonotone=function(t){var e,i,n,a,o,r,s,l,d,u=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),h=u.length;for(e=0;e<h;++e)if(!(n=u[e]).model.skip){if(i=e>0?u[e-1]:null,(a=e<h-1?u[e+1]:null)&&!a.model.skip){var c=a.model.x-n.model.x;n.deltaK=0!==c?(a.model.y-n.model.y)/c:0}!i||i.model.skip?n.mK=n.deltaK:!a||a.model.skip?n.mK=i.deltaK:this.sign(i.deltaK)!==this.sign(n.deltaK)?n.mK=0:n.mK=(i.deltaK+n.deltaK)/2}for(e=0;e<h-1;++e)n=u[e],a=u[e+1],n.model.skip||a.model.skip||(ut.almostEquals(n.deltaK,0,this.EPSILON)?n.mK=a.mK=0:(o=n.mK/n.deltaK,r=a.mK/n.deltaK,(l=Math.pow(o,2)+Math.pow(r,2))<=9||(s=3/Math.sqrt(l),n.mK=o*s*n.deltaK,a.mK=r*s*n.deltaK)));for(e=0;e<h;++e)(n=u[e]).model.skip||(i=e>0?u[e-1]:null,a=e<h-1?u[e+1]:null,i&&!i.model.skip&&(d=(n.model.x-i.model.x)/3,n.model.controlPointPreviousX=n.model.x-d,n.model.controlPointPreviousY=n.model.y-d*n.mK),a&&!a.model.skip&&(d=(a.model.x-n.model.x)/3,n.model.controlPointNextX=n.model.x+d,n.model.controlPointNextY=n.model.y+d*n.mK))},ut.nextItem=function(t,e,i){return i?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},ut.previousItem=function(t,e,i){return i?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},ut.niceNum=function(t,e){var i=Math.floor(ut.log10(t)),n=t/Math.pow(10,i);return(e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10)*Math.pow(10,i)},ut.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},ut.getRelativePosition=function(t,e){var i,n,a=t.originalEvent||t,o=t.target||t.srcElement,r=o.getBoundingClientRect(),s=a.touches;s&&s.length>0?(i=s[0].clientX,n=s[0].clientY):(i=a.clientX,n=a.clientY);var l=parseFloat(ut.getStyle(o,"padding-left")),d=parseFloat(ut.getStyle(o,"padding-top")),u=parseFloat(ut.getStyle(o,"padding-right")),h=parseFloat(ut.getStyle(o,"padding-bottom")),c=r.right-r.left-l-u,f=r.bottom-r.top-d-h;return{x:i=Math.round((i-r.left-l)/c*o.width/e.currentDevicePixelRatio),y:n=Math.round((n-r.top-d)/f*o.height/e.currentDevicePixelRatio)}},ut.getConstraintWidth=function(t){return i(t,"max-width","clientWidth")},ut.getConstraintHeight=function(t){return i(t,"max-height","clientHeight")},ut._calculatePadding=function(t,e,i){return(e=ut.getStyle(t,e)).indexOf("%")>-1?i*parseInt(e,10)/100:parseInt(e,10)},ut._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},ut.getMaximumWidth=function(t){var e=ut._getParentNode(t);if(!e)return t.clientWidth;var i=e.clientWidth,n=i-ut._calculatePadding(e,"padding-left",i)-ut._calculatePadding(e,"padding-right",i),a=ut.getConstraintWidth(t);return isNaN(a)?n:Math.min(n,a)},ut.getMaximumHeight=function(t){var e=ut._getParentNode(t);if(!e)return t.clientHeight;var i=e.clientHeight,n=i-ut._calculatePadding(e,"padding-top",i)-ut._calculatePadding(e,"padding-bottom",i),a=ut.getConstraintHeight(t);return isNaN(a)?n:Math.min(n,a)},ut.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},ut.retinaScale=function(t,e){var i=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==i){var n=t.canvas,a=t.height,o=t.width;n.height=a*i,n.width=o*i,t.ctx.scale(i,i),n.style.height||n.style.width||(n.style.height=a+"px",n.style.width=o+"px")}},ut.fontString=function(t,e,i){return e+" "+t+"px "+i},ut.longestText=function(t,e,i,n){var a=(n=n||{}).data=n.data||{},o=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(a=n.data={},o=n.garbageCollect=[],n.font=e),t.font=e;var r=0;ut.each(i,function(e){null!=e&&!0!==ut.isArray(e)?r=ut.measureText(t,a,o,r,e):ut.isArray(e)&&ut.each(e,function(e){null==e||ut.isArray(e)||(r=ut.measureText(t,a,o,r,e))})});var s=o.length/2;if(s>i.length){for(var l=0;l<s;l++)delete a[o[l]];o.splice(0,s)}return r},ut.measureText=function(t,e,i,n,a){var o=e[a];return o||(o=e[a]=t.measureText(a).width,i.push(a)),o>n&&(n=o),n},ut.numberOfLabelLines=function(t){var e=1;return ut.each(t,function(t){ut.isArray(t)&&t.length>e&&(e=t.length)}),e},ut.color=X?function(t){return t instanceof CanvasGradient&&(t=st.global.defaultColor),X(t)}:function(t){return console.error("Color.js not found!"),t},ut.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:ut.color(t).saturate(.5).darken(.1).rgbString()}}(),ai._adapters=si,ai.Animation=vt,ai.animationService=bt,ai.controllers=ue,ai.DatasetController=Mt,ai.defaults=st,ai.Element=pt,ai.elements=Wt,ai.Interaction=ve,ai.layouts=ke,ai.platform=Ve,ai.plugins=Ee,ai.Scale=fi,ai.scaleService=He,ai.Ticks=li,ai.Tooltip=Je,ai.helpers.each(tn,function(t,e){ai.scaleService.registerScaleType(e,t,t._defaults)}),yn)yn.hasOwnProperty(_n)&&ai.plugins.register(yn[_n]);ai.platform.initialize();var Cn=ai;return"undefined"!=typeof window&&(window.Chart=ai),ai.Chart=ai,ai.Legend=yn.legend._element,ai.Title=yn.title._element,ai.pluginService=ai.plugins,ai.PluginBase=ai.Element.extend({}),ai.canvasHelpers=ai.helpers.canvas,ai.layoutService=ai.layouts,ai.LinearScaleBase=bi,ai.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],function(t){ai[t]=function(e,i){return new ai(e,ai.helpers.merge(i||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}}),Cn});
1
  /*!
2
+ * Chart.js v2.9.3
3
  * https://www.chartjs.org
4
  * (c) 2019 Chart.js Contributors
5
  * Released under the MIT License
6
  */
7
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],(function(t){return e(function(){try{return t("moment")}catch(t){}}())})):(t=t||self).Chart=e(t.moment)}(this,(function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},n=function(t,e){return t(e={exports:{}},e.exports),e.exports}((function(t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[e[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=n[t];if(i)return i;var a,r,o,s=1/0;for(var l in e)if(e.hasOwnProperty(l)){var u=e[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d<s&&(s=d,a=l)}return a},a.keyword.rgb=function(t){return e[t]},a.rgb.xyz=function(t){var e=t[0]/255,n=t[1]/255,i=t[2]/255;return[100*(.4124*(e=e>.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));n.rgb,n.hsl,n.hsv,n.hwb,n.cmyk,n.xyz,n.lab,n.lch,n.hex,n.keyword,n.ansi16,n.ansi256,n.hcg,n.apple,n.gray;function i(t){var e=function(){for(var t={},e=Object.keys(n),i=e.length,a=0;a<i;a++)t[e[a]]={distance:-1,parent:null};return t}(),i=[t];for(e[t].distance=0;i.length;)for(var a=i.pop(),r=Object.keys(n[a]),o=r.length,s=0;s<o;s++){var l=r[s],u=e[l];-1===u.distance&&(u.distance=e[a].distance+1,u.parent=a,i.unshift(l))}return e}function a(t,e){return function(n){return e(t(n))}}function r(t,e){for(var i=[e[t].parent,t],r=n[e[t].parent][t],o=e[t].parent;e[o].parent;)i.unshift(e[o].parent),r=a(n[e[o].parent][o],r),o=e[o].parent;return r.conversion=i,r}var o={};Object.keys(n).forEach((function(t){o[t]={},Object.defineProperty(o[t],"channels",{value:n[t].channels}),Object.defineProperty(o[t],"labels",{value:n[t].labels});var e=function(t){for(var e=i(t),n={},a=Object.keys(e),o=a.length,s=0;s<o;s++){var l=a[s];null!==e[l].parent&&(n[l]=r(l,e))}return n}(t);Object.keys(e).forEach((function(n){var i=e[n];o[t][n]=function(t){var e=function(e){if(null==e)return e;arguments.length>1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a<i;a++)n[a]=Math.round(n[a]);return n};return"conversion"in t&&(e.conversion=t.conversion),e}(i),o[t][n].raw=function(t){var e=function(e){return null==e?e:(arguments.length>1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var s=o,l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},u={getRgba:d,getHsla:h,getRgb:function(t){var e=d(t);return e&&e.slice(0,3)},getHsl:function(t){var e=h(t);return e&&e.slice(0,3)},getHwb:c,getAlpha:function(t){var e=d(t);if(e)return e[3];if(e=h(t))return e[3];if(e=c(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+v(t[0])+v(t[1])+v(t[2])+(e>=0&&e<1?v(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return f(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:f,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:g,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return b[t.slice(0,3)]}};function d(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;r<e.length;r++)e[r]=parseInt(i[r]+i[r],16);a&&(n=Math.round(parseInt(a+a,16)/255*100)/100)}else if(i=t.match(/^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i)){a=i[2],i=i[1];for(r=0;r<e.length;r++)e[r]=parseInt(i.slice(2*r,2*r+2),16);a&&(n=Math.round(parseInt(a,16)/255*100)/100)}else if(i=t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=parseInt(i[r+1]);n=parseFloat(i[4])}else if(i=t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)){for(r=0;r<e.length;r++)e[r]=Math.round(2.55*parseFloat(i[r+1]));n=parseFloat(i[4])}else if(i=t.match(/(\w+)/)){if("transparent"==i[1])return[0,0,0,0];if(!(e=l[i[1]]))return}for(r=0;r<e.length;r++)e[r]=m(e[r],0,255);return n=n||0==n?m(n,0,1):1,e[3]=n,e}}function h(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[m(parseInt(e[1]),0,360),m(parseFloat(e[2]),0,100),m(parseFloat(e[3]),0,100),m(isNaN(n)?1:n,0,1)]}}}function c(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/);if(e){var n=parseFloat(e[4]);return[m(parseInt(e[1]),0,360),m(parseFloat(e[2]),0,100),m(parseFloat(e[3]),0,100),m(isNaN(n)?1:n,0,1)]}}}function f(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]+", "+t[1]+", "+t[2]+", "+e+")"}function g(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(t[1]/255*100)+"%, "+Math.round(t[2]/255*100)+"%, "+(e||t[3]||1)+")"}function p(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]+", "+t[1]+"%, "+t[2]+"%, "+e+")"}function m(t,e,n){return Math.min(Math.max(e,t),n)}function v(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}var b={};for(var x in l)b[l[x]]=x;var y=function(t){return t instanceof y?t:this instanceof y?(this.valid=!1,this.values={rgb:[0,0,0],hsl:[0,0,0],hsv:[0,0,0],hwb:[0,0,0],cmyk:[0,0,0,0],alpha:1},void("string"==typeof t?(e=u.getRgba(t))?this.setValues("rgb",e):(e=u.getHsla(t))?this.setValues("hsl",e):(e=u.getHwb(t))&&this.setValues("hwb",e):"object"==typeof t&&(void 0!==(e=t).r||void 0!==e.red?this.setValues("rgb",e):void 0!==e.l||void 0!==e.lightness?this.setValues("hsl",e):void 0!==e.v||void 0!==e.value?this.setValues("hsv",e):void 0!==e.w||void 0!==e.whiteness?this.setValues("hwb",e):void 0===e.c&&void 0===e.cyan||this.setValues("cmyk",e)))):new y(t);var e};y.prototype={isValid:function(){return this.valid},rgb:function(){return this.setSpace("rgb",arguments)},hsl:function(){return this.setSpace("hsl",arguments)},hsv:function(){return this.setSpace("hsv",arguments)},hwb:function(){return this.setSpace("hwb",arguments)},cmyk:function(){return this.setSpace("cmyk",arguments)},rgbArray:function(){return this.values.rgb},hslArray:function(){return this.values.hsl},hsvArray:function(){return this.values.hsv},hwbArray:function(){var t=this.values;return 1!==t.alpha?t.hwb.concat([t.alpha]):t.hwb},cmykArray:function(){return this.values.cmyk},rgbaArray:function(){var t=this.values;return t.rgb.concat([t.alpha])},hslaArray:function(){var t=this.values;return t.hsl.concat([t.alpha])},alpha:function(t){return void 0===t?this.values.alpha:(this.setValues("alpha",t),this)},red:function(t){return this.setChannel("rgb",0,t)},green:function(t){return this.setChannel("rgb",1,t)},blue:function(t){return this.setChannel("rgb",2,t)},hue:function(t){return t&&(t=(t%=360)<0?360+t:t),this.setChannel("hsl",0,t)},saturation:function(t){return this.setChannel("hsl",1,t)},lightness:function(t){return this.setChannel("hsl",2,t)},saturationv:function(t){return this.setChannel("hsv",1,t)},whiteness:function(t){return this.setChannel("hwb",1,t)},blackness:function(t){return this.setChannel("hwb",2,t)},value:function(t){return this.setChannel("hsv",2,t)},cyan:function(t){return this.setChannel("cmyk",0,t)},magenta:function(t){return this.setChannel("cmyk",1,t)},yellow:function(t){return this.setChannel("cmyk",2,t)},black:function(t){return this.setChannel("cmyk",3,t)},hexString:function(){return u.hexString(this.values.rgb)},rgbString:function(){return u.rgbString(this.values.rgb,this.values.alpha)},rgbaString:function(){return u.rgbaString(this.values.rgb,this.values.alpha)},percentString:function(){return u.percentString(this.values.rgb,this.values.alpha)},hslString:function(){return u.hslString(this.values.hsl,this.values.alpha)},hslaString:function(){return u.hslaString(this.values.hsl,this.values.alpha)},hwbString:function(){return u.hwbString(this.values.hwb,this.values.alpha)},keyword:function(){return u.keyword(this.values.rgb,this.values.alpha)},rgbNumber:function(){var t=this.values.rgb;return t[0]<<16|t[1]<<8|t[2]},luminosity:function(){for(var t=this.values.rgb,e=[],n=0;n<t.length;n++){var i=t[n]/255;e[n]=i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4)}return.2126*e[0]+.7152*e[1]+.0722*e[2]},contrast:function(t){var e=this.luminosity(),n=t.luminosity();return e>n?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb;return(299*t[0]+587*t[1]+114*t[2])/1e3<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=t,i=void 0===e?.5:e,a=2*i-1,r=this.alpha()-n.alpha(),o=((a*r==-1?a:(a+r)/(1+a*r))+1)/2,s=1-o;return this.rgb(o*this.red()+s*n.red(),o*this.green()+s*n.green(),o*this.blue()+s*n.blue()).alpha(this.alpha()*i+n.alpha()*(1-i))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new y,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],"[object Array]"===(e={}.toString.call(t))?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},y.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},y.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},y.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i<t.length;i++)n[t.charAt(i)]=e[t][i];return 1!==e.alpha&&(n.a=e.alpha),n},y.prototype.setValues=function(t,e){var n,i,a=this.values,r=this.spaces,o=this.maxes,l=1;if(this.valid=!0,"alpha"===t)l=e;else if(e.length)a[t]=e.slice(0,t.length),l=e[t.length];else if(void 0!==e[t.charAt(0)]){for(n=0;n<t.length;n++)a[t][n]=e[t.charAt(n)];l=e.a}else if(void 0!==e[r[t][0]]){var u=r[t];for(n=0;n<t.length;n++)a[t][n]=e[u[n]];l=e.alpha}if(a.alpha=Math.max(0,Math.min(1,void 0===l?a.alpha:l)),"alpha"===t)return!1;for(n=0;n<t.length;n++)i=Math.max(0,Math.min(o[t][n],a[t][n])),a[t][n]=Math.round(i);for(var d in r)d!==t&&(a[d]=s[t][d](a[t]));return!0},y.prototype.setSpace=function(t,e){var n=e[0];return void 0===n?this.getValues(t):("number"==typeof n&&(n=Array.prototype.slice.call(e)),this.setValues(t,n),this)},y.prototype.setChannel=function(t,e,n){var i=this.values[t];return void 0===n?i[e]:n===i[e]?this:(i[e]=n,this.setValues(t,i),this)},"undefined"!=typeof window&&(window.Color=y);var _,k=y,w={noop:function(){},uid:(_=0,function(){return _++}),isNullOrUndef:function(t){return null==t},isArray:function(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.substr(0,7)&&"Array]"===e.substr(-6)},isObject:function(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)},isFinite:function(t){return("number"==typeof t||t instanceof Number)&&isFinite(t)},valueOrDefault:function(t,e){return void 0===t?e:t},valueAtIndexOrDefault:function(t,e,n){return w.valueOrDefault(w.isArray(t)?t[e]:t,n)},callback:function(t,e,n){if(t&&"function"==typeof t.call)return t.apply(n,e)},each:function(t,e,n,i){var a,r,o;if(w.isArray(t))if(r=t.length,i)for(a=r-1;a>=0;a--)e.call(n,t[a],a);else for(a=0;a<r;a++)e.call(n,t[a],a);else if(w.isObject(t))for(r=(o=Object.keys(t)).length,a=0;a<r;a++)e.call(n,t[o[a]],o[a])},arrayEquals:function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n<i;++n)if(a=t[n],r=e[n],a instanceof Array&&r instanceof Array){if(!w.arrayEquals(a,r))return!1}else if(a!==r)return!1;return!0},clone:function(t){if(w.isArray(t))return t.map(w.clone);if(w.isObject(t)){for(var e={},n=Object.keys(t),i=n.length,a=0;a<i;++a)e[n[a]]=w.clone(t[n[a]]);return e}return t},_merger:function(t,e,n,i){var a=e[t],r=n[t];w.isObject(a)&&w.isObject(r)?w.merge(a,r,i):e[t]=w.clone(r)},_mergerIf:function(t,e,n){var i=e[t],a=n[t];w.isObject(i)&&w.isObject(a)?w.mergeIf(i,a):e.hasOwnProperty(t)||(e[t]=w.clone(a))},merge:function(t,e,n){var i,a,r,o,s,l=w.isArray(e)?e:[e],u=l.length;if(!w.isObject(t))return t;for(i=(n=n||{}).merger||w._merger,a=0;a<u;++a)if(e=l[a],w.isObject(e))for(s=0,o=(r=Object.keys(e)).length;s<o;++s)i(r[s],t,e,n);return t},mergeIf:function(t,e){return w.merge(t,e,{merger:w._mergerIf})},extend:Object.assign||function(t){return w.merge(t,[].slice.call(arguments,1),{merger:function(t,e,n){e[t]=n[t]}})},inherits:function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=w.inherits,t&&w.extend(n.prototype,t),n.__super__=e.prototype,n},_deprecated:function(t,e,n,i){void 0!==e&&console.warn(t+': "'+n+'" is deprecated. Please use "'+i+'" instead')}},M=w;w.callCallback=w.callback,w.indexOf=function(t,e,n){return Array.prototype.indexOf.call(t,e,n)},w.getValueOrDefault=w.valueOrDefault,w.getValueAtIndexOrDefault=w.valueAtIndexOrDefault;var S={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return(t-=1)*t*t+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-((t-=1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return(t-=1)*t*t*t*t+1},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return 1-Math.cos(t*(Math.PI/2))},easeOutSine:function(t){return Math.sin(t*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return t>=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),-i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n))},easeOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===t?1:(n||(n=.3),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},easeInOutElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:2==(t/=.5)?1:(n||(n=.45),i<1?(i=1,e=n/4):e=n/(2*Math.PI)*Math.asin(1/i),t<1?i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*-.5:i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-S.easeOutBounce(1-t)},easeOutBounce:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*S.easeInBounce(2*t):.5*S.easeOutBounce(2*t-1)+.5}},C={effects:S};M.easingEffects=S;var P=Math.PI,A=P/180,D=2*P,T=P/2,I=P/4,F=2*P/3,L={clear:function(t){t.ctx.clearRect(0,0,t.width,t.height)},roundedRect:function(t,e,n,i,a,r){if(r){var o=Math.min(r,a/2,i/2),s=e+o,l=n+o,u=e+i-o,d=n+a-o;t.moveTo(e,l),s<u&&l<d?(t.arc(s,l,o,-P,-T),t.arc(u,l,o,-T,0),t.arc(u,d,o,0,T),t.arc(s,d,o,T,P)):s<u?(t.moveTo(s,n),t.arc(u,l,o,-T,T),t.arc(s,l,o,T,P+T)):l<d?(t.arc(s,l,o,-P,0),t.arc(s,d,o,0,P)):t.arc(s,l,o,-P,P),t.closePath(),t.moveTo(e,n)}else t.rect(e,n,i,a)},drawPoint:function(t,e,n,i,a,r){var o,s,l,u,d,h=(r||0)*A;if(e&&"object"==typeof e&&("[object HTMLImageElement]"===(o=e.toString())||"[object HTMLCanvasElement]"===o))return t.save(),t.translate(i,a),t.rotate(h),t.drawImage(e,-e.width/2,-e.height/2,e.width,e.height),void t.restore();if(!(isNaN(n)||n<=0)){switch(t.beginPath(),e){default:t.arc(i,a,n,0,D),t.closePath();break;case"triangle":t.moveTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=F,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),h+=F,t.lineTo(i+Math.sin(h)*n,a-Math.cos(h)*n),t.closePath();break;case"rectRounded":u=n-(d=.516*n),s=Math.cos(h+I)*u,l=Math.sin(h+I)*u,t.arc(i-s,a-l,d,h-P,h-T),t.arc(i+l,a-s,d,h-T,h),t.arc(i+s,a+l,d,h,h+T),t.arc(i-l,a+s,d,h+T,h+P),t.closePath();break;case"rect":if(!r){u=Math.SQRT1_2*n,t.rect(i-u,a-u,2*u,2*u);break}h+=I;case"rectRot":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+l,a-s),t.lineTo(i+s,a+l),t.lineTo(i-l,a+s),t.closePath();break;case"crossRot":h+=I;case"cross":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"star":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s),h+=I,s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l),t.moveTo(i+l,a-s),t.lineTo(i-l,a+s);break;case"line":s=Math.cos(h)*n,l=Math.sin(h)*n,t.moveTo(i-s,a-l),t.lineTo(i+s,a+l);break;case"dash":t.moveTo(i,a),t.lineTo(i+Math.cos(h)*n,a+Math.sin(h)*n)}t.fill(),t.stroke()}},_isPointInArea:function(t,e){return t.x>e.left-1e-6&&t.x<e.right+1e-6&&t.y>e.top-1e-6&&t.y<e.bottom+1e-6},clipArea:function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},unclipArea:function(t){t.restore()},lineTo:function(t,e,n,i){var a=n.steppedLine;if(a){if("middle"===a){var r=(e.x+n.x)/2;t.lineTo(r,i?n.y:e.y),t.lineTo(r,i?e.y:n.y)}else"after"===a&&!i||"after"!==a&&i?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y);t.lineTo(n.x,n.y)}else n.tension?t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):t.lineTo(n.x,n.y)}},O=L;M.clear=L.clear,M.drawRoundedRectangle=function(t){t.beginPath(),L.roundedRect.apply(L,arguments)};var R={_set:function(t,e){return M.merge(this[t]||(this[t]={}),e)}};R._set("global",{defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",defaultLineHeight:1.2,showLines:!0});var z=R,N=M.valueOrDefault;var B={toLineHeight:function(t,e){var n=(""+t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/);if(!n||"normal"===n[1])return 1.2*e;switch(t=+n[2],n[3]){case"px":return t;case"%":t/=100}return e*t},toPadding:function(t){var e,n,i,a;return M.isObject(t)?(e=+t.top||0,n=+t.right||0,i=+t.bottom||0,a=+t.left||0):e=n=i=a=+t||0,{top:e,right:n,bottom:i,left:a,height:e+i,width:a+n}},_parseFont:function(t){var e=z.global,n=N(t.fontSize,e.defaultFontSize),i={family:N(t.fontFamily,e.defaultFontFamily),lineHeight:M.options.toLineHeight(N(t.lineHeight,e.defaultLineHeight),n),size:n,style:N(t.fontStyle,e.defaultFontStyle),weight:null,string:""};return i.string=function(t){return!t||M.isNullOrUndef(t.size)||M.isNullOrUndef(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}(i),i},resolve:function(t,e,n,i){var a,r,o,s=!0;for(a=0,r=t.length;a<r;++a)if(void 0!==(o=t[a])&&(void 0!==e&&"function"==typeof o&&(o=o(e),s=!1),void 0!==n&&M.isArray(o)&&(o=o[n],s=!1),void 0!==o))return i&&!s&&(i.cacheable=!1),o}},E={_factorize:function(t){var e,n=[],i=Math.sqrt(t);for(e=1;e<i;e++)t%e==0&&(n.push(e),n.push(t/e));return i===(0|i)&&n.push(i),n.sort((function(t,e){return t-e})).pop(),n},log10:Math.log10||function(t){var e=Math.log(t)*Math.LOG10E,n=Math.round(e);return t===Math.pow(10,n)?n:e}},W=E;M.log10=E.log10;var V=M,H=C,j=O,q=B,U=W,Y={getRtlAdapter:function(t,e,n){return t?function(t,e){return{x:function(n){return t+t+e-n},setWidth:function(t){e=t},textAlign:function(t){return"center"===t?t:"right"===t?"left":"right"},xPlus:function(t,e){return t-e},leftForLtr:function(t,e){return t-e}}}(e,n):{x:function(t){return t},setWidth:function(t){},textAlign:function(t){return t},xPlus:function(t,e){return t+e},leftForLtr:function(t,e){return t}}},overrideTextDirection:function(t,e){var n,i;"ltr"!==e&&"rtl"!==e||(i=[(n=t.canvas.style).getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",e,"important"),t.prevTextDirection=i)},restoreTextDirection:function(t){var e=t.prevTextDirection;void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}};V.easing=H,V.canvas=j,V.options=q,V.math=U,V.rtl=Y;var G=function(t){V.extend(this,t),this.initialize.apply(this,arguments)};V.extend(G.prototype,{_type:void 0,initialize:function(){this.hidden=!1},pivot:function(){var t=this;return t._view||(t._view=V.extend({},t._model)),t._start={},t},transition:function(t){var e=this,n=e._model,i=e._start,a=e._view;return n&&1!==t?(a||(a=e._view={}),i||(i=e._start={}),function(t,e,n,i){var a,r,o,s,l,u,d,h,c,f=Object.keys(n);for(a=0,r=f.length;a<r;++a)if(u=n[o=f[a]],e.hasOwnProperty(o)||(e[o]=u),(s=e[o])!==u&&"_"!==o[0]){if(t.hasOwnProperty(o)||(t[o]=s),(d=typeof u)===typeof(l=t[o]))if("string"===d){if((h=k(l)).valid&&(c=k(u)).valid){e[o]=c.mix(h,i).rgbString();continue}}else if(V.isFinite(l)&&V.isFinite(u)){e[o]=l+(u-l)*i;continue}e[o]=u}}(i,a,n,t),e):(e._view=V.extend({},n),e._start=null,e)},tooltipPosition:function(){return{x:this._model.x,y:this._model.y}},hasValue:function(){return V.isNumber(this._model.x)&&V.isNumber(this._model.y)}}),G.extend=V.inherits;var X=G,K=X.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),Z=K;Object.defineProperty(K.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(K.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}}),z._set("global",{animation:{duration:1e3,easing:"easeOutQuart",onProgress:V.noop,onComplete:V.noop}});var $={animations:[],request:null,addAnimation:function(t,e,n,i){var a,r,o=this.animations;for(e.chart=t,e.startTime=Date.now(),e.duration=n,i||(t.animating=!0),a=0,r=o.length;a<r;++a)if(o[a].chart===t)return void(o[a]=e);o.push(e),1===o.length&&this.requestAnimationFrame()},cancelAnimation:function(t){var e=V.findIndex(this.animations,(function(e){return e.chart===t}));-1!==e&&(this.animations.splice(e,1),t.animating=!1)},requestAnimationFrame:function(){var t=this;null===t.request&&(t.request=V.requestAnimFrame.call(window,(function(){t.request=null,t.startDigest()})))},startDigest:function(){this.advance(),this.animations.length>0&&this.requestAnimationFrame()},advance:function(){for(var t,e,n,i,a=this.animations,r=0;r<a.length;)e=(t=a[r]).chart,n=t.numSteps,i=Math.floor((Date.now()-t.startTime)/t.duration*n)+1,t.currentStep=Math.min(i,n),V.callback(t.render,[e,t],e),V.callback(t.onAnimationProgress,[t],e),t.currentStep>=n?(V.callback(t.onAnimationComplete,[t],e),e.animating=!1,a.splice(r,1)):++r}},J=V.options.resolve,Q=["push","pop","shift","splice","unshift"];function tt(t,e){var n=t._chartjs;if(n){var i=n.listeners,a=i.indexOf(e);-1!==a&&i.splice(a,1),i.length>0||(Q.forEach((function(e){delete t[e]})),delete t._chartjs)}}var et=function(t,e){this.initialize(t,e)};V.extend(et.prototype,{datasetElementType:null,dataElementType:null,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth"],_dataElementOptions:["backgroundColor","borderColor","borderWidth","pointStyle"],initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements(),n._type=n.getMeta().type},updateIndex:function(t){this.index=t},linkScales:function(){var t=this.getMeta(),e=this.chart,n=e.scales,i=this.getDataset(),a=e.options.scales;null!==t.xAxisID&&t.xAxisID in n&&!i.xAxisID||(t.xAxisID=i.xAxisID||a.xAxes[0].id),null!==t.yAxisID&&t.yAxisID in n&&!i.yAxisID||(t.yAxisID=i.yAxisID||a.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},_getValueScaleId:function(){return this.getMeta().yAxisID},_getIndexScaleId:function(){return this.getMeta().xAxisID},_getValueScale:function(){return this.getScaleForId(this._getValueScaleId())},_getIndexScale:function(){return this.getScaleForId(this._getIndexScaleId())},reset:function(){this._update(!0)},destroy:function(){this._data&&tt(this._data,this)},createMetaDataset:function(){var t=this.datasetElementType;return t&&new t({_chart:this.chart,_datasetIndex:this.index})},createMetaData:function(t){var e=this.dataElementType;return e&&new e({_chart:this.chart,_datasetIndex:this.index,_index:t})},addElements:function(){var t,e,n=this.getMeta(),i=this.getDataset().data||[],a=n.data;for(t=0,e=i.length;t<e;++t)a[t]=a[t]||this.createMetaData(t);n.dataset=n.dataset||this.createMetaDataset()},addElementAndReset:function(t){var e=this.createMetaData(t);this.getMeta().data.splice(t,0,e),this.updateElement(e,t,!0)},buildOrUpdateElements:function(){var t,e,n=this,i=n.getDataset(),a=i.data||(i.data=[]);n._data!==a&&(n._data&&tt(n._data,n),a&&Object.isExtensible(a)&&(e=n,(t=a)._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,"_chartjs",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),Q.forEach((function(e){var n="onData"+e.charAt(0).toUpperCase()+e.slice(1),i=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:function(){var e=Array.prototype.slice.call(arguments),a=i.apply(this,e);return V.each(t._chartjs.listeners,(function(t){"function"==typeof t[n]&&t[n].apply(t,e)})),a}})})))),n._data=a),n.resyncElements()},_configure:function(){this._config=V.merge({},[this.chart.options.datasets[this._type],this.getDataset()],{merger:function(t,e,n){"_meta"!==t&&"data"!==t&&V._merger(t,e,n)}})},_update:function(t){this._configure(),this._cachedDataOpts=null,this.update(t)},update:V.noop,transition:function(t){for(var e=this.getMeta(),n=e.data||[],i=n.length,a=0;a<i;++a)n[a].transition(t);e.dataset&&e.dataset.transition(t)},draw:function(){var t=this.getMeta(),e=t.data||[],n=e.length,i=0;for(t.dataset&&t.dataset.draw();i<n;++i)e[i].draw()},getStyle:function(t){var e,n=this.getMeta(),i=n.dataset;return this._configure(),i&&void 0===t?e=this._resolveDatasetElementOptions(i||{}):(t=t||0,e=this._resolveDataElementOptions(n.data[t]||{},t)),!1!==e.fill&&null!==e.fill||(e.backgroundColor=e.borderColor),e},_resolveDatasetElementOptions:function(t,e){var n,i,a,r,o=this,s=o.chart,l=o._config,u=t.custom||{},d=s.options.elements[o.datasetElementType.prototype._type]||{},h=o._datasetElementOptions,c={},f={chart:s,dataset:o.getDataset(),datasetIndex:o.index,hover:e};for(n=0,i=h.length;n<i;++n)a=h[n],r=e?"hover"+a.charAt(0).toUpperCase()+a.slice(1):a,c[a]=J([u[r],l[r],d[r]],f);return c},_resolveDataElementOptions:function(t,e){var n=this,i=t&&t.custom,a=n._cachedDataOpts;if(a&&!i)return a;var r,o,s,l,u=n.chart,d=n._config,h=u.options.elements[n.dataElementType.prototype._type]||{},c=n._dataElementOptions,f={},g={chart:u,dataIndex:e,dataset:n.getDataset(),datasetIndex:n.index},p={cacheable:!i};if(i=i||{},V.isArray(c))for(o=0,s=c.length;o<s;++o)f[l=c[o]]=J([i[l],d[l],h[l]],g,e,p);else for(o=0,s=(r=Object.keys(c)).length;o<s;++o)f[l=r[o]]=J([i[l],d[c[l]],d[l],h[l]],g,e,p);return p.cacheable&&(n._cachedDataOpts=Object.freeze(f)),f},removeHoverStyle:function(t){V.merge(t._model,t.$previousStyle||{}),delete t.$previousStyle},setHoverStyle:function(t){var e=this.chart.data.datasets[t._datasetIndex],n=t._index,i=t.custom||{},a=t._model,r=V.getHoverColor;t.$previousStyle={backgroundColor:a.backgroundColor,borderColor:a.borderColor,borderWidth:a.borderWidth},a.backgroundColor=J([i.hoverBackgroundColor,e.hoverBackgroundColor,r(a.backgroundColor)],void 0,n),a.borderColor=J([i.hoverBorderColor,e.hoverBorderColor,r(a.borderColor)],void 0,n),a.borderWidth=J([i.hoverBorderWidth,e.hoverBorderWidth,a.borderWidth],void 0,n)},_removeDatasetHoverStyle:function(){var t=this.getMeta().dataset;t&&this.removeHoverStyle(t)},_setDatasetHoverStyle:function(){var t,e,n,i,a,r,o=this.getMeta().dataset,s={};if(o){for(r=o._model,a=this._resolveDatasetElementOptions(o,!0),t=0,e=(i=Object.keys(a)).length;t<e;++t)s[n=i[t]]=r[n],r[n]=a[n];o.$previousStyle=s}},resyncElements:function(){var t=this.getMeta(),e=this.getDataset().data,n=t.data.length,i=e.length;i<n?t.data.splice(i,n-i):i>n&&this.insertElements(n,i-n)},insertElements:function(t,e){for(var n=0;n<e;++n)this.addElementAndReset(t+n)},onDataPush:function(){var t=arguments.length;this.insertElements(this.getDataset().data.length-t,t)},onDataPop:function(){this.getMeta().data.pop()},onDataShift:function(){this.getMeta().data.shift()},onDataSplice:function(t,e){this.getMeta().data.splice(t,e),this.insertElements(t,arguments.length-2)},onDataUnshift:function(){this.insertElements(0,arguments.length)}}),et.extend=V.inherits;var nt=et,it=2*Math.PI;function at(t,e){var n=e.startAngle,i=e.endAngle,a=e.pixelMargin,r=a/e.outerRadius,o=e.x,s=e.y;t.beginPath(),t.arc(o,s,e.outerRadius,n-r,i+r),e.innerRadius>a?(r=a/e.innerRadius,t.arc(o,s,e.innerRadius-a,i+r,n-r,!0)):t.arc(o,s,a,i+Math.PI/2,n-Math.PI/2),t.closePath(),t.clip()}function rt(t,e,n){var i="inner"===e.borderAlign;i?(t.lineWidth=2*e.borderWidth,t.lineJoin="round"):(t.lineWidth=e.borderWidth,t.lineJoin="bevel"),n.fullCircles&&function(t,e,n,i){var a,r=n.endAngle;for(i&&(n.endAngle=n.startAngle+it,at(t,n),n.endAngle=r,n.endAngle===n.startAngle&&n.fullCircles&&(n.endAngle+=it,n.fullCircles--)),t.beginPath(),t.arc(n.x,n.y,n.innerRadius,n.startAngle+it,n.startAngle,!0),a=0;a<n.fullCircles;++a)t.stroke();for(t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.startAngle+it),a=0;a<n.fullCircles;++a)t.stroke()}(t,e,n,i),i&&at(t,n),t.beginPath(),t.arc(n.x,n.y,e.outerRadius,n.startAngle,n.endAngle),t.arc(n.x,n.y,n.innerRadius,n.endAngle,n.startAngle,!0),t.closePath(),t.stroke()}z._set("global",{elements:{arc:{backgroundColor:z.global.defaultColor,borderColor:"#fff",borderWidth:2,borderAlign:"center"}}});var ot=X.extend({_type:"arc",inLabelRange:function(t){var e=this._view;return!!e&&Math.pow(t-e.x,2)<Math.pow(e.radius+e.hoverRadius,2)},inRange:function(t,e){var n=this._view;if(n){for(var i=V.getAngleFromPoint(n,{x:t,y:e}),a=i.angle,r=i.distance,o=n.startAngle,s=n.endAngle;s<o;)s+=it;for(;a>s;)a-=it;for(;a<o;)a+=it;var l=a>=o&&a<=s,u=r>=n.innerRadius&&r<=n.outerRadius;return l&&u}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t,e=this._chart.ctx,n=this._view,i="inner"===n.borderAlign?.33:0,a={x:n.x,y:n.y,innerRadius:n.innerRadius,outerRadius:Math.max(n.outerRadius-i,0),pixelMargin:i,startAngle:n.startAngle,endAngle:n.endAngle,fullCircles:Math.floor(n.circumference/it)};if(e.save(),e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,a.fullCircles){for(a.endAngle=a.startAngle+it,e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),t=0;t<a.fullCircles;++t)e.fill();a.endAngle=a.startAngle+n.circumference%it}e.beginPath(),e.arc(a.x,a.y,a.outerRadius,a.startAngle,a.endAngle),e.arc(a.x,a.y,a.innerRadius,a.endAngle,a.startAngle,!0),e.closePath(),e.fill(),n.borderWidth&&rt(e,n,a),e.restore()}}),st=V.valueOrDefault,lt=z.global.defaultColor;z._set("global",{elements:{line:{tension:.4,backgroundColor:lt,borderWidth:3,borderColor:lt,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0}}});var ut=X.extend({_type:"line",draw:function(){var t,e,n,i=this,a=i._view,r=i._chart.ctx,o=a.spanGaps,s=i._children.slice(),l=z.global,u=l.elements.line,d=-1,h=i._loop;if(s.length){if(i._loop){for(t=0;t<s.length;++t)if(e=V.previousItem(s,t),!s[t]._view.skip&&e._view.skip){s=s.slice(t).concat(s.slice(0,t)),h=o;break}h&&s.push(s[0])}for(r.save(),r.lineCap=a.borderCapStyle||u.borderCapStyle,r.setLineDash&&r.setLineDash(a.borderDash||u.borderDash),r.lineDashOffset=st(a.borderDashOffset,u.borderDashOffset),r.lineJoin=a.borderJoinStyle||u.borderJoinStyle,r.lineWidth=st(a.borderWidth,u.borderWidth),r.strokeStyle=a.borderColor||l.defaultColor,r.beginPath(),(n=s[0]._view).skip||(r.moveTo(n.x,n.y),d=0),t=1;t<s.length;++t)n=s[t]._view,e=-1===d?V.previousItem(s,t):s[d],n.skip||(d!==t-1&&!o||-1===d?r.moveTo(n.x,n.y):V.canvas.lineTo(r,e._view,n),d=t);h&&r.closePath(),r.stroke(),r.restore()}}}),dt=V.valueOrDefault,ht=z.global.defaultColor;function ct(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hitRadius}z._set("global",{elements:{point:{radius:3,pointStyle:"circle",backgroundColor:ht,borderColor:ht,borderWidth:1,hitRadius:1,hoverRadius:4,hoverBorderWidth:1}}});var ft=X.extend({_type:"point",inRange:function(t,e){var n=this._view;return!!n&&Math.pow(t-n.x,2)+Math.pow(e-n.y,2)<Math.pow(n.hitRadius+n.radius,2)},inLabelRange:ct,inXRange:ct,inYRange:function(t){var e=this._view;return!!e&&Math.abs(t-e.y)<e.radius+e.hitRadius},getCenterPoint:function(){var t=this._view;return{x:t.x,y:t.y}},getArea:function(){return Math.PI*Math.pow(this._view.radius,2)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y,padding:t.radius+t.borderWidth}},draw:function(t){var e=this._view,n=this._chart.ctx,i=e.pointStyle,a=e.rotation,r=e.radius,o=e.x,s=e.y,l=z.global,u=l.defaultColor;e.skip||(void 0===t||V.canvas._isPointInArea(e,t))&&(n.strokeStyle=e.borderColor||u,n.lineWidth=dt(e.borderWidth,l.elements.point.borderWidth),n.fillStyle=e.backgroundColor||u,V.canvas.drawPoint(n,i,r,o,s,a))}}),gt=z.global.defaultColor;function pt(t){return t&&void 0!==t.width}function mt(t){var e,n,i,a,r;return pt(t)?(r=t.width/2,e=t.x-r,n=t.x+r,i=Math.min(t.y,t.base),a=Math.max(t.y,t.base)):(r=t.height/2,e=Math.min(t.x,t.base),n=Math.max(t.x,t.base),i=t.y-r,a=t.y+r),{left:e,top:i,right:n,bottom:a}}function vt(t,e,n){return t===e?n:t===n?e:t}function bt(t,e,n){var i,a,r,o,s=t.borderWidth,l=function(t){var e=t.borderSkipped,n={};return e?(t.horizontal?t.base>t.x&&(e=vt(e,"left","right")):t.base<t.y&&(e=vt(e,"bottom","top")),n[e]=!0,n):n}(t);return V.isObject(s)?(i=+s.top||0,a=+s.right||0,r=+s.bottom||0,o=+s.left||0):i=a=r=o=+s||0,{t:l.top||i<0?0:i>n?n:i,r:l.right||a<0?0:a>e?e:a,b:l.bottom||r<0?0:r>n?n:r,l:l.left||o<0?0:o>e?e:o}}function xt(t,e,n){var i=null===e,a=null===n,r=!(!t||i&&a)&&mt(t);return r&&(i||e>=r.left&&e<=r.right)&&(a||n>=r.top&&n<=r.bottom)}z._set("global",{elements:{rectangle:{backgroundColor:gt,borderColor:gt,borderSkipped:"bottom",borderWidth:0}}});var yt=X.extend({_type:"rectangle",draw:function(){var t=this._chart.ctx,e=this._view,n=function(t){var e=mt(t),n=e.right-e.left,i=e.bottom-e.top,a=bt(t,n/2,i/2);return{outer:{x:e.left,y:e.top,w:n,h:i},inner:{x:e.left+a.l,y:e.top+a.t,w:n-a.l-a.r,h:i-a.t-a.b}}}(e),i=n.outer,a=n.inner;t.fillStyle=e.backgroundColor,t.fillRect(i.x,i.y,i.w,i.h),i.w===a.w&&i.h===a.h||(t.save(),t.beginPath(),t.rect(i.x,i.y,i.w,i.h),t.clip(),t.fillStyle=e.borderColor,t.rect(a.x,a.y,a.w,a.h),t.fill("evenodd"),t.restore())},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){return xt(this._view,t,e)},inLabelRange:function(t,e){var n=this._view;return pt(n)?xt(n,t,null):xt(n,null,e)},inXRange:function(t){return xt(this._view,t,null)},inYRange:function(t){return xt(this._view,null,t)},getCenterPoint:function(){var t,e,n=this._view;return pt(n)?(t=n.x,e=(n.y+n.base)/2):(t=(n.x+n.base)/2,e=n.y),{x:t,y:e}},getArea:function(){var t=this._view;return pt(t)?t.width*Math.abs(t.y-t.base):t.height*Math.abs(t.x-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}}),_t={},kt=ot,wt=ut,Mt=ft,St=yt;_t.Arc=kt,_t.Line=wt,_t.Point=Mt,_t.Rectangle=St;var Ct=V._deprecated,Pt=V.valueOrDefault;function At(t,e,n){var i,a,r=n.barThickness,o=e.stackCount,s=e.pixels[t],l=V.isNullOrUndef(r)?function(t,e){var n,i,a,r,o=t._length;for(a=1,r=e.length;a<r;++a)o=Math.min(o,Math.abs(e[a]-e[a-1]));for(a=0,r=t.getTicks().length;a<r;++a)i=t.getPixelForTick(a),o=a>0?Math.min(o,Math.abs(i-n)):o,n=i;return o}(e.scale,e.pixels):-1;return V.isNullOrUndef(r)?(i=l*n.categoryPercentage,a=n.barPercentage):(i=r*o,a=1),{chunk:i/o,ratio:a,start:s-i/2}}z._set("bar",{hover:{mode:"label"},scales:{xAxes:[{type:"category",offset:!0,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}}),z._set("global",{datasets:{bar:{categoryPercentage:.8,barPercentage:.9}}});var Dt=nt.extend({dataElementType:_t.Rectangle,_dataElementOptions:["backgroundColor","borderColor","borderSkipped","borderWidth","barPercentage","barThickness","categoryPercentage","maxBarThickness","minBarLength"],initialize:function(){var t,e,n=this;nt.prototype.initialize.apply(n,arguments),(t=n.getMeta()).stack=n.getDataset().stack,t.bar=!0,e=n._getIndexScale().options,Ct("bar chart",e.barPercentage,"scales.[x/y]Axes.barPercentage","dataset.barPercentage"),Ct("bar chart",e.barThickness,"scales.[x/y]Axes.barThickness","dataset.barThickness"),Ct("bar chart",e.categoryPercentage,"scales.[x/y]Axes.categoryPercentage","dataset.categoryPercentage"),Ct("bar chart",n._getValueScale().options.minBarLength,"scales.[x/y]Axes.minBarLength","dataset.minBarLength"),Ct("bar chart",e.maxBarThickness,"scales.[x/y]Axes.maxBarThickness","dataset.maxBarThickness")},update:function(t){var e,n,i=this.getMeta().data;for(this._ruler=this.getRuler(),e=0,n=i.length;e<n;++e)this.updateElement(i[e],e,t)},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=i.getDataset(),o=i._resolveDataElementOptions(t,e);t._xScale=i.getScaleForId(a.xAxisID),t._yScale=i.getScaleForId(a.yAxisID),t._datasetIndex=i.index,t._index=e,t._model={backgroundColor:o.backgroundColor,borderColor:o.borderColor,borderSkipped:o.borderSkipped,borderWidth:o.borderWidth,datasetLabel:r.label,label:i.chart.data.labels[e]},V.isArray(r.data[e])&&(t._model.borderSkipped=null),i._updateElementGeometry(t,e,n,o),t.pivot()},_updateElementGeometry:function(t,e,n,i){var a=this,r=t._model,o=a._getValueScale(),s=o.getBasePixel(),l=o.isHorizontal(),u=a._ruler||a.getRuler(),d=a.calculateBarValuePixels(a.index,e,i),h=a.calculateBarIndexPixels(a.index,e,u,i);r.horizontal=l,r.base=n?s:d.base,r.x=l?n?s:d.head:h.center,r.y=l?h.center:n?s:d.head,r.height=l?h.size:void 0,r.width=l?void 0:h.size},_getStacks:function(t){var e,n,i=this._getIndexScale(),a=i._getMatchingVisibleMetas(this._type),r=i.options.stacked,o=a.length,s=[];for(e=0;e<o&&(n=a[e],(!1===r||-1===s.indexOf(n.stack)||void 0===r&&void 0===n.stack)&&s.push(n.stack),n.index!==t);++e);return s},getStackCount:function(){return this._getStacks().length},getStackIndex:function(t,e){var n=this._getStacks(t),i=void 0!==e?n.indexOf(e):-1;return-1===i?n.length-1:i},getRuler:function(){var t,e,n=this._getIndexScale(),i=[];for(t=0,e=this.getMeta().data.length;t<e;++t)i.push(n.getPixelForValue(null,t,this.index));return{pixels:i,start:n._startPixel,end:n._endPixel,stackCount:this.getStackCount(),scale:n}},calculateBarValuePixels:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._getValueScale(),c=h.isHorizontal(),f=d.data.datasets,g=h._getMatchingVisibleMetas(this._type),p=h._parseValue(f[t].data[e]),m=n.minBarLength,v=h.options.stacked,b=this.getMeta().stack,x=void 0===p.start?0:p.max>=0&&p.min>=0?p.min:p.max,y=void 0===p.start?p.end:p.max>=0&&p.min>=0?p.max-p.min:p.min-p.max,_=g.length;if(v||void 0===v&&void 0!==b)for(i=0;i<_&&(a=g[i]).index!==t;++i)a.stack===b&&(r=void 0===(u=h._parseValue(f[a.index].data[e])).start?u.end:u.min>=0&&u.max>=0?u.max:u.min,(p.min<0&&r<0||p.max>=0&&r>0)&&(x+=r));return o=h.getPixelForValue(x),l=(s=h.getPixelForValue(x+y))-o,void 0!==m&&Math.abs(l)<m&&(l=m,s=y>=0&&!c||y<0&&c?o-m:o+m),{size:l,base:o,head:s,center:s+l/2}},calculateBarIndexPixels:function(t,e,n,i){var a="flex"===i.barThickness?function(t,e,n){var i,a=e.pixels,r=a[t],o=t>0?a[t-1]:null,s=t<a.length-1?a[t+1]:null,l=n.categoryPercentage;return null===o&&(o=r-(null===s?e.end-e.start:s-r)),null===s&&(s=r+r-o),i=r-(r-Math.min(o,s))/2*l,{chunk:Math.abs(s-o)/2*l/e.stackCount,ratio:n.barPercentage,start:i}}(e,n,i):At(e,n,i),r=this.getStackIndex(t,this.getMeta().stack),o=a.start+a.chunk*r+a.chunk/2,s=Math.min(Pt(i.maxBarThickness,1/0),a.chunk*a.ratio);return{base:o-s/2,head:o+s/2,center:o,size:s}},draw:function(){var t=this.chart,e=this._getValueScale(),n=this.getMeta().data,i=this.getDataset(),a=n.length,r=0;for(V.canvas.clipArea(t.ctx,t.chartArea);r<a;++r){var o=e._parseValue(i.data[r]);isNaN(o.min)||isNaN(o.max)||n[r].draw()}V.canvas.unclipArea(t.ctx)},_resolveDataElementOptions:function(){var t=this,e=V.extend({},nt.prototype._resolveDataElementOptions.apply(t,arguments)),n=t._getIndexScale().options,i=t._getValueScale().options;return e.barPercentage=Pt(n.barPercentage,e.barPercentage),e.barThickness=Pt(n.barThickness,e.barThickness),e.categoryPercentage=Pt(n.categoryPercentage,e.categoryPercentage),e.maxBarThickness=Pt(n.maxBarThickness,e.maxBarThickness),e.minBarLength=Pt(i.minBarLength,e.minBarLength),e}}),Tt=V.valueOrDefault,It=V.options.resolve;z._set("bubble",{hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-0"}],yAxes:[{type:"linear",position:"left",id:"y-axis-0"}]},tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.datasets[t.datasetIndex].label||"",i=e.datasets[t.datasetIndex].data[t.index];return n+": ("+t.xLabel+", "+t.yLabel+", "+i.r+")"}}}});var Ft=nt.extend({dataElementType:_t.Point,_dataElementOptions:["backgroundColor","borderColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","hoverRadius","hitRadius","pointStyle","rotation"],update:function(t){var e=this,n=e.getMeta().data;V.each(n,(function(n,i){e.updateElement(n,i,t)}))},updateElement:function(t,e,n){var i=this,a=i.getMeta(),r=t.custom||{},o=i.getScaleForId(a.xAxisID),s=i.getScaleForId(a.yAxisID),l=i._resolveDataElementOptions(t,e),u=i.getDataset().data[e],d=i.index,h=n?o.getPixelForDecimal(.5):o.getPixelForValue("object"==typeof u?u:NaN,e,d),c=n?s.getBasePixel():s.getPixelForValue(u,e,d);t._xScale=o,t._yScale=s,t._options=l,t._datasetIndex=d,t._index=e,t._model={backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,hitRadius:l.hitRadius,pointStyle:l.pointStyle,rotation:l.rotation,radius:n?0:l.radius,skip:r.skip||isNaN(h)||isNaN(c),x:h,y:c},t.pivot()},setHoverStyle:function(t){var e=t._model,n=t._options,i=V.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Tt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Tt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Tt(n.hoverBorderWidth,n.borderWidth),e.radius=n.radius+n.hoverRadius},_resolveDataElementOptions:function(t,e){var n=this,i=n.chart,a=n.getDataset(),r=t.custom||{},o=a.data[e]||{},s=nt.prototype._resolveDataElementOptions.apply(n,arguments),l={chart:i,dataIndex:e,dataset:a,datasetIndex:n.index};return n._cachedDataOpts===s&&(s=V.extend({},s)),s.radius=It([r.radius,o.r,n._config.radius,i.options.elements.point.radius],l,e),s}}),Lt=V.valueOrDefault,Ot=Math.PI,Rt=2*Ot,zt=Ot/2;z._set("doughnut",{animation:{animateRotate:!0,animateScale:!1},hover:{mode:"single"},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r]&&(a.data[r].hidden=!a.data[r].hidden);o.update()}},cutoutPercentage:50,rotation:-zt,circumference:Rt,tooltips:{callbacks:{title:function(){return""},label:function(t,e){var n=e.labels[t.index],i=": "+e.datasets[t.datasetIndex].data[t.index];return V.isArray(n)?(n=n.slice())[0]+=i:n+=i,n}}}});var Nt=nt.extend({dataElementType:_t.Arc,linkScales:V.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],getRingIndex:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&++e;return e},update:function(t){var e,n,i,a,r=this,o=r.chart,s=o.chartArea,l=o.options,u=1,d=1,h=0,c=0,f=r.getMeta(),g=f.data,p=l.cutoutPercentage/100||0,m=l.circumference,v=r._getRingWeight(r.index);if(m<Rt){var b=l.rotation%Rt,x=(b+=b>=Ot?-Rt:b<-Ot?Rt:0)+m,y=Math.cos(b),_=Math.sin(b),k=Math.cos(x),w=Math.sin(x),M=b<=0&&x>=0||x>=Rt,S=b<=zt&&x>=zt||x>=Rt+zt,C=b<=-zt&&x>=-zt||x>=Ot+zt,P=b===-Ot||x>=Ot?-1:Math.min(y,y*p,k,k*p),A=C?-1:Math.min(_,_*p,w,w*p),D=M?1:Math.max(y,y*p,k,k*p),T=S?1:Math.max(_,_*p,w,w*p);u=(D-P)/2,d=(T-A)/2,h=-(D+P)/2,c=-(T+A)/2}for(i=0,a=g.length;i<a;++i)g[i]._options=r._resolveDataElementOptions(g[i],i);for(o.borderWidth=r.getMaxBorderWidth(),e=(s.right-s.left-o.borderWidth)/u,n=(s.bottom-s.top-o.borderWidth)/d,o.outerRadius=Math.max(Math.min(e,n)/2,0),o.innerRadius=Math.max(o.outerRadius*p,0),o.radiusLength=(o.outerRadius-o.innerRadius)/(r._getVisibleDatasetWeightTotal()||1),o.offsetX=h*o.outerRadius,o.offsetY=c*o.outerRadius,f.total=r.calculateTotal(),r.outerRadius=o.outerRadius-o.radiusLength*r._getRingWeightOffset(r.index),r.innerRadius=Math.max(r.outerRadius-o.radiusLength*v,0),i=0,a=g.length;i<a;++i)r.updateElement(g[i],i,t)},updateElement:function(t,e,n){var i=this,a=i.chart,r=a.chartArea,o=a.options,s=o.animation,l=(r.left+r.right)/2,u=(r.top+r.bottom)/2,d=o.rotation,h=o.rotation,c=i.getDataset(),f=n&&s.animateRotate?0:t.hidden?0:i.calculateCircumference(c.data[e])*(o.circumference/Rt),g=n&&s.animateScale?0:i.innerRadius,p=n&&s.animateScale?0:i.outerRadius,m=t._options||{};V.extend(t,{_datasetIndex:i.index,_index:e,_model:{backgroundColor:m.backgroundColor,borderColor:m.borderColor,borderWidth:m.borderWidth,borderAlign:m.borderAlign,x:l+a.offsetX,y:u+a.offsetY,startAngle:d,endAngle:h,circumference:f,outerRadius:p,innerRadius:g,label:V.valueAtIndexOrDefault(c.label,e,a.data.labels[e])}});var v=t._model;n&&s.animateRotate||(v.startAngle=0===e?o.rotation:i.getMeta().data[e-1]._model.endAngle,v.endAngle=v.startAngle+v.circumference),t.pivot()},calculateTotal:function(){var t,e=this.getDataset(),n=this.getMeta(),i=0;return V.each(n.data,(function(n,a){t=e.data[a],isNaN(t)||n.hidden||(i+=Math.abs(t))})),i},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?Rt*(Math.abs(t)/e):0},getMaxBorderWidth:function(t){var e,n,i,a,r,o,s,l,u=0,d=this.chart;if(!t)for(e=0,n=d.data.datasets.length;e<n;++e)if(d.isDatasetVisible(e)){t=(i=d.getDatasetMeta(e)).data,e!==this.index&&(r=i.controller);break}if(!t)return 0;for(e=0,n=t.length;e<n;++e)a=t[e],r?(r._configure(),o=r._resolveDataElementOptions(a,e)):o=a._options,"inner"!==o.borderAlign&&(s=o.borderWidth,u=(l=o.hoverBorderWidth)>(u=s>u?s:u)?l:u);return u},setHoverStyle:function(t){var e=t._model,n=t._options,i=V.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=Lt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Lt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Lt(n.hoverBorderWidth,n.borderWidth)},_getRingWeightOffset:function(t){for(var e=0,n=0;n<t;++n)this.chart.isDatasetVisible(n)&&(e+=this._getRingWeight(n));return e},_getRingWeight:function(t){return Math.max(Lt(this.chart.data.datasets[t].weight,1),0)},_getVisibleDatasetWeightTotal:function(){return this._getRingWeightOffset(this.chart.data.datasets.length)}});z._set("horizontalBar",{hover:{mode:"index",axis:"y"},scales:{xAxes:[{type:"linear",position:"bottom"}],yAxes:[{type:"category",position:"left",offset:!0,gridLines:{offsetGridLines:!0}}]},elements:{rectangle:{borderSkipped:"left"}},tooltips:{mode:"index",axis:"y"}}),z._set("global",{datasets:{horizontalBar:{categoryPercentage:.8,barPercentage:.9}}});var Bt=Dt.extend({_getValueScaleId:function(){return this.getMeta().xAxisID},_getIndexScaleId:function(){return this.getMeta().yAxisID}}),Et=V.valueOrDefault,Wt=V.options.resolve,Vt=V.canvas._isPointInArea;function Ht(t,e){var n=t&&t.options.ticks||{},i=n.reverse,a=void 0===n.min?e:0,r=void 0===n.max?e:0;return{start:i?r:a,end:i?a:r}}function jt(t,e,n){var i=n/2,a=Ht(t,i),r=Ht(e,i);return{top:r.end,right:a.end,bottom:r.start,left:a.start}}function qt(t){var e,n,i,a;return V.isObject(t)?(e=t.top,n=t.right,i=t.bottom,a=t.left):e=n=i=a=t,{top:e,right:n,bottom:i,left:a}}z._set("line",{showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}});var Ut=nt.extend({datasetElementType:_t.Line,dataElementType:_t.Point,_datasetElementOptions:["backgroundColor","borderCapStyle","borderColor","borderDash","borderDashOffset","borderJoinStyle","borderWidth","cubicInterpolationMode","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.options,l=i._config,u=i._showLine=Et(l.showLine,s.showLines);for(i._xScale=i.getScaleForId(a.xAxisID),i._yScale=i.getScaleForId(a.yAxisID),u&&(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=i._yScale,r._datasetIndex=i.index,r._children=o,r._model=i._resolveDatasetElementOptions(r),r.pivot()),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(u&&0!==r._model.tension&&i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i,a,r=this,o=r.getMeta(),s=t.custom||{},l=r.getDataset(),u=r.index,d=l.data[e],h=r._xScale,c=r._yScale,f=o.dataset._model,g=r._resolveDataElementOptions(t,e);i=h.getPixelForValue("object"==typeof d?d:NaN,e,u),a=n?c.getBasePixel():r.calculatePointY(d,e,u),t._xScale=h,t._yScale=c,t._options=g,t._datasetIndex=u,t._index=e,t._model={x:i,y:a,skip:s.skip||isNaN(i)||isNaN(a),radius:g.radius,pointStyle:g.pointStyle,rotation:g.rotation,backgroundColor:g.backgroundColor,borderColor:g.borderColor,borderWidth:g.borderWidth,tension:Et(s.tension,f?f.tension:0),steppedLine:!!f&&f.steppedLine,hitRadius:g.hitRadius}},_resolveDatasetElementOptions:function(t){var e=this,n=e._config,i=t.custom||{},a=e.chart.options,r=a.elements.line,o=nt.prototype._resolveDatasetElementOptions.apply(e,arguments);return o.spanGaps=Et(n.spanGaps,a.spanGaps),o.tension=Et(n.lineTension,r.tension),o.steppedLine=Wt([i.steppedLine,n.steppedLine,r.stepped]),o.clip=qt(Et(n.clip,jt(e._xScale,e._yScale,o.borderWidth))),o},calculatePointY:function(t,e,n){var i,a,r,o,s,l,u,d=this.chart,h=this._yScale,c=0,f=0;if(h.options.stacked){for(s=+h.getRightValue(t),u=(l=d._getSortedVisibleDatasetMetas()).length,i=0;i<u&&(r=l[i]).index!==n;++i)a=d.data.datasets[r.index],"line"===r.type&&r.yAxisID===h.id&&((o=+h.getRightValue(a.data[e]))<0?f+=o||0:c+=o||0);return s<0?h.getPixelForValue(f+s):h.getPixelForValue(c+s)}return h.getPixelForValue(t)},updateBezierControlPoints:function(){var t,e,n,i,a=this.chart,r=this.getMeta(),o=r.dataset._model,s=a.chartArea,l=r.data||[];function u(t,e,n){return Math.max(Math.min(t,n),e)}if(o.spanGaps&&(l=l.filter((function(t){return!t._model.skip}))),"monotone"===o.cubicInterpolationMode)V.splineCurveMonotone(l);else for(t=0,e=l.length;t<e;++t)n=l[t]._model,i=V.splineCurve(V.previousItem(l,t)._model,n,V.nextItem(l,t)._model,o.tension),n.controlPointPreviousX=i.previous.x,n.controlPointPreviousY=i.previous.y,n.controlPointNextX=i.next.x,n.controlPointNextY=i.next.y;if(a.options.elements.line.capBezierPoints)for(t=0,e=l.length;t<e;++t)n=l[t]._model,Vt(n,s)&&(t>0&&Vt(l[t-1]._model,s)&&(n.controlPointPreviousX=u(n.controlPointPreviousX,s.left,s.right),n.controlPointPreviousY=u(n.controlPointPreviousY,s.top,s.bottom)),t<l.length-1&&Vt(l[t+1]._model,s)&&(n.controlPointNextX=u(n.controlPointNextX,s.left,s.right),n.controlPointNextY=u(n.controlPointNextY,s.top,s.bottom)))},draw:function(){var t,e=this.chart,n=this.getMeta(),i=n.data||[],a=e.chartArea,r=e.canvas,o=0,s=i.length;for(this._showLine&&(t=n.dataset._model.clip,V.canvas.clipArea(e.ctx,{left:!1===t.left?0:a.left-t.left,right:!1===t.right?r.width:a.right+t.right,top:!1===t.top?0:a.top-t.top,bottom:!1===t.bottom?r.height:a.bottom+t.bottom}),n.dataset.draw(),V.canvas.unclipArea(e.ctx));o<s;++o)i[o].draw(a)},setHoverStyle:function(t){var e=t._model,n=t._options,i=V.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Et(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Et(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Et(n.hoverBorderWidth,n.borderWidth),e.radius=Et(n.hoverRadius,n.radius)}}),Yt=V.options.resolve;z._set("polarArea",{scale:{type:"radialLinear",angleLines:{display:!1},gridLines:{circular:!0},pointLabels:{display:!1},ticks:{beginAtZero:!0}},animation:{animateRotate:!0,animateScale:!0},startAngle:-.5*Math.PI,legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data,o=r.datasets,s=r.labels;if(a.setAttribute("class",t.id+"-legend"),o.length)for(e=0,n=o[0].data.length;e<n;++e)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=o[0].backgroundColor[e],s[e]&&i.appendChild(document.createTextNode(s[e]));return a.outerHTML},legend:{labels:{generateLabels:function(t){var e=t.data;return e.labels.length&&e.datasets.length?e.labels.map((function(n,i){var a=t.getDatasetMeta(0),r=a.controller.getStyle(i);return{text:n,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,lineWidth:r.borderWidth,hidden:isNaN(e.datasets[0].data[i])||a.data[i].hidden,index:i}})):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n<i;++n)(a=o.getDatasetMeta(n)).data[r].hidden=!a.data[r].hidden;o.update()}},tooltips:{callbacks:{title:function(){return""},label:function(t,e){return e.labels[t.index]+": "+t.yLabel}}}});var Gt=nt.extend({dataElementType:_t.Arc,linkScales:V.noop,_dataElementOptions:["backgroundColor","borderColor","borderWidth","borderAlign","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth"],_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i,a=this,r=a.getDataset(),o=a.getMeta(),s=a.chart.options.startAngle||0,l=a._starts=[],u=a._angles=[],d=o.data;for(a._updateRadius(),o.count=a.countVisibleElements(),e=0,n=r.data.length;e<n;e++)l[e]=s,i=a._computeAngle(e),u[e]=i,s+=i;for(e=0,n=d.length;e<n;++e)d[e]._options=a._resolveDataElementOptions(d[e],e),a.updateElement(d[e],e,t)},_updateRadius:function(){var t=this,e=t.chart,n=e.chartArea,i=e.options,a=Math.min(n.right-n.left,n.bottom-n.top);e.outerRadius=Math.max(a/2,0),e.innerRadius=Math.max(i.cutoutPercentage?e.outerRadius/100*i.cutoutPercentage:1,0),e.radiusLength=(e.outerRadius-e.innerRadius)/e.getVisibleDatasetCount(),t.outerRadius=e.outerRadius-e.radiusLength*t.index,t.innerRadius=t.outerRadius-e.radiusLength},updateElement:function(t,e,n){var i=this,a=i.chart,r=i.getDataset(),o=a.options,s=o.animation,l=a.scale,u=a.data.labels,d=l.xCenter,h=l.yCenter,c=o.startAngle,f=t.hidden?0:l.getDistanceFromCenterForValue(r.data[e]),g=i._starts[e],p=g+(t.hidden?0:i._angles[e]),m=s.animateScale?0:l.getDistanceFromCenterForValue(r.data[e]),v=t._options||{};V.extend(t,{_datasetIndex:i.index,_index:e,_scale:l,_model:{backgroundColor:v.backgroundColor,borderColor:v.borderColor,borderWidth:v.borderWidth,borderAlign:v.borderAlign,x:d,y:h,innerRadius:0,outerRadius:n?m:f,startAngle:n&&s.animateRotate?c:g,endAngle:n&&s.animateRotate?c:p,label:V.valueAtIndexOrDefault(u,e,u[e])}}),t.pivot()},countVisibleElements:function(){var t=this.getDataset(),e=this.getMeta(),n=0;return V.each(e.data,(function(e,i){isNaN(t.data[i])||e.hidden||n++})),n},setHoverStyle:function(t){var e=t._model,n=t._options,i=V.getHoverColor,a=V.valueOrDefault;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth},e.backgroundColor=a(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=a(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=a(n.hoverBorderWidth,n.borderWidth)},_computeAngle:function(t){var e=this,n=this.getMeta().count,i=e.getDataset(),a=e.getMeta();if(isNaN(i.data[t])||a.data[t].hidden)return 0;var r={chart:e.chart,dataIndex:t,dataset:i,datasetIndex:e.index};return Yt([e.chart.options.elements.arc.angle,2*Math.PI/n],r,t)}});z._set("pie",V.clone(z.doughnut)),z._set("pie",{cutoutPercentage:0});var Xt=Nt,Kt=V.valueOrDefault;z._set("radar",{spanGaps:!1,scale:{type:"radialLinear"},elements:{line:{fill:"start",tension:0}}});var Zt=nt.extend({datasetElementType:_t.Line,dataElementType:_t.Point,linkScales:V.noop,_datasetElementOptions:["backgroundColor","borderWidth","borderColor","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","fill"],_dataElementOptions:{backgroundColor:"pointBackgroundColor",borderColor:"pointBorderColor",borderWidth:"pointBorderWidth",hitRadius:"pointHitRadius",hoverBackgroundColor:"pointHoverBackgroundColor",hoverBorderColor:"pointHoverBorderColor",hoverBorderWidth:"pointHoverBorderWidth",hoverRadius:"pointHoverRadius",pointStyle:"pointStyle",radius:"pointRadius",rotation:"pointRotation"},_getIndexScaleId:function(){return this.chart.scale.id},_getValueScaleId:function(){return this.chart.scale.id},update:function(t){var e,n,i=this,a=i.getMeta(),r=a.dataset,o=a.data||[],s=i.chart.scale,l=i._config;for(void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),r._scale=s,r._datasetIndex=i.index,r._children=o,r._loop=!0,r._model=i._resolveDatasetElementOptions(r),r.pivot(),e=0,n=o.length;e<n;++e)i.updateElement(o[e],e,t);for(i.updateBezierControlPoints(),e=0,n=o.length;e<n;++e)o[e].pivot()},updateElement:function(t,e,n){var i=this,a=t.custom||{},r=i.getDataset(),o=i.chart.scale,s=o.getPointPositionForValue(e,r.data[e]),l=i._resolveDataElementOptions(t,e),u=i.getMeta().dataset._model,d=n?o.xCenter:s.x,h=n?o.yCenter:s.y;t._scale=o,t._options=l,t._datasetIndex=i.index,t._index=e,t._model={x:d,y:h,skip:a.skip||isNaN(d)||isNaN(h),radius:l.radius,pointStyle:l.pointStyle,rotation:l.rotation,backgroundColor:l.backgroundColor,borderColor:l.borderColor,borderWidth:l.borderWidth,tension:Kt(a.tension,u?u.tension:0),hitRadius:l.hitRadius}},_resolveDatasetElementOptions:function(){var t=this,e=t._config,n=t.chart.options,i=nt.prototype._resolveDatasetElementOptions.apply(t,arguments);return i.spanGaps=Kt(e.spanGaps,n.spanGaps),i.tension=Kt(e.lineTension,n.elements.line.tension),i},updateBezierControlPoints:function(){var t,e,n,i,a=this.getMeta(),r=this.chart.chartArea,o=a.data||[];function s(t,e,n){return Math.max(Math.min(t,n),e)}for(a.dataset._model.spanGaps&&(o=o.filter((function(t){return!t._model.skip}))),t=0,e=o.length;t<e;++t)n=o[t]._model,i=V.splineCurve(V.previousItem(o,t,!0)._model,n,V.nextItem(o,t,!0)._model,n.tension),n.controlPointPreviousX=s(i.previous.x,r.left,r.right),n.controlPointPreviousY=s(i.previous.y,r.top,r.bottom),n.controlPointNextX=s(i.next.x,r.left,r.right),n.controlPointNextY=s(i.next.y,r.top,r.bottom)},setHoverStyle:function(t){var e=t._model,n=t._options,i=V.getHoverColor;t.$previousStyle={backgroundColor:e.backgroundColor,borderColor:e.borderColor,borderWidth:e.borderWidth,radius:e.radius},e.backgroundColor=Kt(n.hoverBackgroundColor,i(n.backgroundColor)),e.borderColor=Kt(n.hoverBorderColor,i(n.borderColor)),e.borderWidth=Kt(n.hoverBorderWidth,n.borderWidth),e.radius=Kt(n.hoverRadius,n.radius)}});z._set("scatter",{hover:{mode:"single"},scales:{xAxes:[{id:"x-axis-1",type:"linear",position:"bottom"}],yAxes:[{id:"y-axis-1",type:"linear",position:"left"}]},tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}}),z._set("global",{datasets:{scatter:{showLine:!1}}});var $t={bar:Dt,bubble:Ft,doughnut:Nt,horizontalBar:Bt,line:Ut,polarArea:Gt,pie:Xt,radar:Zt,scatter:Ut};function Jt(t,e){return t.native?{x:t.x,y:t.y}:V.getRelativePosition(t,e)}function Qt(t,e){var n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas();for(i=0,r=l.length;i<r;++i)for(a=0,o=(n=l[i].data).length;a<o;++a)(s=n[a])._view.skip||e(s)}function te(t,e){var n=[];return Qt(t,(function(t){t.inRange(e.x,e.y)&&n.push(t)})),n}function ee(t,e,n,i){var a=Number.POSITIVE_INFINITY,r=[];return Qt(t,(function(t){if(!n||t.inRange(e.x,e.y)){var o=t.getCenterPoint(),s=i(e,o);s<a?(r=[t],a=s):s===a&&r.push(t)}})),r}function ne(t){var e=-1!==t.indexOf("x"),n=-1!==t.indexOf("y");return function(t,i){var a=e?Math.abs(t.x-i.x):0,r=n?Math.abs(t.y-i.y):0;return Math.sqrt(Math.pow(a,2)+Math.pow(r,2))}}function ie(t,e,n){var i=Jt(e,t);n.axis=n.axis||"x";var a=ne(n.axis),r=n.intersect?te(t,i):ee(t,i,!1,a),o=[];return r.length?(t._getSortedVisibleDatasetMetas().forEach((function(t){var e=t.data[r[0]._index];e&&!e._view.skip&&o.push(e)})),o):[]}var ae={modes:{single:function(t,e){var n=Jt(e,t),i=[];return Qt(t,(function(t){if(t.inRange(n.x,n.y))return i.push(t),i})),i.slice(0,1)},label:ie,index:ie,dataset:function(t,e,n){var i=Jt(e,t);n.axis=n.axis||"xy";var a=ne(n.axis),r=n.intersect?te(t,i):ee(t,i,!1,a);return r.length>0&&(r=t.getDatasetMeta(r[0]._datasetIndex).data),r},"x-axis":function(t,e){return ie(t,e,{intersect:!1})},point:function(t,e){return te(t,Jt(e,t))},nearest:function(t,e,n){var i=Jt(e,t);n.axis=n.axis||"xy";var a=ne(n.axis);return ee(t,i,n.intersect,a)},x:function(t,e,n){var i=Jt(e,t),a=[],r=!1;return Qt(t,(function(t){t.inXRange(i.x)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a},y:function(t,e,n){var i=Jt(e,t),a=[],r=!1;return Qt(t,(function(t){t.inYRange(i.y)&&a.push(t),t.inRange(i.x,i.y)&&(r=!0)})),n.intersect&&!r&&(a=[]),a}}},re=V.extend;function oe(t,e){return V.where(t,(function(t){return t.pos===e}))}function se(t,e){return t.sort((function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i.index-a.index:i.weight-a.weight}))}function le(t,e,n,i){return Math.max(t[n],e[n])+Math.max(t[i],e[i])}function ue(t,e,n){var i,a,r=n.box,o=t.maxPadding;if(n.size&&(t[n.pos]-=n.size),n.size=n.horizontal?r.height:r.width,t[n.pos]+=n.size,r.getPadding){var s=r.getPadding();o.top=Math.max(o.top,s.top),o.left=Math.max(o.left,s.left),o.bottom=Math.max(o.bottom,s.bottom),o.right=Math.max(o.right,s.right)}if(i=e.outerWidth-le(o,t,"left","right"),a=e.outerHeight-le(o,t,"top","bottom"),i!==t.w||a!==t.h)return t.w=i,t.h=a,n.horizontal?i!==t.w:a!==t.h}function de(t,e){var n=e.maxPadding;function i(t){var i={left:0,top:0,right:0,bottom:0};return t.forEach((function(t){i[t]=Math.max(e[t],n[t])})),i}return i(t?["left","right"]:["top","bottom"])}function he(t,e,n){var i,a,r,o,s,l,u=[];for(i=0,a=t.length;i<a;++i)(o=(r=t[i]).box).update(r.width||e.w,r.height||e.h,de(r.horizontal,e)),ue(e,n,r)&&(l=!0,u.length&&(s=!0)),o.fullWidth||u.push(r);return s&&he(u,e,n)||l}function ce(t,e,n){var i,a,r,o,s=n.padding,l=e.x,u=e.y;for(i=0,a=t.length;i<a;++i)o=(r=t[i]).box,r.horizontal?(o.left=o.fullWidth?s.left:e.left,o.right=o.fullWidth?n.outerWidth-s.right:e.left+e.w,o.top=u,o.bottom=u+o.height,o.width=o.right-o.left,u=o.bottom):(o.left=l,o.right=l+o.width,o.top=e.top,o.bottom=e.top+e.h,o.height=o.bottom-o.top,l=o.right);e.x=l,e.y=u}z._set("global",{layout:{padding:{top:0,right:0,bottom:0,left:0}}});var fe,ge={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw:function(){e.draw.apply(e,arguments)}}]},t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;-1!==n&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],r=a.length,o=0;o<r;++o)i=a[o],n.hasOwnProperty(i)&&(e[i]=n[i])},update:function(t,e,n){if(t){var i=t.options.layout||{},a=V.options.toPadding(i.padding),r=e-a.width,o=n-a.height,s=function(t){var e=function(t){var e,n,i,a=[];for(e=0,n=(t||[]).length;e<n;++e)i=t[e],a.push({index:e,box:i,pos:i.position,horizontal:i.isHorizontal(),weight:i.weight});return a}(t),n=se(oe(e,"left"),!0),i=se(oe(e,"right")),a=se(oe(e,"top"),!0),r=se(oe(e,"bottom"));return{leftAndTop:n.concat(a),rightAndBottom:i.concat(r),chartArea:oe(e,"chartArea"),vertical:n.concat(i),horizontal:a.concat(r)}}(t.boxes),l=s.vertical,u=s.horizontal,d=Object.freeze({outerWidth:e,outerHeight:n,padding:a,availableWidth:r,vBoxMaxWidth:r/2/l.length,hBoxMaxHeight:o/2}),h=re({maxPadding:re({},a),w:r,h:o,x:a.left,y:a.top},a);!function(t,e){var n,i,a;for(n=0,i=t.length;n<i;++n)(a=t[n]).width=a.horizontal?a.box.fullWidth&&e.availableWidth:e.vBoxMaxWidth,a.height=a.horizontal&&e.hBoxMaxHeight}(l.concat(u),d),he(l,h,d),he(u,h,d)&&he(l,h,d),function(t){var e=t.maxPadding;function n(n){var i=Math.max(e[n]-t[n],0);return t[n]+=i,i}t.y+=n("top"),t.x+=n("left"),n("right"),n("bottom")}(h),ce(s.leftAndTop,h,d),h.x+=h.w,h.y+=h.h,ce(s.rightAndBottom,h,d),t.chartArea={left:h.left,top:h.top,right:h.left+h.w,bottom:h.top+h.h},V.each(s.chartArea,(function(e){var n=e.box;re(n,t.chartArea),n.update(h.w,h.h)}))}}},pe=(fe=Object.freeze({__proto__:null,default:"@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}"}))&&fe.default||fe,me="$chartjs",ve="chartjs-size-monitor",be="chartjs-render-monitor",xe="chartjs-render-animation",ye=["animationstart","webkitAnimationStart"],_e={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};function ke(t,e){var n=V.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}var we=!!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("e",null,e)}catch(t){}return t}()&&{passive:!0};function Me(t,e,n){t.addEventListener(e,n,we)}function Se(t,e,n){t.removeEventListener(e,n,we)}function Ce(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function Pe(t){var e=document.createElement("div");return e.className=t||"",e}function Ae(t,e,n){var i,a,r,o,s=t[me]||(t[me]={}),l=s.resizer=function(t){var e=Pe(ve),n=Pe(ve+"-expand"),i=Pe(ve+"-shrink");n.appendChild(Pe()),i.appendChild(Pe()),e.appendChild(n),e.appendChild(i),e._reset=function(){n.scrollLeft=1e6,n.scrollTop=1e6,i.scrollLeft=1e6,i.scrollTop=1e6};var a=function(){e._reset(),t()};return Me(n,"scroll",a.bind(n,"expand")),Me(i,"scroll",a.bind(i,"shrink")),e}((i=function(){if(s.resizer){var i=n.options.maintainAspectRatio&&t.parentNode,a=i?i.clientWidth:0;e(Ce("resize",n)),i&&i.clientWidth<a&&n.canvas&&e(Ce("resize",n))}},r=!1,o=[],function(){o=Array.prototype.slice.call(arguments),a=a||this,r||(r=!0,V.requestAnimFrame.call(window,(function(){r=!1,i.apply(a,o)})))}));!function(t,e){var n=t[me]||(t[me]={}),i=n.renderProxy=function(t){t.animationName===xe&&e()};V.each(ye,(function(e){Me(t,e,i)})),n.reflow=!!t.offsetParent,t.classList.add(be)}(t,(function(){if(s.resizer){var e=t.parentNode;e&&e!==l.parentNode&&e.insertBefore(l,e.firstChild),l._reset()}}))}function De(t){var e=t[me]||{},n=e.resizer;delete e.resizer,function(t){var e=t[me]||{},n=e.renderProxy;n&&(V.each(ye,(function(e){Se(t,e,n)})),delete e.renderProxy),t.classList.remove(be)}(t),n&&n.parentNode&&n.parentNode.removeChild(n)}var Te={disableCSSInjection:!1,_enabled:"undefined"!=typeof window&&"undefined"!=typeof document,_ensureLoaded:function(t){if(!this.disableCSSInjection){var e=t.getRootNode?t.getRootNode():document;!function(t,e){var n=t[me]||(t[me]={});if(!n.containsStyles){n.containsStyles=!0,e="/* Chart.js */\n"+e;var i=document.createElement("style");i.setAttribute("type","text/css"),i.appendChild(document.createTextNode(e)),t.appendChild(i)}}(e.host?e:document.head,pe)}},acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var n=t&&t.getContext&&t.getContext("2d");return n&&n.canvas===t?(this._ensureLoaded(t),function(t,e){var n=t.style,i=t.getAttribute("height"),a=t.getAttribute("width");if(t[me]={initial:{height:i,width:a,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",null===a||""===a){var r=ke(t,"width");void 0!==r&&(t.width=r)}if(null===i||""===i)if(""===t.style.height)t.height=t.width/(e.options.aspectRatio||2);else{var o=ke(t,"height");void 0!==r&&(t.height=o)}}(t,e),n):null},releaseContext:function(t){var e=t.canvas;if(e[me]){var n=e[me].initial;["height","width"].forEach((function(t){var i=n[t];V.isNullOrUndef(i)?e.removeAttribute(t):e.setAttribute(t,i)})),V.each(n.style||{},(function(t,n){e.style[n]=t})),e.width=e.width,delete e[me]}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=n[me]||(n[me]={});Me(i,e,(a.proxies||(a.proxies={}))[t.id+"_"+e]=function(e){n(function(t,e){var n=_e[t.type]||t.type,i=V.getRelativePosition(t,e);return Ce(n,e,i.x,i.y,t)}(e,t))})}else Ae(i,n,t)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"!==e){var a=((n[me]||{}).proxies||{})[t.id+"_"+e];a&&Se(i,e,a)}else De(i)}};V.addEvent=Me,V.removeEvent=Se;var Ie=Te._enabled?Te:{acquireContext:function(t){return t&&t.canvas&&(t=t.canvas),t&&t.getContext("2d")||null}},Fe=V.extend({initialize:function(){},acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},Ie);z._set("global",{plugins:{}});var Le={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach((function(t){-1===e.indexOf(t)&&e.push(t)})),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach((function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)})),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;i<u;++i)if("function"==typeof(s=(r=(a=l[i]).plugin)[e])&&((o=[t].concat(n||[])).push(a.options),!1===s.apply(r,o)))return!1;return!0},descriptors:function(t){var e=t.$plugins||(t.$plugins={});if(e.id===this._cacheId)return e.descriptors;var n=[],i=[],a=t&&t.config||{},r=a.options&&a.options.plugins||{};return this._plugins.concat(a.plugins||[]).forEach((function(t){if(-1===n.indexOf(t)){var e=t.id,a=r[e];!1!==a&&(!0===a&&(a=V.clone(z.global.plugins[e])),n.push(t),i.push({plugin:t,options:a||{}}))}})),e.descriptors=i,e.id=this._cacheId,i},_invalidate:function(t){delete t.$plugins}},Oe={constructors:{},defaults:{},registerScaleType:function(t,e,n){this.constructors[t]=e,this.defaults[t]=V.clone(n)},getScaleConstructor:function(t){return this.constructors.hasOwnProperty(t)?this.constructors[t]:void 0},getScaleDefaults:function(t){return this.defaults.hasOwnProperty(t)?V.merge({},[z.scale,this.defaults[t]]):{}},updateScaleDefaults:function(t,e){this.defaults.hasOwnProperty(t)&&(this.defaults[t]=V.extend(this.defaults[t],e))},addScalesToLayout:function(t){V.each(t.scales,(function(e){e.fullWidth=e.options.fullWidth,e.position=e.options.position,e.weight=e.options.weight,ge.addBox(t,e)}))}},Re=V.valueOrDefault,ze=V.rtl.getRtlAdapter;z._set("global",{tooltips:{enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:V.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.label?n=r.label:r.xLabel?n=r.xLabel:a>0&&r.index<a&&(n=i[r.index])}return n},afterTitle:V.noop,beforeBody:V.noop,beforeLabel:V.noop,label:function(t,e){var n=e.datasets[t.datasetIndex].label||"";return n&&(n+=": "),V.isNullOrUndef(t.value)?n+=t.yLabel:n+=t.value,n},labelColor:function(t,e){var n=e.getDatasetMeta(t.datasetIndex).data[t.index]._view;return{borderColor:n.borderColor,backgroundColor:n.backgroundColor}},labelTextColor:function(){return this._options.bodyFontColor},afterLabel:V.noop,afterBody:V.noop,beforeFooter:V.noop,footer:V.noop,afterFooter:V.noop}}});var Ne={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,r=0;for(e=0,n=t.length;e<n;++e){var o=t[e];if(o&&o.hasValue()){var s=o.tooltipPosition();i+=s.x,a+=s.y,++r}}return{x:i/r,y:a/r}},nearest:function(t,e){var n,i,a,r=e.x,o=e.y,s=Number.POSITIVE_INFINITY;for(n=0,i=t.length;n<i;++n){var l=t[n];if(l&&l.hasValue()){var u=l.getCenterPoint(),d=V.distanceBetweenPoints(e,u);d<s&&(s=d,a=l)}}if(a){var h=a.tooltipPosition();r=h.x,o=h.y}return{x:r,y:o}}};function Be(t,e){return e&&(V.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Ee(t){return("string"==typeof t||t instanceof String)&&t.indexOf("\n")>-1?t.split("\n"):t}function We(t){var e=z.global;return{xPadding:t.xPadding,yPadding:t.yPadding,xAlign:t.xAlign,yAlign:t.yAlign,rtl:t.rtl,textDirection:t.textDirection,bodyFontColor:t.bodyFontColor,_bodyFontFamily:Re(t.bodyFontFamily,e.defaultFontFamily),_bodyFontStyle:Re(t.bodyFontStyle,e.defaultFontStyle),_bodyAlign:t.bodyAlign,bodyFontSize:Re(t.bodyFontSize,e.defaultFontSize),bodySpacing:t.bodySpacing,titleFontColor:t.titleFontColor,_titleFontFamily:Re(t.titleFontFamily,e.defaultFontFamily),_titleFontStyle:Re(t.titleFontStyle,e.defaultFontStyle),titleFontSize:Re(t.titleFontSize,e.defaultFontSize),_titleAlign:t.titleAlign,titleSpacing:t.titleSpacing,titleMarginBottom:t.titleMarginBottom,footerFontColor:t.footerFontColor,_footerFontFamily:Re(t.footerFontFamily,e.defaultFontFamily),_footerFontStyle:Re(t.footerFontStyle,e.defaultFontStyle),footerFontSize:Re(t.footerFontSize,e.defaultFontSize),_footerAlign:t.footerAlign,footerSpacing:t.footerSpacing,footerMarginTop:t.footerMarginTop,caretSize:t.caretSize,cornerRadius:t.cornerRadius,backgroundColor:t.backgroundColor,opacity:0,legendColorBackground:t.multiKeyBackground,displayColors:t.displayColors,borderColor:t.borderColor,borderWidth:t.borderWidth}}function Ve(t,e){return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-t.xPadding:t.x+t.xPadding}function He(t){return Be([],Ee(t))}var je=X.extend({initialize:function(){this._model=We(this._options),this._lastActive=[]},getTitle:function(){var t=this,e=t._options,n=e.callbacks,i=n.beforeTitle.apply(t,arguments),a=n.title.apply(t,arguments),r=n.afterTitle.apply(t,arguments),o=[];return o=Be(o,Ee(i)),o=Be(o,Ee(a)),o=Be(o,Ee(r))},getBeforeBody:function(){return He(this._options.callbacks.beforeBody.apply(this,arguments))},getBody:function(t,e){var n=this,i=n._options.callbacks,a=[];return V.each(t,(function(t){var r={before:[],lines:[],after:[]};Be(r.before,Ee(i.beforeLabel.call(n,t,e))),Be(r.lines,i.label.call(n,t,e)),Be(r.after,Ee(i.afterLabel.call(n,t,e))),a.push(r)})),a},getAfterBody:function(){return He(this._options.callbacks.afterBody.apply(this,arguments))},getFooter:function(){var t=this,e=t._options.callbacks,n=e.beforeFooter.apply(t,arguments),i=e.footer.apply(t,arguments),a=e.afterFooter.apply(t,arguments),r=[];return r=Be(r,Ee(n)),r=Be(r,Ee(i)),r=Be(r,Ee(a))},update:function(t){var e,n,i,a,r,o,s,l,u,d,h=this,c=h._options,f=h._model,g=h._model=We(c),p=h._active,m=h._data,v={xAlign:f.xAlign,yAlign:f.yAlign},b={x:f.x,y:f.y},x={width:f.width,height:f.height},y={x:f.caretX,y:f.caretY};if(p.length){g.opacity=1;var _=[],k=[];y=Ne[c.position].call(h,p,h._eventPosition);var w=[];for(e=0,n=p.length;e<n;++e)w.push((i=p[e],a=void 0,r=void 0,o=void 0,s=void 0,l=void 0,u=void 0,d=void 0,a=i._xScale,r=i._yScale||i._scale,o=i._index,s=i._datasetIndex,l=i._chart.getDatasetMeta(s).controller,u=l._getIndexScale(),d=l._getValueScale(),{xLabel:a?a.getLabelForIndex(o,s):"",yLabel:r?r.getLabelForIndex(o,s):"",label:u?""+u.getLabelForIndex(o,s):"",value:d?""+d.getLabelForIndex(o,s):"",index:o,datasetIndex:s,x:i._model.x,y:i._model.y}));c.filter&&(w=w.filter((function(t){return c.filter(t,m)}))),c.itemSort&&(w=w.sort((function(t,e){return c.itemSort(t,e,m)}))),V.each(w,(function(t){_.push(c.callbacks.labelColor.call(h,t,h._chart)),k.push(c.callbacks.labelTextColor.call(h,t,h._chart))})),g.title=h.getTitle(w,m),g.beforeBody=h.getBeforeBody(w,m),g.body=h.getBody(w,m),g.afterBody=h.getAfterBody(w,m),g.footer=h.getFooter(w,m),g.x=y.x,g.y=y.y,g.caretPadding=c.caretPadding,g.labelColors=_,g.labelTextColors=k,g.dataPoints=w,x=function(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,o=r.reduce((function(t,e){return t+e.before.length+e.lines.length+e.after.length}),0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,l=e.footer.length,u=e.titleFontSize,d=e.bodyFontSize,h=e.footerFontSize;i+=s*u,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=o*d,i+=o?(o-1)*e.bodySpacing:0,i+=l?e.footerMarginTop:0,i+=l*h,i+=l?(l-1)*e.footerSpacing:0;var c=0,f=function(t){a=Math.max(a,n.measureText(t).width+c)};return n.font=V.fontString(u,e._titleFontStyle,e._titleFontFamily),V.each(e.title,f),n.font=V.fontString(d,e._bodyFontStyle,e._bodyFontFamily),V.each(e.beforeBody.concat(e.afterBody),f),c=e.displayColors?d+2:0,V.each(r,(function(t){V.each(t.before,f),V.each(t.lines,f),V.each(t.after,f)})),c=0,n.font=V.fontString(h,e._footerFontStyle,e._footerFontFamily),V.each(e.footer,f),{width:a+=2*e.xPadding,height:i}}(this,g),b=function(t,e,n,i){var a=t.x,r=t.y,o=t.caretSize,s=t.caretPadding,l=t.cornerRadius,u=n.xAlign,d=n.yAlign,h=o+s,c=l+s;return"right"===u?a-=e.width:"center"===u&&((a-=e.width/2)+e.width>i.width&&(a=i.width-e.width),a<0&&(a=0)),"top"===d?r+=h:r-="bottom"===d?e.height+h:e.height/2,"center"===d?"left"===u?a+=h:"right"===u&&(a-=h):"left"===u?a-=c:"right"===u&&(a+=c),{x:a,y:r}}(g,x,v=function(t,e){var n,i,a,r,o,s=t._model,l=t._chart,u=t._chart.chartArea,d="center",h="center";s.y<e.height?h="top":s.y>l.height-e.height&&(h="bottom");var c=(u.left+u.right)/2,f=(u.top+u.bottom)/2;"center"===h?(n=function(t){return t<=c},i=function(t){return t>c}):(n=function(t){return t<=e.width/2},i=function(t){return t>=l.width-e.width/2}),a=function(t){return t+e.width+s.caretSize+s.caretPadding>l.width},r=function(t){return t-e.width-s.caretSize-s.caretPadding<0},o=function(t){return t<=f?"top":"bottom"},n(s.x)?(d="left",a(s.x)&&(d="center",h=o(s.y))):i(s.x)&&(d="right",r(s.x)&&(d="center",h=o(s.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:d,yAlign:g.yAlign?g.yAlign:h}}(this,x),h._chart)}else g.opacity=0;return g.xAlign=v.xAlign,g.yAlign=v.yAlign,g.x=b.x,g.y=b.y,g.width=x.width,g.height=x.height,g.caretX=y.x,g.caretY=y.y,h._model=g,t&&c.custom&&c.custom.call(h,g),h},drawCaret:function(t,e){var n=this._chart.ctx,i=this._view,a=this.getCaretPosition(t,e,i);n.lineTo(a.x1,a.y1),n.lineTo(a.x2,a.y2),n.lineTo(a.x3,a.y3)},getCaretPosition:function(t,e,n){var i,a,r,o,s,l,u=n.caretSize,d=n.cornerRadius,h=n.xAlign,c=n.yAlign,f=t.x,g=t.y,p=e.width,m=e.height;if("center"===c)s=g+m/2,"left"===h?(a=(i=f)-u,r=i,o=s+u,l=s-u):(a=(i=f+p)+u,r=i,o=s-u,l=s+u);else if("left"===h?(i=(a=f+d+u)-u,r=a+u):"right"===h?(i=(a=f+p-d-u)-u,r=a+u):(i=(a=n.caretX)-u,r=a+u),"top"===c)s=(o=g)-u,l=o;else{s=(o=g+m)+u,l=o;var v=r;r=i,i=v}return{x1:i,x2:a,x3:r,y1:o,y2:s,y3:l}},drawTitle:function(t,e,n){var i,a,r,o=e.title,s=o.length;if(s){var l=ze(e.rtl,e.x,e.width);for(t.x=Ve(e,e._titleAlign),n.textAlign=l.textAlign(e._titleAlign),n.textBaseline="middle",i=e.titleFontSize,a=e.titleSpacing,n.fillStyle=e.titleFontColor,n.font=V.fontString(i,e._titleFontStyle,e._titleFontFamily),r=0;r<s;++r)n.fillText(o[r],l.x(t.x),t.y+i/2),t.y+=i+a,r+1===s&&(t.y+=e.titleMarginBottom-a)}},drawBody:function(t,e,n){var i,a,r,o,s,l,u,d,h=e.bodyFontSize,c=e.bodySpacing,f=e._bodyAlign,g=e.body,p=e.displayColors,m=0,v=p?Ve(e,"left"):0,b=ze(e.rtl,e.x,e.width),x=function(e){n.fillText(e,b.x(t.x+m),t.y+h/2),t.y+=h+c},y=b.textAlign(f);for(n.textAlign=f,n.textBaseline="middle",n.font=V.fontString(h,e._bodyFontStyle,e._bodyFontFamily),t.x=Ve(e,y),n.fillStyle=e.bodyFontColor,V.each(e.beforeBody,x),m=p&&"right"!==y?"center"===f?h/2+1:h+2:0,s=0,u=g.length;s<u;++s){for(i=g[s],a=e.labelTextColors[s],r=e.labelColors[s],n.fillStyle=a,V.each(i.before,x),l=0,d=(o=i.lines).length;l<d;++l){if(p){var _=b.x(v);n.fillStyle=e.legendColorBackground,n.fillRect(b.leftForLtr(_,h),t.y,h,h),n.lineWidth=1,n.strokeStyle=r.borderColor,n.strokeRect(b.leftForLtr(_,h),t.y,h,h),n.fillStyle=r.backgroundColor,n.fillRect(b.leftForLtr(b.xPlus(_,1),h-2),t.y+1,h-2,h-2),n.fillStyle=a}x(o[l])}V.each(i.after,x)}m=0,V.each(e.afterBody,x),t.y-=c},drawFooter:function(t,e,n){var i,a,r=e.footer,o=r.length;if(o){var s=ze(e.rtl,e.x,e.width);for(t.x=Ve(e,e._footerAlign),t.y+=e.footerMarginTop,n.textAlign=s.textAlign(e._footerAlign),n.textBaseline="middle",i=e.footerFontSize,n.fillStyle=e.footerFontColor,n.font=V.fontString(i,e._footerFontStyle,e._footerFontFamily),a=0;a<o;++a)n.fillText(r[a],s.x(t.x),t.y+i/2),t.y+=i+e.footerSpacing}},drawBackground:function(t,e,n,i){n.fillStyle=e.backgroundColor,n.strokeStyle=e.borderColor,n.lineWidth=e.borderWidth;var a=e.xAlign,r=e.yAlign,o=t.x,s=t.y,l=i.width,u=i.height,d=e.cornerRadius;n.beginPath(),n.moveTo(o+d,s),"top"===r&&this.drawCaret(t,i),n.lineTo(o+l-d,s),n.quadraticCurveTo(o+l,s,o+l,s+d),"center"===r&&"right"===a&&this.drawCaret(t,i),n.lineTo(o+l,s+u-d),n.quadraticCurveTo(o+l,s+u,o+l-d,s+u),"bottom"===r&&this.drawCaret(t,i),n.lineTo(o+d,s+u),n.quadraticCurveTo(o,s+u,o,s+u-d),"center"===r&&"left"===a&&this.drawCaret(t,i),n.lineTo(o,s+d),n.quadraticCurveTo(o,s,o+d,s),n.closePath(),n.fill(),e.borderWidth>0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,V.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),V.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!V.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),qe=Ne,Ue=je;Ue.positioners=qe;var Ye=V.valueOrDefault;function Ge(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a<s;++a)o=n[t][a],r=Ye(o.type,"xAxes"===t?"category":"linear"),a>=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?V.merge(e[t][a],[Oe.getScaleDefaults(r),o]):V.merge(e[t][a],o)}else V._merger(t,e,n,i)}})}function Xe(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||{},r=n[t];"scales"===t?e[t]=Ge(a,r):"scale"===t?e[t]=V.merge(a,[Oe.getScaleDefaults(r.type),r]):V._merger(t,e,n,i)}})}function Ke(t){var e=t.options;V.each(t.scales,(function(e){ge.removeBox(t,e)})),e=Xe(z.global,z[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Ze(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(V.findIndex(t,a)>=0);return i}function $e(t){return"top"===t||"bottom"===t}function Je(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}z._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Qe=function(t,e){return this.construct(t,e),this};V.extend(Qe.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(z.global,z[t.type],t.options||{}),t}(e);var i=Fe.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=V.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,Qe.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Le.notify(t,"beforeInit"),V.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Le.notify(t,"afterInit"),t},clear:function(){return V.canvas.clear(this),this},stop:function(){return $.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(V.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:V.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",V.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Le.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;V.each(e.xAxes,(function(t,n){t.id||(t.id=Ze(e.xAxes,"x-axis-",n))})),V.each(e.yAxes,(function(t,n){t.id||(t.id=Ze(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),V.each(i,(function(e){var i=e.options,r=i.id,o=Ye(i.type,e.dtype);$e(i.position)!==$e(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Oe.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),V.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Oe.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t<e;t++){var r=a[t],o=n.getDatasetMeta(t),s=r.type||n.config.type;if(o.type&&o.type!==s&&(n.destroyDatasetMeta(t),o=n.getDatasetMeta(t)),o.type=s,o.order=r.order||0,o.index=t,o.controller)o.controller.updateIndex(t),o.controller.linkScales();else{var l=$t[o.type];if(void 0===l)throw new Error('"'+o.type+'" is not a chart type.');o.controller=new l(n,t),i.push(o.controller)}}return i},resetElements:function(){var t=this;V.each(t.data.datasets,(function(e,n){t.getDatasetMeta(n).controller.reset()}),t)},reset:function(){this.resetElements(),this.tooltip.initialize()},update:function(t){var e,n,i=this;if(t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]}),Ke(i),Le._invalidate(i),!1!==Le.notify(i,"beforeUpdate")){i.tooltip._data=i.data;var a=i.buildOrUpdateControllers();for(e=0,n=i.data.datasets.length;e<n;e++)i.getDatasetMeta(e).controller.buildOrUpdateElements();i.updateLayout(),i.options.animation&&i.options.animation.duration&&V.each(a,(function(t){t.reset()})),i.updateDatasets(),i.tooltip.initialize(),i.lastActive=[],Le.notify(i,"afterUpdate"),i._layers.sort(Je("z","_idx")),i._bufferedRender?i._bufferedRequest={duration:t.duration,easing:t.easing,lazy:t.lazy}:i.render(t)}},updateLayout:function(){var t=this;!1!==Le.notify(t,"beforeLayout")&&(ge.update(this,this.width,this.height),t._layers=[],V.each(t.boxes,(function(e){e._configure&&e._configure(),t._layers.push.apply(t._layers,e._layers())}),t),t._layers.forEach((function(t,e){t._idx=e})),Le.notify(t,"afterScaleUpdate"),Le.notify(t,"afterLayout"))},updateDatasets:function(){if(!1!==Le.notify(this,"beforeDatasetsUpdate")){for(var t=0,e=this.data.datasets.length;t<e;++t)this.updateDataset(t);Le.notify(this,"afterDatasetsUpdate")}},updateDataset:function(t){var e=this.getDatasetMeta(t),n={meta:e,index:t};!1!==Le.notify(this,"beforeDatasetUpdate",[n])&&(e.controller._update(),Le.notify(this,"afterDatasetUpdate",[n]))},render:function(t){var e=this;t&&"object"==typeof t||(t={duration:t,lazy:arguments[1]});var n=e.options.animation,i=Ye(t.duration,n&&n.duration),a=t.lazy;if(!1!==Le.notify(e,"beforeRender")){var r=function(t){Le.notify(e,"afterRender"),V.callback(n&&n.onComplete,[t],e)};if(n&&i){var o=new Z({numSteps:i/16.66,easing:t.easing||n.easing,render:function(t,e){var n=V.easing.effects[e.easing],i=e.currentStep,a=i/e.numSteps;t.draw(n(a),a,i)},onAnimationProgress:n.onProgress,onAnimationComplete:r});$.addAnimation(e,o,i,a)}else e.draw(),r(new Z({numSteps:0,chart:e}));return e}},draw:function(t){var e,n,i=this;if(i.clear(),V.isNullOrUndef(t)&&(t=1),i.transition(t),!(i.width<=0||i.height<=0)&&!1!==Le.notify(i,"beforeDraw",[t])){for(n=i._layers,e=0;e<n.length&&n[e].z<=0;++e)n[e].draw(i.chartArea);for(i.drawDatasets(t);e<n.length;++e)n[e].draw(i.chartArea);i._drawTooltip(t),Le.notify(i,"afterDraw",[t])}},transition:function(t){for(var e=0,n=(this.data.datasets||[]).length;e<n;++e)this.isDatasetVisible(e)&&this.getDatasetMeta(e).controller.transition(t);this.tooltip.transition(t)},_getSortedDatasetMetas:function(t){var e,n,i=[];for(e=0,n=(this.data.datasets||[]).length;e<n;++e)t&&!this.isDatasetVisible(e)||i.push(this.getDatasetMeta(e));return i.sort(Je("order","index")),i},_getSortedVisibleDatasetMetas:function(){return this._getSortedDatasetMetas(!0)},drawDatasets:function(t){var e,n;if(!1!==Le.notify(this,"beforeDatasetsDraw",[t])){for(n=(e=this._getSortedVisibleDatasetMetas()).length-1;n>=0;--n)this.drawDataset(e[n],t);Le.notify(this,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n={meta:t,index:t.index,easingValue:e};!1!==Le.notify(this,"beforeDatasetDraw",[n])&&(t.controller.draw(e),Le.notify(this,"afterDatasetDraw",[n]))},_drawTooltip:function(t){var e=this.tooltip,n={tooltip:e,easingValue:t};!1!==Le.notify(this,"beforeTooltipDraw",[n])&&(e.draw(),Le.notify(this,"afterTooltipDraw",[n]))},getElementAtEvent:function(t){return ae.modes.single(this,t)},getElementsAtEvent:function(t){return ae.modes.label(this,t,{intersect:!0})},getElementsAtXAxis:function(t){return ae.modes["x-axis"](this,t,{intersect:!0})},getElementsAtEventForMode:function(t,e,n){var i=ae.modes[e];return"function"==typeof i?i(this,t,n):[]},getDatasetAtEvent:function(t){return ae.modes.dataset(this,t,{intersect:!0})},getDatasetMeta:function(t){var e=this.data.datasets[t];e._meta||(e._meta={});var n=e._meta[this.id];return n||(n=e._meta[this.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e.order||0,index:t}),n},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e<n;++e)this.isDatasetVisible(e)&&t++;return t},isDatasetVisible:function(t){var e=this.getDatasetMeta(t);return"boolean"==typeof e.hidden?!e.hidden:!this.data.datasets[t].hidden},generateLegend:function(){return this.options.legendCallback(this)},destroyDatasetMeta:function(t){var e=this.id,n=this.data.datasets[t],i=n._meta&&n._meta[e];i&&(i.controller.destroy(),delete n._meta[e])},destroy:function(){var t,e,n=this,i=n.canvas;for(n.stop(),t=0,e=n.data.datasets.length;t<e;++t)n.destroyDatasetMeta(t);i&&(n.unbindEvents(),V.canvas.clear(n),Fe.releaseContext(n.ctx),n.canvas=null,n.ctx=null),Le.notify(n,"destroy"),delete Qe.instances[n.id]},toBase64Image:function(){return this.canvas.toDataURL.apply(this.canvas,arguments)},initToolTip:function(){var t=this;t.tooltip=new Ue({_chart:t,_chartInstance:t,_data:t.data,_options:t.options.tooltips},t)},bindEvents:function(){var t=this,e=t._listeners={},n=function(){t.eventHandler.apply(t,arguments)};V.each(t.options.events,(function(i){Fe.addEventListener(t,i,n),e[i]=n})),t.options.responsive&&(n=function(){t.resize()},Fe.addEventListener(t,"resize",n),e.resize=n)},unbindEvents:function(){var t=this,e=t._listeners;e&&(delete t._listeners,V.each(e,(function(e,n){Fe.removeEventListener(t,n,e)})))},updateHoverStyle:function(t,e,n){var i,a,r,o=n?"set":"remove";for(a=0,r=t.length;a<r;++a)(i=t[a])&&this.getDatasetMeta(i._datasetIndex).controller[o+"HoverStyle"](i);"dataset"===e&&this.getDatasetMeta(t[0]._datasetIndex).controller["_"+o+"DatasetHoverStyle"]()},eventHandler:function(t){var e=this,n=e.tooltip;if(!1!==Le.notify(e,"beforeEvent",[t])){e._bufferedRender=!0,e._bufferedRequest=null;var i=e.handleEvent(t);n&&(i=n._start?n.handleEvent(t):i|n.handleEvent(t)),Le.notify(e,"afterEvent",[t]);var a=e._bufferedRequest;return a?e.render(a):i&&!e.animating&&(e.stop(),e.render({duration:e.options.hover.animationDuration,lazy:!0})),e._bufferedRender=!1,e._bufferedRequest=null,e}},handleEvent:function(t){var e,n=this,i=n.options||{},a=i.hover;return n.lastActive=n.lastActive||[],"mouseout"===t.type?n.active=[]:n.active=n.getElementsAtEventForMode(t,a.mode,a),V.callback(i.onHover||i.hover.onHover,[t.native,n.active],n),"mouseup"!==t.type&&"click"!==t.type||i.onClick&&i.onClick.call(n,t.native,n.active),n.lastActive.length&&n.updateHoverStyle(n.lastActive,a.mode,!1),n.active.length&&a.mode&&n.updateHoverStyle(n.active,a.mode,!0),e=!V.arrayEquals(n.active,n.lastActive),n.lastActive=n.active,e}}),Qe.instances={};var tn=Qe;Qe.Controller=Qe,Qe.types={},V.configMerge=Xe,V.scaleMerge=Ge;function en(){throw new Error("This method is not implemented: either no adapter can be found or an incomplete integration was provided.")}function nn(t){this.options=t||{}}V.extend(nn.prototype,{formats:en,parse:en,format:en,add:en,diff:en,startOf:en,endOf:en,_create:function(t){return t}}),nn.override=function(t){V.extend(nn.prototype,t)};var an={_date:nn},rn={formatters:{values:function(t){return V.isArray(t)?t:""+t},linear:function(t,e,n){var i=n.length>3?n[2]-n[1]:n[1]-n[0];Math.abs(i)>1&&t!==Math.floor(t)&&(i=t-Math.floor(t));var a=V.log10(Math.abs(i)),r="";if(0!==t)if(Math.max(Math.abs(n[0]),Math.abs(n[n.length-1]))<1e-4){var o=V.log10(Math.abs(t)),s=Math.floor(o)-Math.floor(a);s=Math.max(Math.min(s,20),0),r=t.toExponential(s)}else{var l=-1*Math.floor(a);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,e,n){var i=t/Math.pow(10,Math.floor(V.log10(t)));return 0===t?"0":1===i||2===i||5===i||0===e||e===n.length-1?t.toExponential():""}}},on=V.isArray,sn=V.isNullOrUndef,ln=V.valueOrDefault,un=V.valueAtIndexOrDefault;function dn(t,e,n){var i,a=t.getTicks().length,r=Math.min(e,a-1),o=t.getPixelForTick(r),s=t._startPixel,l=t._endPixel;if(!(n&&(i=1===a?Math.max(o-s,l-o):0===e?(t.getPixelForTick(1)-o)/2:(o-t.getPixelForTick(r-1))/2,(o+=r<e?i:-i)<s-1e-6||o>l+1e-6)))return o}function hn(t,e,n,i){var a,r,o,s,l,u,d,h,c,f,g,p,m,v=n.length,b=[],x=[],y=[];for(a=0;a<v;++a){if(s=n[a].label,l=n[a].major?e.major:e.minor,t.font=u=l.string,d=i[u]=i[u]||{data:{},gc:[]},h=l.lineHeight,c=f=0,sn(s)||on(s)){if(on(s))for(r=0,o=s.length;r<o;++r)g=s[r],sn(g)||on(g)||(c=V.measureText(t,d.data,d.gc,c,g),f+=h)}else c=V.measureText(t,d.data,d.gc,c,s),f=h;b.push(c),x.push(f),y.push(h/2)}function _(t){return{width:b[t]||0,height:x[t]||0,offset:y[t]||0}}return function(t,e){V.each(t,(function(t){var n,i=t.gc,a=i.length/2;if(a>e){for(n=0;n<a;++n)delete t.data[i[n]];i.splice(0,a)}}))}(i,v),p=b.indexOf(Math.max.apply(null,b)),m=x.indexOf(Math.max.apply(null,x)),{first:_(0),last:_(v-1),widest:_(p),highest:_(m)}}function cn(t){return t.drawTicks?t.tickMarkLength:0}function fn(t){var e,n;return t.display?(e=V.options._parseFont(t),n=V.options.toPadding(t.padding),e.lineHeight+n.height):0}function gn(t,e){return V.extend(V.options._parseFont({fontFamily:ln(e.fontFamily,t.fontFamily),fontSize:ln(e.fontSize,t.fontSize),fontStyle:ln(e.fontStyle,t.fontStyle),lineHeight:ln(e.lineHeight,t.lineHeight)}),{color:V.options.resolve([e.fontColor,t.fontColor,z.global.defaultFontColor])})}function pn(t){var e=gn(t,t.minor);return{minor:e,major:t.major.enabled?gn(t,t.major):e}}function mn(t){var e,n,i,a=[];for(n=0,i=t.length;n<i;++n)void 0!==(e=t[n])._index&&a.push(e);return a}function vn(t,e,n,i){var a,r,o,s,l=ln(n,0),u=Math.min(ln(i,t.length),t.length),d=0;for(e=Math.ceil(e),i&&(e=(a=i-n)/Math.floor(a/e)),s=l;s<0;)d++,s=Math.round(l+d*e);for(r=Math.max(l,0);r<u;r++)o=t[r],r===s?(o._index=r,d++,s=Math.round(l+d*e)):delete o.label}z._set("scale",{display:!0,position:"left",offset:!1,gridLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,drawBorder:!0,drawOnChartArea:!0,drawTicks:!0,tickMarkLength:10,zeroLineWidth:1,zeroLineColor:"rgba(0,0,0,0.25)",zeroLineBorderDash:[],zeroLineBorderDashOffset:0,offsetGridLines:!1,borderDash:[],borderDashOffset:0},scaleLabel:{display:!1,labelString:"",padding:{top:4,bottom:4}},ticks:{beginAtZero:!1,minRotation:0,maxRotation:50,mirror:!1,padding:0,reverse:!1,display:!0,autoSkip:!0,autoSkipPadding:0,labelOffset:0,callback:rn.formatters.values,minor:{},major:{}}});var bn=X.extend({zeroLineIndex:0,getPadding:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}},getTicks:function(){return this._ticks},_getLabels:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]},mergeTicksOptions:function(){},beforeUpdate:function(){V.callback(this.options.beforeUpdate,[this])},update:function(t,e,n){var i,a,r,o,s,l=this,u=l.options.ticks,d=u.sampleSize;if(l.beforeUpdate(),l.maxWidth=t,l.maxHeight=e,l.margins=V.extend({left:0,right:0,top:0,bottom:0},n),l._ticks=null,l.ticks=null,l._labelSizes=null,l._maxLabelLines=0,l.longestLabelWidth=0,l.longestTextCache=l.longestTextCache||{},l._gridLineItems=null,l._labelItems=null,l.beforeSetDimensions(),l.setDimensions(),l.afterSetDimensions(),l.beforeDataLimits(),l.determineDataLimits(),l.afterDataLimits(),l.beforeBuildTicks(),o=l.buildTicks()||[],(!(o=l.afterBuildTicks(o)||o)||!o.length)&&l.ticks)for(o=[],i=0,a=l.ticks.length;i<a;++i)o.push({value:l.ticks[i],major:!1});return l._ticks=o,s=d<o.length,r=l._convertTicksToLabels(s?function(t,e){for(var n=[],i=t.length/e,a=0,r=t.length;a<r;a+=i)n.push(t[Math.floor(a)]);return n}(o,d):o),l._configure(),l.beforeCalculateTickRotation(),l.calculateTickRotation(),l.afterCalculateTickRotation(),l.beforeFit(),l.fit(),l.afterFit(),l._ticksToDraw=u.display&&(u.autoSkip||"auto"===u.source)?l._autoSkip(o):o,s&&(r=l._convertTicksToLabels(l._ticksToDraw)),l.ticks=r,l.afterUpdate(),l.minSize},_configure:function(){var t,e,n=this,i=n.options.ticks.reverse;n.isHorizontal()?(t=n.left,e=n.right):(t=n.top,e=n.bottom,i=!i),n._startPixel=t,n._endPixel=e,n._reversePixels=i,n._length=e-t},afterUpdate:function(){V.callback(this.options.afterUpdate,[this])},beforeSetDimensions:function(){V.callback(this.options.beforeSetDimensions,[this])},setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0},afterSetDimensions:function(){V.callback(this.options.afterSetDimensions,[this])},beforeDataLimits:function(){V.callback(this.options.beforeDataLimits,[this])},determineDataLimits:V.noop,afterDataLimits:function(){V.callback(this.options.afterDataLimits,[this])},beforeBuildTicks:function(){V.callback(this.options.beforeBuildTicks,[this])},buildTicks:V.noop,afterBuildTicks:function(t){var e=this;return on(t)&&t.length?V.callback(e.options.afterBuildTicks,[e,t]):(e.ticks=V.callback(e.options.afterBuildTicks,[e,e.ticks])||e.ticks,t)},beforeTickToLabelConversion:function(){V.callback(this.options.beforeTickToLabelConversion,[this])},convertTicksToLabels:function(){var t=this.options.ticks;this.ticks=this.ticks.map(t.userCallback||t.callback,this)},afterTickToLabelConversion:function(){V.callback(this.options.afterTickToLabelConversion,[this])},beforeCalculateTickRotation:function(){V.callback(this.options.beforeCalculateTickRotation,[this])},calculateTickRotation:function(){var t,e,n,i,a,r,o,s=this,l=s.options,u=l.ticks,d=s.getTicks().length,h=u.minRotation||0,c=u.maxRotation,f=h;!s._isVisible()||!u.display||h>=c||d<=1||!s.isHorizontal()?s.labelRotation=h:(e=(t=s._getLabelSizes()).widest.width,n=t.highest.height-t.highest.offset,i=Math.min(s.maxWidth,s.chart.width-e),e+6>(a=l.offset?s.maxWidth/d:i/(d-1))&&(a=i/(d-(l.offset?.5:1)),r=s.maxHeight-cn(l.gridLines)-u.padding-fn(l.scaleLabel),o=Math.sqrt(e*e+n*n),f=V.toDegrees(Math.min(Math.asin(Math.min((t.highest.height+6)/a,1)),Math.asin(Math.min(r/o,1))-Math.asin(n/o))),f=Math.max(h,Math.min(c,f))),s.labelRotation=f)},afterCalculateTickRotation:function(){V.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){V.callback(this.options.beforeFit,[this])},fit:function(){var t=this,e=t.minSize={width:0,height:0},n=t.chart,i=t.options,a=i.ticks,r=i.scaleLabel,o=i.gridLines,s=t._isVisible(),l="bottom"===i.position,u=t.isHorizontal();if(u?e.width=t.maxWidth:s&&(e.width=cn(o)+fn(r)),u?s&&(e.height=cn(o)+fn(r)):e.height=t.maxHeight,a.display&&s){var d=pn(a),h=t._getLabelSizes(),c=h.first,f=h.last,g=h.widest,p=h.highest,m=.4*d.minor.lineHeight,v=a.padding;if(u){var b=0!==t.labelRotation,x=V.toRadians(t.labelRotation),y=Math.cos(x),_=Math.sin(x),k=_*g.width+y*(p.height-(b?p.offset:0))+(b?0:m);e.height=Math.min(t.maxHeight,e.height+k+v);var w,M,S=t.getPixelForTick(0)-t.left,C=t.right-t.getPixelForTick(t.getTicks().length-1);b?(w=l?y*c.width+_*c.offset:_*(c.height-c.offset),M=l?_*(f.height-f.offset):y*f.width+_*f.offset):(w=c.width/2,M=f.width/2),t.paddingLeft=Math.max((w-S)*t.width/(t.width-S),0)+3,t.paddingRight=Math.max((M-C)*t.width/(t.width-C),0)+3}else{var P=a.mirror?0:g.width+v+m;e.width=Math.min(t.maxWidth,e.width+P),t.paddingTop=c.height/2,t.paddingBottom=f.height/2}}t.handleMargins(),u?(t.width=t._length=n.width-t.margins.left-t.margins.right,t.height=e.height):(t.width=e.width,t.height=t._length=n.height-t.margins.top-t.margins.bottom)},handleMargins:function(){var t=this;t.margins&&(t.margins.left=Math.max(t.paddingLeft,t.margins.left),t.margins.top=Math.max(t.paddingTop,t.margins.top),t.margins.right=Math.max(t.paddingRight,t.margins.right),t.margins.bottom=Math.max(t.paddingBottom,t.margins.bottom))},afterFit:function(){V.callback(this.options.afterFit,[this])},isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){if(sn(t))return NaN;if(("number"==typeof t||t instanceof Number)&&!isFinite(t))return NaN;if(t)if(this.isHorizontal()){if(void 0!==t.x)return this.getRightValue(t.x)}else if(void 0!==t.y)return this.getRightValue(t.y);return t},_convertTicksToLabels:function(t){var e,n,i,a=this;for(a.ticks=t.map((function(t){return t.value})),a.beforeTickToLabelConversion(),e=a.convertTicksToLabels(t)||a.ticks,a.afterTickToLabelConversion(),n=0,i=t.length;n<i;++n)t[n].label=e[n];return e},_getLabelSizes:function(){var t=this,e=t._labelSizes;return e||(t._labelSizes=e=hn(t.ctx,pn(t.options.ticks),t.getTicks(),t.longestTextCache),t.longestLabelWidth=e.widest.width),e},_parseValue:function(t){var e,n,i,a;return on(t)?(e=+this.getRightValue(t[0]),n=+this.getRightValue(t[1]),i=Math.min(e,n),a=Math.max(e,n)):(e=void 0,n=t=+this.getRightValue(t),i=t,a=t),{min:i,max:a,start:e,end:n}},_getScaleLabel:function(t){var e=this._parseValue(t);return void 0!==e.start?"["+e.start+", "+e.end+"]":+this.getRightValue(t)},getLabelForIndex:V.noop,getPixelForValue:V.noop,getValueForPixel:V.noop,getPixelForTick:function(t){var e=this.options.offset,n=this._ticks.length,i=1/Math.max(n-(e?0:1),1);return t<0||t>n-1?null:this.getPixelForDecimal(t*i+(e?i/2:0))},getPixelForDecimal:function(t){return this._reversePixels&&(t=1-t),this._startPixel+t*this._length},getDecimalForPixel:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this.min,e=this.max;return this.beginAtZero?0:t<0&&e<0?e:t>0&&e>0?t:0},_autoSkip:function(t){var e,n,i,a,r=this.options.ticks,o=this._length,s=r.maxTicksLimit||o/this._tickSize()+1,l=r.major.enabled?function(t){var e,n,i=[];for(e=0,n=t.length;e<n;e++)t[e].major&&i.push(e);return i}(t):[],u=l.length,d=l[0],h=l[u-1];if(u>s)return function(t,e,n){var i,a,r=0,o=e[0];for(n=Math.ceil(n),i=0;i<t.length;i++)a=t[i],i===o?(a._index=i,o=e[++r*n]):delete a.label}(t,l,u/s),mn(t);if(i=function(t,e,n,i){var a,r,o,s,l=function(t){var e,n,i=t.length;if(i<2)return!1;for(n=t[0],e=1;e<i;++e)if(t[e]-t[e-1]!==n)return!1;return n}(t),u=(e.length-1)/i;if(!l)return Math.max(u,1);for(o=0,s=(a=V.math._factorize(l)).length-1;o<s;o++)if((r=a[o])>u)return r;return Math.max(u,1)}(l,t,0,s),u>0){for(e=0,n=u-1;e<n;e++)vn(t,i,l[e],l[e+1]);return a=u>1?(h-d)/(u-1):null,vn(t,i,V.isNullOrUndef(a)?0:d-a,d),vn(t,i,h,V.isNullOrUndef(a)?t.length:h+a),mn(t)}return vn(t,i),mn(t)},_tickSize:function(){var t=this.options.ticks,e=V.toRadians(this.labelRotation),n=Math.abs(Math.cos(e)),i=Math.abs(Math.sin(e)),a=this._getLabelSizes(),r=t.autoSkipPadding||0,o=a?a.widest.width+r:0,s=a?a.highest.height+r:0;return this.isHorizontal()?s*n>o*i?o/n:s/i:s*i<o*n?s/n:o/i},_isVisible:function(){var t,e,n,i=this.chart,a=this.options.display;if("auto"!==a)return!!a;for(t=0,e=i.data.datasets.length;t<e;++t)if(i.isDatasetVisible(t)&&((n=i.getDatasetMeta(t)).xAxisID===this.id||n.yAxisID===this.id))return!0;return!1},_computeGridLineItems:function(t){var e,n,i,a,r,o,s,l,u,d,h,c,f,g,p,m,v,b=this,x=b.chart,y=b.options,_=y.gridLines,k=y.position,w=_.offsetGridLines,M=b.isHorizontal(),S=b._ticksToDraw,C=S.length+(w?1:0),P=cn(_),A=[],D=_.drawBorder?un(_.lineWidth,0,0):0,T=D/2,I=V._alignPixel,F=function(t){return I(x,t,D)};for("top"===k?(e=F(b.bottom),s=b.bottom-P,u=e-T,h=F(t.top)+T,f=t.bottom):"bottom"===k?(e=F(b.top),h=t.top,f=F(t.bottom)-T,s=e+T,u=b.top+P):"left"===k?(e=F(b.right),o=b.right-P,l=e-T,d=F(t.left)+T,c=t.right):(e=F(b.left),d=t.left,c=F(t.right)-T,o=e+T,l=b.left+P),n=0;n<C;++n)i=S[n]||{},sn(i.label)&&n<S.length||(n===b.zeroLineIndex&&y.offset===w?(g=_.zeroLineWidth,p=_.zeroLineColor,m=_.zeroLineBorderDash||[],v=_.zeroLineBorderDashOffset||0):(g=un(_.lineWidth,n,1),p=un(_.color,n,"rgba(0,0,0,0.1)"),m=_.borderDash||[],v=_.borderDashOffset||0),void 0!==(a=dn(b,i._index||n,w))&&(r=I(x,a,g),M?o=l=d=c=r:s=u=h=f=r,A.push({tx1:o,ty1:s,tx2:l,ty2:u,x1:d,y1:h,x2:c,y2:f,width:g,color:p,borderDash:m,borderDashOffset:v})));return A.ticksLength=C,A.borderValue=e,A},_computeLabelItems:function(){var t,e,n,i,a,r,o,s,l,u,d,h,c=this,f=c.options,g=f.ticks,p=f.position,m=g.mirror,v=c.isHorizontal(),b=c._ticksToDraw,x=pn(g),y=g.padding,_=cn(f.gridLines),k=-V.toRadians(c.labelRotation),w=[];for("top"===p?(r=c.bottom-_-y,o=k?"left":"center"):"bottom"===p?(r=c.top+_+y,o=k?"right":"center"):"left"===p?(a=c.right-(m?0:_)-y,o=m?"left":"right"):(a=c.left+(m?0:_)+y,o=m?"right":"left"),t=0,e=b.length;t<e;++t)i=(n=b[t]).label,sn(i)||(s=c.getPixelForTick(n._index||t)+g.labelOffset,u=(l=n.major?x.major:x.minor).lineHeight,d=on(i)?i.length:1,v?(a=s,h="top"===p?((k?1:.5)-d)*u:(k?0:.5)*u):(r=s,h=(1-d)*u/2),w.push({x:a,y:r,rotation:k,label:i,font:l,textOffset:h,textAlign:o}));return w},_drawGrid:function(t){var e=this,n=e.options.gridLines;if(n.display){var i,a,r,o,s,l=e.ctx,u=e.chart,d=V._alignPixel,h=n.drawBorder?un(n.lineWidth,0,0):0,c=e._gridLineItems||(e._gridLineItems=e._computeGridLineItems(t));for(r=0,o=c.length;r<o;++r)i=(s=c[r]).width,a=s.color,i&&a&&(l.save(),l.lineWidth=i,l.strokeStyle=a,l.setLineDash&&(l.setLineDash(s.borderDash),l.lineDashOffset=s.borderDashOffset),l.beginPath(),n.drawTicks&&(l.moveTo(s.tx1,s.ty1),l.lineTo(s.tx2,s.ty2)),n.drawOnChartArea&&(l.moveTo(s.x1,s.y1),l.lineTo(s.x2,s.y2)),l.stroke(),l.restore());if(h){var f,g,p,m,v=h,b=un(n.lineWidth,c.ticksLength-1,1),x=c.borderValue;e.isHorizontal()?(f=d(u,e.left,v)-v/2,g=d(u,e.right,b)+b/2,p=m=x):(p=d(u,e.top,v)-v/2,m=d(u,e.bottom,b)+b/2,f=g=x),l.lineWidth=h,l.strokeStyle=un(n.color,0),l.beginPath(),l.moveTo(f,p),l.lineTo(g,m),l.stroke()}}},_drawLabels:function(){var t=this;if(t.options.ticks.display){var e,n,i,a,r,o,s,l,u=t.ctx,d=t._labelItems||(t._labelItems=t._computeLabelItems());for(e=0,i=d.length;e<i;++e){if(o=(r=d[e]).font,u.save(),u.translate(r.x,r.y),u.rotate(r.rotation),u.font=o.string,u.fillStyle=o.color,u.textBaseline="middle",u.textAlign=r.textAlign,s=r.label,l=r.textOffset,on(s))for(n=0,a=s.length;n<a;++n)u.fillText(""+s[n],0,l),l+=o.lineHeight;else u.fillText(s,0,l);u.restore()}}},_drawTitle:function(){var t=this,e=t.ctx,n=t.options,i=n.scaleLabel;if(i.display){var a,r,o=ln(i.fontColor,z.global.defaultFontColor),s=V.options._parseFont(i),l=V.options.toPadding(i.padding),u=s.lineHeight/2,d=n.position,h=0;if(t.isHorizontal())a=t.left+t.width/2,r="bottom"===d?t.bottom-u-l.bottom:t.top+u+l.top;else{var c="left"===d;a=c?t.left+u+l.top:t.right-u-l.top,r=t.top+t.height/2,h=c?-.5*Math.PI:.5*Math.PI}e.save(),e.translate(a,r),e.rotate(h),e.textAlign="center",e.textBaseline="middle",e.fillStyle=o,e.font=s.string,e.fillText(i.labelString,0,0),e.restore()}},draw:function(t){this._isVisible()&&(this._drawGrid(t),this._drawTitle(),this._drawLabels())},_layers:function(){var t=this,e=t.options,n=e.ticks&&e.ticks.z||0,i=e.gridLines&&e.gridLines.z||0;return t._isVisible()&&n!==i&&t.draw===t._draw?[{z:i,draw:function(){t._drawGrid.apply(t,arguments),t._drawTitle.apply(t,arguments)}},{z:n,draw:function(){t._drawLabels.apply(t,arguments)}}]:[{z:n,draw:function(){t.draw.apply(t,arguments)}}]},_getMatchingVisibleMetas:function(t){var e=this,n=e.isHorizontal();return e.chart._getSortedVisibleDatasetMetas().filter((function(i){return(!t||i.type===t)&&(n?i.xAxisID===e.id:i.yAxisID===e.id)}))}});bn.prototype._draw=bn.prototype.draw;var xn=bn,yn=V.isNullOrUndef,_n=xn.extend({determineDataLimits:function(){var t,e=this,n=e._getLabels(),i=e.options.ticks,a=i.min,r=i.max,o=0,s=n.length-1;void 0!==a&&(t=n.indexOf(a))>=0&&(o=t),void 0!==r&&(t=n.indexOf(r))>=0&&(s=t),e.minIndex=o,e.maxIndex=s,e.min=n[o],e.max=n[s]},buildTicks:function(){var t=this._getLabels(),e=this.minIndex,n=this.maxIndex;this.ticks=0===e&&n===t.length-1?t:t.slice(e,n+1)},getLabelForIndex:function(t,e){var n=this.chart;return n.getDatasetMeta(e).controller._getValueScaleId()===this.id?this.getRightValue(n.data.datasets[e].data[t]):this._getLabels()[t]},_configure:function(){var t=this,e=t.options.offset,n=t.ticks;xn.prototype._configure.call(t),t.isHorizontal()||(t._reversePixels=!t._reversePixels),n&&(t._startValue=t.minIndex-(e?.5:0),t._valueRange=Math.max(n.length-(e?0:1),1))},getPixelForValue:function(t,e,n){var i,a,r,o=this;return yn(e)||yn(n)||(t=o.chart.data.datasets[n].data[e]),yn(t)||(i=o.isHorizontal()?t.x:t.y),(void 0!==i||void 0!==t&&isNaN(e))&&(a=o._getLabels(),t=V.valueOrDefault(i,t),e=-1!==(r=a.indexOf(t))?r:e,isNaN(e)&&(e=t)),o.getPixelForDecimal((e-o._startValue)/o._valueRange)},getPixelForTick:function(t){var e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t],t+this.minIndex)},getValueForPixel:function(t){var e=Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange);return Math.min(Math.max(e,0),this.ticks.length-1)},getBasePixel:function(){return this.bottom}}),kn={position:"bottom"};_n._defaults=kn;var wn=V.noop,Mn=V.isNullOrUndef;var Sn=xn.extend({getRightValue:function(t){return"string"==typeof t?+t:xn.prototype.getRightValue.call(this,t)},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;if(e.beginAtZero){var n=V.sign(t.min),i=V.sign(t.max);n<0&&i<0?t.max=0:n>0&&i>0&&(t.min=0)}var a=void 0!==e.min||void 0!==e.suggestedMin,r=void 0!==e.max||void 0!==e.suggestedMax;void 0!==e.min?t.min=e.min:void 0!==e.suggestedMin&&(null===t.min?t.min=e.suggestedMin:t.min=Math.min(t.min,e.suggestedMin)),void 0!==e.max?t.max=e.max:void 0!==e.suggestedMax&&(null===t.max?t.max=e.suggestedMax:t.max=Math.max(t.max,e.suggestedMax)),a!==r&&t.min>=t.max&&(a?t.max=t.min+1:t.min=t.max-1),t.min===t.max&&(t.max++,e.beginAtZero||t.min--)},getTickLimit:function(){var t,e=this.options.ticks,n=e.stepSize,i=e.maxTicksLimit;return n?t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1:(t=this._computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t},_computeTickLimit:function(){return Number.POSITIVE_INFINITY},handleDirectionalChanges:wn,buildTicks:function(){var t=this,e=t.options.ticks,n=t.getTickLimit(),i={maxTicks:n=Math.max(2,n),min:e.min,max:e.max,precision:e.precision,stepSize:V.valueOrDefault(e.fixedStepSize,e.stepSize)},a=t.ticks=function(t,e){var n,i,a,r,o=[],s=t.stepSize,l=s||1,u=t.maxTicks-1,d=t.min,h=t.max,c=t.precision,f=e.min,g=e.max,p=V.niceNum((g-f)/u/l)*l;if(p<1e-14&&Mn(d)&&Mn(h))return[f,g];(r=Math.ceil(g/p)-Math.floor(f/p))>u&&(p=V.niceNum(r*p/u/l)*l),s||Mn(c)?n=Math.pow(10,V._decimalPlaces(p)):(n=Math.pow(10,c),p=Math.ceil(p*n)/n),i=Math.floor(f/p)*p,a=Math.ceil(g/p)*p,s&&(!Mn(d)&&V.almostWhole(d/p,p/1e3)&&(i=d),!Mn(h)&&V.almostWhole(h/p,p/1e3)&&(a=h)),r=(a-i)/p,r=V.almostEquals(r,Math.round(r),p/1e3)?Math.round(r):Math.ceil(r),i=Math.round(i*n)/n,a=Math.round(a*n)/n,o.push(Mn(d)?i:d);for(var m=1;m<r;++m)o.push(Math.round((i+m*p)*n)/n);return o.push(Mn(h)?a:h),o}(i,t);t.handleDirectionalChanges(),t.max=V.max(a),t.min=V.min(a),e.reverse?(a.reverse(),t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max)},convertTicksToLabels:function(){var t=this;t.ticksAsNumbers=t.ticks.slice(),t.zeroLineIndex=t.ticks.indexOf(0),xn.prototype.convertTicksToLabels.call(t)},_configure:function(){var t,e=this,n=e.getTicks(),i=e.min,a=e.max;xn.prototype._configure.call(e),e.options.offset&&n.length&&(i-=t=(a-i)/Math.max(n.length-1,1)/2,a+=t),e._startValue=i,e._endValue=a,e._valueRange=a-i}}),Cn={position:"left",ticks:{callback:rn.formatters.linear}};function Pn(t,e,n,i){var a,r,o=t.options,s=function(t,e,n){var i=[n.type,void 0===e&&void 0===n.stack?n.index:"",n.stack].join(".");return void 0===t[i]&&(t[i]={pos:[],neg:[]}),t[i]}(e,o.stacked,n),l=s.pos,u=s.neg,d=i.length;for(a=0;a<d;++a)r=t._parseValue(i[a]),isNaN(r.min)||isNaN(r.max)||n.data[a].hidden||(l[a]=l[a]||0,u[a]=u[a]||0,o.relativePoints?l[a]=100:r.min<0||r.max<0?u[a]+=r.min:l[a]+=r.max)}function An(t,e,n){var i,a,r=n.length;for(i=0;i<r;++i)a=t._parseValue(n[i]),isNaN(a.min)||isNaN(a.max)||e.data[i].hidden||(t.min=Math.min(t.min,a.min),t.max=Math.max(t.max,a.max))}var Dn=Sn.extend({determineDataLimits:function(){var t,e,n,i,a=this,r=a.options,o=a.chart.data.datasets,s=a._getMatchingVisibleMetas(),l=r.stacked,u={},d=s.length;if(a.min=Number.POSITIVE_INFINITY,a.max=Number.NEGATIVE_INFINITY,void 0===l)for(t=0;!l&&t<d;++t)l=void 0!==(e=s[t]).stack;for(t=0;t<d;++t)n=o[(e=s[t]).index].data,l?Pn(a,u,e,n):An(a,e,n);V.each(u,(function(t){i=t.pos.concat(t.neg),a.min=Math.min(a.min,V.min(i)),a.max=Math.max(a.max,V.max(i))})),a.min=V.isFinite(a.min)&&!isNaN(a.min)?a.min:0,a.max=V.isFinite(a.max)&&!isNaN(a.max)?a.max:1,a.handleTickRangeOptions()},_computeTickLimit:function(){var t;return this.isHorizontal()?Math.ceil(this.width/40):(t=V.options._parseFont(this.options.ticks),Math.ceil(this.height/t.lineHeight))},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){return this.getPixelForDecimal((+this.getRightValue(t)-this._startValue)/this._valueRange)},getValueForPixel:function(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange},getPixelForTick:function(t){var e=this.ticksAsNumbers;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])}}),Tn=Cn;Dn._defaults=Tn;var In=V.valueOrDefault,Fn=V.math.log10;var Ln={position:"left",ticks:{callback:rn.formatters.logarithmic}};function On(t,e){return V.isFinite(t)&&t>=0?t:e}var Rn=xn.extend({determineDataLimits:function(){var t,e,n,i,a,r,o=this,s=o.options,l=o.chart,u=l.data.datasets,d=o.isHorizontal();function h(t){return d?t.xAxisID===o.id:t.yAxisID===o.id}o.min=Number.POSITIVE_INFINITY,o.max=Number.NEGATIVE_INFINITY,o.minNotZero=Number.POSITIVE_INFINITY;var c=s.stacked;if(void 0===c)for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e)&&void 0!==e.stack){c=!0;break}if(s.stacked||c){var f={};for(t=0;t<u.length;t++){var g=[(e=l.getDatasetMeta(t)).type,void 0===s.stacked&&void 0===e.stack?t:"",e.stack].join(".");if(l.isDatasetVisible(t)&&h(e))for(void 0===f[g]&&(f[g]=[]),a=0,r=(i=u[t].data).length;a<r;a++){var p=f[g];n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(p[a]=p[a]||0,p[a]+=n.max)}}V.each(f,(function(t){if(t.length>0){var e=V.min(t),n=V.max(t);o.min=Math.min(o.min,e),o.max=Math.max(o.max,n)}}))}else for(t=0;t<u.length;t++)if(e=l.getDatasetMeta(t),l.isDatasetVisible(t)&&h(e))for(a=0,r=(i=u[t].data).length;a<r;a++)n=o._parseValue(i[a]),isNaN(n.min)||isNaN(n.max)||e.data[a].hidden||n.min<0||n.max<0||(o.min=Math.min(n.min,o.min),o.max=Math.max(n.max,o.max),0!==n.min&&(o.minNotZero=Math.min(n.min,o.minNotZero)));o.min=V.isFinite(o.min)?o.min:null,o.max=V.isFinite(o.max)?o.max:null,o.minNotZero=V.isFinite(o.minNotZero)?o.minNotZero:null,this.handleTickRangeOptions()},handleTickRangeOptions:function(){var t=this,e=t.options.ticks;t.min=On(e.min,t.min),t.max=On(e.max,t.max),t.min===t.max&&(0!==t.min&&null!==t.min?(t.min=Math.pow(10,Math.floor(Fn(t.min))-1),t.max=Math.pow(10,Math.floor(Fn(t.max))+1)):(t.min=1,t.max=10)),null===t.min&&(t.min=Math.pow(10,Math.floor(Fn(t.max))-1)),null===t.max&&(t.max=0!==t.min?Math.pow(10,Math.floor(Fn(t.min))+1):10),null===t.minNotZero&&(t.min>0?t.minNotZero=t.min:t.max<1?t.minNotZero=Math.pow(10,Math.floor(Fn(t.max))):t.minNotZero=1)},buildTicks:function(){var t=this,e=t.options.ticks,n=!t.isHorizontal(),i={min:On(e.min),max:On(e.max)},a=t.ticks=function(t,e){var n,i,a=[],r=In(t.min,Math.pow(10,Math.floor(Fn(e.min)))),o=Math.floor(Fn(e.max)),s=Math.ceil(e.max/Math.pow(10,o));0===r?(n=Math.floor(Fn(e.minNotZero)),i=Math.floor(e.minNotZero/Math.pow(10,n)),a.push(r),r=i*Math.pow(10,n)):(n=Math.floor(Fn(r)),i=Math.floor(r/Math.pow(10,n)));var l=n<0?Math.pow(10,Math.abs(n)):1;do{a.push(r),10===++i&&(i=1,l=++n>=0?1:l),r=Math.round(i*Math.pow(10,n)*l)/l}while(n<o||n===o&&i<s);var u=In(t.max,r);return a.push(u),a}(i,t);t.max=V.max(a),t.min=V.min(a),e.reverse?(n=!n,t.start=t.max,t.end=t.min):(t.start=t.min,t.end=t.max),n&&a.reverse()},convertTicksToLabels:function(){this.tickValues=this.ticks.slice(),xn.prototype.convertTicksToLabels.call(this)},getLabelForIndex:function(t,e){return this._getScaleLabel(this.chart.data.datasets[e].data[t])},getPixelForTick:function(t){var e=this.tickValues;return t<0||t>e.length-1?null:this.getPixelForValue(e[t])},_getFirstTickValue:function(t){var e=Math.floor(Fn(t));return Math.floor(t/Math.pow(10,e))*Math.pow(10,e)},_configure:function(){var t=this,e=t.min,n=0;xn.prototype._configure.call(t),0===e&&(e=t._getFirstTickValue(t.minNotZero),n=In(t.options.ticks.fontSize,z.global.defaultFontSize)/t._length),t._startValue=Fn(e),t._valueOffset=n,t._valueRange=(Fn(t.max)-Fn(e))/(1-n)},getPixelForValue:function(t){var e=this,n=0;return(t=+e.getRightValue(t))>e.min&&t>0&&(n=(Fn(t)-e._startValue)/e._valueRange+e._valueOffset),e.getPixelForDecimal(n)},getValueForPixel:function(t){var e=this,n=e.getDecimalForPixel(t);return 0===n&&0===e.min?0:Math.pow(10,e._startValue+(n-e._valueOffset)*e._valueRange)}}),zn=Ln;Rn._defaults=zn;var Nn=V.valueOrDefault,Bn=V.valueAtIndexOrDefault,En=V.options.resolve,Wn={display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,color:"rgba(0,0,0,0.1)",lineWidth:1,borderDash:[],borderDashOffset:0},gridLines:{circular:!1},ticks:{showLabelBackdrop:!0,backdropColor:"rgba(255,255,255,0.75)",backdropPaddingY:2,backdropPaddingX:2,callback:rn.formatters.linear},pointLabels:{display:!0,fontSize:10,callback:function(t){return t}}};function Vn(t){var e=t.ticks;return e.display&&t.display?Nn(e.fontSize,z.global.defaultFontSize)+2*e.backdropPaddingY:0}function Hn(t,e,n,i,a){return t===i||t===a?{start:e-n/2,end:e+n/2}:t<i||t>a?{start:e-n,end:e}:{start:e,end:e+n}}function jn(t){return 0===t||180===t?"center":t<180?"left":"right"}function qn(t,e,n,i){var a,r,o=n.y+i/2;if(V.isArray(e))for(a=0,r=e.length;a<r;++a)t.fillText(e[a],n.x,o),o+=i;else t.fillText(e,n.x,o)}function Un(t,e,n){90===t||270===t?n.y-=e.h/2:(t>270||t<90)&&(n.y-=e.h)}function Yn(t){return V.isNumber(t)?t:0}var Gn=Sn.extend({setDimensions:function(){var t=this;t.width=t.maxWidth,t.height=t.maxHeight,t.paddingTop=Vn(t.options)/2,t.xCenter=Math.floor(t.width/2),t.yCenter=Math.floor((t.height-t.paddingTop)/2),t.drawingArea=Math.min(t.height-t.paddingTop,t.width)/2},determineDataLimits:function(){var t=this,e=t.chart,n=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;V.each(e.data.datasets,(function(a,r){if(e.isDatasetVisible(r)){var o=e.getDatasetMeta(r);V.each(a.data,(function(e,a){var r=+t.getRightValue(e);isNaN(r)||o.data[a].hidden||(n=Math.min(r,n),i=Math.max(r,i))}))}})),t.min=n===Number.POSITIVE_INFINITY?0:n,t.max=i===Number.NEGATIVE_INFINITY?0:i,t.handleTickRangeOptions()},_computeTickLimit:function(){return Math.ceil(this.drawingArea/Vn(this.options))},convertTicksToLabels:function(){var t=this;Sn.prototype.convertTicksToLabels.call(t),t.pointLabels=t.chart.data.labels.map((function(){var e=V.callback(t.options.pointLabels.callback,arguments,t);return e||0===e?e:""}))},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},fit:function(){var t=this.options;t.display&&t.pointLabels.display?function(t){var e,n,i,a=V.options._parseFont(t.options.pointLabels),r={l:0,r:t.width,t:0,b:t.height-t.paddingTop},o={};t.ctx.font=a.string,t._pointLabelSizes=[];var s,l,u,d=t.chart.data.labels.length;for(e=0;e<d;e++){i=t.getPointPosition(e,t.drawingArea+5),s=t.ctx,l=a.lineHeight,u=t.pointLabels[e],n=V.isArray(u)?{w:V.longestText(s,s.font,u),h:u.length*l}:{w:s.measureText(u).width,h:l},t._pointLabelSizes[e]=n;var h=t.getIndexAngle(e),c=V.toDegrees(h)%360,f=Hn(c,i.x,n.w,0,180),g=Hn(c,i.y,n.h,90,270);f.start<r.l&&(r.l=f.start,o.l=h),f.end>r.r&&(r.r=f.end,o.r=h),g.start<r.t&&(r.t=g.start,o.t=h),g.end>r.b&&(r.b=g.end,o.b=h)}t.setReductions(t.drawingArea,r,o)}(this):this.setCenterPoint(0,0,0,0)},setReductions:function(t,e,n){var i=this,a=e.l/Math.sin(n.l),r=Math.max(e.r-i.width,0)/Math.sin(n.r),o=-e.t/Math.cos(n.t),s=-Math.max(e.b-(i.height-i.paddingTop),0)/Math.cos(n.b);a=Yn(a),r=Yn(r),o=Yn(o),s=Yn(s),i.drawingArea=Math.min(Math.floor(t-(a+r)/2),Math.floor(t-(o+s)/2)),i.setCenterPoint(a,r,o,s)},setCenterPoint:function(t,e,n,i){var a=this,r=a.width-e-a.drawingArea,o=t+a.drawingArea,s=n+a.drawingArea,l=a.height-a.paddingTop-i-a.drawingArea;a.xCenter=Math.floor((o+r)/2+a.left),a.yCenter=Math.floor((s+l)/2+a.top+a.paddingTop)},getIndexAngle:function(t){var e=this.chart,n=(t*(360/e.data.labels.length)+((e.options||{}).startAngle||0))%360;return(n<0?n+360:n)*Math.PI*2/360},getDistanceFromCenterForValue:function(t){var e=this;if(V.isNullOrUndef(t))return NaN;var n=e.drawingArea/(e.max-e.min);return e.options.ticks.reverse?(e.max-t)*n:(t-e.min)*n},getPointPosition:function(t,e){var n=this.getIndexAngle(t)-Math.PI/2;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter}},getPointPositionForValue:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))},getBasePosition:function(t){var e=this.min,n=this.max;return this.getPointPositionForValue(t||0,this.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0)},_drawGrid:function(){var t,e,n,i=this,a=i.ctx,r=i.options,o=r.gridLines,s=r.angleLines,l=Nn(s.lineWidth,o.lineWidth),u=Nn(s.color,o.color);if(r.pointLabels.display&&function(t){var e=t.ctx,n=t.options,i=n.pointLabels,a=Vn(n),r=t.getDistanceFromCenterForValue(n.ticks.reverse?t.min:t.max),o=V.options._parseFont(i);e.save(),e.font=o.string,e.textBaseline="middle";for(var s=t.chart.data.labels.length-1;s>=0;s--){var l=0===s?a/2:0,u=t.getPointPosition(s,r+l+5),d=Bn(i.fontColor,s,z.global.defaultFontColor);e.fillStyle=d;var h=t.getIndexAngle(s),c=V.toDegrees(h);e.textAlign=jn(c),Un(c,t._pointLabelSizes[s],u),qn(e,t.pointLabels[s],u,o.lineHeight)}e.restore()}(i),o.display&&V.each(i.ticks,(function(t,n){0!==n&&(e=i.getDistanceFromCenterForValue(i.ticksAsNumbers[n]),function(t,e,n,i){var a,r=t.ctx,o=e.circular,s=t.chart.data.labels.length,l=Bn(e.color,i-1),u=Bn(e.lineWidth,i-1);if((o||s)&&l&&u){if(r.save(),r.strokeStyle=l,r.lineWidth=u,r.setLineDash&&(r.setLineDash(e.borderDash||[]),r.lineDashOffset=e.borderDashOffset||0),r.beginPath(),o)r.arc(t.xCenter,t.yCenter,n,0,2*Math.PI);else{a=t.getPointPosition(0,n),r.moveTo(a.x,a.y);for(var d=1;d<s;d++)a=t.getPointPosition(d,n),r.lineTo(a.x,a.y)}r.closePath(),r.stroke(),r.restore()}}(i,o,e,n))})),s.display&&l&&u){for(a.save(),a.lineWidth=l,a.strokeStyle=u,a.setLineDash&&(a.setLineDash(En([s.borderDash,o.borderDash,[]])),a.lineDashOffset=En([s.borderDashOffset,o.borderDashOffset,0])),t=i.chart.data.labels.length-1;t>=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=V.options._parseFont(n),s=Nn(n.fontColor,z.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",V.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:V.noop}),Xn=Wn;Gn._defaults=Xn;var Kn=V._deprecated,Zn=V.options.resolve,$n=V.valueOrDefault,Jn=Number.MIN_SAFE_INTEGER||-9007199254740991,Qn=Number.MAX_SAFE_INTEGER||9007199254740991,ti={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ei=Object.keys(ti);function ni(t,e){return t-e}function ii(t){return V.valueOrDefault(t.time.min,t.ticks.min)}function ai(t){return V.valueOrDefault(t.time.max,t.ticks.max)}function ri(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]<n)o=i+1;else{if(!(a[e]>n))return{lo:a,hi:r};s=i-1}}return{lo:r,hi:null}}(t,e,n),r=a.lo?a.hi?a.lo:t[t.length-2]:t[0],o=a.lo?a.hi?a.hi:t[t.length-1]:t[1],s=o[e]-r[e],l=s?(n-r[e])/s:0,u=(o[i]-r[i])*l;return r[i]+u}function oi(t,e){var n=t._adapter,i=t.options.time,a=i.parser,r=a||i.format,o=e;return"function"==typeof a&&(o=a(o)),V.isFinite(o)||(o="string"==typeof r?n.parse(o,r):n.parse(o)),null!==o?+o:(a||"function"!=typeof r||(o=r(e),V.isFinite(o)||(o=n.parse(o))),o)}function si(t,e){if(V.isNullOrUndef(e))return null;var n=t.options.time,i=oi(t,t.getRightValue(e));return null===i?i:(n.round&&(i=+t._adapter.startOf(i,n.round)),i)}function li(t,e,n,i){var a,r,o,s=ei.length;for(a=ei.indexOf(t);a<s-1;++a)if(o=(r=ti[ei[a]]).steps?r.steps:Qn,r.common&&Math.ceil((n-e)/(o*r.size))<=i)return ei[a];return ei[s-1]}function ui(t,e,n){var i,a,r=[],o={},s=e.length;for(i=0;i<s;++i)o[a=e[i]]=i,r.push({value:a,major:!1});return 0!==s&&n?function(t,e,n,i){var a,r,o=t._adapter,s=+o.startOf(e[0].value,i),l=e[e.length-1].value;for(a=s;a<=l;a=+o.add(a,1,i))(r=n[a])>=0&&(e[r].major=!0);return e}(t,r,o,n):r}var di=xn.extend({initialize:function(){this.mergeTicksOptions(),xn.prototype.initialize.call(this)},update:function(){var t=this,e=t.options,n=e.time||(e.time={}),i=t._adapter=new an._date(e.adapters.date);return Kn("time scale",n.format,"time.format","time.parser"),Kn("time scale",n.min,"time.min","ticks.min"),Kn("time scale",n.max,"time.max","ticks.max"),V.mergeIf(n.displayFormats,i.formats()),xn.prototype.update.apply(t,arguments)},getRightValue:function(t){return t&&void 0!==t.t&&(t=t.t),xn.prototype.getRightValue.call(this,t)},determineDataLimits:function(){var t,e,n,i,a,r,o,s=this,l=s.chart,u=s._adapter,d=s.options,h=d.time.unit||"day",c=Qn,f=Jn,g=[],p=[],m=[],v=s._getLabels();for(t=0,n=v.length;t<n;++t)m.push(si(s,v[t]));for(t=0,n=(l.data.datasets||[]).length;t<n;++t)if(l.isDatasetVisible(t))if(a=l.data.datasets[t].data,V.isObject(a[0]))for(p[t]=[],e=0,i=a.length;e<i;++e)r=si(s,a[e]),g.push(r),p[t][e]=r;else p[t]=m.slice(0),o||(g=g.concat(m),o=!0);else p[t]=[];m.length&&(c=Math.min(c,m[0]),f=Math.max(f,m[m.length-1])),g.length&&(g=n>1?function(t){var e,n,i,a={},r=[];for(e=0,n=t.length;e<n;++e)a[i=t[e]]||(a[i]=!0,r.push(i));return r}(g).sort(ni):g.sort(ni),c=Math.min(c,g[0]),f=Math.max(f,g[g.length-1])),c=si(s,ii(d))||c,f=si(s,ai(d))||f,c=c===Qn?+u.startOf(Date.now(),h):c,f=f===Jn?+u.endOf(Date.now(),h)+1:f,s.min=Math.min(c,f),s.max=Math.max(c+1,f),s._table=[],s._timestamps={data:g,datasets:p,labels:m}},buildTicks:function(){var t,e,n,i=this,a=i.min,r=i.max,o=i.options,s=o.ticks,l=o.time,u=i._timestamps,d=[],h=i.getLabelCapacity(a),c=s.source,f=o.distribution;for(u="data"===c||"auto"===c&&"series"===f?u.data:"labels"===c?u.labels:function(t,e,n,i){var a,r=t._adapter,o=t.options,s=o.time,l=s.unit||li(s.minUnit,e,n,i),u=Zn([s.stepSize,s.unitStepSize,1]),d="week"===l&&s.isoWeekday,h=e,c=[];if(d&&(h=+r.startOf(h,"isoWeek",d)),h=+r.startOf(h,d?"day":l),r.diff(n,e,l)>1e5*u)throw e+" and "+n+" are too far apart with stepSize of "+u+" "+l;for(a=h;a<n;a=+r.add(a,u,l))c.push(a);return a!==n&&"ticks"!==o.bounds||c.push(a),c}(i,a,r,h),"ticks"===o.bounds&&u.length&&(a=u[0],r=u[u.length-1]),a=si(i,ii(o))||a,r=si(i,ai(o))||r,t=0,e=u.length;t<e;++t)(n=u[t])>=a&&n<=r&&d.push(n);return i.min=a,i.max=r,i._unit=l.unit||(s.autoSkip?li(l.minUnit,i.min,i.max,h):function(t,e,n,i,a){var r,o;for(r=ei.length-1;r>=ei.indexOf(n);r--)if(o=ei[r],ti[o].common&&t._adapter.diff(a,i,o)>=e-1)return o;return ei[n?ei.indexOf(n):0]}(i,d.length,l.minUnit,i.min,i.max)),i._majorUnit=s.major.enabled&&"year"!==i._unit?function(t){for(var e=ei.indexOf(t)+1,n=ei.length;e<n;++e)if(ti[ei[e]].common)return ei[e]}(i._unit):void 0,i._table=function(t,e,n,i){if("linear"===i||!t.length)return[{time:e,pos:0},{time:n,pos:1}];var a,r,o,s,l,u=[],d=[e];for(a=0,r=t.length;a<r;++a)(s=t[a])>e&&s<n&&d.push(s);for(d.push(n),a=0,r=d.length;a<r;++a)l=d[a+1],o=d[a-1],s=d[a],void 0!==o&&void 0!==l&&Math.round((l+o)/2)===s||u.push({time:s,pos:a/(r-1)});return u}(i._timestamps.data,a,r,f),i._offsets=function(t,e,n,i,a){var r,o,s=0,l=0;return a.offset&&e.length&&(r=ri(t,"time",e[0],"pos"),s=1===e.length?1-r:(ri(t,"time",e[1],"pos")-r)/2,o=ri(t,"time",e[e.length-1],"pos"),l=1===e.length?o:(o-ri(t,"time",e[e.length-2],"pos"))/2),{start:s,end:l,factor:1/(s+1+l)}}(i._table,d,0,0,o),s.reverse&&d.reverse(),ui(i,d,i._majorUnit)},getLabelForIndex:function(t,e){var n=this,i=n._adapter,a=n.chart.data,r=n.options.time,o=a.labels&&t<a.labels.length?a.labels[t]:"",s=a.datasets[e].data[t];return V.isObject(s)&&(o=n.getRightValue(s)),r.tooltipFormat?i.format(oi(n,o),r.tooltipFormat):"string"==typeof o?o:i.format(oi(n,o),r.displayFormats.datetime)},tickFormatFunction:function(t,e,n,i){var a=this._adapter,r=this.options,o=r.time.displayFormats,s=o[this._unit],l=this._majorUnit,u=o[l],d=n[e],h=r.ticks,c=l&&u&&d&&d.major,f=a.format(t,i||(c?u:s)),g=c?h.major:h.minor,p=Zn([g.callback,g.userCallback,h.callback,h.userCallback]);return p?p(f,e,n):f},convertTicksToLabels:function(t){var e,n,i=[];for(e=0,n=t.length;e<n;++e)i.push(this.tickFormatFunction(t[e].value,e,t));return i},getPixelForOffset:function(t){var e=this._offsets,n=ri(this._table,"time",t,"pos");return this.getPixelForDecimal((e.start+n)*e.factor)},getPixelForValue:function(t,e,n){var i=null;if(void 0!==e&&void 0!==n&&(i=this._timestamps.datasets[n][e]),null===i&&(i=si(this,t)),null!==i)return this.getPixelForOffset(i)},getPixelForTick:function(t){var e=this.getTicks();return t>=0&&t<e.length?this.getPixelForOffset(e[t].value):null},getValueForPixel:function(t){var e=this._offsets,n=this.getDecimalForPixel(t)/e.factor-e.end,i=ri(this._table,"pos",n,"time");return this._adapter._create(i)},_getLabelSize:function(t){var e=this.options.ticks,n=this.ctx.measureText(t).width,i=V.toRadians(this.isHorizontal()?e.maxRotation:e.minRotation),a=Math.cos(i),r=Math.sin(i),o=$n(e.fontSize,z.global.defaultFontSize);return{w:n*a+o*r,h:n*r+o*a}},getLabelWidth:function(t){return this._getLabelSize(t).w},getLabelCapacity:function(t){var e=this,n=e.options.time,i=n.displayFormats,a=i[n.unit]||i.millisecond,r=e.tickFormatFunction(t,0,ui(e,[t],e._majorUnit),a),o=e._getLabelSize(r),s=Math.floor(e.isHorizontal()?e.width/o.w:e.height/o.h);return e.options.offset&&s--,s>0?s:1}}),hi={position:"bottom",distribution:"linear",bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{autoSkip:!1,source:"auto",major:{enabled:!1}}};di._defaults=hi;var ci={category:_n,linear:Dn,logarithmic:Rn,radialLinear:Gn,time:di},fi={datetime:"MMM D, YYYY, h:mm:ss a",millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm a",hour:"hA",day:"MMM D",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"};an._date.override("function"==typeof t?{_id:"moment",formats:function(){return fi},parse:function(e,n){return"string"==typeof e&&"string"==typeof n?e=t(e,n):e instanceof t||(e=t(e)),e.isValid()?e.valueOf():null},format:function(e,n){return t(e).format(n)},add:function(e,n,i){return t(e).add(n,i).valueOf()},diff:function(e,n,i){return t(e).diff(t(n),i)},startOf:function(e,n,i){return e=t(e),"isoWeek"===n?e.isoWeekday(i).valueOf():e.startOf(n).valueOf()},endOf:function(e,n){return t(e).endOf(n).valueOf()},_create:function(e){return t(e)}}:{}),z._set("global",{plugins:{filler:{propagate:!0}}});var gi={dataset:function(t){var e=t.fill,n=t.chart,i=n.getDatasetMeta(e),a=i&&n.isDatasetVisible(e)&&i.dataset._children||[],r=a.length||0;return r?function(t,e){return e<r&&a[e]._view||null}:null},boundary:function(t){var e=t.boundary,n=e?e.x:null,i=e?e.y:null;return V.isArray(e)?function(t,n){return e[n]}:function(t){return{x:null===n?t.x:n,y:null===i?t.y:i}}}};function pi(t,e,n){var i,a=t._model||{},r=a.fill;if(void 0===r&&(r=!!a.backgroundColor),!1===r||null===r)return!1;if(!0===r)return"origin";if(i=parseFloat(r,10),isFinite(i)&&Math.floor(i)===i)return"-"!==r[0]&&"+"!==r[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(r){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return r;default:return!1}}function mi(t){return(t.el._scale||{}).getPointPositionForValue?function(t){var e,n,i,a,r,o=t.el._scale,s=o.options,l=o.chart.data.labels.length,u=t.fill,d=[];if(!l)return null;for(e=s.ticks.reverse?o.max:o.min,n=s.ticks.reverse?o.min:o.max,i=o.getPointPositionForValue(0,e),a=0;a<l;++a)r="start"===u||"end"===u?o.getPointPositionForValue(a,"start"===u?e:n):o.getBasePosition(a),s.gridLines.circular&&(r.cx=i.x,r.cy=i.y,r.angle=o.getIndexAngle(a)-Math.PI/2),d.push(r);return d}(t):function(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,r=null;if(isFinite(a))return null;if("start"===a?r=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?r=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?r=n.scaleZero:i.getBasePixel&&(r=i.getBasePixel()),null!=r){if(void 0!==r.x&&void 0!==r.y)return r;if(V.isFinite(r))return{x:(e=i.isHorizontal())?r:null,y:e?null:r}}return null}(t)}function vi(t,e,n){var i,a=t[e].fill,r=[e];if(!n)return a;for(;!1!==a&&-1===r.indexOf(a);){if(!isFinite(a))return a;if(!(i=t[a]))return!1;if(i.visible)return a;r.push(a),a=i.fill}return!1}function bi(t){var e=t.fill,n="dataset";return!1===e?null:(isFinite(e)||(n="boundary"),gi[n](t))}function xi(t){return t&&!t.skip}function yi(t,e,n,i,a){var r,o,s,l;if(i&&a){for(t.moveTo(e[0].x,e[0].y),r=1;r<i;++r)V.canvas.lineTo(t,e[r-1],e[r]);if(void 0===n[0].angle)for(t.lineTo(n[a-1].x,n[a-1].y),r=a-1;r>0;--r)V.canvas.lineTo(t,n[r],n[r-1],!0);else for(o=n[0].cx,s=n[0].cy,l=Math.sqrt(Math.pow(n[0].x-o,2)+Math.pow(n[0].y-s,2)),r=a-1;r>0;--r)t.arc(o,s,l,n[r].angle,n[r-1].angle,!0)}}function _i(t,e,n,i,a,r){var o,s,l,u,d,h,c,f,g=e.length,p=i.spanGaps,m=[],v=[],b=0,x=0;for(t.beginPath(),o=0,s=g;o<s;++o)d=n(u=e[l=o%g]._view,l,i),h=xi(u),c=xi(d),r&&void 0===f&&h&&(s=g+(f=o+1)),h&&c?(b=m.push(u),x=v.push(d)):b&&x&&(p?(h&&m.push(u),c&&v.push(d)):(yi(t,m,v,b,x),b=x=0,m=[],v=[]));yi(t,m,v,b,x),t.closePath(),t.fillStyle=a,t.fill()}var ki={id:"filler",afterDatasetsUpdate:function(t,e){var n,i,a,r,o=(t.data.datasets||[]).length,s=e.propagate,l=[];for(i=0;i<o;++i)r=null,(a=(n=t.getDatasetMeta(i)).dataset)&&a._model&&a instanceof _t.Line&&(r={visible:t.isDatasetVisible(i),fill:pi(a,i,o),chart:t,el:a}),n.$filler=r,l.push(r);for(i=0;i<o;++i)(r=l[i])&&(r.fill=vi(l,i,s),r.boundary=mi(r),r.mapper=bi(r))},beforeDatasetsDraw:function(t){var e,n,i,a,r,o,s,l=t._getSortedVisibleDatasetMetas(),u=t.ctx;for(n=l.length-1;n>=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||z.global.defaultColor,o&&s&&r.length&&(V.canvas.clipArea(u,t.chartArea),_i(u,r,o,a,s,i._loop),V.canvas.unclipArea(u)))}},wi=V.rtl.getRtlAdapter,Mi=V.noop,Si=V.valueOrDefault;function Ci(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}z._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;e<n;e++)(i=a.appendChild(document.createElement("li"))).appendChild(document.createElement("span")).style.backgroundColor=r[e].backgroundColor,r[e].label&&i.appendChild(document.createTextNode(r[e].label));return a.outerHTML}});var Pi=X.extend({initialize:function(t){V.extend(this,t),this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1},beforeUpdate:Mi,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Mi,beforeSetDimensions:Mi,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Mi,beforeBuildLabels:Mi,buildLabels:function(){var t=this,e=t.options.labels||{},n=V.callback(e.generateLabels,[t.chart],t)||[];e.filter&&(n=n.filter((function(n){return e.filter(n,t.chart.data)}))),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:Mi,beforeFit:Mi,fit:function(){var t=this,e=t.options,n=e.labels,i=e.display,a=t.ctx,r=V.options._parseFont(n),o=r.size,s=t.legendHitBoxes=[],l=t.minSize,u=t.isHorizontal();if(u?(l.width=t.maxWidth,l.height=i?10:0):(l.width=i?10:0,l.height=t.maxHeight),i){if(a.font=r.string,u){var d=t.lineWidths=[0],h=0;a.textAlign="left",a.textBaseline="middle",V.each(t.legendItems,(function(t,e){var i=Ci(n,o)+o/2+a.measureText(t.text).width;(0===e||d[d.length-1]+i+2*n.padding>l.width)&&(h+=o+n.padding,d[d.length-(e>0?0:1)]=0),s[e]={left:0,top:0,width:i,height:o},d[d.length-1]+=i+n.padding})),l.height+=h}else{var c=n.padding,f=t.columnWidths=[],g=t.columnHeights=[],p=n.padding,m=0,v=0;V.each(t.legendItems,(function(t,e){var i=Ci(n,o)+o/2+a.measureText(t.text).width;e>0&&v+o+2*c>l.height&&(p+=m+n.padding,f.push(m),g.push(v),m=0,v=0),m=Math.max(m,i),v+=o+c,s[e]={left:0,top:0,width:i,height:o}})),p+=m,f.push(m),g.push(v),l.width+=p}t.width=l.width,t.height=l.height}else t.width=l.width=t.height=l.height=0},afterFit:Mi,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var t=this,e=t.options,n=e.labels,i=z.global,a=i.defaultColor,r=i.elements.line,o=t.height,s=t.columnHeights,l=t.width,u=t.lineWidths;if(e.display){var d,h=wi(e.rtl,t.left,t.minSize.width),c=t.ctx,f=Si(n.fontColor,i.defaultFontColor),g=V.options._parseFont(n),p=g.size;c.textAlign=h.textAlign("left"),c.textBaseline="middle",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=g.string;var m=Ci(n,p),v=t.legendHitBoxes,b=function(t,i){switch(e.align){case"start":return n.padding;case"end":return t-i;default:return(t-i+n.padding)/2}},x=t.isHorizontal();d=x?{x:t.left+b(l,u[0]),y:t.top+n.padding,line:0}:{x:t.left+n.padding,y:t.top+b(o,s[0]),line:0},V.rtl.overrideTextDirection(t.ctx,e.textDirection);var y=p+n.padding;V.each(t.legendItems,(function(e,i){var f=c.measureText(e.text).width,g=m+p/2+f,_=d.x,k=d.y;h.setWidth(t.minSize.width),x?i>0&&_+g+n.padding>t.left+t.minSize.width&&(k=d.y+=y,d.line++,_=d.x=t.left+b(l,u[d.line])):i>0&&k+y>t.top+t.minSize.height&&(_=d.x=_+t.columnWidths[d.line]+n.padding,d.line++,k=d.y=t.top+b(o,s[d.line]));var w=h.x(_);!function(t,e,i){if(!(isNaN(m)||m<=0)){c.save();var o=Si(i.lineWidth,r.borderWidth);if(c.fillStyle=Si(i.fillStyle,a),c.lineCap=Si(i.lineCap,r.borderCapStyle),c.lineDashOffset=Si(i.lineDashOffset,r.borderDashOffset),c.lineJoin=Si(i.lineJoin,r.borderJoinStyle),c.lineWidth=o,c.strokeStyle=Si(i.strokeStyle,a),c.setLineDash&&c.setLineDash(Si(i.lineDash,r.borderDash)),n&&n.usePointStyle){var s=m*Math.SQRT2/2,l=h.xPlus(t,m/2),u=e+p/2;V.canvas.drawPoint(c,i.pointStyle,s,l,u,i.rotation)}else c.fillRect(h.leftForLtr(t,m),e,m,p),0!==o&&c.strokeRect(h.leftForLtr(t,m),e,m,p);c.restore()}}(w,k,e),v[i].left=h.leftForLtr(w,v[i].width),v[i].top=k,function(t,e,n,i){var a=p/2,r=h.xPlus(t,m+a),o=e+a;c.fillText(n.text,r,o),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(r,o),c.lineTo(h.xPlus(r,i),o),c.stroke())}(w,k,e,f),x?d.x+=g+n.padding:d.y+=y})),V.rtl.restoreTextDirection(t.ctx,e.textDirection)}},_getLegendItemAt:function(t,e){var n,i,a,r=this;if(t>=r.left&&t<=r.right&&e>=r.top&&e<=r.bottom)for(a=r.legendHitBoxes,n=0;n<a.length;++n)if(t>=(i=a[n]).left&&t<=i.left+i.width&&e>=i.top&&e<=i.top+i.height)return r.legendItems[n];return null},handleEvent:function(t){var e,n=this,i=n.options,a="mouseup"===t.type?"click":t.type;if("mousemove"===a){if(!i.onHover&&!i.onLeave)return}else{if("click"!==a)return;if(!i.onClick)return}e=n._getLegendItemAt(t.x,t.y),"click"===a?e&&i.onClick&&i.onClick.call(n,t.native,e):(i.onLeave&&e!==n._hoveredItem&&(n._hoveredItem&&i.onLeave.call(n,t.native,n._hoveredItem),n._hoveredItem=e),i.onHover&&e&&i.onHover.call(n,t.native,e))}});function Ai(t,e){var n=new Pi({ctx:t.ctx,options:e,chart:t});ge.configure(t,n,e),ge.addBox(t,n),t.legend=n}var Di={id:"legend",_element:Pi,beforeInit:function(t){var e=t.options.legend;e&&Ai(t,e)},beforeUpdate:function(t){var e=t.options.legend,n=t.legend;e?(V.mergeIf(e,z.global.legend),n?(ge.configure(t,n,e),n.options=e):Ai(t,e)):n&&(ge.removeBox(t,n),delete t.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}},Ti=V.noop;z._set("global",{title:{display:!1,fontStyle:"bold",fullWidth:!0,padding:10,position:"top",text:"",weight:2e3}});var Ii=X.extend({initialize:function(t){V.extend(this,t),this.legendHitBoxes=[]},beforeUpdate:Ti,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:Ti,beforeSetDimensions:Ti,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:Ti,beforeBuildLabels:Ti,buildLabels:Ti,afterBuildLabels:Ti,beforeFit:Ti,fit:function(){var t,e=this,n=e.options,i=e.minSize={},a=e.isHorizontal();n.display?(t=(V.isArray(n.text)?n.text.length:1)*V.options._parseFont(n).lineHeight+2*n.padding,e.width=i.width=a?e.maxWidth:t,e.height=i.height=a?t:e.maxHeight):e.width=i.width=e.height=i.height=0},afterFit:Ti,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var t=this,e=t.ctx,n=t.options;if(n.display){var i,a,r,o=V.options._parseFont(n),s=o.lineHeight,l=s/2+n.padding,u=0,d=t.top,h=t.left,c=t.bottom,f=t.right;e.fillStyle=V.valueOrDefault(n.fontColor,z.global.defaultFontColor),e.font=o.string,t.isHorizontal()?(a=h+(f-h)/2,r=d+l,i=f-h):(a="left"===n.position?h+l:f-l,r=d+(c-d)/2,i=c-d,u=Math.PI*("left"===n.position?-.5:.5)),e.save(),e.translate(a,r),e.rotate(u),e.textAlign="center",e.textBaseline="middle";var g=n.text;if(V.isArray(g))for(var p=0,m=0;m<g.length;++m)e.fillText(g[m],0,p,i),p+=s;else e.fillText(g,0,0,i);e.restore()}}});function Fi(t,e){var n=new Ii({ctx:t.ctx,options:e,chart:t});ge.configure(t,n,e),ge.addBox(t,n),t.titleBlock=n}var Li={},Oi=ki,Ri=Di,zi={id:"title",_element:Ii,beforeInit:function(t){var e=t.options.title;e&&Fi(t,e)},beforeUpdate:function(t){var e=t.options.title,n=t.titleBlock;e?(V.mergeIf(e,z.global.title),n?(ge.configure(t,n,e),n.options=e):Fi(t,e)):n&&(ge.removeBox(t,n),delete t.titleBlock)}};for(var Ni in Li.filler=Oi,Li.legend=Ri,Li.title=zi,tn.helpers=V,function(){function t(t,e,n){var i;return"string"==typeof t?(i=parseInt(t,10),-1!==t.indexOf("%")&&(i=i/100*e.parentNode[n])):i=t,i}function e(t){return null!=t&&"none"!==t}function n(n,i,a){var r=document.defaultView,o=V._getParentNode(n),s=r.getComputedStyle(n)[i],l=r.getComputedStyle(o)[i],u=e(s),d=e(l),h=Number.POSITIVE_INFINITY;return u||d?Math.min(u?t(s,n,a):h,d?t(l,o,a):h):"none"}V.where=function(t,e){if(V.isArray(t)&&Array.prototype.filter)return t.filter(e);var n=[];return V.each(t,(function(t){e(t)&&n.push(t)})),n},V.findIndex=Array.prototype.findIndex?function(t,e,n){return t.findIndex(e,n)}:function(t,e,n){n=void 0===n?t:n;for(var i=0,a=t.length;i<a;++i)if(e.call(n,t[i],i,t))return i;return-1},V.findNextWhere=function(t,e,n){V.isNullOrUndef(n)&&(n=-1);for(var i=n+1;i<t.length;i++){var a=t[i];if(e(a))return a}},V.findPreviousWhere=function(t,e,n){V.isNullOrUndef(n)&&(n=t.length);for(var i=n-1;i>=0;i--){var a=t[i];if(e(a))return a}},V.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},V.almostEquals=function(t,e,n){return Math.abs(t-e)<n},V.almostWhole=function(t,e){var n=Math.round(t);return n-e<=t&&n+e>=t},V.max=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.max(t,e)}),Number.NEGATIVE_INFINITY)},V.min=function(t){return t.reduce((function(t,e){return isNaN(e)?t:Math.min(t,e)}),Number.POSITIVE_INFINITY)},V.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return 0===(t=+t)||isNaN(t)?t:t>0?1:-1},V.toRadians=function(t){return t*(Math.PI/180)},V.toDegrees=function(t){return t*(180/Math.PI)},V._decimalPlaces=function(t){if(V.isFinite(t)){for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}},V.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},V.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},V.aliasPixel=function(t){return t%2==0?0:.5},V._alignPixel=function(t,e,n){var i=t.currentDevicePixelRatio,a=n/2;return Math.round((e-a)*i)/i+a},V.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l),h=i*(u=isNaN(u)?0:u),c=i*(d=isNaN(d)?0:d);return{previous:{x:r.x-h*(o.x-a.x),y:r.y-h*(o.y-a.y)},next:{x:r.x+c*(o.x-a.x),y:r.y+c*(o.y-a.y)}}},V.EPSILON=Number.EPSILON||1e-14,V.splineCurveMonotone=function(t){var e,n,i,a,r,o,s,l,u,d=(t||[]).map((function(t){return{model:t._model,deltaK:0,mK:0}})),h=d.length;for(e=0;e<h;++e)if(!(i=d[e]).model.skip){if(n=e>0?d[e-1]:null,(a=e<h-1?d[e+1]:null)&&!a.model.skip){var c=a.model.x-i.model.x;i.deltaK=0!==c?(a.model.y-i.model.y)/c:0}!n||n.model.skip?i.mK=i.deltaK:!a||a.model.skip?i.mK=n.deltaK:this.sign(n.deltaK)!==this.sign(i.deltaK)?i.mK=0:i.mK=(n.deltaK+i.deltaK)/2}for(e=0;e<h-1;++e)i=d[e],a=d[e+1],i.model.skip||a.model.skip||(V.almostEquals(i.deltaK,0,this.EPSILON)?i.mK=a.mK=0:(r=i.mK/i.deltaK,o=a.mK/i.deltaK,(l=Math.pow(r,2)+Math.pow(o,2))<=9||(s=3/Math.sqrt(l),i.mK=r*s*i.deltaK,a.mK=o*s*i.deltaK)));for(e=0;e<h;++e)(i=d[e]).model.skip||(n=e>0?d[e-1]:null,a=e<h-1?d[e+1]:null,n&&!n.model.skip&&(u=(i.model.x-n.model.x)/3,i.model.controlPointPreviousX=i.model.x-u,i.model.controlPointPreviousY=i.model.y-u*i.mK),a&&!a.model.skip&&(u=(a.model.x-i.model.x)/3,i.model.controlPointNextX=i.model.x+u,i.model.controlPointNextY=i.model.y+u*i.mK))},V.nextItem=function(t,e,n){return n?e>=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},V.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},V.niceNum=function(t,e){var n=Math.floor(V.log10(t)),i=t/Math.pow(10,n);return(e?i<1.5?1:i<3?2:i<7?5:10:i<=1?1:i<=2?2:i<=5?5:10)*Math.pow(10,n)},V.requestAnimFrame="undefined"==typeof window?function(t){t()}:window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)},V.getRelativePosition=function(t,e){var n,i,a=t.originalEvent||t,r=t.target||t.srcElement,o=r.getBoundingClientRect(),s=a.touches;s&&s.length>0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var l=parseFloat(V.getStyle(r,"padding-left")),u=parseFloat(V.getStyle(r,"padding-top")),d=parseFloat(V.getStyle(r,"padding-right")),h=parseFloat(V.getStyle(r,"padding-bottom")),c=o.right-o.left-l-d,f=o.bottom-o.top-u-h;return{x:n=Math.round((n-o.left-l)/c*r.width/e.currentDevicePixelRatio),y:i=Math.round((i-o.top-u)/f*r.height/e.currentDevicePixelRatio)}},V.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},V.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},V._calculatePadding=function(t,e,n){return(e=V.getStyle(t,e)).indexOf("%")>-1?n*parseInt(e,10)/100:parseInt(e,10)},V._getParentNode=function(t){var e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e},V.getMaximumWidth=function(t){var e=V._getParentNode(t);if(!e)return t.clientWidth;var n=e.clientWidth,i=n-V._calculatePadding(e,"padding-left",n)-V._calculatePadding(e,"padding-right",n),a=V.getConstraintWidth(t);return isNaN(a)?i:Math.min(i,a)},V.getMaximumHeight=function(t){var e=V._getParentNode(t);if(!e)return t.clientHeight;var n=e.clientHeight,i=n-V._calculatePadding(e,"padding-top",n)-V._calculatePadding(e,"padding-bottom",n),a=V.getConstraintHeight(t);return isNaN(a)?i:Math.min(i,a)},V.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},V.retinaScale=function(t,e){var n=t.currentDevicePixelRatio=e||"undefined"!=typeof window&&window.devicePixelRatio||1;if(1!==n){var i=t.canvas,a=t.height,r=t.width;i.height=a*n,i.width=r*n,t.ctx.scale(n,n),i.style.height||i.style.width||(i.style.height=a+"px",i.style.width=r+"px")}},V.fontString=function(t,e,n){return e+" "+t+"px "+n},V.longestText=function(t,e,n,i){var a=(i=i||{}).data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var o,s,l,u,d,h=0,c=n.length;for(o=0;o<c;o++)if(null!=(u=n[o])&&!0!==V.isArray(u))h=V.measureText(t,a,r,h,u);else if(V.isArray(u))for(s=0,l=u.length;s<l;s++)null==(d=u[s])||V.isArray(d)||(h=V.measureText(t,a,r,h,d));var f=r.length/2;if(f>n.length){for(o=0;o<f;o++)delete a[r[o]];r.splice(0,f)}return h},V.measureText=function(t,e,n,i,a){var r=e[a];return r||(r=e[a]=t.measureText(a).width,n.push(a)),r>i&&(i=r),i},V.numberOfLabelLines=function(t){var e=1;return V.each(t,(function(t){V.isArray(t)&&t.length>e&&(e=t.length)})),e},V.color=k?function(t){return t instanceof CanvasGradient&&(t=z.global.defaultColor),k(t)}:function(t){return console.error("Color.js not found!"),t},V.getHoverColor=function(t){return t instanceof CanvasPattern||t instanceof CanvasGradient?t:V.color(t).saturate(.5).darken(.1).rgbString()}}(),tn._adapters=an,tn.Animation=Z,tn.animationService=$,tn.controllers=$t,tn.DatasetController=nt,tn.defaults=z,tn.Element=X,tn.elements=_t,tn.Interaction=ae,tn.layouts=ge,tn.platform=Fe,tn.plugins=Le,tn.Scale=xn,tn.scaleService=Oe,tn.Ticks=rn,tn.Tooltip=Ue,tn.helpers.each(ci,(function(t,e){tn.scaleService.registerScaleType(e,t,t._defaults)})),Li)Li.hasOwnProperty(Ni)&&tn.plugins.register(Li[Ni]);tn.platform.initialize();var Bi=tn;return"undefined"!=typeof window&&(window.Chart=tn),tn.Chart=tn,tn.Legend=Li.legend._element,tn.Title=Li.title._element,tn.pluginService=tn.plugins,tn.PluginBase=tn.Element.extend({}),tn.canvasHelpers=tn.helpers.canvas,tn.layoutService=tn.layouts,tn.LinearScaleBase=Sn,tn.helpers.each(["Bar","Bubble","Doughnut","Line","PolarArea","Radar","Scatter"],(function(t){tn[t]=function(e,n){return new tn(e,tn.helpers.merge(n||{},{type:t.charAt(0).toLowerCase()+t.slice(1)}))}})),Bi}));
static/ninjafirewall.css CHANGED
@@ -15,6 +15,9 @@
15
  | GNU General Public License for more details. |
16
  +---------------------------------------------------------------------+
17
  */
 
 
 
18
  .wpplus {
19
  border: 1px solid #ccc;
20
  -moz-box-shadow:-3px 5px 5px #999;
@@ -26,7 +29,7 @@
26
  }
27
  .nfw-progress {
28
  height: 3px;
29
- width: 100%;
30
  -webkit-appearance: none;
31
  border: none;
32
  background-color: #f1f1f1;
15
  | GNU General Public License for more details. |
16
  +---------------------------------------------------------------------+
17
  */
18
+ textarea {
19
+ resize: both;
20
+ }
21
  .wpplus {
22
  border: 1px solid #ccc;
23
  -moz-box-shadow:-3px 5px 5px #999;
29
  }
30
  .nfw-progress {
31
  height: 3px;
32
+ width: 99%;
33
  -webkit-appearance: none;
34
  border: none;
35
  background-color: #f1f1f1;
static/ninjafirewall.js CHANGED
@@ -223,6 +223,27 @@ function nfwjs_fullwaf_countdown() {
223
  }
224
  }
225
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  // =====================================================================
227
  // Statistics page.
228
 
@@ -531,8 +552,7 @@ function nfwjs_livelog() {
531
  nfwjs_livelog_stop();
532
  return true;
533
  }
534
- jQuery('#idtxtlog').prop('disabled', false);
535
- if ( jQuery('#idtxtlog').val() == '' ) {
536
  jQuery('#idtxtlog').val( nfwi18n.no_traffic +' '+ liveinterval/1000 + nfwi18n.seconds +"\n" );
537
  }
538
  if ( scroll == 1 ) {
@@ -606,7 +626,7 @@ function nfwjs_start_livelog() {
606
  livecls = 0;
607
  livecount = 1;
608
 
609
- if ( jQuery('#idtxtlog').val() == '' ) {
610
  jQuery('#idtxtlog').val( nfwi18n.no_traffic +' '+ liveinterval/1000 + nfwi18n.seconds +"\n" );
611
  }
612
  return false;
@@ -627,8 +647,7 @@ function nfwjs_livelog_stop( force ) {
627
 
628
  var textarea = jQuery('#idtxtlog').val();
629
  if ( textarea.includes( nfwi18n.no_traffic ) ) {
630
- jQuery('#idtxtlog').val( '' );
631
- jQuery('#idtxtlog').prop( 'disabled', true );
632
  }
633
 
634
  lines = 0;
223
  }
224
  }
225
 
226
+ function nfwjs_welcomeajax( nonce ) {
227
+
228
+ // Ajax
229
+ var data = {
230
+ 'action': 'nfw_welcomescreen',
231
+ 'nonce': nonce,
232
+ };
233
+ jQuery.ajax( {
234
+ type: "POST",
235
+ url: ajaxurl,
236
+ headers: {
237
+ 'Accept-Language':'en-US,en;q=0.5',
238
+ 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:60.0)',
239
+ },
240
+ data: data,
241
+ dataType: "text",
242
+ // We don't want any response.
243
+ });
244
+ return 1;
245
+ }
246
+
247
  // =====================================================================
248
  // Statistics page.
249
 
552
  nfwjs_livelog_stop();
553
  return true;
554
  }
555
+ if ( jQuery('#idtxtlog').val() == nfwi18n.live_log_desc || jQuery('#idtxtlog').val() == '' ) {
 
556
  jQuery('#idtxtlog').val( nfwi18n.no_traffic +' '+ liveinterval/1000 + nfwi18n.seconds +"\n" );
557
  }
558
  if ( scroll == 1 ) {
626
  livecls = 0;
627
  livecount = 1;
628
 
629
+ if ( jQuery('#idtxtlog').val() == nfwi18n.live_log_desc ) {
630
  jQuery('#idtxtlog').val( nfwi18n.no_traffic +' '+ liveinterval/1000 + nfwi18n.seconds +"\n" );
631
  }
632
  return false;
647
 
648
  var textarea = jQuery('#idtxtlog').val();
649
  if ( textarea.includes( nfwi18n.no_traffic ) ) {
650
+ jQuery('#idtxtlog').val( nfwi18n.live_log_desc );
 
651
  }
652
 
653
  lines = 0;
uninstall.php CHANGED
@@ -44,6 +44,11 @@ function nfw_uninstall() {
44
  unset( $_SESSION['nfw_goodguy'] );
45
  }
46
 
 
 
 
 
 
47
  define( 'HTACCESS_BEGIN', '# BEGIN NinjaFirewall' );
48
  define( 'HTACCESS_END', '# END NinjaFirewall' );
49
  define( 'PHPINI_BEGIN', '; BEGIN NinjaFirewall' );
@@ -70,8 +75,8 @@ function nfw_uninstall() {
70
  // Clean-up .htaccess :
71
  if (! empty($nfw_install['htaccess']) && file_exists($nfw_install['htaccess']) ) {
72
  $htaccess_file = $nfw_install['htaccess'];
73
- } elseif ( file_exists( ABSPATH . '.htaccess' ) ) {
74
- $htaccess_file = ABSPATH . '.htaccess';
75
  } else {
76
  $htaccess_file = '';
77
  }
@@ -91,19 +96,19 @@ function nfw_uninstall() {
91
  $phpini[] = $nfw_install['phpini'];
92
  }
93
  }
94
- if ( file_exists( ABSPATH . 'php.ini' ) ) {
95
- if ( is_writable( ABSPATH . 'php.ini' ) ) {
96
- $phpini[] = ABSPATH . 'php.ini';
97
  }
98
  }
99
- if ( file_exists( ABSPATH . 'php5.ini' ) ) {
100
- if ( is_writable( ABSPATH . 'php5.ini' ) ) {
101
- $phpini[] = ABSPATH . 'php5.ini';
102
  }
103
  }
104
- if ( file_exists( ABSPATH . '.user.ini' ) ) {
105
- if ( is_writable( ABSPATH . '.user.ini' ) ) {
106
- $phpini[] = ABSPATH . '.user.ini';
107
  }
108
  }
109
  foreach( $phpini as $ini ) {
@@ -131,12 +136,14 @@ function nfw_uninstall() {
131
  delete_option('nfw_rules');
132
  delete_option('nfw_install');
133
  delete_option('nfw_tmp');
 
134
  if ( is_multisite() ) {
135
  // Delete those ones too :
136
  delete_site_option('nfw_options');
137
  delete_site_option('nfw_rules');
138
  delete_site_option('nfw_install');
139
  delete_site_option('nfw_tmp');
 
140
  }
141
 
142
  // Clear session flag:
44
  unset( $_SESSION['nfw_goodguy'] );
45
  }
46
 
47
+ if (! function_exists( 'get_home_path' ) ) {
48
+ include_once ABSPATH .'wp-admin/includes/file.php';
49
+ }
50
+ $NFW_ABSPATH = get_home_path();
51
+
52
  define( 'HTACCESS_BEGIN', '# BEGIN NinjaFirewall' );
53
  define( 'HTACCESS_END', '# END NinjaFirewall' );
54
  define( 'PHPINI_BEGIN', '; BEGIN NinjaFirewall' );
75
  // Clean-up .htaccess :
76
  if (! empty($nfw_install['htaccess']) && file_exists($nfw_install['htaccess']) ) {
77
  $htaccess_file = $nfw_install['htaccess'];
78
+ } elseif ( file_exists( $NFW_ABSPATH . '.htaccess' ) ) {
79
+ $htaccess_file = $NFW_ABSPATH . '.htaccess';
80
  } else {
81
  $htaccess_file = '';
82
  }
96
  $phpini[] = $nfw_install['phpini'];
97
  }
98
  }
99
+ if ( file_exists( $NFW_ABSPATH . 'php.ini' ) ) {
100
+ if ( is_writable( $NFW_ABSPATH . 'php.ini' ) ) {
101
+ $phpini[] = $NFW_ABSPATH . 'php.ini';
102
  }
103
  }
104
+ if ( file_exists( $NFW_ABSPATH . 'php5.ini' ) ) {
105
+ if ( is_writable( $NFW_ABSPATH . 'php5.ini' ) ) {
106
+ $phpini[] = $NFW_ABSPATH . 'php5.ini';
107
  }
108
  }
109
+ if ( file_exists( $NFW_ABSPATH . '.user.ini' ) ) {
110
+ if ( is_writable( $NFW_ABSPATH . '.user.ini' ) ) {
111
+ $phpini[] = $NFW_ABSPATH . '.user.ini';
112
  }
113
  }
114
  foreach( $phpini as $ini ) {
136
  delete_option('nfw_rules');
137
  delete_option('nfw_install');
138
  delete_option('nfw_tmp');
139
+ delete_option('nfw_checked');
140
  if ( is_multisite() ) {
141
  // Delete those ones too :
142
  delete_site_option('nfw_options');
143
  delete_site_option('nfw_rules');
144
  delete_site_option('nfw_install');
145
  delete_site_option('nfw_tmp');
146
+ delete_site_option('nfw_checked');
147
  }
148
 
149
  // Clear session flag: