summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2023-09-27 00:53:30 -0400
committerMark H Weaver <mhw@netris.org>2023-09-27 14:34:35 -0400
commitfa5c0b073214191e6996ba0b5bc8e61560ff822c (patch)
tree38e7133195616f4a4da6c8fe46ab2c77c5a6e9e2
parentd167f676a167b1392a4e29f14ddf25613468680b (diff)
Update the JShelter extension to 0.15.2.
-rw-r--r--data/extensions/jsr@javascriptrestrictor/META-INF/manifest.mf239
-rw-r--r--data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.rsabin4342 -> 4342 bytes
-rw-r--r--data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.sf4
-rw-r--r--data/extensions/jsr@javascriptrestrictor/_locales/cs/messages.json1534
-rw-r--r--data/extensions/jsr@javascriptrestrictor/_locales/en/messages.json1535
-rw-r--r--data/extensions/jsr@javascriptrestrictor/_locales/ru/messages.json1485
-rw-r--r--data/extensions/jsr@javascriptrestrictor/background.js63
-rw-r--r--data/extensions/jsr@javascriptrestrictor/code_builders.js184
-rw-r--r--data/extensions/jsr@javascriptrestrictor/common.css8
-rw-r--r--data/extensions/jsr@javascriptrestrictor/crc16.js49
-rw-r--r--data/extensions/jsr@javascriptrestrictor/document_start.js28
-rw-r--r--data/extensions/jsr@javascriptrestrictor/farble.wasmbin0 -> 972 bytes
-rw-r--r--data/extensions/jsr@javascriptrestrictor/fp_code_builders.js204
-rw-r--r--data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_0.json12
-rw-r--r--data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_1.json12
-rw-r--r--data/extensions/jsr@javascriptrestrictor/fp_detect_background.js102
-rw-r--r--data/extensions/jsr@javascriptrestrictor/fp_levels.js111
-rw-r--r--data/extensions/jsr@javascriptrestrictor/fp_report.html20
-rw-r--r--data/extensions/jsr@javascriptrestrictor/fp_report.js23
-rw-r--r--data/extensions/jsr@javascriptrestrictor/helpers.js22
-rw-r--r--data/extensions/jsr@javascriptrestrictor/http_shield_common.js43
-rw-r--r--data/extensions/jsr@javascriptrestrictor/http_shield_firefox.js17
-rw-r--r--data/extensions/jsr@javascriptrestrictor/i18n_translate_dom.js46
-rw-r--r--data/extensions/jsr@javascriptrestrictor/level_cache.js24
-rw-r--r--data/extensions/jsr@javascriptrestrictor/levels.js415
-rw-r--r--data/extensions/jsr@javascriptrestrictor/levels_browser.js16
-rw-r--r--data/extensions/jsr@javascriptrestrictor/lib/sha256.js (renamed from data/extensions/jsr@javascriptrestrictor/nscl/lib/sha256.js)19
-rw-r--r--data/extensions/jsr@javascriptrestrictor/manifest.json92
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js2
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/log.js2
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/sha256.js27
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js4
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js2
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js64
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js8
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js2
-rw-r--r--data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js2
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options.css45
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options.html160
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options.js104
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options_advanced.html38
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options_advanced.js35
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options_domains.html42
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options_domains.js18
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options_init.js27
-rw-r--r--data/extensions/jsr@javascriptrestrictor/options_nbs.js27
-rw-r--r--data/extensions/jsr@javascriptrestrictor/popup.css6
-rw-r--r--data/extensions/jsr@javascriptrestrictor/popup.html39
-rw-r--r--data/extensions/jsr@javascriptrestrictor/popup.js11
-rw-r--r--data/extensions/jsr@javascriptrestrictor/tweaks_gui.js7
-rw-r--r--data/extensions/jsr@javascriptrestrictor/update.js89
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingL-CANVAS.js6
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js47
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js197
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingS-MCS.js7
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingS-NP.js79
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingS-WEBA.js140
-rw-r--r--data/extensions/jsr@javascriptrestrictor/wrappingS-WEBGL.js126
58 files changed, 6409 insertions, 1261 deletions
diff --git a/data/extensions/jsr@javascriptrestrictor/META-INF/manifest.mf b/data/extensions/jsr@javascriptrestrictor/META-INF/manifest.mf
index e222a76..7e4f5c1 100644
--- a/data/extensions/jsr@javascriptrestrictor/META-INF/manifest.mf
+++ b/data/extensions/jsr@javascriptrestrictor/META-INF/manifest.mf
@@ -7,38 +7,48 @@ SHA256-Digest: kU+HKcdrshA3zzIH1wFWtkw1lw/2O6El8UCFSOvLxEc=
Name: background.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: zfg2GLj6CLghM961pmnUp6XirJ8=
-SHA256-Digest: o5l+C8zGmBIIve62qF3RxmEJzVjwqi4Tv+Q0GhRhpL0=
+SHA1-Digest: W6usKK5pgMqOpl0Cj6gJMPG6D3Y=
+SHA256-Digest: zfz+yKJkk7ZEfGt+O91zcEije3FT0C/KgLvwGqKbD4g=
Name: code_builders.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: gkCrI66sYg/pvGWpLIIrXih9y0I=
-SHA256-Digest: W5P/ZK0+h9Rzj94ENoPRMLwrMaPG/z9JwpTIfGg4reY=
+SHA1-Digest: iqgFaEjd0CAQiNWRCtBqYc024UA=
+SHA256-Digest: 7wGRu5HxS/B9OFPnaMm/Vs6tM4lrOeCRSuXRLoFg/tk=
Name: common.css
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: B74uQeo1h1Y8NemIbL6B2ROWCtA=
-SHA256-Digest: fvtP5x4diAyoFpNSiY99G11Jc9GNGjJsdGbNa8YBbCg=
+SHA1-Digest: Na0zOCxbmyMFpSdv4kVAL+pQ2FM=
+SHA256-Digest: M0Ay423nVy4i/GxaHz072gCLqRhnItAzpjIHoPoTZwI=
Name: crc16.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: Ac+v9o9WWrHMQMx+HixdOHp8wHc=
-SHA256-Digest: varm0+gaiVn8xbQEkrnDHqOLn9gu2Saf3omveIpCPuA=
+SHA1-Digest: T97r2grez4dAiyuKv/vLo6Yd0yk=
+SHA256-Digest: a0IfR18X0joyJvCPY2UKRvvBgdbg7e+VENaaiAix4Vg=
Name: document_start.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: yK82UOsn7X0J8KYKMkapEA9OrGs=
-SHA256-Digest: zCm8PKwBxFjownEz6CkNLhWaUKfOgis2hJ8ExHoaPzU=
+SHA1-Digest: N3KYZS+F0i/IxaG/FI8Vb61F3kQ=
+SHA256-Digest: qvNMyqEOjBno3yAlVxpZ+EtwNhPuU1BmYyUlbIPE84Y=
+
+Name: farble.wasm
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: y2cmMLiaieIsO/iZcAYNJzPhHTw=
+SHA256-Digest: vkhiYJKN6KQYc52l4Y6XhmyiltXE3htOrsGljPSFUq4=
Name: fp_code_builders.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: qEGEvWSFVPBjud3zBCOBGK2X+uo=
-SHA256-Digest: 9j+VHTzJmF6y8S5oqJIo3xkGH7VfbB8fL09vjcqiOdM=
+SHA1-Digest: l5+Aj596qyaIATTFnxEWstTYfHk=
+SHA256-Digest: HgH2ivYD9O1IRznQgAJCzxYbulH6+8hpcz49eKySLZ0=
Name: fp_detect_background.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: bv81+mhoIhj6nYOmk0KpZwnRHCw=
-SHA256-Digest: 7jcajj6GseQV1cksz3idlfHFfXk0KDSVNTGulErK9vA=
+SHA1-Digest: z2ulMkV0DY6kHWfiqYi1R0+FU5I=
+SHA256-Digest: I1C13tAYJt2YlqPIPHrySDR+sOJHXJJE/2V1IuIg3l0=
+
+Name: fp_levels.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: v5gN5dTR5QSLIcOPnBspRjucX08=
+SHA256-Digest: 78gX+7f+hPsJD+axfZdCS7VwIz9sSxDqqMooO2AUZuc=
Name: fp_report.css
Digest-Algorithms: SHA1 SHA256
@@ -47,28 +57,28 @@ SHA256-Digest: IOR4EnFZ6TlreDvMW8/D+aqvhefK3Oka2DVQjsHK+7c=
Name: fp_report.html
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: BIYew/1W/RleZMCVonuJGzApIk8=
-SHA256-Digest: 1/ebI9hynG5LPM2m5/+qaX3rmIdDxp2dX1ZVvQufQBc=
+SHA1-Digest: EpC+oSCQ4GQLih64v6AeaoIMY9k=
+SHA256-Digest: 3Q423bVTSECwFjbCiJvGNLlL7IgrqaMia/tgTCQTb+Q=
Name: fp_report.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: kLefCvCEXKAgSlRiuE7KA461JlY=
-SHA256-Digest: 3NI6w5CttqkFNF5qBzMnz3PT5Le3X1LOYD1O6Mky5Xk=
+SHA1-Digest: dsqh1j3rZJQCjld8izOCAz6trSQ=
+SHA256-Digest: rzzlmcI6jumVxVpzm/XliW46i1K8woBwrddn/CIewsM=
Name: helpers.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: 4kZSEQoJlYCuK10HeZBGxghU+qQ=
-SHA256-Digest: 6RrHgTK94ej+5juCq+n6w4oIOvLV2bOqamVOhcOsXE0=
+SHA1-Digest: xDt35vq5v9wRcAiKsJj3M10a1Gw=
+SHA256-Digest: TZ7sgaBPd//Bc4SueVhwqQmhmj8H74xsL8ySqMXxPeo=
Name: http_shield_common.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: kUFW4ZnUSBPJfWtX/O1st9gYUQo=
-SHA256-Digest: g+Zv6PV0oJcPJpxuc5mvBohfZ+OsOmVnbsHq512/gT4=
+SHA1-Digest: kNZPvYvIu8/q73uhpv5i/624hsU=
+SHA256-Digest: Z66jza7VW2NytbRsq6kkXe5duIvmb5hml8ZPS/I5UYY=
Name: http_shield_firefox.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: VhR3hctMbCCJ+XapH3Po8z/YVW0=
-SHA256-Digest: ZfJLZs+cUcNoxGQQfzuEah6oL/Gdkqtzl/IzMLedRdM=
+SHA1-Digest: 6lb3fXUX+vYdv/Xj7E3Gh3J3OAc=
+SHA256-Digest: azcLJExqs0Z+OTIEk+2C5UdOqQtkQdAJG+pp7D7Dlp8=
Name: ipv4.dat
Digest-Algorithms: SHA1 SHA256
@@ -80,75 +90,90 @@ Digest-Algorithms: SHA1 SHA256
SHA1-Digest: SRhTZIQ2nTeX0GIF/B8e/IuUKpQ=
SHA256-Digest: 9ImunHzGKDZACTknDe86EwUHZv2DS1g9U+ofDC3Pa20=
+Name: i18n_translate_dom.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: bLeppNH/YlEym1IR2nJUY8iQ/uo=
+SHA256-Digest: LMDyVtBpfyoTemLr9Ide2KTzWaHFiYsGMkuLznPZQXc=
+
Name: level_cache.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: fBX8tK29kRN2WGWwKQZp2EDjJdE=
-SHA256-Digest: zkotRJunCJ2MYovcTVP7bZJ7Mjfyw5Sgl1P//M8jhts=
+SHA1-Digest: Om78VB8P727PJEK+cckvSkR6EYU=
+SHA256-Digest: aOiW1BZnxu0fnCc6JBAlIfjHSqDcdK03zTGVlkqpjA4=
Name: levels_browser.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: qLTF2OzEekI24qVbthvveUPiNxo=
-SHA256-Digest: WuutVxrpc8d0nl4dTpAOU7z1fPraJc+oo9tofkT6C80=
+SHA1-Digest: 72sdCbsIHyw9EZnYfkZQTR8QCaw=
+SHA256-Digest: eTo5q2caJLdrRu6zyrI+sf1nowugn1kMo3ogEckCYiE=
Name: levels.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: FaPUq+pQhBr90Shcl8PUHeQdGzo=
-SHA256-Digest: YCopHh5p/S3OxjJwjlz9VCCh2/MF/OcfOTE+FYcdzBU=
+SHA1-Digest: Q9ugAYffvkh57OSHf9a6My5PKyg=
+SHA256-Digest: 7O0pZL6dDMlL7YsdkH2pe26+LqF+top1MWuSArDkn3o=
Name: manifest.json
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: 1EKeU8rmShvywHEwC/looGubXhg=
-SHA256-Digest: nIzKW7BJSpoJVdkyl5B1xlJ+dyHd2cdGX5tn+AodFxA=
+SHA1-Digest: s4kwAq7a8L2duIJt97ooFJ5zk5g=
+SHA256-Digest: hk8/xVVSlR47eiUD18ZDXpWVI5m0/FAcYw8akzEzE3c=
Name: options_advanced.html
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: jkKx1WRE6foVtrTJCR6iuACzHGM=
-SHA256-Digest: 2d0PDwhHX/bmnQ/lmlKNJtIsLnduR0/w9fbTCfHdE5E=
+SHA1-Digest: Bpa0fhFfMi5FxqhnFoPEKfVqeW0=
+SHA256-Digest: 0Fhm1Lr+qLPQENwZxuzKxh4fKSoofunMNIvohorftcY=
Name: options_advanced.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: ifHO827fwiqmp8gdWdA31bIbAuU=
-SHA256-Digest: Un0RFIGvcat0vq62gm++hlewM222ISkT0h/PE/uVceU=
+SHA1-Digest: rcFzrCHbBI+p3AB6MpF6Pe+7kfA=
+SHA256-Digest: g1di+vvp1AsFB7Bc9p+642h4q22nbuHJhgDKes8wEUc=
Name: options.css
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: Pnb/LA7WMP8ry+FjVw+du250Bls=
-SHA256-Digest: FCNV70i+g1yy6hOt5mEm2MOVBOw9A2V9EdMZCeHTX8A=
+SHA1-Digest: zB2r3uJRfvuD1X8nL+L0DrEpHrQ=
+SHA256-Digest: HjCnmdzNCIORPpEMbFS/E8ZC0GLqWTSCPvZ86uolORg=
Name: options_domains.html
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: fjEx4rqPdxXqIX6tVFJgFYMpVhY=
-SHA256-Digest: 6F7XBwqPzdU7C2Ws9eXTuTP2k9/LmfyycNYWSIShklY=
+SHA1-Digest: tuFFhBGK9VUuJdVXKoV9J5Nmkdo=
+SHA256-Digest: De/HcfDN1ABlW1JX35tSnG2MdpeOjHhxoWQog41qlTQ=
Name: options_domains.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: nyPZhXB5RiwHvXcyAcv6CqXGXZg=
-SHA256-Digest: QnIfwO5YDojtZCCuq2b5NOewcdHjkhdrF/l6z8LiVAk=
+SHA1-Digest: rt3zMuBXLMcgJDwR66J+U33XvLQ=
+SHA256-Digest: sIEEO9iCXMLPUvJ31XO++cfCKMmVjKWmygNeFXyzyaQ=
Name: options.html
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: dYHPM7tkDtVXDcMrB0ZGkdbYcy0=
-SHA256-Digest: fMbrcSdIUzjcyNe9sUdh6pcbkm+WXNYVJQE/lS6zyu8=
+SHA1-Digest: MGD/SqN3LzDv5/yef0cBClm5Drc=
+SHA256-Digest: 0DbnRG3fLgaXNLAJlyJLHGNPLJGCovgg/47QvjKo+KU=
+
+Name: options_init.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: tV+QFUmbo81Z7jB1IGEnl+cO5ZE=
+SHA256-Digest: fyTvllNuszakdtR+gLB1hbwX0RpakoMk1A6JWIMacEs=
Name: options.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: L5VUF4oypFxHN3EA8ZofUwBwZ4o=
-SHA256-Digest: Eg4iikQCPIu/Lgd55Fo9Gf/6jVAnCYxSOczieGg5MFU=
+SHA1-Digest: ZmVXI+04j43I67Tks5qqmA7iV2Y=
+SHA256-Digest: Mqc7QBRBNcQDK5aHUcjehzYpeha53KxX/ZA9/nW2I78=
+
+Name: options_nbs.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: h3P/IZQ4cvzytOYh2Smz4XFHE3Y=
+SHA256-Digest: +nuxi7EKQMGCwuViCJHydualO/at8yiwR3qA5dQ6h78=
Name: popup.css
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: y2hScw1MXLzwE9/Xh0joswyvcHY=
-SHA256-Digest: ffEkBa4g72NO60xa5Sv2jZ2wocZ+N3nBcUYDaIRDOnA=
+SHA1-Digest: NEHwa2mxPudXCR1cGQOPxKh6eSw=
+SHA256-Digest: eEvnjRyVpSq05xZVb/ljOTQBOYT3VrfoTbceVDDqcTc=
Name: popup.html
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: tES+wupe9Hk1iwDtBeHOzzHRWks=
-SHA256-Digest: rtywjwLX4btUKDf+fRg30Z39Bi+W6vSSrWsEkUq7RyA=
+SHA1-Digest: Totcd7bnZkyqnP3s7NumcYobn6E=
+SHA256-Digest: VT335sjDOCZjF1PegHX90YxGu+zQHDa+LDed0sESz14=
Name: popup.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: GYA71DOyjNikrxPPt9O3qEZ2uzI=
-SHA256-Digest: fHD8w76BWrOyhRJG+oW12to+m5jkgX9hZ0Z9FuLPuj8=
+SHA1-Digest: 4s/vcKgblGpApf8W/eJZjfLDDi4=
+SHA256-Digest: p7NBk5ox+PwHvQvrv1t1PvHx/7RN8EtcGt09t/IqJfw=
Name: session_hash.js
Digest-Algorithms: SHA1 SHA256
@@ -157,13 +182,13 @@ SHA256-Digest: vfS4+xGX33J1hff3LE3jwozkHXJPi71FgK+PbIzPwxM=
Name: tweaks_gui.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: XU+Whq0LShrti/SfJNjY5uuGH5A=
-SHA256-Digest: tUdQ15eW8fn9OWnU/z8KAIYs20dLJwGiSyoyAdRz6zk=
+SHA1-Digest: ZfuO6OyqMhbMdyZhhwsmNVeqMEs=
+SHA256-Digest: SR8tPdfgZkBoDtXkpR71ZxfaZb1dAOHOF7neWYeKUr8=
Name: update.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: xcaO9C6mtLExt6gSyjjOAh2C6Sc=
-SHA256-Digest: R8Iu8kjH+mqt3lI8/rcQwpJrdgFNvu4AsT/zHMsfcg0=
+SHA1-Digest: ixU/edeai2hi6I9wNKA4XHE2jmE=
+SHA256-Digest: IG1iUU+a4g4c39IABujlw9f6fpfgXYreMH8szf9o8JY=
Name: url.js
Digest-Algorithms: SHA1 SHA256
@@ -177,8 +202,8 @@ SHA256-Digest: 9pb9WqrsILSwvxmZlZHnYbIjladVhTtyg5AAs4hyN4M=
Name: wrappingL-CANVAS.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: dwYGdTdFFJOuhkDgUo08/BtOqQc=
-SHA256-Digest: Jnv7x3wqRBJjTYGId418vTjttIDLm5TWFALqx5TI2aw=
+SHA1-Digest: EeTovI1VAdeK69fBvcykyvssE+Q=
+SHA256-Digest: H/AxcTOkk/Sx5iFaqFohnEfLtRerTMV74RazfLTDngo=
Name: wrappingL-SENSOR.js
Digest-Algorithms: SHA1 SHA256
@@ -247,8 +272,8 @@ SHA256-Digest: qQ+yXy2jnNvKBzthsLmhy+C14YVkqsHmn7e8IMuv88I=
Name: wrappingS-H-C.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: Lopsd4mWd9JdFKsy3YoCTu6lkJQ=
-SHA256-Digest: R7/g4px7JFCfodYsqnsyvmMlhfGUmYJpPYWnuIBg6Cw=
+SHA1-Digest: 2v6H5AJ1s72J5brdOYApMQ8EJCY=
+SHA256-Digest: FsFNzSNMiS8gkjpUZmwoKOvHE4mGroVMol/jgY+ks+M=
Name: wrappingS-HRT.js
Digest-Algorithms: SHA1 SHA256
@@ -262,8 +287,8 @@ SHA256-Digest: Wj+Mt70ZbFenafzJRZfQL6RX7u+mh8qulalynS6yzuk=
Name: wrappingS-HTML-LS.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: W1ziYVpsKkF/tHBjgMcWAJaMKWo=
-SHA256-Digest: 8pB7lz4eUtyfWoMIsoDd7G0cjzkK6jijdHW0z5OMDTQ=
+SHA1-Digest: uuGnjjKXlhd3UCDmQZ0o7zl6ajk=
+SHA256-Digest: WYkyPHeu7lV7piS5kcZTBOI7hSE4y27oT3W+Jtq8IM0=
Name: wrappingS-HTML5.js
Digest-Algorithms: SHA1 SHA256
@@ -277,8 +302,8 @@ SHA256-Digest: Y5DI2oTaBtvSuY0KlIchsWmOCtT0r92fRLoqn5do5ts=
Name: wrappingS-MCS.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: TMokSiISBKkdtMcua6STTGcKTsg=
-SHA256-Digest: 5Ukd+Adr+EvrIsj0Z6DbYNynSBCLc2/njHUGEoCscx0=
+SHA1-Digest: qqA53JjE+TYeho+MP5s1P/s0PKo=
+SHA256-Digest: 2fOx8vYIjLr42nErRd8LyPfjaALGEBGdHL9738YKzi0=
Name: wrappingS-MEDIA-CAPABILITIES.js
Digest-Algorithms: SHA1 SHA256
@@ -297,8 +322,8 @@ SHA256-Digest: xHWrw+WAmLKW4I9z/0JKEUz6DN65KgfmSvp4bODNvpw=
Name: wrappingS-NP.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: y6/pC7YOutf9ry8nGsoZEXm65O4=
-SHA256-Digest: WNMOzqUPFjW4S9KVTEwDmm8uc/54+qwxm6Ww4KQO+EM=
+SHA1-Digest: hJ/LXoVaOy4EZDDOWjoYLEuZ5XY=
+SHA256-Digest: evVoVl5uK1B5qI5Ns7Hqsb+NkFKOBlgPgMO4sQKX30k=
Name: wrappingS-PT2.js
Digest-Algorithms: SHA1 SHA256
@@ -342,13 +367,13 @@ SHA256-Digest: 6rCIUQbouuzjt7vTy1F9QA+bgR+eC44llkvotIlBDyQ=
Name: wrappingS-WEBA.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: appRo8QKIyRcJmj+EWt9rWiCAHM=
-SHA256-Digest: FVDvfkf6ixNXXIa4aM612mlMi2ybsz9vepgb3kcCMAI=
+SHA1-Digest: mCqLG7sAMseBZfrTxT6K0E7JDto=
+SHA256-Digest: M06g1kH18JuULaIe5L/MI1EOHJ5TgcLQiFGraO+L3uE=
Name: wrappingS-WEBGL.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: xZqS6YRNDhBR2GzXkpdaArXHyck=
-SHA256-Digest: 5V8tl/lGumynKbfYikcFkngZlcG3z5m2nar7v5TNg2o=
+SHA1-Digest: R2RCVUAMhmlZwsqUTWZJnAm1yA4=
+SHA256-Digest: xlvbfsr8seDN0H/92fwnjEWJX0lwyLSjLVXFs5Bz6CU=
Name: wrappingS-XR.js
Digest-Algorithms: SHA1 SHA256
@@ -362,13 +387,13 @@ SHA256-Digest: SeynVsnuZtz3mWJnErfRkWb/vQ1Ur4g1J43vK69So5s=
Name: fp_config/groups-lvl_0.json
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: pSnJ2P2SnQcBAKrt8sFDXtv3bZE=
-SHA256-Digest: xnab8XVLiZD5ClKf479dvVF0ERwlDPkxcWAWUexqCC8=
+SHA1-Digest: tM7YSIGu2lT7KPlQTzIv/olpuJQ=
+SHA256-Digest: PRWuiq+beNrdL7ZvGhZKV4ys/YaXWGt+AL2gcxP9Fb0=
Name: fp_config/groups-lvl_1.json
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: ULB9KVO+guCNTJjQr+UVxzakH5w=
-SHA256-Digest: EQ9WyDWlR+lw1q1v7zTT/RB4Ee1+O9mfxN6acr2FLbw=
+SHA1-Digest: 9l5nDa6C5LH3m7x0TeR/VAb9qIE=
+SHA256-Digest: kideCOUQOvNn2lFfQ2qX+N0Ei9uSeZiiX/tli9sVPAc=
Name: fp_config/schema/groups-schema.json
Digest-Algorithms: SHA1 SHA256
@@ -435,6 +460,11 @@ Digest-Algorithms: SHA1 SHA256
SHA1-Digest: eyK7DY2xw58Th8+nNZbzdwqLbuc=
SHA256-Digest: Yxel5v3nXBt7QpQRuNiZvuwVv13ssvs6S1aZUPWbLfw=
+Name: lib/sha256.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: gD41L2w5Df8fUa/G7hFq54BXjaw=
+SHA256-Digest: ENvJL72y7Tk5wW6pxybHZT9ex9/bAQyZBEBCaMtCSgg=
+
Name: LICENSES/CC-BY-ND-4.0.txt
Digest-Algorithms: SHA1 SHA256
SHA1-Digest: qubAfBNgLC6jZ29X/XVKrC8laqg=
@@ -470,10 +500,20 @@ Digest-Algorithms: SHA1 SHA256
SHA1-Digest: MaPUYLs8fZiEUYfHFqMNuBxEthU=
SHA256-Digest: OXLcl0T2SZ8Pmy2/dmlvKuetivmyPd5m1q+Gyd+zaYY=
-Name: nscl/lib/sha256.js
+Name: _locales/cs/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: Gujwa/8S8lvnsW1CGAlBlZgA468=
+SHA256-Digest: mCdTJ3foSabe9+uEr1Wp8tYAlWOMuVdyg1qFWvWiNx4=
+
+Name: _locales/en/messages.json
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: ZzdC7ixl8ggNMnIItha/WcIr254=
-SHA256-Digest: bbNosz5JlGdezcH8vxdbJ+b/hVKQTTRxrb+kM13pxc0=
+SHA1-Digest: HQ/YC7C0TIDEFVL4ddnTbkkJgbI=
+SHA256-Digest: LUnQGYZfDGM96TN3R8vq4EBRw1a4Ruw3fh8PYE5OIUw=
+
+Name: _locales/ru/messages.json
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: jURMs87Mbqnr+lWPeu19Q5qM1nM=
+SHA256-Digest: wJahl5vJgNyuw5KrRJi/0I4IcpgEqTCi5xqdO79VtD4=
Name: nscl/lib/browser-polyfill.js
Digest-Algorithms: SHA1 SHA256
@@ -482,51 +522,56 @@ SHA256-Digest: VEmOeKUOaZ0Zo2iiAxvFWOUrl8K5EImAdAGQpoC/bXw=
Name: nscl/content/patchWindow.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: 2mu3m3DihlgOhjyZVtSPkAUqvYY=
-SHA256-Digest: FwLKI3vQi0+yQImfDyAbtUI5xjwd+uIwhKTnZ7iuDDU=
+SHA1-Digest: KnWXEDAsK0gT/Lbm+hVpZG31dzc=
+SHA256-Digest: j9nOCk+rDV2oGA9wx/3dGh/T4+ASjR0alQg92QqmsU8=
Name: nscl/service/TabCache.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: GZPwQrJCQns64Bftwb125qOW8Dw=
-SHA256-Digest: gX190S7nzMZWYDq60W4tTUNXAEz6f/jzvq8JgOUkOUk=
+SHA1-Digest: JtBhoAqkmlvTh5Aw6U5r9FR+KFg=
+SHA256-Digest: MZ8twBoQTr7T1cEM1Bj1FcTtwIU6i8NSFt8XnQaP1cM=
Name: nscl/service/NavCache.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: OrlBSdnxN5xTVWs9Kfbf8LL0qUM=
-SHA256-Digest: kkzpb0ikfd1QtKvHHlONRuWqwWWuR+AnYl0ZlJuqrpA=
+SHA1-Digest: OfR7FXA/hwGI+OO8KAuCbI/fVlY=
+SHA256-Digest: fa+mjXlWEkGVEhA8rV2sNhaFGMf0ZWImlWliwv/q2g8=
Name: nscl/service/DocStartInjection.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: mgwZ0kEAZy3KyZUG+jtT09PKzMU=
-SHA256-Digest: yqXIvyuuto8nnRfEWhO+VC2pl+l2dYMG1PTjhPSJF0o=
+SHA1-Digest: HP5OH9pLtF/RsTaeg0pGUhdoaYI=
+SHA256-Digest: icPil/yxMbonPgK9YRb/H/nKX+JPg4QOfBrewe96O2Y=
Name: nscl/common/SyncMessage.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: 8IK3UskVjbjAaLbvJPws4pB8MbQ=
-SHA256-Digest: pJ14ejigMkTVMl2wWv5Po1ya9UmaUgskL8SAlusAyOg=
+SHA1-Digest: UITULazzRhuYeYaaQdJokqTn3m0=
+SHA256-Digest: LFbpi3YajTjh0D5cK5zUI1LXBM4glu5lFgy6EIi5GRg=
Name: nscl/common/log.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: NlgOSexX6tlhp+tFcdlUs1Dck0c=
-SHA256-Digest: xhms3B6gG3wF6DSBZrddwIcLmSZmtmzxC14JqYOLR6k=
+SHA1-Digest: D6WyYmDlHZJ5HtwvPjLmLvXKcUY=
+SHA256-Digest: FrwKTjORt5vnRGS6xNi23iMo74ilmDTSsEhev/LTfys=
+
+Name: nscl/common/sha256.js
+Digest-Algorithms: SHA1 SHA256
+SHA1-Digest: oopweeRH4mcoo2oeUIHrklNFClg=
+SHA256-Digest: yoQJd/4X8OR+6Tod9zGoeS6QobcjrFZOVKB+iBFSWGs=
Name: nscl/common/tld.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: flHzu/kg29dt9lHIum7QBE0z0B4=
-SHA256-Digest: K3Ipu9x1Txfc9IQHEA+1ZIpcXJvjCY/4Jfeg7yjhzK4=
+SHA1-Digest: RSjzTXsK4MAYyrsSC6gVKNRwpps=
+SHA256-Digest: f2K4JLK3rvuj09VyQI0S+LvKXX6W2uXhR+PKwb14yWw=
Name: nscl/common/uuid.js
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: Ivy6/SQFkg9kYY0Q9bKhlJ1NbaQ=
-SHA256-Digest: 6FpYbrFm6wiNtzFGQhOqdouPFj6ZLZLAH5jdNfjBois=
+SHA1-Digest: xCfJkXi5oNJtmym2RiiXKNaGJhs=
+SHA256-Digest: vlK2vGRJoOGxrKrpfRa90v8E2qbEJqRWSOzdDcZYRNw=
Name: META-INF/cose.manifest
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: KXqbaR6cGjxum5zGnOabtkAt15g=
-SHA256-Digest: 0nKmJ+zwdj4nQKIumDYzZbnVAnhNBegyKVLgFIblg1o=
+SHA1-Digest: bPlmcy5bufFI2QA5ipNlJCOpVJg=
+SHA256-Digest: xwAseM94EEQH0bNUdojBJPIyTZxCyrk4cmTxa+ztWeQ=
Name: META-INF/cose.sig
Digest-Algorithms: SHA1 SHA256
-SHA1-Digest: agLomBh4ZVGvNojiCS/9Zj7gQzk=
-SHA256-Digest: gyctAC7mK8+0KVK0p6uBL+OfJiaiPG/uoxLEthAnxW4=
+SHA1-Digest: O15rPOZvPahLPZ5Tr89oc5xYprY=
+SHA256-Digest: vMs2KmQQObHfYgoLykpGXeQqsgW8gqovB94/Pa6aYpM=
diff --git a/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.rsa b/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.rsa
index 09c44e3..843ec08 100644
--- a/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.rsa
+++ b/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.rsa
Binary files differ
diff --git a/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.sf b/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.sf
index 0543a5e..25ffe32 100644
--- a/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.sf
+++ b/data/extensions/jsr@javascriptrestrictor/META-INF/mozilla.sf
@@ -1,4 +1,4 @@
Signature-Version: 1.0
-SHA1-Digest-Manifest: 5vjqXD7u5s03VLOVHdtGzeufgKs=
-SHA256-Digest-Manifest: Oz3Tt4y6P2x/R/D33oF26svJSviDwpLB4FLGaan5k7Y=
+SHA1-Digest-Manifest: ZzJoYaa+fFdiMwj6PpKb5WYnA8k=
+SHA256-Digest-Manifest: aU0PLZCbphsVr090Zf//4dE6QeJYeabIXZMFIjwxMhY=
diff --git a/data/extensions/jsr@javascriptrestrictor/_locales/cs/messages.json b/data/extensions/jsr@javascriptrestrictor/_locales/cs/messages.json
new file mode 100644
index 0000000..a521659
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/_locales/cs/messages.json
@@ -0,0 +1,1534 @@
+{
+ "extensionName": {
+ "message": "JShelter",
+ "description": "Jméno rozšíření. Prosím nepřekládat pokud není patřičně zdůvodněno."
+ },
+ "extensionDescription": {
+ "message": "Rozšíření pro zvýšení bezpečnosti a soukromí uživatele prohlížeče.",
+ "description": "Description of the extension."
+ },
+ "javascriptShield": {
+ "message": "JavaScriptový štít",
+ "description": "The name of the JavaScript Shield displayed at multiple places"
+ },
+ "networkBoundaryShield": {
+ "message": "Štít pro ochranu hranice sítě",
+ "description": "The name of the Network Boundary Shield displayed at multiple places"
+ },
+ "NBSgloballyOff": {
+ "message": "Štít pro ochranu hranice sítě je úplně deaktivovaný",
+ "description": "Informs the user that NBS is globally disabled, displayed e.g. in popup"
+ },
+ "fingerprintDetector": {
+ "message": "Detektor získávání otisku prohlížeče",
+ "description": "The name of the Fingerprint Detector displayed at multiple places"
+ },
+ "FPDgloballyOff": {
+ "message": "Detektor získávání otisku prohlížeče je úplně deaktivovaný",
+ "description": "Informs the user that FPD is globally disabled, displayed e.g. in popup"
+ },
+ "globalSettings": {
+ "message": "Globální nastavení",
+ "description": "The button in the popup that opens options page"
+ },
+ "settingsForDomain": {
+ "message": "Nastavení pro doménu",
+ "description": "The text in the popup that introduces the context of the information in the popup"
+ },
+
+ "refreshPage": {
+ "message": "Obnov stránku",
+ "description": "The button in the popup that refreshes the currently displayed page"
+ },
+ "modifyJSSPopup": {
+ "message": "Upravit",
+ "description": "The button in the popup that tweaks JSS"
+ },
+ "descriptionMore": {
+ "message": "(více...)",
+ "description": "Used for example in the popup in the description text of the currently applied level when JShelter gives user the option to get more information about the level."
+ },
+ "descriptionLess": {
+ "message": "(skryj...)",
+ "description": "Used for example in the popup in the description text of the currently applied level when JShelter gives user the option to get less information about the level."
+ },
+ "nameDescriptionSeparator": {
+ "message": " — ",
+ "description": "Used for example in the popup to separate the current JSS level from its description."
+ },
+ "detailTweaksOfJSShieldForThisSite": {
+ "message": "Podrobná nastavení JavaScriptového štítu",
+ "description": "Button in the popup that allows to tweak JSS."
+ },
+ "wrappers": {
+ "message": "Skupiny volání",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "levelOfDefense": {
+ "message": "Úroveň aplikované ochrany",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "numberOfCalls": {
+ "message": "Počet volání API",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "FingerprintQualityLabel": {
+ "message": "⤷ Počet API zneužívaných pro tvorbu otisku prohlížeče volaných stránkou: ",
+ "description": "This text is displayed in the popup as additional information from FPD"
+ },
+ "popupDefaultLevelHelpText": {
+ "message": "Nastav úroveň ochrany pro tuto stránku na globálně nastavenou výchozí úroveň.",
+ "description": "This text is displayed in the popup as a tooltip for the Default level button"
+ },
+ "defaultLevelSelection": {
+ "message": "Výchozí úroveň ($levelName$)",
+ "description": "This text is displayed as the default level in the popup",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "description": "Translated name of the default level used by the user",
+ "example": "Recommended, see the keys JSSL*Name like JSSL2Name"
+ }
+ }
+ },
+ "ShieldOffSlider": {
+ "message": "Vyp.",
+ "description": "Displayed in sliders that control activation of shields in popup and options, keep the text short to prevent overflow"
+ },
+ "ShieldOnSlider": {
+ "message": "Zap.",
+ "description": "Displayed in sliders that control activation of shields in popup and options, keep the text short to prevent overflow"
+ },
+
+ "jssgroupUnprotected": {
+ "message": "Bez ochrany",
+ "description": "Displayed during JSS level tweaking in case the API group is completely disabled"
+ },
+ "jssgroupPoor": {
+ "message": "Slabá",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupLow": {
+ "message": "Nízká",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupMedium": {
+ "message": "Střední",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupHigh": {
+ "message": "Vysoká",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupLittleLies": {
+ "message": "Drobné lži",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupStrict": {
+ "message": "Přísná",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupConfuse": {
+ "message": "Zmatení",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupFake": {
+ "message": "Falešné",
+ "description": "Displayed during JSS level tweaking for InstalledBrowserPlugins and possibly more (in the future)"
+ },
+ "jssgroupAddFake": {
+ "message": "Přidej falešné",
+ "description": "Displayed during JSS level tweaking for Connected cameras and microphones and possibly more (in the future)"
+ },
+ "jssgroupAsk": {
+ "message": "Ptej se",
+ "description": "Displayed during JSS level tweaking for XHR and possibly more (in the future)"
+ },
+ "jssgroupBlock": {
+ "message": "Blokace",
+ "description": "Displayed during JSS level tweaking for XHR and possibly more (in the future)"
+ },
+ "jssgroupRemove": {
+ "message": "Odstraň",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+
+ "jssgroupTimePrecision": {
+ "message": "Přesnost měření času"
+ },
+ "jssgroupTimePrecisionDescription": {
+ "message": "Znesnadňuje a brání útokům a získávání otisku prohlížeče vyžadující přesné měření času.",
+ "description": "Displayed at various places"
+ },
+ "jssgroupTimePrecisionDescription2": {
+ "message": "Omezuje přesnost časových značek dostupných v API jako je $apis$. Časové značky Geolocation API jsou také změněny, pokud je zároveň aktivní ochrana „$jssgroupPhysicalLocationGeolocation$“.",
+ "description": "Displayed at various places",
+ "placeholders": {
+ "apis": {
+ "content": "Date, Performance, Gamepad API, Web VR API a v rámci událostí",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ },
+ "jssgroupPhysicalLocationGeolocation": {
+ "content": "$1",
+ "description": "Translated version of the jssgroupPhysicalLocationGeolocation string"
+ }
+ }
+ },
+ "jssgroupTimePoorDescription": {
+ "message": "Zaokrouhluje čas na setiny sekundy (1.230)",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupTimeLowDescription": {
+ "message": "Zaokrouhluje čas na desetiny sekundy (1.200)",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupTimeHighDescription": {
+ "message": "Přidává šum do desetinných míst (1.451)",
+ "description": "Explains the protection to the user"
+ },
+
+ "jssgroupLocallyRenderedImages": {
+ "message": "Lokálně generované obrázky",
+ "description": "htmlcanvaselement group"
+ },
+ "jssgroupLocallyRenderedImagesDescription": {
+ "message": "Chrání před získáváním otisku prohlížeče založeném na generování obrázků lokální grafickou kartou (Canvas fingerprinting), nebo získávání informací o chování grafické karty.",
+ "description": "Displayed at various places, try to keep canvas in English or make sure that the user can understand that the protection is about the Canvas API"
+ },
+ "jssgroupLocallyRenderedImagesDescription2": {
+ "message": "Funkce $apis$ vrací modifikované informace.",
+ "description": "Displayed at various places",
+ "placeholders": {
+ "apis": {
+ "content": "canvas.toDataURL(), canvas.toBlob(), CanvasRenderingContext2D.getImageData(), OffscreenCanvas.convertToBlob() a WebGLRenderingContext.readPixels",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyRenderedImagesDescription3": {
+ "message": "Výsledky $apis$ jsou modifikovány jen s určitou pravděpodobností.",
+ "description": "Displayed after jssgroupLocallyRenderedImagesDescription2",
+ "placeholders": {
+ "apis": {
+ "content": "CanvasRenderingContext2D.isPointInStroke() a CanvasRenderingContext2D.isPointInPath()",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyRenderedImagesLittleLiesDescription": {
+ "message": "Drobně upravuje generované obrázky tak, aby vizuálně vypadaly stejně, ale přesné hodnoty se lišily v závislosti na doméně a sezení. Cílem je znemožnit, či ztížit Canvas fingerprinting.",
+ "description": "Consider keeping reference to Canvas fingerprinting in English"
+ },
+ "jssgroupLocallyRenderedImagesStrictDescription": {
+ "message": "Vrací bílé obrázky. Plátno (canvas) WebGL vrací prázdné pole. Nechrání před Canvas fingerprintingem.",
+ "description": "Consider keeping reference to Canvas fingerprinting in English"
+ },
+
+ "jssgroupLocallyGeneratedAudio": {
+ "message": "Lokálně generované zvuky",
+ "description": "audiobuffer group"
+ },
+ "jssgroupLocallyGeneratedAudioDescription": {
+ "message": "Chrání před získáváním informací o schopnostech generování zvuku, např. zvukovou kartou, které lze využit např. pro vytváření otisků prohlížeče založeném na analýze generovaného audia (audio fingerprinting).",
+ "description": "Try to keep reference to audio fingerprinting"
+ },
+ "jssgroupLocallyGeneratedAudioDescription2": {
+ "message": "Modifikuje výsledky funkcí $apis$.",
+ "placeholders": {
+ "apis": {
+ "content": "AudioBuffer.getChannelData(), AudioBuffer.copyFromChannel(), AnalyserNode.getByteTimeDomainData(), AnalyserNode.getFloatTimeDomainData(), AnalyserNode.getByteFrequencyData() a AnalyserNode.getFloatFrequencyData()",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyGeneratedAudioLittleLiesDescription": {
+ "message": "Přidává drobný šum k amplitudě tak, aby byl zvuk pro člověka podobný původnímu zvuku. Přesné hodnoty se však liší na různých doménách a v rámci různých sezení. Cílem je chránit před Audio fingerprintingem, nebo jej alespoň udělat těžším.",
+ "description": "Consider keeping reference to Audio fingerprinting in English"
+ },
+ "jssgroupLocallyGeneratedAudioStrictDescription": {
+ "message": "Zvuková data jsou nahrazené bílým šumem, který se liší podle navštívené domény a v rámci různých sezení Cílem je omezit informace, které unikají o zvukovém hardware a zároveň zkomplikovat získávání otisku prohlížeče (Audio fingerprinting).",
+ "description": "Consider keeping reference to Audio fingerprinting in English"
+ },
+
+ "jssgroupGraphicCardInformation": {
+ "message": "Informace o grafické kartě",
+ "description": "webgl group"
+ },
+ "jssgroupGraphicCardInformationDescription": {
+ "message": "Podvrhnout informace o grafické kartě, např. pro ztížení získávání otisku prohlížeče."
+ },
+ "jssgroupGraphicCardInformationDescription2": {
+ "message": "Funkce $api$ vrací modifikované hodnoty pro vybrané parametry.",
+ "placeholders": {
+ "api": {
+ "content": "WebGLRenderingContext.getParameter()",
+ "description": "Keep the names of the API"
+ }
+ }
+ },
+ "jssgroupGraphicCardInformationDescription3": {
+ "message": "$apis$ vrací modifikované výsledky.",
+ "placeholders": {
+ "apis": {
+ "content": "WebGLRenderingContext functions .getFramebufferAttachmentParameter(), .getActiveAttrib(), .getActiveUniform(), .getAttribLocation(), .getBufferParameter(), .getProgramParameter(), .getRenderbufferParameter(), .getShaderParameter(), .getShaderPrecisionFormat(), .getTexParameter(), .getUniformLocation(), .getVertexAttribOffset(), .getSupportedExtensions() a .getExtension()",
+ "description": "Keep the names of the API but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupGraphicCardInformationLittleLiesDescription": {
+ "message": "Nahraď původní hodnoty rozumnými čísly, nebo náhodnými řetězci, které se liší podle navštívené domény a napříč sezeními. Cílem je omezit informace o grafickém hardware a zároveň ztížit získávání otisku prohlížeče."
+ },
+ "jssgroupGraphicCardInformationStrictDescription": {
+ "message": "Vrať prázdné hodnoty (null, prázdné řetězce). Pozor, toto nastavení nebrání získávání otisku prohlížeče."
+ },
+
+ "jssgroupInstalledBrowserPlugins": {
+ "message": "Nainstalované rozšiřující moduly prohlížeče",
+ "description": "plugins group"
+ },
+ "jssgroupInstalledBrowserPluginsDescription": {
+ "message": "Chraň před tvorbou otisku prohlížeče založenou na seznamu nainstalovaných rozšiřujících modulů prohlížeče."
+ },
+ "jssgroupInstalledBrowserPluginsDescription2": {
+ "message": "Tato ochrana se neuplatňuje pokud prohlížeč vrací prázdný seznam rozšiřujících modulů, nebo tento seznam obsahuje pouze pět modulů specifikovaných HTML living standard. Takže se tato ochrana neuplatňuje v moderních prohlížečích.",
+ "description": "The protection is not applied in modern browsers"
+ },
+ "jssgroupInstalledBrowserPluginsLittleLiesDescription": {
+ "message": "Přidej dva falešné moduly.",
+ "description": ""
+ },
+ "jssgroupInstalledBrowserPluginsFakeDescription": {
+ "message": "Vrať pouze dva falešné moduly.",
+ "description": ""
+ },
+ "jssgroupInstalledBrowserPluginsStrictDescription": {
+ "message": "Nevracej žádný modul.",
+ "description": ""
+ },
+
+ "jssgroupConnectedCamerasAndMicrophones": {
+ "message": "Připojené kamery a mikrofóny"
+ },
+ "jssgroupConnectedCamerasAndMicrophonesDescription": {
+ "message": "Braň před tvorbou otisku prohlížeče založené na informacích o připojených zařízeních typu kamera a mikrofón."
+ },
+ "jssgroupConnectedCamerasAndMicrophonesDescription2": {
+ "message": "Funkce $api$ vrací upravené výsledky.",
+ "placeholders": {
+ "api": {
+ "content": "MediaDevices.enumerateDevices()",
+ "description": "Keep the names of the API"
+ }
+ }
+ },
+ "jssgroupConnectedCamerasAndMicrophonesLittleLiesDescription": {
+ "message": "Náhodně změní pořadí zařízení. Skutečná zařízení jsou označená jinými identifikátory na různých doménách a napříč sezeními."
+ },
+ "jssgroupConnectedCamerasAndMicrophonesAddFakeDescription": {
+ "message": "Přidá 0-4 zařízení a změní pořadí. Skutečná zařízení jsou označená jinými identifikátory na různých doménách a napříč sezeními.",
+ "description": ""
+ },
+ "jssgroupConnectedCamerasAndMicrophonesStrictDescription": {
+ "message": "Nevrací žádné informace o připojených zařízeních.",
+ "description": ""
+ },
+
+ "jssgroupHardware": {
+ "message": "Informace o operační paměti a procesoru",
+ "description": "hardware group"
+ },
+ "jssgroupHardwareDescription": {
+ "message": "Podvrhni hardwarové informace o množství operační paměti a procesorů."
+ },
+ "jssgroupHardwareDescription2": {
+ "message": "API $apis$ vrací modifikované hodnoty.",
+ "placeholders": {
+ "apis": {
+ "content": "navigator.deviceMemory a navigator.hardwareConcurrency",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupHardwareLowDescription": {
+ "message": "Vrací náhodnou platnou hodnotu mezi minimální a skutečnou hodnotou. Návratová hodnota se liší na různých navštívených doménách a napříč sezeními."
+ },
+ "jssgroupHardwareMediumDescription": {
+ "message": "Vrací náhodnou platnou hodnotu mezi minimální a 8. Návratová hodnota se liší na různých navštívených doménách a napříč sezeními."
+ },
+ "jssgroupHardwareHighDescription": {
+ "message": "Vrací 4 pro navigator.deviceMemory a 2 pro navigator.hardwareConcurrency.",
+ "description": "Keep the names of the APIs in English"
+ },
+
+ "jssgroupNetworkConditions": {
+ "message": "Stav sítě",
+ "description": "net group"
+ },
+ "jssgroupNetworkConditionsDescription": {
+ "message": "Blokování přístupu k informacím o stavu sítě, např. pro omezení získávání informací pro tvorbu otisku prohlížeče a zamezení zneužití informací pro sledování vzorů chování uživatele při přístupu k sítím, např. pro zjištění, jestli je uživatel doma, v práci, nebo cestuje.",
+ "description": ""
+ },
+ "jssgroupNetworkConditionsRemoveDescription": {
+ "message": "Odeber API NetworkInformation",
+ "description": "Keep the name of the API in English"
+ },
+
+ "jssgroupXMLHttpRequestRequests": {
+ "message": "Přenosy dat pomocí XMLHttpRequest (XHR)",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupXMLHttpRequestRequestsDescription": {
+ "message": "Filtruje spolehlivé přenosy informací na server pomocí API XHR."
+ },
+ "jssgroupXMLHttpRequestRequestsDescription2": {
+ "message": "Pozor, API XHR se naprosto běžně používá pro nezávadné přenosy. Zároveň mějte na paměti, že tato volba neřeší obdobná API, jako jsou $apis$, která dovolují přenos dat k serveru. Pokud si nejste jisti, že víte, co děláte, ponechte tuto skupinu neaktivní. JShelter nadále poskytuje úpravy XHR pro experimentální použití. Pro blokování přenosů dat potřebných pro tvorbu otisku prohlížeče zapněte „Detektor získávání otisků prohlížeče“.",
+ "placeholders": {
+ "apis": {
+ "content": "API Fetch, SSE, WebRTC a WebSockets",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupXMLHttpRequestRequestsAskDescription": {
+ "message": "Zeptej se před vykonáním každého požadavku pomocí XHR",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupXMLHttpRequestRequestsBlockDescription": {
+ "message": "Blokuj všechny požadavky pomocí XHR",
+ "description": "Keep the name of the API in English"
+ },
+
+ "jssgroupArrays": {
+ "message": "API ArrayBuffer",
+ "description": "arrays group"
+ },
+ "jssgroupArraysDescription": {
+ "message": "Ochrana před zneužitím API ArrayBuffer, např. pro zamezení zneužití pro tvorbu postranních kanálů k útokům na operační paměť (nebo alespoň znesnadní takové útoky).",
+ "description": ""
+ },
+ "jssgroupArraysShift": {
+ "message": "Posun"
+ },
+ "jssgroupArraysShiftDescription": {
+ "message": "Posune indexy polí pro znesnadnění detekce hranice stránek v operační paměti."
+ },
+ "jssgroupArraysRandomize": {
+ "message": "Náhodné"
+ },
+ "jssgroupArraysRandomizeDescription": {
+ "message": "Náhodně prohází prvky pole v paměti, což je pomalejší než posun, ale účinější."
+ },
+
+ "jssgroupSharedArraysBuffer": {
+ "message": "API SharedArrayBuffer",
+ "description": "shared_array group"
+ },
+ "jssgroupSharedArraysBufferDescription": {
+ "message": "Ochrana před zneužitím API SharedArrayBuffer, např. pro zamezení zneužití pro tvorbu postranních kanálů (nebo alespoň znesnadní takové útoky).",
+ "description": ""
+ },
+ "jssgroupSharedArraysBufferMediumDescription": {
+ "message": "Náhodně zpomalí zprávy jako prevence tvorby vysoce přesných časovačů",
+ "description": ""
+ },
+ "jssgroupSharedArraysBufferStrictDescription": {
+ "message": "Blokování SharedArrayBuffer",
+ "description": ""
+ },
+
+ "jssgroupWebWorker": {
+ "message": "API WebWorker",
+ "description": "webworker group, keep the name of the API in English"
+ },
+ "jssgroupWebWorkerDescription": {
+ "message": "Chraň před zneužitím WebWorkerů",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupWebWorkerDescription2": {
+ "message": "Workeři poskytují bohatá API, která např. umožňují nainstalovat odposlouchávání dat pro navštívenou stránku komukoliv, kdo může do stránky vložit JavaScriptový kód. Vyšší úrovně ochrany odstraňují tuto možnost. Pozor na to, že Workeři jsou běžně používání i pro účely, které nejsou pro uživatele škodlivé, např. pro umožnění práce s webovou aplikací offline, během interaktivního vyhledávání, dočasného kešování informací, např. při přehrávání multimédií apod.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerLowDescription": {
+ "message": "Náhodně zpomalí komunikaci s WebWorkery, aby se zabránilo jejich zneužití pro tvorbu časovačů s velkou přesností. Zachovává plné možnosti Workerů včetně jejich přístupu k originálním API (bez úpravy JShelterem). Používejte jen s nejvyšší opatrností.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerStrictDescription": {
+ "message": "Rozbije WebWorkers tak, že nevykonávají žádnou činnost. Pro stránku se však tato volba tváří tak že prohlížeč Workery podporuje a tak nemohou jednoduše poskytnout náhradní řešení (které některé stránky poskytují). Tato volba pomáhá proti tvorbě unikátního otisku prohlížeče.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerRemoveDescription": {
+ "message": "Odstraň podporu WebWorkerů z prohlížeče. To je snadno detekovatelné stránkou, takže tato volba zvyšuje možnosti tvorby unikátního otisku prohlížeče. Na druhou stranu tato volba dává stránkám možnost nasazení náhradního řešení, která nemají rizika původního API.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+
+ "jssgroupPhysicalLocationGeolocation": {
+ "message": "Umístění v prostoru (geolokace)"
+ },
+ "jssgroupPhysicalLocationGeolocationDescription": {
+ "message": "Omezuje množství informací poskytovaných Geolocation API.",
+ "description": "Displayed at various places, keep the name of the API in the English"
+ },
+ "jssgroupPhysicalLocationGeolocationDescription2": {
+ "message": "Mění pozici pro různé domény různě. Pro každé sezení reportuje stejnou lokaci pro každou jednotlivou doménu.",
+ "description": "Displayed at various places"
+ },
+ "jssgroupGeolocationTimestampOnly": {
+ "message": "Jen časové značky",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationTimestampOnlyDescription": {
+ "message": "Poskytuje přesnou pozici (použitelné pokud potřebujete poskytnout přesnou polohu a zároveň chcete chránit časové značky při aktivní ochraně „$jssgroupTimePrecision$“)",
+ "description": "Explains the protection to the user",
+ "placeholders": {
+ "jssgroupTimePrecision": {
+ "content": "$1",
+ "example": "Translated string of the jssgroupTimePrecision"
+ }
+ }
+ },
+ "jssgroupGeolocationVillage": {
+ "message": "Vesnice",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationVillageDescription": {
+ "message": "Poloha přesná na stovky metrů.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationTown": {
+ "message": "Město",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationTownDescription": {
+ "message": "Poloha přesná na kilometry.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationRegion": {
+ "message": "Oblast",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationRegionDescription": {
+ "message": "Poloha přesná na desítky kilometrů.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationLongDistance": {
+ "message": "Velká oblast",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationLongDistanceDescription": {
+ "message": "Poloha přesná na stovky kilometrů.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationRemoveDescription": {
+ "message": "Deaktivuj API.",
+ "description": "Explains the protection to the user"
+ },
+
+ "jssgroupPhysicalEnvironmentSensors": {
+ "message": "Senzory okolního prostředí",
+ "description": "physical_environment group"
+ },
+ "jssgroupPhysicalEnvironmentSensorsDescription": {
+ "message": "Omezuje množství informací poskytovaných ze senzorů zkoumající stav prostředí obklopující zařízení jako je magnetometr a akcelerometr.",
+ "description": "Consider replacing Magnetometer and Accelerometer with localized version of the sensor"
+ },
+ "jssgroupPhysicalEnvironmentSensorsDescription2": {
+ "message": "Informace poskytované blokovanými senzory mohou být zneužity pro mnoho účelů včetně získávání otisku okolního prostředí, sledování polohy uživatele, detekce blízkých zařízení, odhadu akcí uživatele, které se zařízením provádí a mnoho dalších. Ale údaje poskytované senzory mohou být potřeba pro užitečné aplikace jako je navigace, hry a další, pokud jsou tyto aplikace závislé na údajích poskytovaných senzory. Např. některé aplikace využívají orientaci zařízení pro ovládání akcí poskytovaných aplikací."
+ },
+ "jssgroupPhysicalEnvironmentSensorsHighDescription": {
+ "message": "Simuluje statické zařízení, které poskytuje konzistentní data, která se liší napříč doménami a sezeními."
+ },
+
+ "jssgroupUserIdleDetection": {
+ "message": "Detekce aktivity uživatele",
+ "description": "useridle group"
+ },
+ "jssgroupUserIdleDetectionDescription": {
+ "message": "API Idle Detection detekuje neaktivního uživatele a uzamčenou obrazovku zařízení.",
+ "description": "Try to keep the name of the API in English"
+ },
+ "jssgroupUserIdleDetectionDescription2": {
+ "message": "Webové aplikace mohou tyto informace použít např. pro zjištění zda uživateli zobrazovat notifikace. Tyto informace však mohou být zneužity ke sledování aktivity uživatele a korelaci stavu napříč doménami."
+ },
+ "jssgroupUserIdleConfuseDescription": {
+ "message": "Vždy vrací informací, že je uživatel aktivní a obrazovka není uzamčená."
+ },
+ "jssgroupUserIdleBlockDescription": {
+ "message": "Automaticky odmítá provést akci bez zobrazení výzvy uživateli."
+ },
+ "jssgroupUserIdleRemoveDescription": {
+ "message": "Odstraní API."
+ },
+ "jssgroupCoopschedule": {
+ "message": "Plánovač úloh",
+ "description": "coopschedule group"
+ },
+ "jssgroupCoopscheduleDescription": {
+ "message": "API Cooperative Scheduling patřící mezi API Background Tasks může naplánovat výpočetně náročné úlohy na dobu, kdy nebudou způsobovat prodlevy detekovatelné uživatelem nebo v jiných úlohách sdílejících stejnou smyčku událostí.",
+ "description": "Try to keep the names of the APIs in English"
+ },
+ "jssgroupCoopscheduleDescription2": {
+ "message": "Toto API umožňuje získat přístup k informacím o vytížení prohlížeče jinými úlohami."
+ },
+ "jssgroupCoopscheduleConfuseDescription": {
+ "message": "Upravuje informace, aby zmátl nepřítele."
+ },
+
+ "jssgroupGamepads": {
+ "message": "Gamepady",
+ "description": "gamepads group"
+ },
+ "jssgroupGamepadsDescription": {
+ "message": "Blokuje přístup stránek k informacím o připojených gamepadech."
+ },
+ "jssgroupGamepadsDescription2": {
+ "message": "Informace o připojených gamepadech může být zneužita při tvorbě otisku prohlížeče. Webové stránky obvykle nepotřebují znát informace o připojených gamepadech, pokud se nejedná o specializované, obvykle herní, aplikace."
+ },
+ "jssgroupGamepadsStrictDescription": {
+ "message": "Skryj všechny gamepady."
+ },
+
+ "jssgroupVirtualAndAugmentedRealityDevices": {
+ "message": "Zařízení virtuální a rozšířené reality",
+ "description": "vr group (also includes XR API)"
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesDescription": {
+ "message": "Zamezí webovým aplikacím ke zjišťování informací o displejích virtuální a rozšířené reality."
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesDescription2": {
+ "message": "Informace o připojených zařízeních virtuální a rozšířené reality může být zneužita při tvorbě otisku prohlížeče. Webové stránky obvykle nepotřebují znát informace o takových připojených zařízeních, pokud se nejedná o specializované aplikace."
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesStrictDescription": {
+ "message": "Skryj všechna zařízení"
+ },
+
+ "jssgroupMultimediaPlayback": {
+ "message": "Multimediální kodeky",
+ "description": "playback group"
+ },
+ "jssgroupMultimediaPlaybackDescription": {
+ "message": "Zamezí aplikacím k přístupu k informacím o instalovaných kodecích, schopnostech kódovat a dekódovat multimédia a výkonu."
+ },
+ "jssgroupMultimediaPlaybackDescription2": {
+ "message": "Informace poskytované API mohou být zneužity na tvorbu otisku prohlížeče. Tato ochrana by měla být aktivována pro stránky, které nezpracovávají audio a video. Aplikace zpracovávající audio, nebo video mohou být ochranou rozbité."
+ },
+ "jssgroupMultimediaPlaybackLittleLiesDescription": {
+ "message": "S pravděpodobností 12,5% reportuj kódovací a dekódovací mechanismus jako nepodporovaný."
+ },
+ "jssgroupMultimediaPlaybackStrictDescription": {
+ "message": "Reportuj všechny kódovací a dekódovací mechanismy jako nepodporované."
+ },
+ "jssgroupMultimediaPlaybackBlockDescription": {
+ "message": "Nevracej žádné informace."
+ },
+
+ "jssgroupUnreliableTransfersToServerBeacons": {
+ "message": "Nespolehlivé přenosy na server",
+ "description": "analytics group"
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription": {
+ "message": "Zabraňuje nespolehlivým přenosům na server, nazývané také jako beacons, nebo majáky."
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription2": {
+ "message": "Tyto přenosy jsou typicky zneužívané pro analytické účely, ale občas mohou být vyžadované pro správnou funkčnost e-shopů a jiných služeb."
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription3": {
+ "message": "Brání stránkám ve využití API Beacon.",
+ "description": "Keep the name of the API"
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsBlockDescription": {
+ "message": "Blokuje datové přenosy pomocí API Beacon. V rámci volání se neprovádí žádná akce."
+ },
+
+ "jssgroupHardwareBattery": {
+ "message": "Stav baterie",
+ "description": "battery group"
+ },
+ "jssgroupHardwareBatteryDescription": {
+ "message": "Odstraňuje podporu API Battery Status, které je zneužívané pro tvorbu otisku prohlížeče.",
+ "description": "Try to keep the reference to the English name of the API"
+ },
+ "jssgroupHardwareBatteryRemoveDescription": {
+ "message": "Odstraní API"
+ },
+
+ "jssgroupPersistentIdentifierOfTheBrowserTab": {
+ "message": "Trvalý identifikátor panelu prohlížeče",
+ "description": "windowname group"
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabDescription": {
+ "message": "Na rozdíl od jiných částí prostředí prohlížeče se vlastnost window.name neresetuje během načítání stránky. Důsledkem je, že si může stránka do této vlastnosti uložit jedinečný identifikátor, nebo neškodná a užitečná data.",
+ "description": "Try to keep reference to window.name."
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabDescription2": {
+ "message": "Toto API poskytuje možnost identifikace panelu prohlížeče napříč doménami v rámci jednoho sezení."
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabStrictDescription": {
+ "message": "Vymaž obsah vlastnosti window.name při přechodu na jinou službu (změna eTLD+1) během načítání stránky. Tato volba nebrání většině neškodných využití API a zároveň znemožňuje zneužití pro útoky identifikující stejný panel prohlížeče napříč doménami.",
+ "description": "Try to keep reference to window.name and eTLD+1"
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabFirefox88": {
+ "message": "$BROWSER$ a již obsahuje tuto ochranu.",
+ "placeholders": {
+ "browser": {
+ "content": "Firefox 88"
+ }
+ }
+ },
+
+ "jssgroupNFC": {
+ "message": "Near Field Communication (NFC)",
+ "description": "nfc group"
+ },
+ "jssgroupNFCDescription": {
+ "message": "Near Field Communication (NFC) umožňuje bezdrátovou komunikaci mezi dvěma velmi blízkými zařízeními, obvykle maximálně jednotky centimetru. Komunikace probíhá na základě standardu ISO/IEC 18092 na frekvenci 13.56 MHz.",
+ "description": "Keep the technical references"
+ },
+ "jssgroupNFCDescription2": {
+ "message": "API NFC může být zneužito pro zjištění informací o zařízeních v těsné blízkosti."
+ },
+ "jssgroupNFCRemoveDescription": {
+ "message": "Odstraň API"
+ },
+
+ "jssgroupWASM": {
+ "message": "Urychlení pomocí WebAssembly",
+ "description": "webassembly group"
+ },
+ "jssgroupWASMDescription": {
+ "message": "Urychlí úpravy nutné pro aplikaci drobných lží do obrázků a audia pomocí WebAssembly.",
+ "description": "Keep reference to WebAssembly"
+ },
+ "jssgroupWASMDescription2": {
+ "message": "Tato volba má význam jen pokud je ochrana „$CANVAS$“ nebo „$AUDIO$“ nastavená na úroveň „$LITTLElies$“.",
+ "placeholders": {
+ "canvas": {
+ "content": "$1",
+ "example": "Translation of jssgroupLocallyRenderedImages"
+ },
+ "audio": {
+ "content": "$2",
+ "example": "Translation of jssgroupLocallyGeneratedAudio"
+ },
+ "littlelies": {
+ "content": "$3",
+ "example": "Translation of jssgroupLittleLies"
+ }
+ }
+ },
+ "jssgroupWASMDescription3": {
+ "message": "Kód ve WebAssembly generuje stejné úpravy jako originální kód, takže je aktivace této volby bezpečná z pohledu ochrany před získávání otisku prohlížeče."
+ },
+ "jssgroupWASMDisabled": {
+ "message": "Vypnuto"
+ },
+ "jssgroupWASMDisabledDescription": {
+ "message": "Urychlení pomocí WebAssembly není aplikováno"
+ },
+ "jssgroupWASMPassive": {
+ "message": "Pasivní"
+ },
+ "jssgroupWASMPassiveDescription": {
+ "message": "Povol urychlení pomocí WebAssembly, ale využij původní (pomalejší) implementaci, pokud nemůže být kód ve WebAssembly vložen."
+ },
+ "jssgroupWASMActive": {
+ "message": "Aktivní"
+ },
+ "jssgroupWASMActiveDescription": {
+ "message": "Upravuje direktivu 'wasm-unsafe-eval' Content-Security Policy (CSP), aby umožnil vložení kódu ve WebAssembly v případech, kdy CSP navštívené stránky brání v aplikaci rychlejší implementace."
+ },
+ "jssgroupWASMActiveDescription2": {
+ "message": "Inicializace modulů WebAssembly je kontrolováno CSP navštívené stránky v prohlížečích založených na Chromiu."
+ },
+ "jssgroupWASMActiveDescription3": {
+ "message": "Výhoda tohoto nastavení je, že výpočty běží rychleji na všech stránkách."
+ },
+ "jssgroupWASMActiveDescription4": {
+ "message": "Nevýhodou tohoto nastavení je zvýšené rizika spuštění kódu ve WebAssembly, kterému by za normálních okolností zabránila CSP stránky, např. pokud je stránka samotná zranitelná útokem nazývaným cross-site scripting. Toto nastavení také může interagovat s jinými rozšířeními prohlížeče, které mohou modifikace CSP vrátit zpět."
+ },
+ "jssgroupWASMEnabled": {
+ "message": "Zapnuto"
+ },
+ "jssgroupWASMEnabledDescription": {
+ "message": "Urychlení pomocí WebAssembly je aplikováno"
+ },
+
+ "JShelterOptions": {
+ "message": "Hlavní nastavení JShelteru",
+ "description": "Title of the main options page"
+ },
+ "mainSettings": {
+ "message": "Hlavní nastavení",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "JShelterOptionsJSSFineTune": {
+ "message": "Detaily Javascriptového štítu: nastavení pro konkrétní domény",
+ "description": "Title of the JS Shield details options page"
+ },
+ "jSSShieldDetails": {
+ "message": "Detail JS štítu",
+ "description": "Displayed in options in the navigation bar, try to keep JS shield abbreviated to keep the text short"
+ },
+ "JShelterOptionsAdvanced": {
+ "message": "Expertní nastavení JShelteru",
+ "description": "Title of the expert options page"
+ },
+ "advancedOptions": {
+ "message": "Expertní nastavení",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "externalLinks": {
+ "message": "Webové odkazy",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "ExternalLinksSeparator": {
+ "message": ":",
+ "description": "Displayed in options in the navigation bar, for example after external links"
+ },
+ "threatModel": {
+ "message": "Uvažované hrozby",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "fAQ": {
+ "message": "Časté dotazy",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "testPage": {
+ "message": "Testovací stránka",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "permissions": {
+ "message": "Požadovaná oprávnění",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "sourceCode": {
+ "message": "Zdrojový kód",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "issueTracker": {
+ "message": "Sledování chyb",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "credits": {
+ "message": "Autoři",
+ "description": "Displayed in options in the navigation bar"
+ },
+
+ "ExampleDomainsText": {
+ "message": "příklad.com nebo cokoliv.example.com",
+ "description": "Displayed in text inputs that expect a domain"
+ },
+ "ButtonSignExpandOneCharacterDown": {
+ "message": "⤵",
+ "description": "A button caption that can be used generically by JShelter, it should contain a single character that intuitively tells the user that by clicking the button, more information will be shown"
+ },
+ "ButtonSave": {
+ "message": "Ulož",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRestore": {
+ "message": "Obnov",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRestoreLevel": {
+ "message": "Obnov úroveň $LEVELNAME$",
+ "description": "A button caption that can be used generically by JShelter",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "Level name of the level to be restored, for example, Default"
+ }
+ }
+ },
+ "ButtonEdit": {
+ "message": "Uprav",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRemove": {
+ "message": "Odstraň",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonSaveCustomLevel": {
+ "message": "Ulož vlastní úroveň",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonCancel": {
+ "message": "Storno",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonAddNewLevel": {
+ "message": "Přidej novou úroveň",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "addToList": {
+ "message": "Přidej do seznamu",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "saveAll": {
+ "message": "Ulož vše",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "deleteAll": {
+ "message": "Smaž vše",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "ManageWhitelist": {
+ "message": "Spravuj seznam domén s výjimkou ⤵",
+ "description": "A button caption that can be used generically by JShelter, e.g. to fine-tune NBS and FPD; Please indicate that the list would appear below (the arrow at the end)."
+ },
+ "HideWhitelist": {
+ "message": "Skrýj seznam domén s výjimkou ⤵",
+ "description": "A button caption that can be used generically by JShelter, e.g. to fine-tune NBS and FPD; Please indicate that the list is located below (the arrow at the end)."
+ },
+ "ButtonDisableForDomain": {
+ "message": "<strong>$DISABLE$</strong> $FORTHEDOMAIN$",
+ "description": "A button caption that can be used generically by JShelter, e.g. in the options; if necessary, edit the structure of the message but make sure to emhasize the disablement. Translate the placeholders.",
+ "placeholders": {
+ "disable": {
+ "content": "Vypnout",
+ "description": "Please translate"
+ },
+ "forTheDomain": {
+ "content": "pro doménu",
+ "description": "Please translate"
+ }
+ }
+ },
+ "ButtonEnableForSelectedDomains": {
+ "message": "<strong>$ENABLE$</strong> $FORTHEDOMAIN$",
+ "description": "A button caption that can be used generically by JShelter, e.g. in the options; if necessary, edit the structure of the message but make sure to emhasize the enablement. Translate the placeholders.",
+ "placeholders": {
+ "enable": {
+ "content": "Povol",
+ "description": "Please translate"
+ },
+ "forTheDomain": {
+ "content": "pro vybrané domény",
+ "description": "Please translate"
+ }
+ }
+ },
+ "ManageWhitelistDescription": {
+ "message": "Uvedená doménová jména jsou zpracovávaná v rámci hierarchie doménových jmen, takže uvedením <strong>example.com</strong> také vypnete štít pro <strong>news.example.com</strong>.",
+ "description": "Information text that can be used generically by JShelter, e.g. in options to explain the exception list of NBS and FPD."
+ },
+
+ "javascriptShieldDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><ul><li>$REDUCTION$</li><li>$FAKE$</li><li>$HIDE$</li></ul><p>$BLOGS$</p>",
+ "description": "This is the description of JSS shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs but please keed all paragraphs in the jss_description class.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Javascriptový štít upravuje chování prostředí interpretu JavaScriptu, které je dostupné navštíveným stránkám. JShelter poskytuje falešné informace, aby zmátl skripty získávající otisky prohlížečů, nebo zabránil útokům zneužívající JavaScript, nebo je alespoň učinil složitějšími.",
+ "description": "Paragraph 1, please translate this text."
+ },
+ "paragraph2": {
+ "content": "Javascriptový štít se skládá z wraperů, malých kusů kódu, které modifikují původní chování JavaScriptových API (funkcí nebo vlastností) definovaných standardy. Chování většiny wraperů obvykle spadá do jedné z následujících kategorií:",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "reduction": {
+ "content": "Omezení přesnosti: Původní hodnota je příliš přesná, což ve většině případů použití není potřeba. Javascriptový štít upravuje poskytované hodnoty takovým způsobem, aby obvyklé neškodné použití nebylo ovlivněno.",
+ "description": "UL item 1, please translate this text."
+ },
+ "fake": {
+ "content": "Falešné hodnoty: Některé wrapery poskytují falešné informace, většinou se tak děje pro zmatení skriptů tvořících otisk prohlížeče. Některé wrapery poskytují možné údaje, které však nejsou založeny na skutečných datech. Další wrapery upravují skutečné hodnoty malými změnami, které typicky nejsou detekovatelné člověkem, ale jsou významné pro skript počítající otisk prohlížeče. Takové změny JShelter aplikuje různě na různých navštívených doménách a v různých sezeních, takže provozovatelé různých domén nemohou použít přečtené informace ke spojení prohlížeče. Např. wrapery pro plátno canvas upravují obrázek tak, aby stejné pokyny vedly k různým výsledkům na různých doménách a v různých sezeních.",
+ "description": "UL item 2, please translate this text."
+ },
+ "hide": {
+ "content": "Skrytí informací: Některá API poskytují informace, které nejsou obvykle potřeba a mohou být ukryté před většinou stránek. V závislosti na API, Javascriptový štít vrací chybu, prázdnou hodnotu, nebo úplně blokuje API.",
+ "description": "UL item 3, please translate this text."
+ },
+ "blogs": {
+ "content": "Pro více informací se podívejte na naše blogové příspěvky o <a href='https://jshelter.org/fingerprinting/'>protiopatřením před získáváním otisku prohlížeče</a> a <a href='https://jshelter.org/farbling/'>metodě drobných lží</a>.",
+ "description": "Last paragraph, please translate this text, keep the URLs to the English version unless a translation exists on the web."
+ }
+ }
+ },
+ "JavascriptShieldLevelsMainLevelOptionHeading": {
+ "message": "Tvorba vlastních úrovní ochrany a nastavení výchozí úrovně",
+ "description": "A heading in the options above the configuration of the default JSS level and the possibility to list existing levels and create own levels."
+ },
+ "addCustomLevel": {
+ "message": "Přidej vlastní úroveň",
+ "description": "A button caption, the button creates a custom JSS level."
+ },
+
+ "JSSL0Name": {
+ "message": "Vypnout JavaScriptový štít",
+ "description": "The name of JSS L0 that is used at various places in the UI"
+ },
+ "JSSL0Description": {
+ "message": "JavaScriptová APIs nejsou chráněná. Vypněte JavaScriptový štít jen pokud 1. věříte provozovateli zobrazené stránky a chete mu (a všem nepřátelům, kteří mohli vložit kód do stránky) dát přístup ke všem API podporovaných prohlížečem, nebo 2. pokud JavaScriptový štít nechcete používat, ale chcete využívat jiné ochranné mechanismy JShelteru.",
+ "description": "The description of JSS L0 that is used at various places in the UI"
+ },
+ "JSSL1Name": {
+ "message": "Bez ochrany před tvorbou otisku prohlížeče",
+ "description": "The name of JSS L1 that is used at various places in the UI"
+ },
+ "JSSL1Description": {
+ "message": "Uplatňuje bezpečnostní opatření, které nejspíše nerozbijí chování stránky, ale nechrání před tvorbou otisku prohlížeče. Vypíná API, která nejsou obvyklými stránkami využívaná. Použijte tuto úroveň pokud Detektor získávání otisku prohlížeče hlásí, že stránka volala nízký počet API zneužívaných pro tvorbu otisku prohlížeče, věříte provozovateli stránek nebo si myslíte, že JShelter příliš zpomaluje zobrazené stránky, nebo je rozbíjí, a vaše touha zobrazit stránky je tak vysoká, že nechcete chránit před tvorbou otisku prohlížeče.",
+ "description": "The description of JSS L1 that is used at various places in the UI, see also FingerprintQualityLabel label for the origin of 'The description of JSS L1 that is used at various places in the UI, see also FingerprintQualityLabel label for the origin of 'the page called a low number of APIs misued for fingerprinting''"
+ },
+ "JSSL2Name": {
+ "message": "Doporučená",
+ "description": "The name of JSS L2 that is used at various places in the UI"
+ },
+ "JSSL2Description": {
+ "message": "Snaží se prohlížeč upravit tak, aby vypadal rozdílně na stránkách různých domén. Uplatňuje bezpečnostní opatření, která obvykle nerozbíjejí stránky. Drobně upravuje výsledky volání API různými způsoby na stránkách různých domén tak, aby otisk prohlížeče sestavený na různých doménách byl jiný. Hodnoty zneužívané pro vytváření otisku prohlížeče se také liší s každým spuštěním prohlížeče. Pokud potřebujete získat jiný otisk prohlížeče bez restartu prohlížeče, zkuste použít anonymní mód. Mějte na paměti, že i když se odhlásíte od používání služby, smažete cookies, změníte adresu IP, upravené API poskytnou možnost výpočtu stejného otisku prohlížeče. Restartujte prohlížeč pokud chcete změnit svůj otisk prohlížeče. Pokud nevíte jakou úroveň ochrany zvolit, zvolte tuto.",
+ "description": "The description of JSS L1 that is used at various places in the UI"
+ },
+ "JSSL3Name": {
+ "message": "Přísná",
+ "description": "The name of JSS L3 that is used at various places in the UI"
+ },
+ "JSSL3Description": {
+ "message": "Zapíná všechny ochrany, kterou nejsou považovány za experimentální. Obalená API vrací falešné hodnoty. Některá API jsou úplně odstraněná, další poskytují smysluplné, ale neobvyklé hodnoty. Některá API vrací bezvýznamné hodnoty. Tato úroveň dovolí výpočet stabilního otisku prohlížeče, protože volání jednotlivých API obvykle vrací stejné hodnoty na všech webech a ve všech sezeních. Použijte tuto úroveň pokud chcete omezit množství informací poskytnutých vašim prohlížečem. Pokud se bojíte získávání otisku prohlížeče,zapněte Detektor získávání otisku prohlížeče.",
+ "description": "The description of JSS L2 that is used at various places in the UI"
+ },
+ "JSSLexperimentalName": {
+ "message": "Experimentální",
+ "description": "The name of JSS experimental level that is used at various places in the UI"
+ },
+ "JSSLexperimentalDescription": {
+ "message": "Stejné volby jako o přísné úrovně ochrany s dodatečnými úpravami (včetně API, o kterých je známo, že jejich úpravy běžně rozbíjejí stránky, a API, která nefungují dostatečně dobře). Tuto úroveň používejte jen pro experimenty s JShelterem. Pro běžné prohlížení použijte Doporučenou, nebo Přísnou úroveň s aktivním Detektorem získávání otisku prohlížeče.",
+ "description": "The description of JSS experimental level that is used at various places in the UI"
+ },
+
+ "omittedAPIsHeading": {
+ "message": "Jako ochranu před tvorbou otisku prohlížeče, JShelter nevytváří neexistující vlastnosti. Tento prohlížeč nepodporuje:",
+ "description": "This message is displayed while giving the possibility to create a new level or edit existing levels in options"
+ },
+ "newLevelsNotRecommended": {
+ "message": "Nedoporučujeme tvorbu vlastních úrovní ochrany a změnu konfigurace pokud používáte JShelter jako ochranu před tvorbou otisku prohlížeče. Přečtěte si <a href=\"$FAQURL$\">FAQ</a> a náš <a href=\"$PAPERURL$\">článek</a>. V případě, že se vaše nastavení bude lišit od nastavení jiných uživatelů, usnadňujete vaši identifikaci v budoucnu.",
+ "placeholders": {
+ "faqurl": {
+ "content": "https://jshelter.org/faq/"
+ },
+ "paperurl": {
+ "content": "https://arxiv.org/abs/2204.01392"
+ }
+ },
+ "description": "This message is displayed while creating a new level in options. Make sure that you keep correct HTML markup"
+ },
+
+ "formlabelName": {
+ "message": "Jméno:",
+ "description": "Used in forms whenever a name should be enered (atm new level name)"
+ },
+ "formlabelDescription": {
+ "message": "Popis:",
+ "description": "Used in forms whenever a description should be enered (atm new level description)"
+ },
+
+ "customLevelAlreadyExistsItWillBeOverridden": {
+ "message": "Vlastní úroveň $CUSTOMNAME$ již existuje a bude přepsána.",
+ "description": "Alert message shown during level editing, translate the message but not the placeholder",
+ "placeholders": {
+ "customName": {
+ "content": "$1",
+ "example": "User provided value, any text",
+ "description": "The level name that is about to be overwritten"
+ }
+ }
+ },
+ "customLevelWereNotUpdated": {
+ "message": "Vlastní úrovně nebyly aktualizovány, prosím opakujte akci později.",
+ "description": "The configuration with the chaged or new level was not saved because of unknown reason."
+ },
+ "NewLevelMissingNameOrDescription": {
+ "message": "Jak jméno, tak popis úrovně ochrany jsou povinné, prosím vyplňte obě pole.",
+ "description": "User did not supply all mandatory fields for a JSS level"
+ },
+ "JSSeditLevelHeading": {
+ "message": "Úprava úrovně $LEVELNAME$",
+ "description": "Heading shown during JSS tweaking (edit level form)",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "User provided value, any text",
+ "description": "The level name that is about to be overwritten, do not translate"
+ }
+ }
+ },
+ "JSSaddLevelHeading": {
+ "message": "Tvorba nové úrovně zabezpečení",
+ "description": "Form heading during creation of a new level. You likely want to use the same or very similar value as ButtonAddNewLevel translation string."
+ },
+
+ "javaScriptShieldPerWebsiteConfiguration": {
+ "message": "Nastavení Javascriptového štítu pro jednotlivé navštívené domény",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "setJavaScriptShieldForWebsite": {
+ "message": "Nastav JavaScriptový štít pro doménu:",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "aListOfWebsiteWithRedefinedJavaScriptShield": {
+ "message": "Seznam domén s vlastní konfigurací Javascriptového štítu:",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "JSSAdvancedConfirmOverwrite": {
+ "message": "Nastavení pro doménu $DOMAIN$ již existuje a bude přepsáno.",
+ "description": "Displayed in JSS advanced options page",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "The domain whose settings are about to be overwritten, like example.com"
+ }
+ }
+ },
+ "LevelAndDescription": {
+ "message": "$LEVELNAME$: $LEVELSHORTDESCRIPTION$",
+ "description": "Displayed in options pages in select elements to give the user an idea what level to apply by listing both its name and a short description",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "Name of the level"
+ },
+ "levelShortDescription": {
+ "content": "$2",
+ "example": "Short description of the level"
+ }
+ }
+ },
+
+ "doNotModifyThisConfiguration": {
+ "message": "POZOR! Neměňte tuto konfiguraci, pokud nevíte, co děláte.",
+ "description": "Displayed in expert settings"
+ },
+ "JShelterFullConfiguration": {
+ "message": "Plné nastavení JShelteru v textové podobě",
+ "description": "Displayed in expert settings, label for the full extension configuration in textarea"
+ },
+ "ExpertLoadCurrentlyStoredConfiguration": {
+ "message": "Načíst aktuálně uložené nastavení",
+ "description": "Displayed in expert settings, button that loads current configuration to the textarea"
+ },
+ "ExpertOverwriteConfiguration": {
+ "message": "Přepiš nastavení (přepíše uložené nastavení tím, které je zobrazené na této stránce)",
+ "description": "Displayed in expert settings, button that stores the current configuration permanently"
+ },
+ "ExpertResetConfiguration": {
+ "message": "Vrať se k výchozímu nastavení (odstraní všechno lokální nastavení)",
+ "description": "Displayed in expert settings, button that reset to the configuration that we ship (factory reset)"
+ },
+ "ExpertUndoConfiguration": {
+ "message": "Zpět (zapomeň poslední přepis konfigurace)",
+ "description": "Displayed in expert settings, button that restores the configuration to the previous (back button)"
+ },
+
+ "protectionConfigurationOptionActivatedOn": {
+ "message": "Zapnuto",
+ "description": "Displayed during NBS and FPD configuration when the option is activated (on)"
+ },
+ "protectionConfigurationOptionActivatedOff": {
+ "message": "Vypnuto",
+ "description": "Displayed during NBS and FPD configuration when the option is deactivated (off)"
+ },
+ "shieldNotifications": {
+ "message": "Notifikace",
+ "description": "Displayed as a text label during NBS and FPD configuration when the user can activate or deactivate notifications"
+ },
+ "NBSDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><p>$PARAGRAPH3$</p>",
+ "description": "This is the description of NBS shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Štít pro ochranu hranice sítě znemožňuje navštíveným stránkám zneužít prohlížeč jako mezičlánek mezi veřejným Internetem a lokální sítí. Podívejte se na <a href='https://jshelter.org/localportscanning/'>náš příspěvek na blogu</a> a <a href='https://www.forcepoint.com/sites/default/files/resources/files/report-attacking-internal-network-en_0.pdf'>zprávu společnosti Force Point</a> pro příklady útoků, kterým Štít pro ochranu hranice sítě brání. Štít pro ochranu hranice sítě využívá WebRequest API, takže zachycuje všechny odchozí požadavky.",
+ "description": "Paragraph 1, please translate this text, keep the URLs or replace them to a translated version of the targets."
+ },
+ "paragraph2": {
+ "content": "Obvykle byste měli nechat Štít pro ochranu hranice sítě vyhledávat podezřelé požadavky v celém provozu. Ale některé stránky vyžadují interakci mezi veřejným Internetem a lokální sítí, např. Štít pro ochranu hranice sítě může rozbít některé Intranetové informační systémy. Uživatelé JShelteru také nahlásili zvýšené množství falešných poplachů v kombinací s filtrovacími programy modifikujícími odpovědi DNS. Pokud takový program používáte, ujistěte se, že DNS vrací 0.0.0.0 pro blokované domény.",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "paragraph3": {
+ "content": "Chování Štítu pro ochranu hranice sítě může být globálně nastaveno níže. Štít pro ochranu hranice sítě může také být vypnutý pro jednotlivé domény s využitím seznamu výjimek. Domény do tohoto seznamu mohou být přidány s využitím okna dostupného pro každou navštívenou stránku po kliknutí na ikonu JShelteru nebo ručně níže. Uvedením domény do tohoto seznamu také vypnete Štít pro ochranu hranice sítě na všech jejich poddoménách. Abyste deaktivovali Štít pro ochranu hranice sítě pro konkrétní doménu, vložte tuto doménu do seznamu (vynechte „www“, ale zahrňte všechny nadřazené domény jako je „.cz“).",
+ "description": "Paragraph 3, please translate this text, note that <i>Manage exception list</i> refers to the ManageWhitelist string."
+ }
+ }
+ },
+ "NBSHttpProxyDNSAPINote": {
+ "message": "Pokud používáte HTTP proxy, Štít pro ochranu hranice sítě chrání síť této proxy, protože proxy provádí HTTP dotazy. JShelter zamezuje úniku DNS dotazů tak, že v případě využití HTTP proxy neresolvuje DNS domény pro detekci možných dotazů do místní sítě. I tak v takovém případě bere Štít v úvahu IP adresy přímo vložené v URL. Takže Štít pro ochranu hranice sítě chrání síť použité proxy, ale jen částečně.",
+ "description": "This note is appended to NBS description in Firefox, see https://pagure.io/JShelter/webextension/issue/41 for the context of the issue"
+ },
+
+ "nbsBlocking": {
+ "message": "Blokace",
+ "description": "Displayed during NBS configuration, label for a configuration option"
+ },
+ "nbsBlockingDescription": {
+ "message": "Blokuje požadavky, které se snaží přistupovat k místní síti.",
+ "description": "Displayed during NBS configuration, basic explanation of the configuration option"
+ },
+ "nbsBlockingDescription2": {
+ "message": "Doporučujeme ponechat toto nastavení aktivní.",
+ "description": "Displayed during NBS configuration, further explanation of the configuration option"
+ },
+ "nbsBlockingOffDescription": {
+ "message": "Závadné požadavky neblokovány.",
+ "description": "Displayed during NBS configuration, further explanation of the selected configuration level"
+ },
+ "nbsBlockingOnDescription": {
+ "message": "Závadné požadavky blokovány.",
+ "description": "Displayed during NBS configuration, further explanation of the selected configuration level"
+ },
+ "NBSNotificationsDescription": {
+ "message": "Povolení nebo zakázání notifikací o podezřelém dění, nebo blokovaných požadavcích.",
+ "description": "Displayed in NBS options, globaly disables or enables notifications"
+ },
+ "NBSNotificationsDescription2": {
+ "message": "V případě, že povolíte notifikace: s aktivním blokováním budete upozorněni notifikací o blokacích, bez aktivního blokování budete ve stejných situacích informování o podezřelé aktivitě, která blokována nebude.",
+ "description": "Displayed in NBS options, globaly disables or enables notifications"
+ },
+ "NBSNotificationsOffDescription": {
+ "message": "Notifikace vypnuty.",
+ "description": "Displayed in NBS options, notifications about blocked requests are globally disabled"
+ },
+ "NBSNotificationsOnDescription": {
+ "message": "Notifikace zapnuty.",
+ "description": "Displayed in NBS options, notifications about blocked requests are globally enabled"
+ },
+ "NBSBlockedTitle": {
+ "message": "Štít pro ochranu hranice sítě zablokoval podezřelé požadavky!",
+ "description": "Title of the notifications that is displayed when NBS actually blocks requests"
+ },
+ "NBSDetectedTitle": {
+ "message": "Štít pro ochranu hranice sítě detekoval podezřelé požadavky!",
+ "description": "Title of the notifications that is displayed when NBS detects a suspicious requests but does not block them because blocking is disabled"
+ },
+ "NBSBlockedMessageMultipleTargets": {
+ "message": "Počet blokovaných požadavků\nod $ORIGIN$,\nkteré se směřovaly do místní\nsítě: $COUNT$.",
+ "description": "The message shown when the page contacted multiple targets in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "count": {
+ "content": "$2",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSDetectedMessageMultipleTargets": {
+ "message": "Počet detekovaných požadavků\nod $ORIGIN$,\nkteré se odešly do místní\nsítě: $COUNT$.",
+ "description": "The message shown when the page contacted multiple targets in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "count": {
+ "content": "$2",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSBlockedMessageWithTarget": {
+ "message": "Blokovaných požadavků: $COUNT$\nod $ORIGIN$\nna $TARGET$.",
+ "description": "The message shown when the page contacted single target in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "target": {
+ "content": "$2",
+ "description": "IP address (maybe domain), do not translate",
+ "example": "10.0.0.1"
+ },
+ "count": {
+ "content": "$3",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSDetectedMessageWithTarget": {
+ "message": "Detekovaných požadavků: $COUNT$\nod $ORIGIN$\nna $TARGET$.",
+ "description": "The message shown when the page contacted single target in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "target": {
+ "content": "$2",
+ "description": "IP address (maybe domain), do not translate",
+ "example": "10.0.0.1"
+ },
+ "count": {
+ "content": "$3",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSBlockedHostTitle": {
+ "message": "Štít pro ochranu hranice sítě zablokoval podezřelý stroj!",
+ "description": "Title of the notifications that is displayed when NBS blocks future requests by a host in Chromium-based browsers"
+ },
+ "NBSDetectedHostTitle": {
+ "message": "Štít pro ochranu hranice sítě detekoval podezřelý stroj!",
+ "description": "Title of the notifications that is displayed when NBS detects suspicious requests by a host in Chromium-based browsers but does not block them because blocking is disabled"
+ },
+ "NBSBlockedHost": {
+ "message": "Všechny další požadavky od $HOST$ budou blokovány.",
+ "description": "The message shown in Chromium-based browsers when NBS starts blocking a host.",
+ "placeholders": {
+ "host": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ }
+ }
+ },
+ "NBSDetectedHost": {
+ "message": "Zapněte blokování požadavků pro blokování všech požadavků od $HOST$ do místní sítě.",
+ "description": "The message shown in Chromium-based browsers when NBS detects a suspicious host.",
+ "placeholders": {
+ "host": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ }
+ }
+ },
+
+ "FPDDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><p>$PARAGRAPH3$</p>",
+ "description": "This is the description of FPDBS shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Detektor získávání otisku prohlížeče poskytuje mechanismus, který informuje uživatele o aktivitách webových stránek, které mohou směřovat k získání otisku prohlížeče. Detektor také může zabránit stránkám v přenosu otisku prohlížeče k serveru, pokud se tak uživatel rozhodne. Podívejte se na <a href='https://jshelter.org/fpdetection/'>náš příspěvek na blogu</a> nebo článek <a href='https://arxiv.org/pdf/1905.01051.pdf'>shrnující výzkum v oblasti získávání a používání otisků prohlížeče</a> pro bližší popis tématu.",
+ "description": "Paragraph 1, please translate this text, keep the URLs or replace them to a translated version of the targets."
+ },
+ "paragraph2": {
+ "content": "Zapnutý detektor může zobrazit upozornění kdykoliv navštívíte stránku s podezřelým chováním. Detektor měří počet volaných API zneužívaných k tvorbě otisku prohlížeče na každé navštívené stránce. Na základě heuristiky nad voláními a jejich obsahem vyhodnocuje, míru závažnosti volaných API z pohledu tvorby otisku prohlížeče. Tato míra závažnosti je zobrazená jako barva ikony JShelteru a také v okně zobrazeném po kliknutí na tuto ikonu (stavové okno). V případě vysoké závažnosti můžete být upozorněni notifikací. JShelter umožňuje zobrazit detaily aktivit vedoucích k tvorbě otisku prohlížeče formou zprávy. Tuto zprávu můžete získat kliknutím na stavové okno nebo kliknutím na upozornění o možném získání otisku prohlížeče navštívenou stránkou.",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "paragraph3": {
+ "content": "Výchozí chování Detektoru získávání otisku prohlížeče můžete upravit. Blokující chování cílí na zamezení stránky v předání otisku prohlížeče ven z prohlížeče. Detektor získávání otisku prohlížeče blokuje všechny odchozí požadavky protokolem HTTP a maže úložiště v prohlížeči poté, co detekuje volání vysokého množství API zneužívaných k tvorbě otisku prohlížeče. <strong>Blokace všech odchozích požadavků HTTP obvykle rozbíjí chování webových stránek</strong>. Při rozbití stránek důvěryhodných doménách byste měli tyto domény zařadit mezi výjimky. Vypnutí detektoru ve stavovém okně přidá navštívenou doménu do seznamu výjimek. Domény uvedené v seznamu výjimek nejsou detektorem vyhodnocované ani blokované. Výjimky můžete spravovat níže.",
+ "description": "Paragraph 3, please translate this text."
+ }
+ }
+ },
+
+ "fpdBehavior": {
+ "message": "Chování",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorDescription": {
+ "message": "Specifikuje chování modulu.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorPassive": {
+ "message": "Pasivní",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorPassiveDescription": {
+ "message": "Zobrazuje počet API zneužitelných pro tvorbu otisku prohlížeče volaných stránkou jako barvu v ikoně rozšíření.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorLimitedBlocking": {
+ "message": "Omezené blokování",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorBlockingDescription": {
+ "message": "Detektor reaguje na stránky volající velké množství API zneužitelných pro tvorbu otisku prohlížeče.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorBlockingDescription2": {
+ "message": "• Znemožní stránce další komunikaci přes síť, aby se zabránilo úniku vytvořeného otisku prohlížeče.",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorLimitedBlockingDescription3": {
+ "message": "• Smaže úložiště <strong>specifikovaná níže</strong> stránky v prohlížeči, aby se předešlo možnému částečnému uložení otisku prohlížeče v těchto úložištích. (Nevyžaduje žádná další povolení.)",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorLimitedBlockingDescription4": {
+ "message": "• Maže se: <strong>localStorage, sessionStorage, JS cookies, IndexedDB, keše, window.name</strong>",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorBlockingDescriptionWarning": {
+ "message": "POZOR: Tato volba může znemožnit správné chování některých stránek.",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorFullBlocking": {
+ "message": "Úplné blokování",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorFullBlockingDescription3": {
+ "message": "• Maže <strong>všechny</strong> dostupné mechanismy pro uložení dat. (Vyžaduje oprávnění BrowsingData.)",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdBehaviorFullBlockingDescription4": {
+ "message": "• maže: <strong>localStorage, sessionStorage, cookies, IndexedDB, keše, window.name, fileSystems, WebSQL, serviceWorkers</strong>",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdNotificationsDescription": {
+ "message": "Zapíná a vypíná notifikace o detekci chování umožňující tvorbu otisku prohlížeče a o blokaci požadavků HTTP.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsDescription2": {
+ "message": "POZOR: Doporučujeme zapnout notifikace, pokud zvolíte blokující chování detektoru.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsOffDescription": {
+ "message": "Notifikace jsou vypnuté.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsOnDescription": {
+ "message": "Notifikace jsou zapnuté.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetection": {
+ "message": "Detekce",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDescription": {
+ "message": "Upravuje nastavení heuristiky, která poskytuje hranice ovlivňující zda je stránka považovaná za takovou, která volala příliš mnoho API zneužitelných pro tvorbu otisku prohlížeče.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefault": {
+ "message": "Výchozí",
+ "description": "Option shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription": {
+ "message": "Doporučené nastavení pro většinu uživatelů.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription2": {
+ "message": "• Velmi malé množství mylné detekce aktivit směřujících k tvorbě otisku prohlížeče (zaměřuje se na jasné případy tvorby otisku prohlížeče, což vede k velmi malému množství zbytečně blokovaných stránek).",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription3": {
+ "message": "• Přijatelné množství neodhalených pokusu o tvorbu otisku prohlížeče (některé skripty pro tvorbu otisku prohlížeče se mohou vyhnout detekci).",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrict": {
+ "message": "Přísná",
+ "description": "Option shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription": {
+ "message": "Snížený práh detekce pořizování otisku prohlížeče pro obezřetnější uživatele. Raději blokuj, než bys nechal někoho projít.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription2": {
+ "message": "• Nižší množství neodhalených pokusu o tvorbu otisku prohlížeče (detekuje pokusy o získání otisku prohlížeče u více stránek)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription3": {
+ "message": "• Zvýšené riziko nesprávné detekce získávání otisku prohlížeče (blokuje hraniční případy)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "FPDSeverityNone": {
+ "message": "Žádný",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityLow": {
+ "message": "Nízký",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityModerate": {
+ "message": "Střední",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityHigh": {
+ "message": "Vysoký",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityVeryHigh": {
+ "message": "Velmi vysoký",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "fpdBlockingSubsequent": {
+ "message": "Budu blokovat další požadavky HTTP.",
+ "description": "Shown in a notification when FPD starts blocking HTTP requests"
+ },
+ "fpdClickNotificationDetails": {
+ "message": "Pro více informací klikni na notifikaci.",
+ "description": "Shown in a notification when FPD detects a suspicious activity but is not configured to block"
+ },
+ "fpdNotificationMessage": {
+ "message": "$MESSAGE$\n\nStránka: $PAGETITLE$\nDoména: $DOMAIN$",
+ "description": "Constructs the full message for the notification when FPD detects suspicious activity",
+ "placeholders": {
+ "message": {
+ "content": "$1",
+ "example": "Blocking all subsequent requests.",
+ "description": "Translated fpdBlockingSubsequent or fpdClickNotificationDetails"
+ },
+ "pagetitle": {
+ "content": "$2",
+ "example": "JShelter test page",
+ "description": "The content of the title element of the fingerprinting page (in case it is long, only the start of the string)"
+ },
+ "domain": {
+ "content": "$3",
+ "example": "example.com",
+ "description": "The domain of the visited page or IP address (taken from the URL bar)"
+ }
+ }
+ },
+ "fpdNotificationTitle": {
+ "message": "Detekována aktivity umožňující vytvoření otisku prohlížeče!",
+ "description": ""
+ },
+ "FPDReportTitle": {
+ "message": "Zpráva Detektoru získávání otisku prohlížeče",
+ "description": "Title of a fingeprint report"
+ },
+ "FPDReportDescriptionPara1": {
+ "message": "Tato zpráva obsahuje seznam všech koncových bodů, ke kterým přistoupila zobrazená stránka a které jsou považovány JShelterem za relevantní pro získávání otisku prohlížeče. Detektoru získávání otisku prohlížeče používá tato data při rozhodování, zda je stránka podezřelá ze sbírání dat pro výpočet otisku prohlížeče.",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon"
+ },
+ "FPDReportDescriptionPara2": {
+ "message": "Detektor získávání otisku prohlížeče zpracovává volání API ve skupinách podle jejich sémantiky. Toto okno ukazuje počet detekovaných volání jednotlivých API. Výchozí zobrazení ukazuje jen skupiny, které stránka nejméně jednou využila. Pokud stránka nevyužila žádné API, toto okno může být prázdné. Pokud chcete vidět všechny API monitorované Detektorem získávání otisku prohlížeče, klikněte $STARTTAG$ sem $ENDTAG$",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon",
+ "placeholders": {
+ "starttag": {
+ "content": "<span id='unhideAll'>",
+ "description": "Please keep the tag as is, do not translate"
+ },
+ "endtag": {
+ "content": "</span>",
+ "description": "Please keep the tag as is, do not translate"
+ }
+ }
+ },
+ "FPDReportDescriptionPara3": {
+ "message": "Data z této zprávy můžete exportovat do formátu JSON. Exportovaná data zahrnují použité váhy nastavené jednotlivým API a jejich skupinám ($NOTE1$). Dále zahrnují využité API a využité argumenty ($NOTE2$).",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon",
+ "placeholders": {
+ "note1": {
+ "content": "<i>fpd_evaluation_statistics</i>",
+ "description": "Please keep as is, do not translate"
+ },
+ "note2": {
+ "content": "<i>fpd_access_logs</i>",
+ "description": "Please keep as is, do not translate"
+ }
+ }
+ },
+ "FPDReportShowDetails": {
+ "message": "Zobraz detaily",
+ "description": "Button caption"
+ },
+ "FPDReportHideDetails": {
+ "message": "Skryj detaily",
+ "description": "Button caption"
+ },
+ "FPDReportExportJSON": {
+ "message": "Exportuj úplnou zprávu jako JSON",
+ "description": "Button caption"
+ },
+ "FPDReportMissingData": {
+ "message": "CHYBA: Nemám data a nemůžu vytvořit zprávu! Pokuste se znovu načíst stránku a znovu otevřít zprávu.",
+ "description": "Text shown if the windows cannot communicate with the internals of the extension"
+ }
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/_locales/en/messages.json b/data/extensions/jsr@javascriptrestrictor/_locales/en/messages.json
new file mode 100644
index 0000000..458c732
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/_locales/en/messages.json
@@ -0,0 +1,1535 @@
+{
+ "extensionName": {
+ "message": "JShelter",
+ "description": "Name of the extension. Please, do not translate unless properly justified."
+ },
+ "extensionDescription": {
+ "message": "Extension for increasing security and privacy level of the user.",
+ "description": "Description of the extension."
+ },
+ "javascriptShield": {
+ "message": "JavaScript Shield",
+ "description": "The name of the JavaScript Shield displayed at multiple places"
+ },
+ "networkBoundaryShield": {
+ "message": "Network Boundary Shield",
+ "description": "The name of the Network Boundary Shield displayed at multiple places"
+ },
+ "NBSgloballyOff": {
+ "message": "Network Boundary Shield is globally disabled",
+ "description": "Informs the user that NBS is globally disabled, displayed e.g. in popup"
+ },
+ "fingerprintDetector": {
+ "message": "Fingerprint Detector",
+ "description": "The name of the Fingerprint Detector displayed at multiple places"
+ },
+ "FPDgloballyOff": {
+ "message": "Fingerprint Detector is globally disabled",
+ "description": "Informs the user that FPD is globally disabled, displayed e.g. in popup"
+ },
+ "globalSettings": {
+ "message": "Global settings",
+ "description": "The button in the popup that opens options page"
+ },
+ "settingsForDomain": {
+ "message": "Settings for domain",
+ "description": "The text in the popup that introduces the context of the information in the popup"
+ },
+
+ "refreshPage": {
+ "message": "Refresh page",
+ "description": "The button in the popup that refreshes the currently displayed page"
+ },
+ "modifyJSSPopup": {
+ "message": "Modify",
+ "description": "The button in the popup that tweaks JSS"
+ },
+ "descriptionMore": {
+ "message": "(more...)",
+ "description": "Used for example in the popup in the description text of the currently applied level when JShelter gives user the option to get more information about the level."
+ },
+ "descriptionLess": {
+ "message": "(less...)",
+ "description": "Used for example in the popup in the description text of the currently applied level when JShelter gives user the option to get less information about the level."
+ },
+ "nameDescriptionSeparator": {
+ "message": " — ",
+ "description": "Used for example in the popup to separate the current JSS level from its description."
+ },
+ "detailTweaksOfJSShieldForThisSite": {
+ "message": "Detail tweaks of JS shield for this site",
+ "description": "Button in the popup that allows to tweak JSS."
+ },
+ "wrappers": {
+ "message": "Groups of APIs",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "levelOfDefense": {
+ "message": "Level of defense",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "numberOfCalls": {
+ "message": "Number of calls",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "FingerprintQualityLabel": {
+ "message": "⤷ The number of APIs misused for fingerprinting called by the page: ",
+ "description": "This text is displayed in the popup as additional information from FPD"
+ },
+ "popupDefaultLevelHelpText": {
+ "message": "Set the global default level as the JavaScript Shield level for this page.",
+ "description": "This text is displayed in the popup as a tooltip for the Default level button"
+ },
+ "defaultLevelSelection": {
+ "message": "Default level ($levelName$)",
+ "description": "This text is displayed as the default level in the popup",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "description": "Translated name of the default level used by the user",
+ "example": "Recommended, see the keys JSSL*Name like JSSL2Name"
+ }
+ }
+ },
+ "ShieldOffSlider": {
+ "message": "OFF",
+ "description": "Displayed in sliders that control activation of shields in popup and options, keep the text short to prevent overflow"
+ },
+ "ShieldOnSlider": {
+ "message": "ON",
+ "description": "Displayed in sliders that control activation of shields in popup and options, keep the text short to prevent overflow"
+ },
+
+ "jssgroupUnprotected": {
+ "message": "Unprotected",
+ "description": "Displayed during JSS level tweaking in case the API group is completely disabled"
+ },
+ "jssgroupPoor": {
+ "message": "Poor",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupLow": {
+ "message": "Low",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupMedium": {
+ "message": "Medium",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupHigh": {
+ "message": "High",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupLittleLies": {
+ "message": "Little lies",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupStrict": {
+ "message": "Strict",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupConfuse": {
+ "message": "Confuse",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupFake": {
+ "message": "Fake",
+ "description": "Displayed during JSS level tweaking for InstalledBrowserPlugins and possibly more (in the future)"
+ },
+ "jssgroupAddFake": {
+ "message": "Add fake",
+ "description": "Displayed during JSS level tweaking for Connected cameras and microphones and possibly more (in the future)"
+ },
+ "jssgroupAsk": {
+ "message": "Ask",
+ "description": "Displayed during JSS level tweaking for XHR and possibly more (in the future)"
+ },
+ "jssgroupBlock": {
+ "message": "Block",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupRemove": {
+ "message": "Remove",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+
+ "jssgroupTimePrecision": {
+ "message": "Time precision"
+ },
+ "jssgroupTimePrecisionDescription": {
+ "message": "Prevent attacks and fingerprinting techniques relying on precise time measurement (or make them harder).",
+ "description": "Displayed at various places"
+ },
+ "jssgroupTimePrecisionDescription2": {
+ "message": "Limit the precision of high-resolution time stamps $apis$. Timestamps provided by the Geolocation API are wrapped as well if you enable \"$jssgroupPhysicalLocationGeolocation$\" protection.",
+ "description": "Displayed at various places",
+ "placeholders": {
+ "apis": {
+ "content": "(Date, Performance, events, Gamepad API, and Web VR API)",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ },
+ "jssgroupPhysicalLocationGeolocation": {
+ "content": "$1",
+ "description": "Translated version of the jssgroupPhysicalLocationGeolocation string"
+ }
+ }
+ },
+ "jssgroupTimePoorDescription": {
+ "message": "Round time to hundredths of a second (1.230)",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupTimeLowDescription": {
+ "message": "Round time to tenths of a second (1.200)",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupTimeHighDescription": {
+ "message": "Randomize decimal digits with noise (1.451)",
+ "description": "Explains the protection to the user"
+ },
+
+ "jssgroupLocallyRenderedImages": {
+ "message": "Locally rendered images",
+ "description": "htmlcanvaselement group"
+ },
+ "jssgroupLocallyRenderedImagesDescription": {
+ "message": "Protect against canvas fingerprinting or leaking information on the rendering capabilities of the graphic card.",
+ "description": "Displayed at various places, try to keep canvas in English or make sure that the user can understand that the protection is about the Canvas API"
+ },
+ "jssgroupLocallyRenderedImagesDescription2": {
+ "message": "Functions $apis$ return modified image data.",
+ "description": "Displayed at various places",
+ "placeholders": {
+ "apis": {
+ "content": "canvas.toDataURL(), canvas.toBlob(), CanvasRenderingContext2D.getImageData(), OffscreenCanvas.convertToBlob(), and WebGLRenderingContext.readPixels",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyRenderedImagesDescription3": {
+ "message": "$apis$ are modified to lie with probability.",
+ "description": "Displayed after jssgroupLocallyRenderedImagesDescription2",
+ "placeholders": {
+ "apis": {
+ "content": "CanvasRenderingContext2D.isPointInStroke() and CanvasRenderingContext2D.isPointInPath()",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyRenderedImagesLittleLiesDescription": {
+ "message": "Apply small modifications to read image data so that the images look the same, but the precise values differ based on the visited domain and across sessions. The goal is to prevent Canvas fingerprinting or at least make it harder.",
+ "description": "Consider keeping reference to Canvas fingerprinting in English"
+ },
+ "jssgroupLocallyRenderedImagesStrictDescription": {
+ "message": "Read white images (from WebGL canvas read an empty array). This option does not protect from Canvas fingerprinting.",
+ "description": "Consider keeping reference to Canvas fingerprinting in English"
+ },
+
+ "jssgroupLocallyGeneratedAudio": {
+ "message": "Locally generated audio",
+ "description": "audiobuffer group"
+ },
+ "jssgroupLocallyGeneratedAudioDescription": {
+ "message": "Protect against leaking information on the rendering capabilities of the audio card that can be used, for example, in audio fingerprinting.",
+ "description": "Try to keep reference to audio fingerprinting"
+ },
+ "jssgroupLocallyGeneratedAudioDescription2": {
+ "message": "Functions $apis$ return modified data.",
+ "placeholders": {
+ "apis": {
+ "content": "AudioBuffer.getChannelData(), AudioBuffer.copyFromChannel(), AnalyserNode.getByteTimeDomainData(), AnalyserNode.getFloatTimeDomainData(), AnalyserNode.getByteFrequencyData(), and AnalyserNode.getFloatFrequencyData()",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyGeneratedAudioLittleLiesDescription": {
+ "message": "Add small amplitude noise so that the sound is similar to the original to a human. The precise values differ based on the visited domain and across sessions. The goal is to prevent Audio fingerprinting or at least make it harder.",
+ "description": "Consider keeping reference to Audio fingerprinting in English"
+ },
+ "jssgroupLocallyGeneratedAudioStrictDescription": {
+ "message": "Sound data are replaced by white noise that differs based on the visited domain and across sessions. The goal is to limit leaks on audio hardware and at the same time make Audio fingerprinting harder.",
+ "description": "Consider keeping reference to Audio fingerprinting in English"
+ },
+
+ "jssgroupGraphicCardInformation": {
+ "message": "Graphic card information",
+ "description": "webgl group"
+ },
+ "jssgroupGraphicCardInformationDescription": {
+ "message": "Spoof details of your graphic card usable, for example, to make fingerprinting harder."
+ },
+ "jssgroupGraphicCardInformationDescription2": {
+ "message": "Function $api$ returns modified or bottom values for certain parameters.",
+ "placeholders": {
+ "api": {
+ "content": "WebGLRenderingContext.getParameter()",
+ "description": "Keep the names of the API"
+ }
+ }
+ },
+ "jssgroupGraphicCardInformationDescription3": {
+ "message": "$apis$ return modified values.",
+ "placeholders": {
+ "apis": {
+ "content": "WebGLRenderingContext functions .getFramebufferAttachmentParameter(), .getActiveAttrib(), .getActiveUniform(), .getAttribLocation(), .getBufferParameter(), .getProgramParameter(), .getRenderbufferParameter(), .getShaderParameter(), .getShaderPrecisionFormat(), .getTexParameter(), .getUniformLocation(), .getVertexAttribOffset(), .getSupportedExtensions(), and .getExtension()",
+ "description": "Keep the names of the API but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupGraphicCardInformationLittleLiesDescription": {
+ "message": "Generate reasonable numbers or random strings that differ on the visited domain and across sessions. The goal is to limit leaks on graphic cards and at the same time make fingerprinting harder."
+ },
+ "jssgroupGraphicCardInformationStrictDescription": {
+ "message": "Return bottom values (null, empty strings). Note that this option does not prevent fingerprinting."
+ },
+
+ "jssgroupInstalledBrowserPlugins": {
+ "message": "Installed browser plugins",
+ "description": "plugins group"
+ },
+ "jssgroupInstalledBrowserPluginsDescription": {
+ "message": "Protect against plugin fingerprinting."
+ },
+ "jssgroupInstalledBrowserPluginsDescription2": {
+ "message": "The protection is not applied if your browser returns an empty list or the five PDF plugin viewers specified by the living HTML standard. Hence the protection is not applied in modern browsers.",
+ "description": "The protection is not applied in modern browsers"
+ },
+ "jssgroupInstalledBrowserPluginsLittleLiesDescription": {
+ "message": "Edit current plugins and add two fake plugins.",
+ "description": ""
+ },
+ "jssgroupInstalledBrowserPluginsFakeDescription": {
+ "message": "Return two fake plugins.",
+ "description": ""
+ },
+ "jssgroupInstalledBrowserPluginsStrictDescription": {
+ "message": "Hide all plugins.",
+ "description": ""
+ },
+
+ "jssgroupConnectedCamerasAndMicrophones": {
+ "message": "Connected cameras and microphones"
+ },
+ "jssgroupConnectedCamerasAndMicrophonesDescription": {
+ "message": "Prevent fingerprinting based on the multimedia devices connected to the computer."
+ },
+ "jssgroupConnectedCamerasAndMicrophonesDescription2": {
+ "message": "Function $api$ is modified to return empty or modified result.",
+ "placeholders": {
+ "api": {
+ "content": "MediaDevices.enumerateDevices()",
+ "description": "Keep the names of the API"
+ }
+ }
+ },
+ "jssgroupConnectedCamerasAndMicrophonesLittleLiesDescription": {
+ "message": "Randomize the order of the devices. The existing devices are not linkable on different domains and across sessions."
+ },
+ "jssgroupConnectedCamerasAndMicrophonesAddFakeDescription": {
+ "message": "Add 0-4 fake devices and randomize the order. The existing devices are not linkable on different domains and across sessions.",
+ "description": ""
+ },
+ "jssgroupConnectedCamerasAndMicrophonesStrictDescription": {
+ "message": "Return an empty list of devices.",
+ "description": ""
+ },
+
+ "jssgroupHardware": {
+ "message": "Device memory and CPU",
+ "description": "hardware group"
+ },
+ "jssgroupHardwareDescription": {
+ "message": "Spoof hardware information on the amount of RAM and CPU count."
+ },
+ "jssgroupHardwareDescription2": {
+ "message": "Getters $apis$ return modified values.",
+ "placeholders": {
+ "apis": {
+ "content": "navigator.deviceMemory and navigator.hardwareConcurrency",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupHardwareLowDescription": {
+ "message": "Return random valid value between the minimum and the real value. The returned value differs based on the visited domains and across sessions."
+ },
+ "jssgroupHardwareMediumDescription": {
+ "message": "Return random valid value between minimum and 8. The returned value differs based on the visited domains and across sessions."
+ },
+ "jssgroupHardwareHighDescription": {
+ "message": "Return 4 for navigator.deviceMemory and 2 for navigator.hardwareConcurrency.",
+ "description": "Keep the names of the APIs in English"
+ },
+
+ "jssgroupNetworkConditions": {
+ "message": "Network conditions",
+ "description": "net group"
+ },
+ "jssgroupNetworkConditionsDescription": {
+ "message": "Disable access to network information to limit fingerprinting and remove the possibility of observing patterns in accessed networks to learn if the user is at home, work, or travel.",
+ "description": ""
+ },
+ "jssgroupNetworkConditionsRemoveDescription": {
+ "message": "Disable NetworkInformation API",
+ "description": "Keep the name of the API in English"
+ },
+
+ "jssgroupXMLHttpRequestRequests": {
+ "message": "XMLHttpRequest (XHR) data transfers",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupXMLHttpRequestRequestsDescription": {
+ "message": "Filter reliable XHR requests to the server."
+ },
+ "jssgroupXMLHttpRequestRequestsDescription2": {
+ "message": "Note that XHR requests are broadly employed for benign purposes and that $apis$ are not blocked. All provide similar and some even better means of communication with servers. We recommend activating the Fingerprint Detector instead of XHR wrappers for practical usage. JShelter keeps the wrapper as it is useful for some users mainly for experimental reasons.",
+ "placeholders": {
+ "apis": {
+ "content": "Fetch, SSE, WebRTC, and WebSockets APIs",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupXMLHttpRequestRequestsAskDescription": {
+ "message": "Ask before executing an XHR request",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupXMLHttpRequestRequestsBlockDescription": {
+ "message": "Block all XHR requests",
+ "description": "Keep the name of the API in English"
+ },
+
+ "jssgroupArrays": {
+ "message": "ArrayBuffer API",
+ "description": "arrays group"
+ },
+ "jssgroupArraysDescription": {
+ "message": "Protect against ArrayBuffer exploitation, for example, to prevent side-channel attacks on memory layout (or make them harder).",
+ "description": ""
+ },
+ "jssgroupArraysShift": {
+ "message": "Shift"
+ },
+ "jssgroupArraysShiftDescription": {
+ "message": "Shift indexes to make memory page boundaries detection harder."
+ },
+ "jssgroupArraysRandomize": {
+ "message": "Randomize"
+ },
+ "jssgroupArraysRandomizeDescription": {
+ "message": "Use random mapping of array indexing to memory. This option is more effective but slower compared to shifting."
+ },
+
+ "jssgroupSharedArraysBuffer": {
+ "message": "SharedArrayBuffer API",
+ "description": "shared_array group"
+ },
+ "jssgroupSharedArraysBufferDescription": {
+ "message": "Protect against SharedArrayBuffer exploitation, for example, to prevent side-channel attacks on memory layout (or make them harder).",
+ "description": ""
+ },
+ "jssgroupSharedArraysBufferMediumDescription": {
+ "message": "Randomly slow messages to prevent high-resolution timers",
+ "description": ""
+ },
+ "jssgroupSharedArraysBufferStrictDescription": {
+ "message": "Block SharedArrayBuffer",
+ "description": ""
+ },
+
+ "jssgroupWebWorker": {
+ "message": "WebWorker API",
+ "description": "webworker group, keep the name of the API in English"
+ },
+ "jssgroupWebWorkerDescription": {
+ "message": "Protect against WebWorker exploitation",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupWebWorkerDescription2": {
+ "message": "Workers provide powerful APIs that, for example, allow installing an invisible proxy to the browser. Higher levels remove that possibility. Note that benign sites use workers to provide offline work capabilities, search, caching during multimedia playbacks, etc.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerLowDescription": {
+ "message": "Randomly slow messages to prevent high-resolution timers but keep WebWorker support. This option does not prevent Workers from accessing original APIs. Use with caution.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerStrictDescription": {
+ "message": "Make WebWorkers inoperable. Use this to prevent sites from learning that the browser does not support WebWorkers. However, this prevents sites to deploy workarounds for missing WebWorker support that some sites provide.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerRemoveDescription": {
+ "message": "Remove WebWorkers support from the browser. This is easily detectable by web pages and improves the fingerprintability of the browser but at the same time gives the page the possibility to deploy code that compensates for the missing WebWorker support.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+
+ "jssgroupPhysicalLocationGeolocation": {
+ "message": "Physical location (geolocation)"
+ },
+ "jssgroupPhysicalLocationGeolocationDescription": {
+ "message": "Limit the information on real-world position provided by Geolocation API.",
+ "description": "Displayed at various places, keep the name of the API in the English"
+ },
+ "jssgroupPhysicalLocationGeolocationDescription2": {
+ "message": "Use domain hash for the position spoofing so the position will be the same at one domain for the whole session.",
+ "description": "Displayed at various places"
+ },
+ "jssgroupGeolocationTimestampOnly": {
+ "message": "Timestamp-only",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationTimestampOnlyDescription": {
+ "message": "Provide accurate data (use when you really need to provide the exact location and you want to protect geolocation timestamps via \"$jssgroupTimePrecision$\" protection)",
+ "description": "Explains the protection to the user",
+ "placeholders": {
+ "jssgroupTimePrecision": {
+ "content": "$1",
+ "example": "Translated string of the jssgroupTimePrecision"
+ }
+ }
+ },
+ "jssgroupGeolocationVillage": {
+ "message": "Village",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationVillageDescription": {
+ "message": "Use accuracy of hundreds of meters.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationTown": {
+ "message": "Town",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationTownDescription": {
+ "message": "Use accuracy of kilometers.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationRegion": {
+ "message": "Region",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationRegionDescription": {
+ "message": "Use accuracy of tens of kilometers.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationLongDistance": {
+ "message": "Long distance",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationLongDistanceDescription": {
+ "message": "Use accuracy of hundreds of kilometers.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationRemoveDescription": {
+ "message": "Completely remove geolocation services.",
+ "description": "Explains the protection to the user"
+ },
+
+ "jssgroupPhysicalEnvironmentSensors": {
+ "message": "Physical environment sensors",
+ "description": "physical_environment group"
+ },
+ "jssgroupPhysicalEnvironmentSensorsDescription": {
+ "message": "Limit the information provided by physical environment sensors like Magnetometer or Accelerometer.",
+ "description": "Consider replacing Magnetometer and Accelerometer with localized version of the sensor"
+ },
+ "jssgroupPhysicalEnvironmentSensorsDescription2": {
+ "message": "Such information can be misused for multiple purposes, including environment fingerprinting, user location tracking, detection of nearby devices, estimation of the user action performed with the device, and many others. However, the readings can be useful for applications like navigation, gaming, and others. For example, some applications can use the orientation of the device to control the actions inside the application."
+ },
+ "jssgroupPhysicalEnvironmentSensorsHighDescription": {
+ "message": "Emulate stationary device that provides different sensor readings on different domains and across sessions."
+ },
+
+ "jssgroupUserIdleDetection": {
+ "message": "User idle detection",
+ "description": "useridle group"
+ },
+ "jssgroupUserIdleDetectionDescription": {
+ "message": "The Idle Detection API can detect inactive users and locked screens.",
+ "description": "Try to keep the name of the API in English"
+ },
+ "jssgroupUserIdleDetectionDescription2": {
+ "message": "The intention of the API is to provide web applications the information of user inactivity, for example, not to show notifications while the user is inactive. However, the information can be misused to track the activity of the user and for correlating changes in the state across domains."
+ },
+ "jssgroupUserIdleConfuseDescription": {
+ "message": "Always return active user with an unlocked screen."
+ },
+ "jssgroupUserIdleBlockDescription": {
+ "message": "Do not show prompts and automatically decline."
+ },
+ "jssgroupUserIdleRemoveDescription": {
+ "message": "Remove the API."
+ },
+
+ "jssgroupCoopschedule": {
+ "message": "Idle period task scheduling",
+ "description": "coopschedule group"
+ },
+ "jssgroupCoopscheduleDescription": {
+ "message": "The Cooperative Scheduling of Background Tasks API can schedule background tasks such that they do not introduce delays to other high-priority tasks that share the same event loop.",
+ "description": "Try to keep the names of the APIs in English"
+ },
+ "jssgroupCoopscheduleDescription2": {
+ "message": "The API leaks information about the other tasks running in the browser as it leaks information on currently scheduled tasks, vsync deadlines, user-interaction and so on."
+ },
+ "jssgroupCoopscheduleConfuseDescription": {
+ "message": "Modify the available information to confuse adversaries."
+ },
+
+ "jssgroupGamepads": {
+ "message": "Gamepads",
+ "description": "gamepads group"
+ },
+ "jssgroupGamepadsDescription": {
+ "message": "Prevent websites from accessing and learning information on local gamepads."
+ },
+ "jssgroupGamepadsDescription2": {
+ "message": "The information can be misused for browser fingerprinting. At the same time, the user needs access to gamepads only on specialized websites."
+ },
+ "jssgroupGamepadsStrictDescription": {
+ "message": "Hide all gamepads."
+ },
+
+ "jssgroupVirtualAndAugmentedRealityDevices": {
+ "message": "Virtual and augmented reality devices",
+ "description": "vr group (also includes XR API)"
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesDescription": {
+ "message": "Prevent websites from accessing and learning information on local virtual and augmented reality displays."
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesDescription2": {
+ "message": "The information can be misused for browser fingerprinting. At the same time, the user needs access to virtual and augmented reality devices only on specialized websites."
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesStrictDescription": {
+ "message": "Hide all devices."
+ },
+
+ "jssgroupMultimediaPlayback": {
+ "message": "Multimedia playback",
+ "description": "playback group"
+ },
+ "jssgroupMultimediaPlaybackDescription": {
+ "message": "Prevent websites from accessing and learning information on locally installed codecs and encoding/decoding capabilities and performance."
+ },
+ "jssgroupMultimediaPlaybackDescription2": {
+ "message": "The information provided by the API can be misused for browser fingerprinting. You should enable the protection for sites that do not process audio or video. The protection can break sites processing audio or video."
+ },
+ "jssgroupMultimediaPlaybackLittleLiesDescription": {
+ "message": "Report a codec/encryption mechanism as unsupported with 12.5% probability."
+ },
+ "jssgroupMultimediaPlaybackStrictDescription": {
+ "message": "Report all codecs/encryption mechanisms as unsupported."
+ },
+ "jssgroupMultimediaPlaybackBlockDescription": {
+ "message": "Do not return any information at all."
+ },
+
+ "jssgroupUnreliableTransfersToServerBeacons": {
+ "message": "Unreliable transfers to server (beacons)",
+ "description": "analytics group"
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription": {
+ "message": "Prevent unreliable transfers to server (beacons)."
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription2": {
+ "message": "Such transfers are typically misused for analytics but occasionally may be used by online retailers or other pages."
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription3": {
+ "message": "Prevent sending information through Beacon API.",
+ "description": "Keep the name of the API"
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsBlockDescription": {
+ "message": "Block data transfers through this API. Performs no action."
+ },
+
+ "jssgroupHardwareBattery": {
+ "message": "Battery Status API",
+ "description": "battery group"
+ },
+ "jssgroupHardwareBatteryDescription": {
+ "message": "Removes Battery Status API support that is being misused for fingerprinting.",
+ "description": "Try to keep the reference to the English name of the API"
+ },
+ "jssgroupHardwareBatteryRemoveDescription": {
+ "message": "Remove the API"
+ },
+
+ "jssgroupPersistentIdentifierOfTheBrowserTab": {
+ "message": "Persistent identifier of the browser tab",
+ "description": "windowname group"
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabDescription": {
+ "message": "Unlike the other parts of the environment, window.name property is not reset during page load. Consequently, a page might store a unique identifier of the tab to the property or other benign data.",
+ "description": "Try to keep reference to window.name."
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabDescription2": {
+ "message": "This API allows cross-site identification in one tab and browser session."
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabStrictDescription": {
+ "message": "Clear window.name values when moving do a different service (eTLD+1 domain change) during page reload. This does not interfere with most benign purposes while preventing the cross-site re-identification attack.",
+ "description": "Try to keep reference to window.name and eTLD+1"
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabFirefox88": {
+ "message": "$BROWSER$ and above already protects you.",
+ "placeholders": {
+ "browser": {
+ "content": "Firefox 88"
+ }
+ }
+ },
+
+ "jssgroupNFC": {
+ "message": "Near Field Communication (NFC)",
+ "description": "nfc group"
+ },
+ "jssgroupNFCDescription": {
+ "message": "Near Field Communication (NFC) enables wireless communication between two devices at close proximity, usually less than a few centimeters. NFC is an international standard (ISO/IEC 18092) defining an interface and protocol for simple wireless interconnection of closely coupled devices operating at 13.56 MHz."
+ },
+ "jssgroupNFCDescription2": {
+ "message": "The API can be misused to learn information about other devices in the proximity.",
+ "description": "Keep the technical references"
+ },
+ "jssgroupNFCRemoveDescription": {
+ "message": "Remove the API"
+ },
+
+ "jssgroupWASM": {
+ "message": "WebAssembly speed-up",
+ "description": "webassembly group"
+ },
+ "jssgroupWASMDescription": {
+ "message": "Speed up the little-lies modifications of locally generated images and audio by WebAssembly.",
+ "description": "Keep reference to WebAssembly"
+ },
+ "jssgroupWASMDescription2": {
+ "message": "This option takes effect when the level of \"$canvas$\" or \"$audio$\" is set to \"$littlelies$\" only.",
+ "placeholders": {
+ "canvas": {
+ "content": "$1",
+ "example": "Translation of jssgroupLocallyRenderedImages"
+ },
+ "audio": {
+ "content": "$2",
+ "example": "Translation of jssgroupLocallyGeneratedAudio"
+ },
+ "littlelies": {
+ "content": "$3",
+ "example": "Translation of jssgroupLittleLies"
+ }
+ }
+ },
+ "jssgroupWASMDescription3": {
+ "message": "The WebAssembly code generates the same modifications as the not accelerated version, so it is a safe option to activate when concerned about fingerprinting."
+ },
+ "jssgroupWASMDisabled": {
+ "message": "Disabled"
+ },
+ "jssgroupWASMDisabledDescription": {
+ "message": "Disable WebAssembly from creating little lies."
+ },
+ "jssgroupWASMPassive": {
+ "message": "Passive"
+ },
+ "jssgroupWASMPassiveDescription": {
+ "message": "Enable WebAssembly to create little lies but fall back to the default slower implementation if the WebAssembly module cannot be injected."
+ },
+ "jssgroupWASMActive": {
+ "message": "Active"
+ },
+ "jssgroupWASMActiveDescription": {
+ "message": "Loosen the 'wasm-unsafe-eval' Content Security Policy (CSP) directive to allow WebAssembly execution where the CSP of the visited page would otherwise prevent it."
+ },
+ "jssgroupWASMActiveDescription2": {
+ "message": "The initialization of WebAssembly modules is subject to the CSP of the visited page in Chromium-based browsers."
+ },
+ "jssgroupWASMActiveDescription3": {
+ "message": "The benefit of this option is that the modifications run faster on all pages."
+ },
+ "jssgroupWASMActiveDescription4": {
+ "message": "However, by enabling this option, you increase the risk of being a victim of a vulnerability that would have been otherwise prevented by the CSP, such as cross-site scripting vulnerabilities. Moreover, this option might interfere with other installed extensions that modify the CSP header."
+ },
+ "jssgroupWASMEnabled": {
+ "message": "Enabled"
+ },
+ "jssgroupWASMEnabledDescription": {
+ "message": "Create little lies in WebAssembly."
+ },
+
+ "JShelterOptions": {
+ "message": "JShelter main settings",
+ "description": "Title of the main options page"
+ },
+ "mainSettings": {
+ "message": "Main settings",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "JShelterOptionsJSSFineTune": {
+ "message": "Javascript Shield details: per domain protections",
+ "description": "Title of the JS Shield details options page"
+ },
+ "jSSShieldDetails": {
+ "message": "JS Shield details",
+ "description": "Displayed in options in the navigation bar, try to keep JS shield abbreviated to keep the text short"
+ },
+ "JShelterOptionsAdvanced": {
+ "message": "JShelter expert options",
+ "description": "Title of the expert options page"
+ },
+ "advancedOptions": {
+ "message": "Expert options",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "externalLinks": {
+ "message": "External links",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "ExternalLinksSeparator": {
+ "message": " »",
+ "description": "Displayed in options in the navigation bar, for example after external links"
+ },
+ "threatModel": {
+ "message": "Threat model",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "fAQ": {
+ "message": "FAQ",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "testPage": {
+ "message": "Test page",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "permissions": {
+ "message": "Permissions",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "sourceCode": {
+ "message": "Source code",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "issueTracker": {
+ "message": "Issue tracker",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "credits": {
+ "message": "Credits",
+ "description": "Displayed in options in the navigation bar"
+ },
+
+ "ExampleDomainsText": {
+ "message": "example.com or en.example.com",
+ "description": "Displayed in text inputs that expect a domain"
+ },
+ "ButtonSignExpandOneCharacterDown": {
+ "message": "⤵",
+ "description": "A button caption that can be used generically by JShelter, it should contain a single character that intuitively tells the user that by clicking the button, more information will be shown"
+ },
+ "ButtonSave": {
+ "message": "Save",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRestore": {
+ "message": "Restore",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRestoreLevel": {
+ "message": "Restore level $LEVELNAME$",
+ "description": "A button caption that can be used generically by JShelter",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "Level name of the level to be restored, for example, Default"
+ }
+ }
+ },
+ "ButtonEdit": {
+ "message": "Edit",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonSaveCustomLevel": {
+ "message": "Save custom level",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonAddNewLevel": {
+ "message": "Add new level",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonCancel": {
+ "message": "Cancel",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRemove": {
+ "message": "Remove",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "addToList": {
+ "message": "Add to list",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "saveAll": {
+ "message": "Save all",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "deleteAll": {
+ "message": "Delete all",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "ManageWhitelist": {
+ "message": "Manage exception list ⤵",
+ "description": "A button caption that can be used generically by JShelter, e.g. to fine-tune NBS and FPD; Please indicate that the list would appear below (the arrow at the end)."
+ },
+ "HideWhitelist": {
+ "message": "Hide exception list ⤵",
+ "description": "A button caption that can be used generically by JShelter, e.g. to fine-tune NBS and FPD; Please indicate that the list is located below (the arrow at the end)."
+ },
+ "ButtonDisableForDomain": {
+ "message": "<strong>$DISABLE$</strong> $FORTHEDOMAIN$",
+ "description": "A button caption that can be used generically by JShelter, e.g. in the options; if necessary, edit the structure of the message but make sure to emhasize the disablement. Translate the placeholders.",
+ "placeholders": {
+ "disable": {
+ "content": "Disable",
+ "description": "Please translate"
+ },
+ "forTheDomain": {
+ "content": "for the domain",
+ "description": "Please translate"
+ }
+ }
+ },
+ "ButtonEnableForSelectedDomains": {
+ "message": "<strong>$ENABLE$</strong> $FORTHEDOMAIN$",
+ "description": "A button caption that can be used generically by JShelter, e.g. in the options; if necessary, edit the structure of the message but make sure to emhasize the enablement. Translate the placeholders.",
+ "placeholders": {
+ "enable": {
+ "content": "Enable",
+ "description": "Please translate"
+ },
+ "forTheDomain": {
+ "content": "for the selected domains",
+ "description": "Please translate"
+ }
+ }
+ },
+ "ManageWhitelistDescription": {
+ "message": "Please note that these domain names are checked within the domain hierarchy, so giving the exception to <strong>example.com</strong> does also allow <strong>news.example.com</strong> to bypass the shield.",
+ "description": "Information text that can be used generically by JShelter, e.g. in options to explain the exception list of NBS and FPD."
+ },
+
+ "javascriptShieldDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><ul><li>$REDUCTION$</li><li>$FAKE$</li><li>$HIDE$</li></ul><p>$BLOGS$</p>",
+ "description": "This is the description of JSS shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "JavaScript Shield modifies the behavior of the JavaScript environment available for the visited webpage. JShelter provides fake information to confuse fingerprinters or make webpage triggered attacks impossible or harder.",
+ "description": "Paragraph 1, please translate this text."
+ },
+ "paragraph2": {
+ "content": "JavaScript Shield internally consists of wrappers, small pieces of code that modify the original behavior of a JavaScript API (a function or a property) defined by standards. The behavior of most of the wrappers can be divided into several categories:",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "reduction": {
+ "content": "Precision reduction: The original value is too precise for most use cases. JavaScript Shield modifies the values so that typical and benign use cases are not affected.",
+ "description": "UL item 1, please translate this text."
+ },
+ "fake": {
+ "content": "Provide fake information: Some wrappers provide fake information mostly to confuse fingerprinters. Some wrappers provide plausible readings that are not based on the original value. Other wrappers modify the readings with small deviations that are typically not detectable for a human but significant for a fingerprinter. JShelter applies such deviations differently in each session and for each domain so that an observer operating several domains cannot use the information to link the browser. For example, canvas wrappers modify the image so that the same instructions produce different results on different domains and in different sessions.",
+ "description": "UL item 2, please translate this text."
+ },
+ "hide": {
+ "content": "Hide information: Some APIs provide information that is not generally needed and can be hidden from most pages. Depending on the API, JavaScript Shield might return an error, an empty value, or block the API completely.",
+ "description": "UL item 3, please translate this text."
+ },
+ "blogs": {
+ "content": "See our blog posts for more information on <a href='https://jshelter.org/fingerprinting/'>browser fingerprinting counter-measures</a> and <a href='https://jshelter.org/farbling/'>little lies</a>.",
+ "description": "Last paragraph, please translate this text, keep the URLs to the English version unless a translation exists on the web."
+ }
+ }
+ },
+ "JavascriptShieldLevelsMainLevelOptionHeading": {
+ "message": "Create custom levels and set the default level",
+ "description": "A heading in the options above the configuration of the default JSS level and the possibility to list existing levels and create own levels."
+ },
+ "addCustomLevel": {
+ "message": "Add custom level",
+ "description": "A button caption, the button creates a custom JSS level."
+ },
+
+ "JSSL0Name": {
+ "message": "Turn JavaScript Shield off",
+ "description": "The name of JSS L0 that is used at various places in the UI"
+ },
+ "JSSL0Description": {
+ "message": "JavaScript APIs are not wrapped. Use this level if you (1) trust the operator of the visited page(s) and you want to give them access to full APIs supported by the browser as well as the adversaries that might have injected code to the trusted pages, or (2) if you do not like JavaScript Shield but you want to apply other protection mechanisms.",
+ "description": "The description of JSS L0 that is used at various places in the UI"
+ },
+ "JSSL1Name": {
+ "message": "Turn fingerprinting protection off",
+ "description": "The name of JSS L1 that is used at various places in the UI"
+ },
+ "JSSL1Description": {
+ "message": "Apply security counter-measures that are likely not to break web pages but do not defend against fingerprinting. Disable APIs that are not commonly used. Use this level if Fingerprint Detector reports that the page called a low number of APIs misused for fingerprinting, you trust the visited service, and/or you think that the protection makes the page slow or broken and your temptation to use the service is so high that you do not want to be protected.",
+ "description": "The description of JSS L1 that is used at various places in the UI, see also FingerprintQualityLabel label for the origin of 'the page called a low number of APIs misused for fingerprinting'"
+ },
+ "JSSL2Name": {
+ "message": "Recommended",
+ "description": "The name of JSS L2 that is used at various places in the UI"
+ },
+ "JSSL2Description": {
+ "message": "Make the browser appear differently on distinct visited domains. Apply security counter-measures that are likely not to break web pages. Slightly modify the results of API calls differently on different domains so that the cross-site fingerprint is not stable. The values misused to generate fingerprints also differ with each browser restart. Try incognito mode if you need a different fingerprint for the same website without restart. Remember that even if you log out from a site, clear your cookies, and change your IP address, the modified APIs will provide a way to compute the same fingerprint. Restart your browser if you want to change your fingerprint. If in doubt, use this level.",
+ "description": "The description of JSS L1 that is used at various places in the UI"
+ },
+ "JSSL3Name": {
+ "message": "Strict",
+ "description": "The name of JSS L3 that is used at various places in the UI"
+ },
+ "JSSL3Description": {
+ "message": "Enable all non-experimental protection. The wrapped APIs return fake values. Some APIs are blocked completely, while others provide meaningful but rare values. Some return meaningless values. This level will make you fingerprintable because the results of API calls are generally modified in the same way on all websites and in each session. Use this level if you want to limit the information provided by your browser. If you are worried about fingerprinters, make sure the Fingerprint Detector is activated.",
+ "description": "The description of JSS L2 that is used at various places in the UI"
+ },
+ "JSSLexperimentalName": {
+ "message": "Experimental",
+ "description": "The name of JSS experimental level that is used at various places in the UI"
+ },
+ "JSSLexperimentalDescription": {
+ "message": "Strict level protections with additional wrappers enabled (including APIs known to regularly break webpages and APIs that do not work perfectly). Use this level if you want to experiment with JShelter. Use Recommended or Strict level with active Fingerprint Detector for your regular activities.",
+ "description": "The description of JSS experimental level that is used at various places in the UI"
+ },
+
+ "omittedAPIsHeading": {
+ "message": "Note that for fingerprintability prevention, JShelter does not wrap objects that are not defined. Your browser does not support:",
+ "description": "This message is displayed while giving the possibility to create a new level or edit existing levels in options"
+ },
+ "newLevelsNotRecommended": {
+ "message": "We do not recommend creating your own levels and changing configuration if you are concerned about browser fingerprinting. Please read <a href=\"$FAQURL$\">FAQ</a> and our <a href=\"$PAPERURL$\">paper</a>. By diverging from the configuration of other users, you make your re-identification easier.",
+ "placeholders": {
+ "faqurl": {
+ "content": "https://jshelter.org/faq/"
+ },
+ "paperurl": {
+ "content": "https://arxiv.org/abs/2204.01392"
+ }
+ },
+ "description": "This message is displayed while creating a new level in options. Make sure that you keep correct HTML markup"
+ },
+
+ "formlabelName": {
+ "message": "Name:",
+ "description": "Used in forms whenever a name should be enered (atm new level name)"
+ },
+ "formlabelDescription": {
+ "message": "Description:",
+ "description": "Used in forms whenever a description should be enered (atm new level description)"
+ },
+
+ "customLevelAlreadyExistsItWillBeOverridden": {
+ "message": "Custom level $CUSTOMNAME$ already exists. It will be overridden.",
+ "description": "Alert message shown during level editing, translate the message but not the placeholder",
+ "placeholders": {
+ "customName": {
+ "content": "$1",
+ "example": "User provided value, any text",
+ "description": "The level name that is about to be overwritten, do not translate"
+ }
+ }
+ },
+ "customLevelWereNotUpdated": {
+ "message": "Custom levels were not updated. Please try again later.",
+ "description": "The configuration with the chaged or new level was not saved because of unknown reason."
+ },
+ "NewLevelMissingNameOrDescription": {
+ "message": "Both Name and Description of the level are mandatory. Please provide both.",
+ "description": "User did not supply all mandatory fields for a JSS level"
+ },
+ "JSSeditLevelHeading": {
+ "message": "Edit level $LEVELNAME$",
+ "description": "Heading shown during JSS tweaking (edit level form)",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "User provided value, any text",
+ "description": "The level name that is about to be overwritten, do not translate"
+ }
+ }
+ },
+ "JSSaddLevelHeading": {
+ "message": "Add new level",
+ "description": "Form heading during creation of a new level. You likely want to use the same or very similar value as ButtonAddNewLevel translation string."
+ },
+
+ "javaScriptShieldPerWebsiteConfiguration": {
+ "message": "JavaScript Shield per-website configuration",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "setJavaScriptShieldForWebsite": {
+ "message": "Set JavaScript Shield for website:",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "aListOfWebsiteWithRedefinedJavaScriptShield": {
+ "message": "A list of websites with redefined JavaScript Shield:",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "JSSAdvancedConfirmOverwrite": {
+ "message": "Settings for domain $DOMAIN$ already exist and will be overridden.",
+ "description": "Displayed in JSS advanced options page",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "The domain whose settings are about to be overwritten, like example.com"
+ }
+ }
+ },
+ "LevelAndDescription": {
+ "message": "$LEVELNAME$: $LEVELSHORTDESCRIPTION$",
+ "description": "Displayed in options pages in select elements to give the user an idea what level to apply by listing both its name and a short description",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "Name of the level"
+ },
+ "levelShortDescription": {
+ "content": "$2",
+ "example": "Short description of the level"
+ }
+ }
+ },
+
+ "doNotModifyThisConfiguration": {
+ "message": "BEWARE! Do not modify this configuration unless you know what you are doing.",
+ "description": "Displayed in expert settings"
+ },
+ "JShelterFullConfiguration": {
+ "message": "Full JShelter configuration in the text",
+ "description": "Displayed in expert settings, label for the full extension configuration in textarea"
+ },
+ "ExpertLoadCurrentlyStoredConfiguration": {
+ "message": "Load currently stored configuration",
+ "description": "Displayed in expert settings, button that loads current configuration to the textarea"
+ },
+ "ExpertOverwriteConfiguration": {
+ "message": "Overwrite configuration (stores the displayed configuration permanently)",
+ "description": "Displayed in expert settings, button that stores the current configuration permanently"
+ },
+ "ExpertResetConfiguration": {
+ "message": "Reset the configuration (remove all custom changes)",
+ "description": "Displayed in expert settings, button that reset to the configuration that we ship (factory reset)"
+ },
+ "ExpertUndoConfiguration": {
+ "message": "Undo (discard last configuration override)",
+ "description": "Displayed in expert settings, button that restores the configuration to the previous (back button)"
+ },
+
+ "protectionConfigurationOptionActivatedOn": {
+ "message": "On",
+ "description": "Displayed during NBS and FPD configuration when the option is activated (on)"
+ },
+ "protectionConfigurationOptionActivatedOff": {
+ "message": "Off",
+ "description": "Displayed during NBS and FPD configuration when the option is deactivated (off)"
+ },
+ "shieldNotifications": {
+ "message": "Notifications",
+ "description": "Displayed as a text label during NBS and FPD configuration when the user can activate or deactivate notifications"
+ },
+ "NBSDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><p>$PARAGRAPH3$</p>",
+ "description": "This is the description of NBS shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Network Boundary Shield prevents visited web pages from using the browser as a proxy between the public Internet and local network. See <a href='https://jshelter.org/localportscanning/'>our blog post</a> and <a href='https://www.forcepoint.com/sites/default/files/resources/files/report-attacking-internal-network-en_0.pdf'>Force Point report</a> for examples of attacks handled by the Network Boundary Shield. The protection encapsulates the WebRequest API, so it captures all outgoing requests.",
+ "description": "Paragraph 1, please translate this text, keep the URLs or replace them to a translated version of the targets."
+ },
+ "paragraph2": {
+ "content": "Generally, you want Network Boundary Shield to block all suspicious requests. However, some pages can be broken because they require interaction between the public Internet and the local network. For example, the Network Boundary Shield might break some Intranet information systems. JShelter users also reported increased false positives when using DNS-based filtering programs. If you use one, make sure that DNS returns 0.0.0.0 for the blocked domains.",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "paragraph3": {
+ "content": "Network Boundary Shield default behavior can be globally adjusted by the settings below. Network Boundary Shield can also be completely disabled per domain by the exception list. Domains can be allowed to make cross-network requests via <i>Network Boundary Shield switch</i> in the popup window or manually via the <i>Manage exception list</i> option. Remember that adding a domain to the exception list also allows its subdomains to make cross-network requests. To selectively deactivate Network Boundary Shield, insert the domains to the exception list (excluding \"www\" but including all other domains, e.g., \".com\").",
+ "description": "Paragraph 3, please translate this text, note that <i>Manage exception list</i> refers to the ManageWhitelist string."
+ }
+ }
+ },
+ "NBSHttpProxyDNSAPINote": {
+ "message": "If you are using an HTTP proxy, NBS would protect the local network of the proxy instead of your network as the proxy performs the HTTP requests to the destinations. To prevent DNS leaks of your queries initiated from this computer, Network Boundary Shield does not resolve the DNS domains to detect possible cross-network boundary requests. However, the Network Boundary Shield protects the local network of the proxy for directly embedded IP addresses. Hence, Network Boundary Shield protects the local network of the proxy only partially.",
+ "description": "This note is appended to NBS description in Firefox, see https://pagure.io/JShelter/webextension/issue/41 for the context of the issue"
+ },
+
+ "nbsBlocking": {
+ "message": "Blocking",
+ "description": "Displayed during NBS configuration, label for a configuration option"
+ },
+ "nbsBlockingDescription": {
+ "message": "Block requests that are trying to access your local network.",
+ "description": "Displayed during NBS configuration, basic explanation of the configuration option"
+ },
+ "nbsBlockingDescription2": {
+ "message": "NOTE: We recommend having request blocking turned on in most cases.",
+ "description": "Displayed during NBS configuration, further explanation of the configuration option"
+ },
+ "nbsBlockingOffDescription": {
+ "message": "Requests blocking turned off.",
+ "description": "Displayed during NBS configuration, further explanation of the selected configuration level"
+ },
+ "nbsBlockingOnDescription": {
+ "message": "Requests blocking turned on.",
+ "description": "Displayed during NBS configuration, further explanation of the selected configuration level"
+ },
+ "NBSNotificationsDescription": {
+ "message": "Turn on/off notifications about suspicious requests or requests being blocked.",
+ "description": "Displayed in NBS options, globaly disables or enables notifications"
+ },
+ "NBSNotificationsDescription2": {
+ "message": "In case you enable the notifications: if the blocking is on, you will be notified about blocked requests; if the blocking is off, you will be notified about suspicious requests without any attempt to prevent them.",
+ "description": "Displayed in NBS options, globaly disables or enables notifications"
+ },
+ "NBSNotificationsOffDescription": {
+ "message": "Blocking notifications turned off.",
+ "description": "Displayed in NBS options, notifications about blocked requests are globally disabled"
+ },
+ "NBSNotificationsOnDescription": {
+ "message": "Blocking notifications turned on.",
+ "description": "Displayed in NBS options, notifications about blocked requests are globally enabled"
+ },
+ "NBSBlockedTitle": {
+ "message": "Network Boundary Shield blocked suspicious requests!",
+ "description": "Title of the notifications that is displayed when NBS actually blocks requests"
+ },
+ "NBSDetectedTitle": {
+ "message": "Network Boundary Shield detected suspicious requests!",
+ "description": "Title of the notifications that is displayed when NBS detects a suspicious requests but does not block them because blocking is disabled"
+ },
+ "NBSBlockedMessageMultipleTargets": {
+ "message": "Count of blocked requests\nby $ORIGIN$\nthat attempted to access local\nnetwork: $COUNT$.",
+ "description": "The message shown when the page contacted multiple targets in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "count": {
+ "content": "$2",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSDetectedMessageMultipleTargets": {
+ "message": "Count of detected requests\nby $ORIGIN$\nthat accessed local\nnetwork: $COUNT$.",
+ "description": "The message shown when the page contacted multiple targets in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "count": {
+ "content": "$2",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSBlockedMessageWithTarget": {
+ "message": "Blocked requests: $COUNT$\nfrom $ORIGIN$\nto $TARGET$.",
+ "description": "The message shown when the page contacted single target in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "target": {
+ "content": "$2",
+ "description": "IP address (maybe domain), do not translate",
+ "example": "10.0.0.1"
+ },
+ "count": {
+ "content": "$3",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSDetectedMessageWithTarget": {
+ "message": "Detected requests: $COUNT$\nfrom $ORIGIN$\nto $TARGET$.",
+ "description": "The message shown when the page contacted single target in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "target": {
+ "content": "$2",
+ "description": "IP address (maybe domain), do not translate",
+ "example": "10.0.0.1"
+ },
+ "count": {
+ "content": "$3",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSBlockedHostTitle": {
+ "message": "Network Boundary Shield blocked a host!",
+ "description": "Title of the notifications that is displayed when NBS blocks future requests by a host in Chromium-based browsers"
+ },
+ "NBSDetectedHostTitle": {
+ "message": "Network Boundary Shield detected a suspicious host!",
+ "description": "Title of the notifications that is displayed when NBS detects suspicious requests by a host in Chromium-based browsers but does not block them because blocking is disabled"
+ },
+ "NBSBlockedHost": {
+ "message": "All future HTTP requests from $HOST$ will be blocked.",
+ "description": "The message shown in Chromium-based browsers when NBS starts blocking a host.",
+ "placeholders": {
+ "host": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ }
+ }
+ },
+ "NBSDetectedHost": {
+ "message": "To block HTTP requests from $HOST$ enable blocking.",
+ "description": "The message shown in Chromium-based browsers when NBS detects a suspicious host.",
+ "placeholders": {
+ "host": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ }
+ }
+ },
+
+ "FPDDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><p>$PARAGRAPH3$</p>",
+ "description": "This is the description of FPD shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Fingerprint Detector provides a mechanism that informs users about fingerprinting activity on visited web pages. The detector can also prevent web pages from extracting browser fingerprints if a user chooses to do so. See <a href='https://jshelter.org/fpdetection/'>our blog post</a> or <a href='https://arxiv.org/pdf/1905.01051.pdf'>Browser Fingerprinting: A survey</a> for a closer description of browser fingerprinting.",
+ "description": "Paragraph 1, please translate this text, keep the URLs or replace them to a translated version of the targets."
+ },
+ "paragraph2": {
+ "content": "By enabling the detector, you will be notified whenever it detects that the visited page has called a high number of APIs misused for fingerprinting. The detector counts and evaluates the called APIs for each page visit according to our heuristics. The number of called APIs misused for fingerprinting is presented to you by the badge color of the JShelter icon and in the popup window. You can receive a notification if the page calls a high number of fingerprinting APIs. You can see details about the fingerprinting activity by generating a fingerprint report. You can access it via a popup window or by clicking directly on the notification.",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "paragraph3": {
+ "content": "The default behavior of Fingerprint Detector can be adjusted to your liking. You can choose \"blocking\" behavior, which is a counter-measure against leaking your fingerprint. In this case, the Fingerprint Detector blocks all HTTP requests and cleans browser storages when it computes that the page calls a high number of fingerprinting APIs. Since <strong>this action generally breaks web pages</strong>, we recommend creating an exception list for trusted domains. Switching off the detector for a domain in the popup window will add the domain to the exception list. This domain will not be evaluated or blocked in the future. You can manage all the exceptions below.",
+ "description": "Paragraph 3, please translate this text."
+ }
+ }
+ },
+
+ "fpdBehavior": {
+ "message": "Behavior",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorDescription": {
+ "message": "Specify the preferred behavior of the module.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorPassive": {
+ "message": "Passive",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorPassiveDescription": {
+ "message": "Use extension icon badge color to signalize the number of the APIs called by the visited page that can be misused for fingerprinting.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorLimitedBlocking": {
+ "message": "Limited Blocking",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorBlockingDescription": {
+ "message": "Allow the extension to react whenever a page calls a high number of APIs misusable for fingerprinting.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorBlockingDescription2": {
+ "message": "• Interrupt network traffic for the page to prevent possible fingerprint leakage.",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdBehaviorLimitedBlockingDescription3": {
+ "message": "• Clear <strong>some</strong> browser storage of the page to remove possibly cached fingerprint. (No additional permissions required.)",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorLimitedBlockingDescription4": {
+ "message": "• Clearing: <strong>localStorage, sessionStorage, JS cookies, IndexedDB, caches, window.name</strong>",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorBlockingDescriptionWarning": {
+ "message": "NOTE: Blocking behavior may break some functionality on fingerprinting websites.",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorFullBlocking": {
+ "message": "Full Blocking",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorFullBlockingDescription3": {
+ "message": "• Clear <strong>all</strong> available storage mechanisms of the page where fingerprint may be cached. (Requires BrowsingData permission.)",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdBehaviorFullBlockingDescription4": {
+ "message": "• Clearing: <strong>localStorage, sessionStorage, cookies, IndexedDB, caches, window.name, fileSystems, WebSQL, serviceWorkers</strong>",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdNotificationsDescription": {
+ "message": "Turn on/off notifications about fingerprinting detection and HTTP requests blocking.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsDescription2": {
+ "message": "NOTE: We recommend having notifications turned on for blocking behavior.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsOffDescription": {
+ "message": "Detection/blocking notifications turned off.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsOnDescription": {
+ "message": "Detection/blocking notifications turned on.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetection": {
+ "message": "Detection",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDescription": {
+ "message": "Adjust heuristic thresholds which determine the severity of the number of called APIs misusable for fingerprinting.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefault": {
+ "message": "Default",
+ "description": "Option shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription": {
+ "message": "Recommended setting for most users.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription2": {
+ "message": "• Very low number of false positive detections (focus on clear fingerprinting cases, very low number of unreasonably blocked sites)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription3": {
+ "message": "• Acceptable amount of false negative detections (some fingerprinting websites may get around detection)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrict": {
+ "message": "Strict",
+ "description": "Option shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription": {
+ "message": "Optional setting for more cautious users.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription2": {
+ "message": "• Lower number of false negative detections (also detects websites with less excessive fingerprinting)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription3": {
+ "message": "• Higher probability of false positive detections (in edge cases benign websites may be falsely blocked)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "FPDSeverityNone": {
+ "message": "None",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityLow": {
+ "message": "Low",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityModerate": {
+ "message": "Moderate",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityHigh": {
+ "message": "High",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityVeryHigh": {
+ "message": "Very High",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "fpdBlockingSubsequent": {
+ "message": "Blocking all subsequent requests.",
+ "description": "Shown in a notification when FPD starts blocking HTTP requests"
+ },
+ "fpdClickNotificationDetails": {
+ "message": "Click the notification for more details.",
+ "description": "Shown in a notification when FPD detects a suspicious activity but is not configured to block"
+ },
+ "fpdNotificationMessage": {
+ "message": "$MESSAGE$\n\nPage: $PAGETITLE$\nHost: $DOMAIN$",
+ "description": "Constructs the full message for the notification when FPD detects suspicious activity",
+ "placeholders": {
+ "message": {
+ "content": "$1",
+ "example": "Blocking all subsequent requests.",
+ "description": "Translated fpdBlockingSubsequent or fpdClickNotificationDetails"
+ },
+ "pagetitle": {
+ "content": "$2",
+ "example": "JShelter test page",
+ "description": "The content of the title element of the fingerprinting page (in case it is long, only the start of the string)"
+ },
+ "domain": {
+ "content": "$3",
+ "example": "example.com",
+ "description": "The domain of the visited page or IP address (taken from the URL bar)"
+ }
+ }
+ },
+ "fpdNotificationTitle": {
+ "message": "Fingerprinting activity detected!",
+ "description": "Title of a notification"
+ },
+ "FPDReportTitle": {
+ "message": "Fingerprint Detector Report",
+ "description": "Title of a fingeprint report"
+ },
+ "FPDReportDescriptionPara1": {
+ "message": "This report lists all JavaScript API endpoints accessed by the web page and considered relevant for browser fingerprinting. Fingerprint Detector (FPD) uses this data to decide whether the page may be collecting a browser fingerprint.",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon"
+ },
+ "FPDReportDescriptionPara2": {
+ "message": "FPD processes API calls in groups based on their semantic properties. This window shows the detected number of API calls on the visited page. The default view shows only groups accessed at least once. This way, the report can be empty if the page does not access any fingerprintable API. If you want to see all APIs monitored by FPD, click $STARTTAG$ here $ENDTAG$",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon",
+ "placeholders": {
+ "starttag": {
+ "content": "<span id='unhideAll'>",
+ "description": "Please keep the tag as is, do not translate"
+ },
+ "endtag": {
+ "content": "</span>",
+ "description": "Please keep the tag as is, do not translate"
+ }
+ }
+ },
+ "FPDReportDescriptionPara3": {
+ "message": "You can export the full FPD Report that contains all the data collected and used by FPD to evaluate the page. This comprehensive report shows the weights assigned to the groups/endpoints ($NOTE1$). It also lists all accessed API endpoints with corresponding arguments ($NOTE2$).",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon",
+ "placeholders": {
+ "note1": {
+ "content": "<i>fpd_evaluation_statistics</i>",
+ "description": "Please keep as is, do not translate"
+ },
+ "note2": {
+ "content": "<i>fpd_access_logs</i>",
+ "description": "Please keep as is, do not translate"
+ }
+ }
+ },
+ "FPDReportShowDetails": {
+ "message": "Show details",
+ "description": "Button caption"
+ },
+ "FPDReportHideDetails": {
+ "message": "Hide details",
+ "description": "Button caption"
+ },
+ "FPDReportExportJSON": {
+ "message": "Export full FPD Report as JSON",
+ "description": "Button caption"
+ },
+ "FPDReportMissingData": {
+ "message": "ERROR: Missing data, cannot create a report! Try to reload the page and reopen the report.",
+ "description": "Text shown if the windows cannot communicate with the internals of the extension"
+ }
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/_locales/ru/messages.json b/data/extensions/jsr@javascriptrestrictor/_locales/ru/messages.json
new file mode 100644
index 0000000..4b8767d
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/_locales/ru/messages.json
@@ -0,0 +1,1485 @@
+{
+ "extensionName": {
+ "message": "JShelter",
+ "description": "Name of the extension. Please, do not translate unless properly justified."
+ },
+ "extensionDescription": {
+ "message": "Расширение для повышения безопасности и приватности пользователя.",
+ "description": "Description of the extension."
+ },
+ "javascriptShield": {
+ "message": "Щит JavaScript",
+ "description": "The name of the JavaScript Shield displayed at multiple places"
+ },
+ "networkBoundaryShield": {
+ "message": "Щит границ сети",
+ "description": "The name of the Network Boundary Shield displayed at multiple places"
+ },
+ "NBSgloballyOff": {
+ "message": "Щит границ сети отключен глобально",
+ "description": "Informs the user that NBS is globally disabled, displayed e.g. in popup"
+ },
+ "fingerprintDetector": {
+ "message": "Детектор фингерпринтинга",
+ "description": "The name of the Fingerprint Detector displayed at multiple places"
+ },
+ "FPDgloballyOff": {
+ "message": "Детектор фингерпринтинга отключен глобально",
+ "description": "Informs the user that FPD is globally disabled, displayed e.g. in popup"
+ },
+ "globalSettings": {
+ "message": "Глобальные настройки",
+ "description": "The button in the popup that opens options page"
+ },
+ "settingsForDomain": {
+ "message": "Настройки для домена",
+ "description": "The text in the popup that introduces the context of the information in the popup"
+ },
+ "refreshPage": {
+ "message": "Обновить страницу",
+ "description": "The button in the popup that refreshes the currently displayed page"
+ },
+ "modifyJSSPopup": {
+ "message": "Изменить",
+ "description": "The button in the popup that tweaks JSS"
+ },
+ "descriptionMore": {
+ "message": "(больше...)",
+ "description": "Used for example in the popup in the description text of the currently applied level when JShelter gives user the option to get more information about the level."
+ },
+ "descriptionLess": {
+ "message": "(меньше...)",
+ "description": "Used for example in the popup in the description text of the currently applied level when JShelter gives user the option to get less information about the level."
+ },
+ "nameDescriptionSeparator": {
+ "message": " — ",
+ "description": "Used for example in the popup to separate the current JSS level from its description."
+ },
+ "detailTweaksOfJSShieldForThisSite": {
+ "message": "Подробные настройки щита JS для данного сайта",
+ "description": "Button in the popup that allows to tweak JSS."
+ },
+ "wrappers": {
+ "message": "Группы API",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "levelOfDefense": {
+ "message": "Уровень защиты",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "numberOfCalls": {
+ "message": "Количество вызовов",
+ "description": "Column headding in the popup detailed JSS shield"
+ },
+ "FingerprintQualityLabel": {
+ "message": "⤷ Количество API, недобросовестно используемых для фингерпринтинга на странице: ",
+ "description": "This text is displayed in the popup as additional information from FPD"
+ },
+ "popupDefaultLevelHelpText": {
+ "message": "Задать глобальный уровень щита JavaScript по умолчанию на данной странице.",
+ "description": "This text is displayed in the popup as a tooltip for the Default level button"
+ },
+ "defaultLevelSelection": {
+ "message": "Уровень по умолчанию ($levelName$)",
+ "description": "This text is displayed as the default level in the popup",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "Translated name of the default level used by the user"
+ }
+ }
+ },
+ "ShieldOffSlider": {
+ "message": "ВЫКЛ",
+ "description": "Displayed in sliders that control activation of shields in popup and options, keep the text short to prevent overflow"
+ },
+ "ShieldOnSlider": {
+ "message": "ВКЛ",
+ "description": "Displayed in sliders that control activation of shields in popup and options, keep the text short to prevent overflow"
+ },
+ "jssgroupUnprotected": {
+ "message": "Не защищено",
+ "description": "Displayed during JSS level tweaking in case the API group is completely disabled"
+ },
+ "jssgroupPoor": {
+ "message": "Плохой",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupLow": {
+ "message": "Низкий",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupMedium": {
+ "message": "Средний",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupHigh": {
+ "message": "Высокий",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupLittleLies": {
+ "message": "Малая ложь",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupStrict": {
+ "message": "Строгий",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupConfuse": {
+ "message": "Запутать",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupFake": {
+ "message": "Ложь",
+ "description": "Displayed during JSS level tweaking for InstalledBrowserPlugins and possibly more (in the future)"
+ },
+ "jssgroupAddFake": {
+ "message": "Добавлять ложные",
+ "description": "Displayed during JSS level tweaking for Connected cameras and microphones and possibly more (in the future)"
+ },
+ "jssgroupAsk": {
+ "message": "Спрашивать",
+ "description": "Displayed during JSS level tweaking for XHR and possibly more (in the future)"
+ },
+ "jssgroupBlock": {
+ "message": "Блокировать",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupRemove": {
+ "message": "Удалять",
+ "description": "Displayed during JSS level tweaking for several API groups"
+ },
+ "jssgroupTimePrecision": {
+ "message": "Точность времени"
+ },
+ "jssgroupTimePrecisionDescription": {
+ "message": "Противодействовать атакам и техникам фингерпринтинга, полагающимся на измерение точного времени (или усложнять их).",
+ "description": "Displayed at various places"
+ },
+ "jssgroupTimePrecisionDescription2": {
+ "message": "Ограничивать высокую точность временных меток $apis$. Для временных меток, выдаваемых Geolocation API, также используются обертки при включении защиты \"$jssgroupPhysicalLocationGeolocation$\".",
+ "description": "Displayed at various places",
+ "placeholders": {
+ "apis": {
+ "content": "(Date, Performance, события, Gamepad API и Web VR API)",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ },
+ "jssgroupPhysicalLocationGeolocation": {
+ "content": "$1",
+ "description": "Translated version of the jssgroupPhysicalLocationGeolocation string"
+ }
+ }
+ },
+ "jssgroupTimePoorDescription": {
+ "message": "Округлять время до сотых секунды (1.230)",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupTimeLowDescription": {
+ "message": "Округлять время до десятых секунды (1.200)",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupTimeHighDescription": {
+ "message": "Выдавать случайные десятичные числа с шумом (1.451)",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupLocallyRenderedImages": {
+ "message": "Локально отрендеренные изображения",
+ "description": "htmlcanvaselement group"
+ },
+ "jssgroupLocallyRenderedImagesDescription": {
+ "message": "Защищать от фингерпринтинга Canvas или утечек информации о возможностях рендеринга графической карты.",
+ "description": "Displayed at various places, try to keep canvas in English or make sure that the user can understand that the protection is about the Canvas API"
+ },
+ "jssgroupLocallyRenderedImagesDescription2": {
+ "message": "Функции $apis$ возвращают измененные данные изображения.",
+ "description": "Displayed at various places",
+ "placeholders": {
+ "apis": {
+ "content": "canvas.toDataURL(), canvas.toBlob(), CanvasRenderingContext2D.getImageData(), OffscreenCanvas.convertToBlob() и WebGLRenderingContext.readPixels",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyRenderedImagesDescription3": {
+ "message": "$apis$ изменены, чтобы по возможности выдавать неверные результаты.",
+ "description": "Displayed after jssgroupLocallyRenderedImagesDescription2",
+ "placeholders": {
+ "apis": {
+ "content": "CanvasRenderingContext2D.isPointInStroke() и CanvasRenderingContext2D.isPointInPath()",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyRenderedImagesLittleLiesDescription": {
+ "message": "Вносить небольшие изменения в чтение данных изображения таким образом, чтобы оно выглядело так же, но точные значения отличались для разных посещаемых доменов и между сессиями. Цель — предотвратить фингерпринтинг Canvas или как минимум усложнить его.",
+ "description": "Consider keeping reference to Canvas fingerprinting in English"
+ },
+ "jssgroupLocallyRenderedImagesStrictDescription": {
+ "message": "Считывать белые изображения (пустой массив из WebGL canvas). Эта опция не защищает от фингерпринтинга Canvas.",
+ "description": "Consider keeping reference to Canvas fingerprinting in English"
+ },
+ "jssgroupLocallyGeneratedAudio": {
+ "message": "Локально сгенерированное аудио",
+ "description": "audiobuffer group"
+ },
+ "jssgroupLocallyGeneratedAudioDescription": {
+ "message": "Защищать от утечек информации о возможностях рендеринга звуковой карты, которые могут быть использованы, например, для фингерпринтинга аудио.",
+ "description": "Try to keep reference to audio fingerprinting"
+ },
+ "jssgroupLocallyGeneratedAudioDescription2": {
+ "message": "Функции $apis$ возвращают изменения для аудиоданных.",
+ "placeholders": {
+ "apis": {
+ "content": "AudioBuffer.getChannelData(), AudioBuffer.copyFromChannel(), AnalyserNode.getByteTimeDomainData(), AnalyserNode.getFloatTimeDomainData(), AnalyserNode.getByteFrequencyData() и AnalyserNode.getFloatFrequencyData()",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupLocallyGeneratedAudioLittleLiesDescription": {
+ "message": "Добавлять небольшой шум амплитуды таким образом, чтобы звук не отличался от оригинального для человека. Точные значения отличаются для разных посещаемых доменов и между сессиями. Цель — предотвратить фингерпринтинг аудио или, как минимум, усложнить его.",
+ "description": "Consider keeping reference to Audio fingerprinting in English"
+ },
+ "jssgroupLocallyGeneratedAudioStrictDescription": {
+ "message": "Звуковые данные заменяются белым шумом, который отличается для разных посещаемых доменов и между сессиями. Цель — ограничить утечки о звуковом оборудовании и заодно усложнить фингерпринтинг аудио.",
+ "description": "Consider keeping reference to Audio fingerprinting in English"
+ },
+ "jssgroupGraphicCardInformation": {
+ "message": "Информация о графической карте",
+ "description": "webgl group"
+ },
+ "jssgroupGraphicCardInformationDescription": {
+ "message": "Подменять подробности о вашей графической карте, например, для усложнения фингерпринтинга."
+ },
+ "jssgroupGraphicCardInformationDescription2": {
+ "message": "Функция $api$ возвращает измененные или минимальные значения для определенных параметров.",
+ "placeholders": {
+ "api": {
+ "content": "WebGLRenderingContext.getParameter()",
+ "description": "Keep the names of the API"
+ }
+ }
+ },
+ "jssgroupGraphicCardInformationDescription3": {
+ "message": "$apis$ возвращают измененные значения.",
+ "placeholders": {
+ "apis": {
+ "content": "WebGLRenderingContext functions .getFramebufferAttachmentParameter(), .getActiveAttrib(), .getActiveUniform(), .getAttribLocation(), .getBufferParameter(), .getProgramParameter(), .getRenderbufferParameter(), .getShaderParameter(), .getShaderPrecisionFormat(), .getTexParameter(), .getUniformLocation(), .getVertexAttribOffset(), .getSupportedExtensions() и .getExtension()",
+ "description": "Keep the names of the API but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupGraphicCardInformationLittleLiesDescription": {
+ "message": "Генерировать правдоподобные числа или случайные строки, которые отличаются для разных посещаемых доменов и между сессиями. Цель — ограничить утечки о графических картах и заодно усложнить фингерпринтинг."
+ },
+ "jssgroupGraphicCardInformationStrictDescription": {
+ "message": "Возвращать минимальные значения (null, пустые строки). Имейте в виду, что данная опция не предотвращает фингерпринтинг."
+ },
+ "jssgroupInstalledBrowserPlugins": {
+ "message": "Установленные браузерные плагины",
+ "description": "plugins group"
+ },
+ "jssgroupInstalledBrowserPluginsDescription": {
+ "message": "Защищать от фингерпринтинга по плагинам."
+ },
+ "jssgroupInstalledBrowserPluginsDescription2": {
+ "message": "Защита не применяется, если ваш браузер возвращает пустой список или пять плагинов для просмотра PDF, определенных текущим стандартом HTML. Таким образом, данная защита не применяется в современных браузерах.",
+ "description": "The protection is not applied in modern browsers"
+ },
+ "jssgroupInstalledBrowserPluginsLittleLiesDescription": {
+ "message": "Изменять текущие плагины и добавлять два ложных."
+ },
+ "jssgroupInstalledBrowserPluginsFakeDescription": {
+ "message": "Возвращать два ложных плагина."
+ },
+ "jssgroupInstalledBrowserPluginsStrictDescription": {
+ "message": "Скрывать все плагины."
+ },
+ "jssgroupConnectedCamerasAndMicrophones": {
+ "message": "Подключенные камеры и микрофоны"
+ },
+ "jssgroupConnectedCamerasAndMicrophonesDescription": {
+ "message": "Предотвращать фингерпринтинг по мультимедийным устройствам, подключенным к компьютеру."
+ },
+ "jssgroupConnectedCamerasAndMicrophonesDescription2": {
+ "message": "Функция $api$ изменена и выдает пустой или измененный результат.",
+ "placeholders": {
+ "api": {
+ "content": "MediaDevices.enumerateDevices()",
+ "description": "Keep the names of the API"
+ }
+ }
+ },
+ "jssgroupConnectedCamerasAndMicrophonesLittleLiesDescription": {
+ "message": "Делать порядок устройств случайным. Существующие устройства не связываются с различными доменами и между сессиями."
+ },
+ "jssgroupConnectedCamerasAndMicrophonesAddFakeDescription": {
+ "message": "Добавлять 0-4 ложных устройства и делать порядок случайным. Существующие устройства не связываются с различными доменами и между сессиями."
+ },
+ "jssgroupConnectedCamerasAndMicrophonesStrictDescription": {
+ "message": "Выдавать пустой список устройств."
+ },
+ "jssgroupHardware": {
+ "message": "Память устройства и процессор",
+ "description": "hardware group"
+ },
+ "jssgroupHardwareDescription": {
+ "message": "Подменять аппаратную информацию об объеме ОЗУ и тактовой частоте процессора."
+ },
+ "jssgroupHardwareDescription2": {
+ "message": "Геттеры $apis$ выдают измененные значения.",
+ "placeholders": {
+ "apis": {
+ "content": "navigator.deviceMemory и navigator.hardwareConcurrency",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupHardwareLowDescription": {
+ "message": "Выдавать случайное действительное значение между минимумом и реальным значением. Выданное значение отличается для разных посещаемых доменов и между сессиями."
+ },
+ "jssgroupHardwareMediumDescription": {
+ "message": "Выдавать случайное действительное значение между минимумом и 8. Выданное значение отличается для разных посещаемых доменов и между сессиями."
+ },
+ "jssgroupHardwareHighDescription": {
+ "message": "Выдавать 4 для navigator.deviceMemory и 2 для navigator.hardwareConcurrency.",
+ "description": "Keep the names of the APIs in English"
+ },
+ "jssgroupNetworkConditions": {
+ "message": "Условия работы сети",
+ "description": "net group"
+ },
+ "jssgroupNetworkConditionsDescription": {
+ "message": "Отключить доступ к информации о сети, чтобы ограничить фингерпринтинг и убрать возможность вычленения паттернов в доступных сетях для понимания, дома ли пользователь, на работе или в путешествии."
+ },
+ "jssgroupNetworkConditionsRemoveDescription": {
+ "message": "Отключить NetworkInformation API",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupXMLHttpRequestRequests": {
+ "message": "Передача данных XMLHttpRequest (XHR)",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupXMLHttpRequestRequestsDescription": {
+ "message": "Фильтровать достоверные XHR-запросы к серверу."
+ },
+ "jssgroupXMLHttpRequestRequestsDescription2": {
+ "message": "Имейте в виду, что данные запросы часто выполняются в добросовестных целях, а $apis$ не блокируются. Все они имеют схожие цели в коммуникации с сервером. Для практического использования мы рекомендуем включить детектор фингерпринтинга вместо оберток XHR. JShelter предоставляет данную обертку, поскольку она может быть нужна некоторым пользователям, в основном в экспериментальных целях.",
+ "placeholders": {
+ "apis": {
+ "content": "Fetch, SSE, WebRTC и WebSockets APIs",
+ "description": "Keep the names of the APIs but translate the punctuation and conjunctions"
+ }
+ }
+ },
+ "jssgroupXMLHttpRequestRequestsAskDescription": {
+ "message": "Спрашивать перед выполнением XHR-запроса",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupXMLHttpRequestRequestsBlockDescription": {
+ "message": "Блокировать все XHR-запросы",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupArrays": {
+ "message": "ArrayBuffer API",
+ "description": "arrays group"
+ },
+ "jssgroupArraysDescription": {
+ "message": "Защищать от эксплуатации ArrayBuffer, например, для предотвращения (или усложнения) атак по сторонним каналам на участки памяти."
+ },
+ "jssgroupArraysShift": {
+ "message": "Сдвигать"
+ },
+ "jssgroupArraysShiftDescription": {
+ "message": "Сдвигать индексы для усложнения обнаружения границ страницы памяти."
+ },
+ "jssgroupArraysRandomize": {
+ "message": "Делать случайным"
+ },
+ "jssgroupArraysRandomizeDescription": {
+ "message": "Использовать случайное размещение индексации массивов в памяти. Данная опция более эффективна, но медленнее по сравнению со сдвигом."
+ },
+ "jssgroupSharedArraysBuffer": {
+ "message": "SharedArrayBuffer API",
+ "description": "shared_array group"
+ },
+ "jssgroupSharedArraysBufferDescription": {
+ "message": "Защищать от эксплуатации SharedArrayBuffer, например, для предотвращения (или усложнения) атак по сторонним каналам на участки памяти."
+ },
+ "jssgroupSharedArraysBufferMediumDescription": {
+ "message": "Замедлять сообщения случайным образом для предотвращения работы таймеров высокой точности"
+ },
+ "jssgroupSharedArraysBufferStrictDescription": {
+ "message": "Блокировать SharedArrayBuffer"
+ },
+ "jssgroupWebWorker": {
+ "message": "WebWorker API",
+ "description": "webworker group, keep the name of the API in English"
+ },
+ "jssgroupWebWorkerDescription": {
+ "message": "Защищать от эксплуатации WebWorker",
+ "description": "Keep the name of the API in English"
+ },
+ "jssgroupWebWorkerDescription2": {
+ "message": "Worker предоставляет мощные API, которые позволяют, например, устанавливать в браузер невидимые прокси. Высокие уровни предотвращают эти действия. Имейте в виду, что добросовестные сайты с помощью workers предоставляют возможности работы без подключения к Интернету, поиск, кэширование при возпроизведении мультимедиа и т.д.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerLowDescription": {
+ "message": "Замедлять сообщения случайным образом для предотвращения работы таймеров высокой точности, но сохранять поддержку WebWorker. Данная опция не запрещает Workers доступ к оригинальным API. Используйте ее с осторожностью.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerStrictDescription": {
+ "message": "Сделать WebWorkers недействующими. Используйте, чтобы не давать сайтам понять, что браузер не поддерживает WebWorkers. Однако данная опция также не даст некоторым сайтам выполнить код для работы без поддержки WebWorker.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupWebWorkerRemoveDescription": {
+ "message": "Удалить поддержку WebWorkers из браузера. Это легко распознается веб-страницами и усиливает возможность снятия фингерпринта браузера, но также дает возможность странице выполнить код для работы без поддержки WebWorker.",
+ "description": "Try to keep the reference to the Worker in English"
+ },
+ "jssgroupPhysicalLocationGeolocation": {
+ "message": "Физическое местоположение (геолокация)"
+ },
+ "jssgroupPhysicalLocationGeolocationDescription": {
+ "message": "Ограничивать информацию о местоположении в реальном мире, предоставляемую Geolocation API.",
+ "description": "Displayed at various places, keep the name of the API in the English"
+ },
+ "jssgroupPhysicalLocationGeolocationDescription2": {
+ "message": "Использовать хэш домена для подмены местоположения, чтобы оно не изменялось для одного домена в течение всей сессии.",
+ "description": "Displayed at various places"
+ },
+ "jssgroupGeolocationTimestampOnly": {
+ "message": "Только по временным меткам",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationTimestampOnlyDescription": {
+ "message": "Предоставлять точные данные (используйте в тех случаях, когда вам по-настоящему нужно предоставить точное местоположение и вы хотите защитить временные метки геолокации с помощью \"$jssgroupTimePrecision$\")",
+ "description": "Explains the protection to the user",
+ "placeholders": {
+ "jssgroupTimePrecision": {
+ "content": "$1",
+ "example": "Translated string of the jssgroupTimePrecision"
+ }
+ }
+ },
+ "jssgroupGeolocationVillage": {
+ "message": "Деревня",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationVillageDescription": {
+ "message": "Использовать точность до сотен метров.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationTown": {
+ "message": "Город",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationTownDescription": {
+ "message": "Использовать точность до километров.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationRegion": {
+ "message": "Регион",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationRegionDescription": {
+ "message": "Использовать точность до десятков километров.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationLongDistance": {
+ "message": "Большое расстояние",
+ "description": "Displayed during level tweaks"
+ },
+ "jssgroupGeolocationLongDistanceDescription": {
+ "message": "Использовать точность до сотен километров.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupGeolocationRemoveDescription": {
+ "message": "Полностью удалить сервисы геолокации.",
+ "description": "Explains the protection to the user"
+ },
+ "jssgroupPhysicalEnvironmentSensors": {
+ "message": "Физические датчики окружения",
+ "description": "physical_environment group"
+ },
+ "jssgroupPhysicalEnvironmentSensorsDescription": {
+ "message": "Ограничивать информацию, предоставляемую физическими датчиками окружения, такими как магнитометр и акселерометр.",
+ "description": "Consider replacing Magnetometer and Accelerometer with localized version of the sensor"
+ },
+ "jssgroupPhysicalEnvironmentSensorsDescription2": {
+ "message": "Данная информация может быть недобросовестно использована для различных целей, например фингерпринтинга по окружению, отслеживания геолокации, обнаружения находящихся рядом устройств, оценки действий пользователя на устройстве и многого другого. Однако ее считывание может использоваться в приложениях для навигации, игр и других. Например, некоторые приложения с помощью ориентации устройства управляют действиями внутри них."
+ },
+ "jssgroupPhysicalEnvironmentSensorsHighDescription": {
+ "message": "Эмулировать стационарное устройство, выдающее разные показания сенсора для различных доменов и между сессиями."
+ },
+ "jssgroupUserIdleDetection": {
+ "message": "Обнаружение бездействия пользователя",
+ "description": "useridle group"
+ },
+ "jssgroupUserIdleDetectionDescription": {
+ "message": "Idle Detection API может обнаружить неактивность пользователя и заблокированный экран.",
+ "description": "Try to keep the name of the API in English"
+ },
+ "jssgroupUserIdleDetectionDescription2": {
+ "message": "Намерение данного API — предоставить веб-приложениям информацию о бездействии пользователя, например, чтобы не отображать уведомления при его неактивности. Однако эта информация может быть недобросовестно использована для отслеживания активности пользователя и сопоставления изменений состояния между доменами."
+ },
+ "jssgroupUserIdleConfuseDescription": {
+ "message": "Всегда выдавать активного пользователя с разблокированным экраном."
+ },
+ "jssgroupUserIdleBlockDescription": {
+ "message": "Не показывать всплывающие окна и автоматически отклонять."
+ },
+ "jssgroupUserIdleRemoveDescription": {
+ "message": "Удалить API."
+ },
+ "jssgroupCoopschedule": {
+ "message": "Планирование задач периода бездействия",
+ "description": "coopschedule group"
+ },
+ "jssgroupCoopscheduleDescription": {
+ "message": "Cooperative Scheduling of Background Tasks API может планировать фоновые задачи таким образом, чтобы при выполнении других высокоприоритетных задач, разделяющих тот же событийный цикл, не возникали задержки.",
+ "description": "Try to keep the names of the APIs in English"
+ },
+ "jssgroupCoopscheduleDescription2": {
+ "message": "Данный API вызывает утечки информации о других задачах, выполняемых браузером, как и о текущих запланированных задачах, окончании вертикальной синхронизации, взаимодействии пользователя и других."
+ },
+ "jssgroupCoopscheduleConfuseDescription": {
+ "message": "Изменять доступную информацию, чтобы запутывать злоумышленников."
+ },
+ "jssgroupGamepads": {
+ "message": "Геймпады",
+ "description": "gamepads group"
+ },
+ "jssgroupGamepadsDescription": {
+ "message": "Не давать веб-сайтам получать и изучать информацию о локальных геймпадах."
+ },
+ "jssgroupGamepadsDescription2": {
+ "message": "Данная информация может быть недобросовестно использована для фингерпринтинга браузера. Вдобавок, доступ к геймпадам нужен пользователю только на специализированных веб-сайтах."
+ },
+ "jssgroupGamepadsStrictDescription": {
+ "message": "Скрывать все геймпады."
+ },
+ "jssgroupVirtualAndAugmentedRealityDevices": {
+ "message": "Устройства виртуальной и дополненной реальности",
+ "description": "vr group (also includes XR API)"
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesDescription": {
+ "message": "Не давать веб-сайтам получать и изучать информацию о локальных устройствах виртуальной и дополненной реальности."
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesDescription2": {
+ "message": "Даннная информация может быть недобросовестно использована для фингерпринтинга браузера. Вдобавок, доступ к устройствам виртуальной и дополненной реальности нужен пользователю только на специализированных веб-сайтах."
+ },
+ "jssgroupVirtualAndAugmentedRealityDevicesStrictDescription": {
+ "message": "Скрывать все устройства."
+ },
+ "jssgroupMultimediaPlayback": {
+ "message": "Воспроизведение мультимедиа",
+ "description": "playback group"
+ },
+ "jssgroupMultimediaPlaybackDescription": {
+ "message": "Не давать веб-сайтам получать и изучать информацию о локально установленных кодеках, возможностях кодирования/декодирования и производительности."
+ },
+ "jssgroupMultimediaPlaybackDescription2": {
+ "message": "Информация, предоставляемая данным API, может быть недобросовестно использована для фингерпринтинга браузера. Вам стоит включать защиту для сайтов, не воспроизводящих аудио или видео. Данная защита может нарушить работу сайтов, воспроизводящих аудио или видео."
+ },
+ "jssgroupMultimediaPlaybackLittleLiesDescription": {
+ "message": "Сообщать, что кодек/механизм шифрования не поддерживается, с вероятностью 12.5%."
+ },
+ "jssgroupMultimediaPlaybackStrictDescription": {
+ "message": "Сообщать, что ни один кодек/механизм шифрования не поддерживается."
+ },
+ "jssgroupMultimediaPlaybackBlockDescription": {
+ "message": "Не сообщать никакую информацию вообще."
+ },
+ "jssgroupUnreliableTransfersToServerBeacons": {
+ "message": "Недостоверные запросы к серверу (маяки)",
+ "description": "analytics group"
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription": {
+ "message": "Предотвращать недостоверные запросы к серверу (маяки)."
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription2": {
+ "message": "Данные запросы чаще всего недобросовестно применяются для аналитики, но иногда их могут использовать интернет-магазины или другие страницы."
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsDescription3": {
+ "message": "Предотвращать отправку информации с помощью Beacon API.",
+ "description": "Keep the name of the API"
+ },
+ "jssgroupUnreliableTransfersToServerBeaconsBlockDescription": {
+ "message": "Блокировать передачу данных с помощью данного API. Не выполняет никаких действий."
+ },
+ "jssgroupHardwareBattery": {
+ "message": "Battery Status API",
+ "description": "battery group"
+ },
+ "jssgroupHardwareBatteryDescription": {
+ "message": "Удаляет поддержку Battery Status API, которая недобросовестно используется для фингерпринтинга.",
+ "description": "Try to keep the reference to the English name of the API"
+ },
+ "jssgroupHardwareBatteryRemoveDescription": {
+ "message": "Удалить API"
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTab": {
+ "message": "Постоянный идентификатор вкладки браузера",
+ "description": "windowname group"
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabDescription": {
+ "message": "В отличие от других компонентов окружения, свойство window.name не сбрасывается во время загрузки страницы. Следовательно, страница может сохранять уникальный идентификатор вкладки в свойство или другие добросовестные данные.",
+ "description": "Try to keep reference to window.name."
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabDescription2": {
+ "message": "Данный API позволяет совершать межсайтовую идентификацию в одной вкладке и сессии браузера."
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabStrictDescription": {
+ "message": "Очищать значения window.name при переходе на другой сервис (изменение домена eTLD+1) во время перезагрузки страницы. Это действие не препятствует многим добросовестным намерениям и предотвращает атаки межсайтовой реидентификации.",
+ "description": "Try to keep reference to window.name and eTLD+1"
+ },
+ "jssgroupPersistentIdentifierOfTheBrowserTabFirefox88": {
+ "message": "$BROWSER$ и выше уже защищает вас.",
+ "placeholders": {
+ "browser": {
+ "content": "Firefox 88"
+ }
+ }
+ },
+ "jssgroupNFC": {
+ "message": "Near Field Communication (NFC)",
+ "description": "nfc group"
+ },
+ "jssgroupNFCDescription": {
+ "message": "Near Field Communication (NFC) включает беспроводную связь между двумя устройствами на близком расстоянии, обычно до нескольких сантиметров. NFC — это международный стандарт (ISO/IEC 18092), определяющий интерфейс и протокол для простой беспроводного подключения близко расположенных девайсов, работающее на частоте 13.56 МГц."
+ },
+ "jssgroupNFCDescription2": {
+ "message": "Данный API может быть недобросовестно использован для получения информации о других устройствах в зоне действия.",
+ "description": "Keep the technical references"
+ },
+ "jssgroupNFCRemoveDescription": {
+ "message": "Удалить API"
+ },
+ "jssgroupWASM": {
+ "message": "Ускорение WebAssembly",
+ "description": "webassembly group"
+ },
+ "jssgroupWASMDescription": {
+ "message": "Ускорять изменения типа \"малая ложь\" для локально сгенерированных изображений и аудио с помощью WebAssembly.",
+ "description": "Keep reference to WebAssembly"
+ },
+ "jssgroupWASMDescription2": {
+ "message": "Данная опция имеет эффект, если уровни \"$canvas$\" или \"$audio$\" установлены только на \"$littlelies$\".",
+ "placeholders": {
+ "canvas": {
+ "content": "$1",
+ "example": "Translation of jssgroupLocallyRenderedImages"
+ },
+ "audio": {
+ "content": "$2",
+ "example": "Translation of jssgroupLocallyGeneratedAudio"
+ },
+ "littlelies": {
+ "content": "$3",
+ "example": "Translation of jssgroupLittleLies"
+ }
+ }
+ },
+ "jssgroupWASMDescription3": {
+ "message": "Код WebAssembly генерирует те же изменения, что и неускоренная версия. Таким образом, эта опция безопасна с точки зрения беспокойства о фингерпринтинге."
+ },
+ "jssgroupWASMDisabled": {
+ "message": "Выключено"
+ },
+ "jssgroupWASMDisabledDescription": {
+ "message": "Выключить создание малой лжи с помощью WebAssembly."
+ },
+ "jssgroupWASMPassive": {
+ "message": "Пассивно"
+ },
+ "jssgroupWASMPassiveDescription": {
+ "message": "Включить создание малой лжи с помощью WebAssembly, но откатываться на медленную реализацию по умолчанию при невозможности ввести модуль WebAssembly."
+ },
+ "jssgroupWASMActive": {
+ "message": "Активно"
+ },
+ "jssgroupWASMActiveDescription": {
+ "message": "Ослабить директиву 'wasm-unsafe-eval' Content Security Policy (CSP), чтобы разрешить выполнение WebAssembly там, где CSP посещаемой страницы иначе этого не позволяет."
+ },
+ "jssgroupWASMActiveDescription2": {
+ "message": "Инициализация модулей WebAssembly modules подчиняется CSP посещаемой страницы в браузерах, основанных на Chromium."
+ },
+ "jssgroupWASMActiveDescription3": {
+ "message": "Данная опция полезна тем, что изменения выполняются быстрее на всех страницах."
+ },
+ "jssgroupWASMActiveDescription4": {
+ "message": "Однако при включении данной опции повышается риск стать жертвой уязвимости, от которой CSP иначе бы защитила — например, межсайтовый скриптинг. Кроме того, данная опция может помешать работе других установленных расширений, изменяющих заголовок CSP."
+ },
+ "jssgroupWASMEnabled": {
+ "message": "Включено"
+ },
+ "jssgroupWASMEnabledDescription": {
+ "message": "Создавать малую ложь с помощью WebAssembly."
+ },
+ "JShelterOptions": {
+ "message": "Основные настройки JShelter",
+ "description": "Title of the main options page"
+ },
+ "mainSettings": {
+ "message": "Основные настройки",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "JShelterOptionsJSSFineTune": {
+ "message": "Детали щита Javascript: защита для каждого домена",
+ "description": "Title of the JS Shield details options page"
+ },
+ "jSSShieldDetails": {
+ "message": "Детали щита JS",
+ "description": "Displayed in options in the navigation bar, try to keep JS shield abbreviated to keep the text short"
+ },
+ "JShelterOptionsAdvanced": {
+ "message": "Экспертные настройки JShelter",
+ "description": "Title of the expert options page"
+ },
+ "advancedOptions": {
+ "message": "Экспертные настройки",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "externalLinks": {
+ "message": "Внешние ссылки",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "ExternalLinksSeparator": {
+ "message": " »",
+ "description": "Displayed in options in the navigation bar, for example after external links"
+ },
+ "threatModel": {
+ "message": "Модель угроз",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "fAQ": {
+ "message": "FAQ",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "testPage": {
+ "message": "Тестовая страница",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "permissions": {
+ "message": "Разрешения",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "sourceCode": {
+ "message": "Исходный код",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "issueTracker": {
+ "message": "Баг-трекер",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "credits": {
+ "message": "Авторы",
+ "description": "Displayed in options in the navigation bar"
+ },
+ "ExampleDomainsText": {
+ "message": "example.com или en.example.com",
+ "description": "Displayed in text inputs that expect a domain"
+ },
+ "ButtonSignExpandOneCharacterDown": {
+ "message": "⤵",
+ "description": "A button caption that can be used generically by JShelter, it should contain a single character that intuitively tells the user that by clicking the button, more information will be shown"
+ },
+ "ButtonSave": {
+ "message": "Сохранить",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRestore": {
+ "message": "Восстановить",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRestoreLevel": {
+ "message": "Восстановить уровень $LEVELNAME$",
+ "description": "A button caption that can be used generically by JShelter",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "Level name of the level to be restored, for example, Default"
+ }
+ }
+ },
+ "ButtonEdit": {
+ "message": "Редактировать",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonSaveCustomLevel": {
+ "message": "Сохранить пользовательский уровень",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonAddNewLevel": {
+ "message": "Добавить новый уровень",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonCancel": {
+ "message": "Отмена",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "ButtonRemove": {
+ "message": "Удалить",
+ "description": "A button caption that can be used generically by JShelter"
+ },
+ "addToList": {
+ "message": "Добавить в список",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "saveAll": {
+ "message": "Сохранить все",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "deleteAll": {
+ "message": "Удалить все",
+ "description": "A button caption that can be used generically by JShelter, atm it is displayed in JSS advanced options page"
+ },
+ "ManageWhitelist": {
+ "message": "Управление списком исключений ⤵",
+ "description": "A button caption that can be used generically by JShelter, e.g. to fine-tune NBS and FPD; Please indicate that the list would appear below (the arrow at the end)."
+ },
+ "HideWhitelist": {
+ "message": "Скрыть список исключений ⤵",
+ "description": "A button caption that can be used generically by JShelter, e.g. to fine-tune NBS and FPD; Please indicate that the list is located below (the arrow at the end)."
+ },
+ "ButtonDisableForDomain": {
+ "message": "<strong>$DISABLE$</strong> $FORTHEDOMAIN$",
+ "description": "A button caption that can be used generically by JShelter, e.g. in the options; if necessary, edit the structure of the message but make sure to emhasize the disablement. Translate the placeholders.",
+ "placeholders": {
+ "disable": {
+ "content": "Отключить",
+ "description": "Please translate"
+ },
+ "forTheDomain": {
+ "content": "для домена",
+ "description": "Please translate"
+ }
+ }
+ },
+ "ButtonEnableForSelectedDomains": {
+ "message": "<strong>$ENABLE$</strong> $FORTHEDOMAIN$",
+ "description": "A button caption that can be used generically by JShelter, e.g. in the options; if necessary, edit the structure of the message but make sure to emhasize the enablement. Translate the placeholders.",
+ "placeholders": {
+ "enable": {
+ "content": "Включить",
+ "description": "Please translate"
+ },
+ "forTheDomain": {
+ "content": "для выбранных доменов",
+ "description": "Please translate"
+ }
+ }
+ },
+ "ManageWhitelistDescription": {
+ "message": "Пожалуйста, имейте в виду, что данные доменные имена проверяются в соответствии с их иерархией, поэтому добавление в список исключений <strong>example.com</strong> также позволяет <strong>news.example.com</strong> обойти щит.",
+ "description": "Information text that can be used generically by JShelter, e.g. in options to explain the exception list of NBS and FPD."
+ },
+ "javascriptShieldDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><ul><li>$REDUCTION$</li><li>$FAKE$</li><li>$HIDE$</li></ul><p>$BLOGS$</p>",
+ "description": "This is the description of JSS shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Щит JavaScript изменяет поведение окружения JavaScript, доступного для посещаемых веб-страниц. JShelter подменяет информацию, чтобы ввести в заблуждение фингерпринтеры или сделать атаки, вызываемые веб-страницей, невозможными или более сложными.",
+ "description": "Paragraph 1, please translate this text."
+ },
+ "paragraph2": {
+ "content": "Внутри щит JavaScript состоит из оберток — небольших фрагментов кода, изменяющих оригинальное поведение JavaScript API (функцию или свойство), определенное стандартами. Поведение большинства оберток можно разделить на несколько категорий:",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "reduction": {
+ "content": "Снижение точности: оригинальное значение является слишком точным и в большинстве случаев не обязательно для использования. Щит JavaScript изменяет значения таким образом, что обычные и добросовестные случаи использования не затрагиваются.",
+ "description": "UL item 1, please translate this text."
+ },
+ "fake": {
+ "content": "Подмена информации: некоторые обертки подменяют информацию в основном для введения в заблуждение фингерпринтеров. Некоторые обертки выдают правдоподобные показания, не основанные на оригинальном значении. Другие обертки наделяют показания небольшими изменениями, обычно незаметными для человека, но значимыми для фингерпринтера. JShelter применяет данные изменения по-разному в каждой сессии и для каждого домена таким образом, что наблюдатель, управляющий несколькими доменами, не может использовать данную информацию для связывания браузера между ними. Например, обертки canvas изменяют изображение таким образом, что одни и те же инструкции выдают разный результат для разных доменов и в разных сессиях.",
+ "description": "UL item 2, please translate this text."
+ },
+ "hide": {
+ "content": "Скрытие информации: некоторые API выдают необязательную информацию, которую можно скрыть на большинстве страниц. В зависимости от API щит JavaScript может вернуть ошибку, пустое значение или полностью заблокировать API.",
+ "description": "UL item 3, please translate this text."
+ },
+ "blogs": {
+ "content": "Для получения более подробной информации читайте наш пост в блоге о <a href='https://jshelter.org/fingerprinting/'>мерах противодействия фингерпринтингу браузера</a> и <a href='https://jshelter.org/farbling/'>малой лжи</a>.",
+ "description": "Last paragraph, please translate this text, keep the URLs to the English version unless a translation exists on the web."
+ }
+ }
+ },
+ "JavascriptShieldLevelsMainLevelOptionHeading": {
+ "message": "Создать пользовательские уровни и задать уровень по умолчанию",
+ "description": "A heading in the options above the configuration of the default JSS level and the possibility to list existing levels and create own levels."
+ },
+ "addCustomLevel": {
+ "message": "Добавить пользовательский уровень",
+ "description": "A button caption, the button creates a custom JSS level."
+ },
+ "JSSL0Name": {
+ "message": "Выключить щит JavaScript",
+ "description": "The name of JSS L0 that is used at various places in the UI"
+ },
+ "JSSL0Description": {
+ "message": "Не включены обертки для API JavaScript. Используйте этот уровень, если вы (1) доверяете оператору посещаемого сайта/-ов и хотите дать ему доступ ко всем поддерживаемым браузером API, а также злоумышленникам, которые могут встроить код в доверенные страницы, или (2) если вам не нравится щит JavaScript, но вы хотите применить другие механизмы защиты.",
+ "description": "The description of JSS L0 that is used at various places in the UI"
+ },
+ "JSSL1Name": {
+ "message": "Выключить защиту от фингерпринтинга",
+ "description": "The name of JSS L1 that is used at various places in the UI"
+ },
+ "JSSL1Description": {
+ "message": "Применять меры противодействия, которые редко могут привести к поломке веб-страниц, но не защищают от фингерпринтинга. Отключить малоиспользуемые API. Используйте этот уровень, если детектор фингерпринтинга сообщает о низкой вероятности фингерпринтинга, вы доверяете посещаемому сервису и/или полагаете, что защита замедляет страницу или ломает ее, и ваше желание пользоваться сервисом гораздо выше желания быть защищенным.",
+ "description": "The description of JSS L1 that is used at various places in the UI, see also FingerprintQualityLabel label for the origin of 'the page called a low number of APIs misused for fingerprinting'"
+ },
+ "JSSL2Name": {
+ "message": "Рекомендуемый",
+ "description": "The name of JSS L2 that is used at various places in the UI"
+ },
+ "JSSL2Description": {
+ "message": "Изменять представление браузера по-разному для разных посещаемых доменов. Применять меры противодействия, которые редко могут привести к поломке веб-страниц. Слегка изменять результаты вызовов of API по-разному для разных доменов, что делает межсайтовый фингерпринтинг нестабильным. Значения, недобросовестно используемые для фингерпринтинга, также отличаются при каждом перезапуске браузера. Если вам нужен меняющийся фингерпринт для одного и того же веб-сайта без перезапуска, используйте режим инкогнито. Имейте в виду, что даже если вы разлогинитесь с сайта, очистите файлы cookie и измените IP-адрес, модифицированные API все равно дадут способ вычислить такой же фингерпринт. Если вы хотите изменить фингерпринт, перезапустите браузер. Если сомневаетесь, используйте этот уровень.",
+ "description": "The description of JSS L1 that is used at various places in the UI"
+ },
+ "JSSL3Name": {
+ "message": "Строгий",
+ "description": "The name of JSS L3 that is used at various places in the UI"
+ },
+ "JSSL3Description": {
+ "message": "Включить все неэкспериментальные меры защиты. API с включенными обертками выдают ложные значения. Некоторые API заблокированы полностью, другие выдают осмысленные, но редкие значения. Некоторые выдаваемые значения бессмысленны. Данный уровень может сделать вас уязвимым для фингерпринтинга, поскольку результаты вызовов API в основном изменяются одинаковым образом для всех веб-сайтов и в каждой сессии. Используйте этот уровень, если хотите ограничить объем информации, передаваемой браузером. Если вас волнует фингерпринтинг, убедитесь, что детектор фингерпринтинга включен.",
+ "description": "The description of JSS L2 that is used at various places in the UI"
+ },
+ "JSSLexperimentalName": {
+ "message": "Экспериментальный",
+ "description": "The name of JSS experimental level that is used at various places in the UI"
+ },
+ "JSSLexperimentalDescription": {
+ "message": "Строгий уровень защиты с включенными дополнительными обертками (включая те API, которые часто ломают страницы и работают неидеально). Используйте этот уровень, если хотите поэкспериментировать с JShelter. Для обычной работы используйте рекомендуемый или строгий уровни с включенным детектором фингерпринтинга.",
+ "description": "The description of JSS experimental level that is used at various places in the UI"
+ },
+ "omittedAPIsHeading": {
+ "message": "Имейте в виду, что для предотвращения фингерпринтинга JShelter не использует обертки для объектов, которые не определены. Ваш браузер не поддерживает:",
+ "description": "This message is displayed while giving the possibility to create a new level or edit existing levels in options"
+ },
+ "newLevelsNotRecommended": {
+ "message": "Мы не рекомендуем создавать собственные уровни и изменять конфигурацию, если вас волнует фингерпринтинг браузера. Пожалуйста, прочитайте <a href=\"$FAQURL$\">FAQ</a> и наши <a href=\"$PAPERURL$\">документы</a>. Создавая расхождения с конфигурацией других пользователей, вы облегчаете вашу реидентификацию.",
+ "description": "This message is displayed while creating a new level in options. Make sure that you keep correct HTML markup",
+ "placeholders": {
+ "faqurl": {
+ "content": "https://jshelter.org/faq/"
+ },
+ "paperurl": {
+ "content": "https://arxiv.org/abs/2204.01392"
+ }
+ }
+ },
+ "formlabelName": {
+ "message": "Название:",
+ "description": "Used in forms whenever a name should be enered (atm new level name)"
+ },
+ "formlabelDescription": {
+ "message": "Описание:",
+ "description": "Used in forms whenever a description should be enered (atm new level description)"
+ },
+ "customLevelAlreadyExistsItWillBeOverridden": {
+ "message": "Пользовательский уровень $CUSTOMNAME$ уже существует. Он будет перезаписан.",
+ "description": "Alert message shown during level editing, translate the message but not the placeholder",
+ "placeholders": {
+ "customName": {
+ "content": "$1",
+ "description": "The level name that is about to be overwritten, do not translate",
+ "example": "User provided value, any text"
+ }
+ }
+ },
+ "customLevelWereNotUpdated": {
+ "message": "Пользовательские уровни не были обновлены. Пожалуйста, попробуйте позже.",
+ "description": "The configuration with the chaged or new level was not saved because of unknown reason."
+ },
+ "NewLevelMissingNameOrDescription": {
+ "message": "Оба поля, \"Название\" и \"Описание\", обязательны для уровня. Пожалуйста, заполните их.",
+ "description": "User did not supply all mandatory fields for a JSS level"
+ },
+ "JSSeditLevelHeading": {
+ "message": "Изменить уровень $LEVELNAME$",
+ "description": "Heading shown during JSS tweaking (edit level form)",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "description": "The level name that is about to be overwritten, do not translate",
+ "example": "User provided value, any text"
+ }
+ }
+ },
+ "JSSaddLevelHeading": {
+ "message": "Добавить новый уровень",
+ "description": "Form heading during creation of a new level. You likely want to use the same or very similar value as ButtonAddNewLevel translation string."
+ },
+ "javaScriptShieldPerWebsiteConfiguration": {
+ "message": "Настройки щита JavaScript для веб-сайтов",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "setJavaScriptShieldForWebsite": {
+ "message": "Установить щит JavaScript Shield для веб-сайта:",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "aListOfWebsiteWithRedefinedJavaScriptShield": {
+ "message": "Список веб-сайтов с установленным щитом JavaScript:",
+ "description": "Displayed in JSS advanced options page"
+ },
+ "JSSAdvancedConfirmOverwrite": {
+ "message": "Настройки для домена $DOMAIN$ уже существуют и будут перезаписаны.",
+ "description": "Displayed in JSS advanced options page",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "The domain whose settings are about to be overwritten, like example.com"
+ }
+ }
+ },
+ "LevelAndDescription": {
+ "message": "$LEVELNAME$: $LEVELSHORTDESCRIPTION$",
+ "description": "Displayed in options pages in select elements to give the user an idea what level to apply by listing both its name and a short description",
+ "placeholders": {
+ "levelName": {
+ "content": "$1",
+ "example": "Name of the level"
+ },
+ "levelShortDescription": {
+ "content": "$2",
+ "example": "Short description of the level"
+ }
+ }
+ },
+ "doNotModifyThisConfiguration": {
+ "message": "ОСТОРОЖНО! Не изменяйте эти настройки, если не знаете, что делать.",
+ "description": "Displayed in expert settings"
+ },
+ "JShelterFullConfiguration": {
+ "message": "Все настройки JShelter в текстовом виде",
+ "description": "Displayed in expert settings, label for the full extension configuration in textarea"
+ },
+ "ExpertLoadCurrentlyStoredConfiguration": {
+ "message": "Загрузить текущие сохраненные настройки",
+ "description": "Displayed in expert settings, button that loads current configuration to the textarea"
+ },
+ "ExpertOverwriteConfiguration": {
+ "message": "Перезаписать настройки (сохраняет отображаемые настройки окончательно)",
+ "description": "Displayed in expert settings, button that stores the current configuration permanently"
+ },
+ "ExpertResetConfiguration": {
+ "message": "Сбросить настройки (удалить все пользовательские изменения)",
+ "description": "Displayed in expert settings, button that reset to the configuration that we ship (factory reset)"
+ },
+ "ExpertUndoConfiguration": {
+ "message": "Отменить (убрать последнюю перезапись настроек)",
+ "description": "Displayed in expert settings, button that restores the configuration to the previous (back button)"
+ },
+ "protectionConfigurationOptionActivatedOn": {
+ "message": "Вкл",
+ "description": "Displayed during NBS and FPD configuration when the option is activated (on)"
+ },
+ "protectionConfigurationOptionActivatedOff": {
+ "message": "Выкл",
+ "description": "Displayed during NBS and FPD configuration when the option is deactivated (off)"
+ },
+ "shieldNotifications": {
+ "message": "Уведомления",
+ "description": "Displayed as a text label during NBS and FPD configuration when the user can activate or deactivate notifications"
+ },
+ "NBSDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><p>$PARAGRAPH3$</p>",
+ "description": "This is the description of NBS shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Network Boundary Shield не позволяет посещенным веб-страницам использовать браузер в качестве прокси-сервера между общедоступным Интернетом и локальной сетью. См. <a href='https://jshelter.org/localportscanning/'>наш блог</a> и <a href='https://www.forcepoint.com/sites/default/files/resources/files. /report-attacking-internal-network-en_0.pdf'>Отчет Force Point</a> с примерами атак, отраженных Network Boundary Shield. Защита инкапсулирует API веб-запросов, поэтому он фиксирует все исходящие запросы.",
+ "description": "Paragraph 1, please translate this text, keep the URLs or replace them to a translated version of the targets."
+ },
+ "paragraph2": {
+ "content": "Обычно вы хотите заблокировать все подозрительные запросы с помощью щита границ сети. Однако некоторые страницы могут работать некорректно, поскольку требуют взаимодействия между Интернетом и локальной сетью. Например, некоторые информационные системы интранета могут быть заблокированы щитом границ сети. Пользователи JShelter также сообщили об увеличении частоты ложных срабатываний при использовании программ фильтрации по DNS. Если вы используете подобную, убедитесь, что DNS возвращает 0.0.0.0 для заблокированных доменов.",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "paragraph3": {
+ "content": "Поведение Network Boundary Shield по умолчанию можно глобально настроить с помощью настроек ниже. Network Boundary Shield также можно полностью отключить для каждого домена с помощью списка исключений. Доменам можно разрешить отправлять межсетевые запросы с помощью <i>переключателя Network Boundary Shield</i> во всплывающем окне или вручную с помощью параметра <i>Управление списком исключений</i>. Помните, что добавление домена в список исключений также позволяет его субдоменам выполнять межсетевые запросы. Чтобы выборочно отключить Network Boundary Shield, добавьте домены в список исключений (за исключением «www», но включая все остальные домены, например «.com»).",
+ "description": "Paragraph 3, please translate this text, note that <i>Manage exception list</i> refers to the ManageWhitelist string."
+ }
+ }
+ },
+ "NBSHttpProxyDNSAPINote": {
+ "message": "Если вы используете HTTP-прокси, NBS защитит локальную сеть прокси вместо вашей сети, поскольку прокси выполняет HTTP-запросы к назначенному адресу. Для предотвращения утечек DNS ваших запросов, инициированных с данного компьютера, щит границ сети не разрешает доменам DNS обнаруживать возможные межсетевые запросы. Однако щит границ сети защищает локальную сеть прокси для напрямую встроенных IP-адресов. Следовательно, щит границ сети защищает локальную сеть прокси только частично.",
+ "description": "This note is appended to NBS description in Firefox, see https://pagure.io/JShelter/webextension/issue/41 for the context of the issue"
+ },
+ "nbsBlocking": {
+ "message": "Блокировка",
+ "description": "Displayed during NBS configuration, label for a configuration option"
+ },
+ "nbsBlockingDescription": {
+ "message": "Блокировать запросы, пытающиеся достичь вашей локальной сети.",
+ "description": "Displayed during NBS configuration, basic explanation of the configuration option"
+ },
+ "nbsBlockingDescription2": {
+ "message": "ВАЖНО: в большинстве случаев мы рекомендуем включать блокировку запросов.",
+ "description": "Displayed during NBS configuration, further explanation of the configuration option"
+ },
+ "nbsBlockingOffDescription": {
+ "message": "Блокировка запросов выключена.",
+ "description": "Displayed during NBS configuration, further explanation of the selected configuration level"
+ },
+ "nbsBlockingOnDescription": {
+ "message": "Блокировка запросов включена.",
+ "description": "Displayed during NBS configuration, further explanation of the selected configuration level"
+ },
+ "NBSNotificationsDescription": {
+ "message": "Включать/выключать уведомления о подозрительных или заблокированных запросах.",
+ "description": "Displayed in NBS options, globaly disables or enables notifications"
+ },
+ "NBSNotificationsDescription2": {
+ "message": "Если уведомления включены: при включенной блокировке вы получите уведомления о заблокированных запросах; при выключенной блокировке вы получите уведомления о подозрительных запросах без попыток их предотвратить.",
+ "description": "Displayed in NBS options, globaly disables or enables notifications"
+ },
+ "NBSNotificationsOffDescription": {
+ "message": "Уведомления о блокировке выключены.",
+ "description": "Displayed in NBS options, notifications about blocked requests are globally disabled"
+ },
+ "NBSNotificationsOnDescription": {
+ "message": "Уведомления о блокировке включены.",
+ "description": "Displayed in NBS options, notifications about blocked requests are globally enabled"
+ },
+ "NBSBlockedTitle": {
+ "message": "Щит границ сети заблокировал подозрительные запросы!",
+ "description": "Title of the notifications that is displayed when NBS actually blocks requests"
+ },
+ "NBSDetectedTitle": {
+ "message": "Щит границ сети обнаружил подозрительные запросы!",
+ "description": "Title of the notifications that is displayed when NBS detects a suspicious requests but does not block them because blocking is disabled"
+ },
+ "NBSBlockedMessageMultipleTargets": {
+ "message": "Количество заблокированных запросов\nот $ORIGIN$,\nпытавшихся получить доступ\nк локальной сети: $COUNT$.",
+ "description": "The message shown when the page contacted multiple targets in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "count": {
+ "content": "$2",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSDetectedMessageMultipleTargets": {
+ "message": "Количество обнаруженных запросов\nот $ORIGIN$,\nпытавшихся получить доступ\nк локальной сети: $COUNT$.",
+ "description": "The message shown when the page contacted multiple targets in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "count": {
+ "content": "$2",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSBlockedMessageWithTarget": {
+ "message": "Заблокированные запросы: $COUNT$\nот $ORIGIN$\nк $TARGET$.",
+ "description": "The message shown when the page contacted single target in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "target": {
+ "content": "$2",
+ "description": "IP address (maybe domain), do not translate",
+ "example": "10.0.0.1"
+ },
+ "count": {
+ "content": "$3",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSDetectedMessageWithTarget": {
+ "message": "Обнаруженные запросы: $COUNT$\nот $ORIGIN$\nк $TARGET$.",
+ "description": "The message shown when the page contacted single target in the local network. Produce short lines.",
+ "placeholders": {
+ "origin": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ },
+ "target": {
+ "content": "$2",
+ "description": "IP address (maybe domain), do not translate",
+ "example": "10.0.0.1"
+ },
+ "count": {
+ "content": "$3",
+ "description": "A positive number, do not translate",
+ "example": "5"
+ }
+ }
+ },
+ "NBSBlockedHostTitle": {
+ "message": "Щит границ сети заблокировал сервер!",
+ "description": "Title of the notifications that is displayed when NBS blocks future requests by a host in Chromium-based browsers"
+ },
+ "NBSDetectedHostTitle": {
+ "message": "Щит границ сети обнаружил подозрительный сервер!",
+ "description": "Title of the notifications that is displayed when NBS detects suspicious requests by a host in Chromium-based browsers but does not block them because blocking is disabled"
+ },
+ "NBSBlockedHost": {
+ "message": "Все будущие HTTP-запросы от $HOST$ будут заблокированы.",
+ "description": "The message shown in Chromium-based browsers when NBS starts blocking a host.",
+ "placeholders": {
+ "host": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ }
+ }
+ },
+ "NBSDetectedHost": {
+ "message": "Чтобы заблокировать HTTP-запросы от $HOST$, включите блокировку.",
+ "description": "The message shown in Chromium-based browsers when NBS detects a suspicious host.",
+ "placeholders": {
+ "host": {
+ "content": "$1",
+ "description": "Domain name or IP address, do not translate",
+ "example": "domainname.example.com"
+ }
+ }
+ },
+ "FPDDescription": {
+ "message": "<p>$PARAGRAPH1$</p><p>$PARAGRAPH2$</p><p>$PARAGRAPH3$</p>",
+ "description": "This is the description of FPD shown in options. Please do not modify the template string in the message but translate the paragraphs in the placeholders section. If you find necessary, you can remove or add paragraphs.",
+ "placeholders": {
+ "paragraph1": {
+ "content": "Детектор фингерпринтинга предоставляет механизм информарования пользователя об активности фингерпринтинга на посещаемых веб-страницах. Детектор также не дает веб-страницам извлекать фингерпринт браузера по выбору пользователя. Читайте наш <a href='https://jshelter.org/fpdetection/'>пост в блоге</a> или <a href='https://arxiv.org/pdf/1905.01051.pdf'>\"Фингерпринтинг браузера: исследование\"</a> для получения более подробной информации о фингерпринтинге браузера.",
+ "description": "Paragraph 1, please translate this text, keep the URLs or replace them to a translated version of the targets."
+ },
+ "paragraph2": {
+ "content": "Если детектор включен, вы будете получать уведомления при обнаружении на веб-странице вызовов большого количества API, недобросовестно используемых для фингерпринтинга. Детектор подсчитывает и оценивает вызванные API для каждого посещения страницы согласно нашей эвристики. Количество вызываемых API, недобросовестно используемых для фингерпринтинга, представлено в виде значка цветом иконки JShelter и во всплывающем окне. При вызове страницей большого количества API фингерпринтинга может появиться уведомление. Вы можете посмотреть подробности об активности фингерпринтинга, сгенерировав отчет о фингерпринтинге. Доступ к нему можно получить во всплывающем окне или нажав прямо на уведомление.",
+ "description": "Paragraph 2, please translate this text."
+ },
+ "paragraph3": {
+ "content": "Поведение детектора фингерпринтинга по умолчанию можно настроить в соответствии с предпочтениями. Вы можете выбрать \"блокирующее\" поведение в качестве меры противодействия утечкам фингерпринта. В данном случае детектор фингерпринта блокирует все HTTP-запросы и очищает хранилища браузера при обнаружении вызовов страницей большого количества API фингерпринтинга. Поскольку <strong>данное действие в основном нарушает работу веб-страниц</strong>, мы рекомендуем создать список исключений для доверенных доменов. Выключение детектора для домена во всплывающем окне добавит домен в список исключений. В будущем этот домен не будет обрабатываться или блокироваться. Вы можете управлять всеми исключениями ниже.",
+ "description": "Paragraph 3, please translate this text."
+ }
+ }
+ },
+ "fpdBehavior": {
+ "message": "Поведение",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorDescription": {
+ "message": "Указать предпочитаемое поведение модуля.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorPassive": {
+ "message": "Пассивное",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorPassiveDescription": {
+ "message": "Использовать цвет значка иконки расширения для сообщения количества вызываемых посещаемой страницей API, которые могут быть недобросовестно используемы для фингерпринтинга.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorLimitedBlocking": {
+ "message": "Ограниченная блокировка",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorBlockingDescription": {
+ "message": "Разрешать расширению реагировать при вызове страницей большого количества API, недобросовестно используемых для фингерпринтинга.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorBlockingDescription2": {
+ "message": "• Прерывать сетевой трафик страницы для предотвращения возможной утечки фингерпринта.",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdBehaviorLimitedBlockingDescription3": {
+ "message": "• Очищать <strong>некоторые</strong> хранилища браузера страницы для удаления возможного кэша фингерпринта. (Дополнительные разрешения не требуются.)",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorLimitedBlockingDescription4": {
+ "message": "• Очищает: <strong>localStorage, sessionStorage, JS cookies, IndexedDB, caches, window.name</strong>",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorBlockingDescriptionWarning": {
+ "message": "ВАЖНО: поведение блокировки может нарушить некоторую функциональность на веб-сайтах с фингерпринтингом.",
+ "description": "Additional information to fpdBehaviorLimitedBlockingDescription"
+ },
+ "fpdBehaviorFullBlocking": {
+ "message": "Полная блокировка",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdBehaviorFullBlockingDescription3": {
+ "message": "• Очищать <strong>все</strong> доступные механизмы хранилищ страницы, где может располагаться кэш фингерпринта. (Требуется разрешение BrowsingData.)",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdBehaviorFullBlockingDescription4": {
+ "message": "• Очищает: <strong>localStorage, sessionStorage, cookies, IndexedDB, caches, window.name, fileSystems, WebSQL, serviceWorkers</strong>",
+ "description": "Additional information to fpdBehaviorBlockingDescription"
+ },
+ "fpdNotificationsDescription": {
+ "message": "Включать/выключать уведомления об обнаружении фингерпринтинга и блокировке HTTP-запросов.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsDescription2": {
+ "message": "ВАЖНО: мы рекомендуем включить уведомления для поведения блокировки.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsOffDescription": {
+ "message": "Уведомления об обнаружении/блокировке выключены.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdNotificationsOnDescription": {
+ "message": "Уведомления об обнаружении/блокировке включены.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetection": {
+ "message": "Обнаружение",
+ "description": "A label shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDescription": {
+ "message": "Настроить эвристические пороги, определяющие значительность количества вызываемых API, недобросовестно используемых для фингерпринтинга.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefault": {
+ "message": "По умолчанию",
+ "description": "Option shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription": {
+ "message": "Рекомендованная настройка для большинства пользователей.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription2": {
+ "message": "• Очень низкое количество ложноположительных обнаружений (сосредоточиться на явных случаях фингерпринтинга, очень низкое количество неразумно заблокированных сайтов)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdDetectionDefaultDescription3": {
+ "message": "• Приемлемое количество ложноположительных обнаружений (некоторые веб-сайты с фингерпринтингом могут обойти обнаружение)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrict": {
+ "message": "Строгий",
+ "description": "Option shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription": {
+ "message": "Опциональная настройка для более осторожных пользователей.",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription2": {
+ "message": "• Низкое количество ложноотрицательных обнаружений (также обнаруживает веб-сайты с менее избыточным фингерпринтингом)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "fpdStrictDescription3": {
+ "message": "• Более высокая вероятность ложноположительных обнаружений (в крайних случаях могут быть ложно заблокированы добросовестные веб-сайты)",
+ "description": "Text shown in options during configuaration of the parameters of FPD"
+ },
+ "FPDSeverityNone": {
+ "message": "Нет",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityLow": {
+ "message": "Низкий",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityModerate": {
+ "message": "Умеренный",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityHigh": {
+ "message": "Высокий",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "FPDSeverityVeryHigh": {
+ "message": "Очень высокий",
+ "description": "The level of the number of detected APIs misusable for fingerprinting"
+ },
+ "fpdBlockingSubsequent": {
+ "message": "Блокирует все дальнейшие запросы.",
+ "description": "Shown in a notification when FPD starts blocking HTTP requests"
+ },
+ "fpdClickNotificationDetails": {
+ "message": "Нажмите на уведомление, чтобы узнать больше подробностей.",
+ "description": "Shown in a notification when FPD detects a suspicious activity but is not configured to block"
+ },
+ "fpdNotificationMessage": {
+ "message": "$MESSAGE$\n\nСтраница: $PAGETITLE$\nСервер: $DOMAIN$",
+ "description": "Constructs the full message for the notification when FPD detects suspicious activity",
+ "placeholders": {
+ "message": {
+ "content": "$1",
+ "description": "Translated fpdBlockingSubsequent or fpdClickNotificationDetails",
+ "example": "Blocking all subsequent requests."
+ },
+ "pagetitle": {
+ "content": "$2",
+ "description": "The content of the title element of the fingerprinting page (in case it is long, only the start of the string)",
+ "example": "JShelter test page"
+ },
+ "domain": {
+ "content": "$3",
+ "description": "The domain of the visited page or IP address (taken from the URL bar)",
+ "example": "example.com"
+ }
+ }
+ },
+ "fpdNotificationTitle": {
+ "message": "Обнаружена активность фингерпринтинга!",
+ "description": "Title of a notification"
+ },
+ "FPDReportTitle": {
+ "message": "Отчет детектора фингерпринтинга",
+ "description": "Title of a fingeprint report"
+ },
+ "FPDReportDescriptionPara1": {
+ "message": "Данный отчет перечисляет все конечные точки JavaScript API, запрашиваемые веб-страницей и считающиеся релевантными для фингерпринтинга браузера. Детектор фингерпринтинга (ДФ) использует эти данные для принятия решения о том, может ли страница собирать фингерпринт браузера.",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon"
+ },
+ "FPDReportDescriptionPara2": {
+ "message": "ДФ обрабатывает вызовы API по группам, основанным на их семантических свойствах. В данном окне показано количество обнаруженных вызовов API на посещаемой странице. По умолчанию показываются только группы, доступ к которым был как минимум один раз. Поэтому отчет может быть пустым, если страница не запрашивала никакие API для фингерпринтинга. Если вы хотите увидеть все API, которые мониторит ДФ, нажмите $STARTTAG$ здесь $ENDTAG$",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon",
+ "placeholders": {
+ "starttag": {
+ "content": "<span id='unhideAll'>",
+ "description": "Please keep the tag as is, do not translate"
+ },
+ "endtag": {
+ "content": "</span>",
+ "description": "Please keep the tag as is, do not translate"
+ }
+ }
+ },
+ "FPDReportDescriptionPara3": {
+ "message": "Вы можете экспортировать полный отчет ДФ, содержащий все данные, собранные и использованные ДФ для оценки страницы. Данный всеобъемлющий отчет показывает важность, присвоенную группам/конечным точкам ($NOTE1$). Он также перечисляет все запрошенные конечные точки API с соответствующими аргументами ($NOTE2$).",
+ "description": "Explanation text in the report, it can be shown by clicking on the help icon",
+ "placeholders": {
+ "note1": {
+ "content": "<i>fpd_evaluation_statistics</i>",
+ "description": "Please keep as is, do not translate"
+ },
+ "note2": {
+ "content": "<i>fpd_access_logs</i>",
+ "description": "Please keep as is, do not translate"
+ }
+ }
+ },
+ "FPDReportShowDetails": {
+ "message": "Показать подробности",
+ "description": "Button caption"
+ },
+ "FPDReportHideDetails": {
+ "message": "Скрыть подробности",
+ "description": "Button caption"
+ },
+ "FPDReportExportJSON": {
+ "message": "Экспортировать полный отчет ДФ в формате JSON",
+ "description": "Button caption"
+ },
+ "FPDReportMissingData": {
+ "message": "ОШИБКА: отсутствуют данные, невозможно создать отчет! Попробуйте перезагрузить страницу и открыть отчет заново.",
+ "description": "Text shown if the windows cannot communicate with the internals of the extension"
+ }
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/background.js b/data/extensions/jsr@javascriptrestrictor/background.js
index ab7cac9..019b76c 100644
--- a/data/extensions/jsr@javascriptrestrictor/background.js
+++ b/data/extensions/jsr@javascriptrestrictor/background.js
@@ -3,6 +3,7 @@
*
* \author Copyright (C) 2019 Libor Polcak
* \author Copyright (C) 2019 Martin Timko
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
*/
@@ -43,13 +44,62 @@ function tabUpdate(tabid, changeInfo) {
if (url === undefined) {
return wrapping_groups.empty_level;
}
- let current_level = getCurrentLevelJSON(url)[0];
+ let current_level = getCurrentLevelJSON(url);
tab_urls[tabid] = url;
return current_level;
}
// on tab reload or tab change, update metadata
browser.tabs.onUpdated.addListener(tabUpdate); // reload tab
+const scriptSrcRegex = /script-src\s/;
+// Modify CSP headers to allow WASM execution in page context
+function cspRequestProcessor(details) {
+ // Because this handler fires before configuration for the page is created,
+ // we need to search for the configuration for that domain now.
+ let subDomains = extractSubDomains(getEffectiveDomain(details.url));
+ let found = false;
+ for (let domain of subDomains.reverse()) {
+ if (domain in domains) {
+ found = true;
+ if (domains[domain].wasm !== 2) {
+ return {};
+ }
+ break;
+ }
+ }
+ // If no configuration is found, use the default level.
+ if (!found && default_level.wasm !== 2) {
+ return {};
+ }
+
+ let modified = false;
+ let headers = details.responseHeaders;
+ for (let header of headers) {
+ let name = header.name.toLowerCase();
+ if (name !== "content-security-policy" &&
+ name !== "content-security-policy-report-only" &&
+ name !== "x-webkit-csp") {
+ continue;
+ }
+ let origCSP = header.value;
+ header.value = header.value.replace(scriptSrcRegex, "script-src 'wasm-unsafe-eval' ");
+ if (origCSP !== header.value) {
+ modified = true;
+ }
+ }
+ return modified ? {responseHeaders: headers} : {};
+}
+// Attach listener only in chromium where the WASM module is instantiated directly in
+// page context, subject to the page's CSP. Code inserted as script tags isn't subject
+// to script-src origins, it is, however, subject to the 'unsafe' group of script evaluation rules.
+if (typeof browser_polyfill_used !== "undefined" && browser_polyfill_used) {
+ browser.webRequest.onHeadersReceived.addListener(cspRequestProcessor,
+ {urls: ["<all_urls>"],
+ types: ["main_frame", "sub_frame"]},
+ ["blocking", "responseHeaders"]
+ );
+}
+
// Communication channels
/**
@@ -61,9 +111,14 @@ browser.tabs.onUpdated.addListener(tabUpdate); // reload tab
*/
async function connected(port) {
if (port.name === "port_from_popup") {
- /// We always send back current level
- let [tab] = await browser.tabs.query(queryInfo);
- let current_level = tabUpdate(tab.id, tab.url);
+ let current_level = wrapping_groups.empty_level;
+ try {
+ // We always send back current level
+ let [tab] = await browser.tabs.query(queryInfo);
+ current_level = getCurrentLevelJSON(tab.url);
+ } catch (e) {
+ // Stick to the empty_level and ignore the exception
+ }
port.postMessage(current_level);
port.onMessage.addListener(function(msg) {
port.postMessage(current_level);
diff --git a/data/extensions/jsr@javascriptrestrictor/code_builders.js b/data/extensions/jsr@javascriptrestrictor/code_builders.js
index 8173c43..c73da36 100644
--- a/data/extensions/jsr@javascriptrestrictor/code_builders.js
+++ b/data/extensions/jsr@javascriptrestrictor/code_builders.js
@@ -4,6 +4,7 @@
* \author Copyright (C) 2019 Libor Polcak
* \author Copyright (C) 2021 Giorgio Maone
* \author Copyright (C) 2022 Marek Salon
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
*/
@@ -45,16 +46,12 @@ function enclose_wrapping2(code, name, params, call_with_window) {
*/
function create_counter_call(wrapper, type) {
let {parent_object, parent_object_property} = wrapper;
- let updateCount = `${parent_object}.${parent_object_property}`;
-
- if ("update_count" in wrapper) {
- if (typeof wrapper.update_count === "string") updateCount = wrapper.update_count;
- }
-
- return updateCount ? `if (fp_enabled && fp_${type}_count < 1000) {
- updateCount(${JSON.stringify(updateCount)}, "${type}", args.map(x => JSON.stringify(x)));
+ let resource = `${parent_object}.${parent_object_property}`;
+ let args = wrapper.report_args ? "args.map(x => JSON.stringify(x))" : "[]"
+ return `if (fp_enabled && fp_${type}_count < 1000) {
+ updateCount(${JSON.stringify(resource)}, "${type}", ${args});
fp_${type}_count += 1;
- }` : "";
+ }`;
}
/**
@@ -92,30 +89,35 @@ function define_page_context_function(wrapper) {
else {
code += `${wrapper.wrapping_function_body}`
}
-
code += `
};
- if (WrapHelper.XRAY) {
- let innerF = replacementF;
- replacementF = function(...args) {
+ `;
- // prepare callbacks
- args = args.map(a => typeof a === "function" ? WrapHelper.pageAPI(a) : a);
+ if (typeof browser_polyfill_used === "undefined") {
+ code += `
+ let innerF = replacementF;
+ replacementF = function(...args) {
- let ret = WrapHelper.forPage(innerF.call(this, ...args));
- if (ret) {
- if (ret instanceof xrayWindow.Promise || ret instanceof WrapHelper.unX(xrayWindow).Promise) {
- ret = Promise.resolve(ret);
+ // prepare callbacks
+ args = args.map(a => typeof a === "function" ? WrapHelper.pageAPI(a) : a);
+
+ let ret = WrapHelper.forPage(innerF.call(this, ...args));
+ if (ret) {
+ if (ret instanceof xrayWindow.Promise || ret instanceof WrapHelper.unX(xrayWindow).Promise) {
+ ret = Promise.resolve(ret);
+ }
+ try {
+ ret = WrapHelper.unX(ret);
+ } catch (e) {}
}
- try {
- ret = WrapHelper.unX(ret);
- } catch (e) {}
- }
- return ret;
- }
+ return ret;
+ };
+ `;
}
- exportFunction(replacementF, ${parent_object}, {defineAs: '${parent_object_property}'});
- ${wrapper.post_replacement_code || ''}`
+ code += `
+ exportFunction(replacementF, ${parent_object}, {defineAs: '${parent_object_property}'});
+ ${wrapper.post_replacement_code || ''}
+ `;
return enclose_wrapping2(code, wrapper.wrapping_code_function_name, wrapper.wrapping_code_function_params, wrapper.wrapping_code_function_call_window);
}
@@ -146,23 +148,7 @@ function generate_object_properties(code_spec_obj, fpd_only) {
}
code += `
{
- let obj = ${code_spec_obj.parent_object};
- let prop = "${code_spec_obj.parent_object_property}";
- let descriptor = Object.getOwnPropertyDescriptor(obj, prop);
- if (!descriptor) {
- // let's traverse the prototype chain in search of this property
- for (let proto = Object.getPrototypeOf(obj); proto; proto = Object.getPrototypeOf(obj)) {
- if (descriptor = Object.getOwnPropertyDescriptor(proto, prop)) {
- obj = WrapHelper.unX(obj);
- break;
- }
- }
- if (!descriptor) descriptor = {
- // Originally not a descriptor, fallback
- enumerable: true,
- configurable: true,
- };
- }
+ let descriptor = WrapHelper.getDescriptor(${code_spec_obj.parent_object}, "${code_spec_obj.parent_object_property}");
`
for (let wrap_spec of code_spec_obj.wrapped_properties) {
// variable name used for distinguishing between different original properties of the same wrapper
@@ -329,11 +315,13 @@ var build_code = function(wrapper, ...args) {
Object.setPrototypeOf(${target}, ${source});
}`;
}
- code += `
- if (${wrapper.freeze}) {
- Object.freeze(${wrapper.parent_object}.${wrapper.parent_object_property});
- }
- `;
+ if (wrapper.freeze !== undefined) {
+ code += `
+ if (${wrapper.freeze}) {
+ Object.freeze(${wrapper.parent_object}.${wrapper.parent_object_property});
+ }
+ `;
+ }
return enclose_wrapping(code, ...args);
};
@@ -367,6 +355,80 @@ let joinWrappingCode = code => {
}
/**
+ * Insert WebAssembly initialization code into wrapped injection code.
+ */
+function insert_wasm_code(code) {
+ let wasm_code = (() => {
+ const wasm_memory = new WebAssembly.Memory({initial: 1});
+ // Memory layout:
+ // +-----------------+--------------+----------+---------------------------------------- - -
+ // | CRC table | Xoring table | Reserved | Data
+ // | 256 * u16 | 8 * u32 | |
+ // +-----------------+--------------+----------+---------------------------------------- - -
+ // 0 512 544 1024
+ const crc_offset = 0;
+ const xoring_offset = 512;
+ const reserved_offset = 544;
+ const data_offset = 1024;
+
+ WebAssembly.instantiateStreaming(fetch("/* WASM_URL */"), {env: {memory: wasm_memory}}).then(result => {
+ new Uint16Array(wasm_memory.buffer, crc_offset, crc16_table.length).set(crc16_table);
+ const xoring = new Uint32Array(wasm_memory.buffer, xoring_offset, 8);
+ for (let i = 0; i < 64; i += 8) {
+ xoring[i / 8] = parseInt(domainHash.slice(i, i + 8), 16) >>> 0;
+ }
+
+ wasm = {
+ // Getter and setter for data in WASM memory. Because we need access from page context,
+ // we can't just get a memory view and use it directly. The view needs to be exported to be
+ // usable in the page context on Firefox.
+ // This means that views returned by wasm.get() aren't actually views of the WASM memory,
+ // but rather copies of the data and modifying them won't affect the underlying memory.
+ // We can't export the wasm memory directly either, it is bound to the WASM instance and
+ // it's not possible to export the instance as well.
+ // For constructing views of the correct type, we can't use constructors passed from page context,
+ // a content script constructor must be used. For now, we use just 2 types, so passing a bool
+ // to differentiate is enough.
+ get(length, offset = 0, float = false) {
+ if (float) {
+ return WrapHelper.forPage(new Float32Array(wasm_memory.buffer, data_offset + offset, length));
+ } else {
+ return WrapHelper.forPage(new Uint8Array(wasm_memory.buffer, data_offset + offset, length));
+ }
+ },
+ set(data, offset = 0, float = false) {
+ if (float) {
+ new Float32Array(wasm_memory.buffer, data_offset + offset, data.length).set(data);
+ } else {
+ new Uint8Array(wasm_memory.buffer, data_offset + offset, data.length).set(data);
+ }
+ },
+ // Grow the WASM memory if needed.
+ grow(needed_bytes) {
+ const memory_size = wasm_memory.buffer.byteLength;
+ needed_bytes += data_offset;
+ if (memory_size < needed_bytes) {
+ try {
+ wasm_memory.grow(Math.ceil((needed_bytes - memory_size) / 65536));
+ } catch (e) {
+ return false;
+ }
+ }
+ return true;
+ },
+ // Make WASM exported functions available to wrappers.
+ ...result.instance.exports,
+ ready: true
+ }
+ Object.freeze(wasm);
+ }).catch(e => {
+ });
+ }).toString().replace("/* WASM_URL */", browser.runtime.getURL("farble.wasm"));
+
+ return code.replace("// WASM_CODE //", `(${wasm_code})()`);
+}
+
+/**
* Append wrapped codes to NSCL helpers and create injectable code.
*/
function generate_code(wrapped_code) {
@@ -619,6 +681,24 @@ function generate_code(wrapped_code) {
}
return descriptors ? this.defineProperties(obj, descriptors) && obj : obj;
},
+ getDescriptor(obj, prop) {
+ let descriptor = Object.getOwnPropertyDescriptor(obj, prop);
+ if (!descriptor) {
+ // let's traverse the prototype chain in search of this property
+ for (let proto = Object.getPrototypeOf(obj); proto; proto = Object.getPrototypeOf(obj)) {
+ if (descriptor = Object.getOwnPropertyDescriptor(proto, prop)) {
+ obj = unX(obj);
+ break;
+ }
+ }
+ if (!descriptor) descriptor = {
+ // Originally not a descriptor, fallback
+ enumerable: true,
+ configurable: true,
+ };
+ }
+ return descriptor;
+ },
// WrapHelper.overlay(obj, data)
// Proxies the prototype of the obj object in order to return the properties of the data object
@@ -640,6 +720,12 @@ function generate_code(wrapped_code) {
Object.freeze(WrapHelper);
}
+ // The object available to wrappers later containing farbling WASM optmitimized functions if enabled
+ let wasm = Object.freeze({ready: false});
+
+ // Farbling WebAssembly module initialization placeholder
+ // WASM_CODE //
+
with(unwrappedWindow) {
let window = unwrappedWindow;
let {Proxy} = WrapHelper;
diff --git a/data/extensions/jsr@javascriptrestrictor/common.css b/data/extensions/jsr@javascriptrestrictor/common.css
index 6b0c0a4..dbc3c81 100644
--- a/data/extensions/jsr@javascriptrestrictor/common.css
+++ b/data/extensions/jsr@javascriptrestrictor/common.css
@@ -78,6 +78,10 @@ button:hover {
color: var(--button-text-hover-color);
}
+#levels-list button {
+ margin: 0.5ex;
+}
+
h1, h2, h3, h4, h5, h6 {
color: var(--title-color);
}
@@ -178,7 +182,7 @@ a:hover, a:active {
-webkit-transition: .4s;
transition: .4s;
color: var(--off-color);
- content:"OFF";
+ content:"__MSG_ShieldOffSlider__";
}
input:checked + .slider {
@@ -193,7 +197,7 @@ input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
- content:"ON";
+ content:"__MSG_ShieldOnSlider__";
color: var(--slider-text-color);
}
diff --git a/data/extensions/jsr@javascriptrestrictor/crc16.js b/data/extensions/jsr@javascriptrestrictor/crc16.js
index 3ebff44..7d05af2 100644
--- a/data/extensions/jsr@javascriptrestrictor/crc16.js
+++ b/data/extensions/jsr@javascriptrestrictor/crc16.js
@@ -43,32 +43,31 @@
// THE SOFTWARE.
var crc16 = `
-var crc16_table = undefined;
+var crc16_table = [
+ 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741,
+ 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
+ 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941,
+ 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
+ 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341,
+ 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
+ 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40,
+ 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
+ 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41,
+ 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
+ 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141,
+ 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
+ 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41,
+ 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
+ 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541,
+ 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
+ 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741,
+ 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
+ 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941,
+ 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
+ 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341,
+ 0x4100, 0x81c1, 0x8081, 0x4040,
+];
function CRC16() {
- crc16_table = crc16_table || [
- 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741,
- 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
- 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941,
- 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
- 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341,
- 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
- 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40,
- 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
- 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41,
- 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
- 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141,
- 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
- 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41,
- 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
- 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541,
- 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
- 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741,
- 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
- 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941,
- 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
- 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341,
- 0x4100, 0x81c1, 0x8081, 0x4040,
- ];
this.crc = 0;
}
CRC16.prototype = {
diff --git a/data/extensions/jsr@javascriptrestrictor/document_start.js b/data/extensions/jsr@javascriptrestrictor/document_start.js
index 71d3119..62e4a64 100644
--- a/data/extensions/jsr@javascriptrestrictor/document_start.js
+++ b/data/extensions/jsr@javascriptrestrictor/document_start.js
@@ -5,6 +5,7 @@
* \author Copyright (C) 2021 Matus Svancar
* \author Copyright (C) 2021 Giorgio Maone
* \author Copyright (C) 2021 Marek Salon
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
*/
@@ -25,10 +26,9 @@
var wrappersPort;
var pageConfiguration = null;
-function configureInjection({currentLevel, code, wrappers, domainHash, sessionHash}) {
+function configureInjection({currentLevel, fpdWrappers, domainHash}) {
if (pageConfiguration) return; // one shot
pageConfiguration = {currentLevel};
- if (!code) return true; // nothing to wrap, bail out!
if(browser.extension.inIncognitoContext){
// Redefine the domainHash for incognito context:
// Compute the SHA256 hash of the original hash so that the incognito hash is:
@@ -39,6 +39,24 @@ function configureInjection({currentLevel, code, wrappers, domainHash, sessionHa
hash.update(JSON.stringify(domainHash));
domainHash = hash.hex();
}
+ // Append argument reporting setting to JSS wrapper definitions
+ fp_append_reporting_to_jss_wrappers(fpdWrappers);
+ // Generate wrapping code
+ var code = wrap_code(currentLevel.wrappers);
+ // Generate FPD wrapping code
+ if (fpdWrappers) {
+ if (!code) {
+ code = fp_generate_wrapping_code(fpdWrappers);
+ }
+ else {
+ code = fp_update_wrapping_code(code, currentLevel.wrappers, fpdWrappers);
+ }
+ }
+ // Insert farbling WASM module into wrapped code if enabled, only when farbling is actually used
+ if (currentLevel.wasm && (currentLevel.audiobuffer === 1 || currentLevel.htmlcanvaselement === 1)) {
+ code = insert_wasm_code(code);
+ }
+
var aleaCode = `(() => {
var domainHash = ${JSON.stringify(domainHash)};
${crc16}
@@ -67,6 +85,12 @@ function configureInjection({currentLevel, code, wrappers, domainHash, sessionHa
return false;
}
+/**
+ * See https://pagure.io/JShelter/paper2022/c/a7e7e88edecfa19c3a52542b553bf1dc9b4388a9?branch=cnil,
+ * https://pagure.io/JShelter/webextension/issue/70 and
+ * https://pagure.io/JShelter/webextension/issue/46#comment-793783
+ * for more information on the early injection mechanism.
+ */
if ("configuration" in window) {
configureInjection(configuration);
} else {
diff --git a/data/extensions/jsr@javascriptrestrictor/farble.wasm b/data/extensions/jsr@javascriptrestrictor/farble.wasm
new file mode 100644
index 0000000..24ae8a8
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/farble.wasm
Binary files differ
diff --git a/data/extensions/jsr@javascriptrestrictor/fp_code_builders.js b/data/extensions/jsr@javascriptrestrictor/fp_code_builders.js
index 4378a84..02467fa 100644
--- a/data/extensions/jsr@javascriptrestrictor/fp_code_builders.js
+++ b/data/extensions/jsr@javascriptrestrictor/fp_code_builders.js
@@ -2,6 +2,7 @@
* \brief Functions that help to automate process of building wrapping code for FPD module
*
* \author Copyright (C) 2021 Marek Salon
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
*/
@@ -19,28 +20,6 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
-/** \file
- *
- * \brief This file is part of Fingerprint Detector (FPD) and contains helper functions for automated wrappers creation.
- * File also contains loading routine for FPD configuration files (groups-lvl_X.json, wrappers-lvl_X.json, etc...).
- *
- * \ingroup FPD
- */
-
-//DEF_FPD_FILES_S
-var fp_config_files = ["groups-lvl_0", "groups-lvl_1", "wrappers-lvl_0_1"]
-//DEF_FPD_FILES_E
-
-/**
- * The object carrying code for builded FPD wrappers
- */
-var fp_wrapped_codes = {};
-
-/**
- * Object containing parsed input from JSON configuration files of FPD module.
- */
-var fp_levels = {};
-
/**
* Additional wrappers for specialized purposes.
*/
@@ -113,92 +92,46 @@ var additional_wrappers = [
}
]
-/// \cond (Exclude this section from the doxygen documentation. If this section is not excluded, it is documented as a separate function.)
-{
- // parse input files into fp_levels for each level, generate wrapping code and initialize FPD module
- let loadFpdConfig = async () => {
- for (let file of fp_config_files) {
- try {
- let config = JSON.parse(await readFile(browser.runtime.getURL(`fp_config/${file}.json`)));
- let file_splitted = file.split("-");
- let file_levels = file_splitted[1].split("_").filter(x => x != 'lvl');
- fp_levels[file_splitted[0]] = fp_levels[file_splitted[0]] || {};
- for (let level of file_levels) {
- fp_levels[file_splitted[0]][level] = config;
- }
- }
- catch (e) {
- console.error(e);
- }
+/**
+ * The function that generates wrapping code from FPD wrappers when JSS hasn't wrapped anything.
+ *
+ * \param fpd_wrappers Array of wrappers defined by FPD configuration.
+ *
+ * \returns Injectable code created from FPD wrappers.
+ */
+function fp_generate_from_wrappers(fpd_wrappers) {
+ // define wrapper for each FPD endpoint (using default JSS definition of wrappers)
+ let tmp_build_wrapping_code = {};
+ for (let wrap_item of fpd_wrappers) {
+ if (wrap_item[1]) { // wrap_item.type === "property"
+ tmp_build_wrapping_code[wrap_item[0]] = fp_build_property_wrapper(wrap_item);
}
-
- // merge duplicit entries of the same resource to be wrapped only once
- let mergeWrappers = (sameResources) => {
- let mergeGroups = () => {
- let accArray = [];
- for (let resource of sameResources) {
- accArray.push(...resource.groups);
- }
- return accArray;
- }
-
- return {
- resource: sameResources[0].resource,
- type: sameResources[0].type,
- groups: mergeGroups()
- }
+ else { // wrap_item.type === "function"
+ tmp_build_wrapping_code[wrap_item[0]] = fp_build_function_wrapper(wrap_item);
}
+ }
- for (let level in fp_levels.wrappers) {
- let tmpWrappers = {};
- for (let wrapper of fp_levels.wrappers[level]) {
- if (!Object.keys(tmpWrappers).includes(wrapper.resource)) {
- let sameResources = fp_levels.wrappers[level].filter(x => x.resource == wrapper.resource);
- tmpWrappers[wrapper.resource] = mergeWrappers(sameResources);
- }
- }
- fp_levels.wrappers[level] = Object.values(tmpWrappers);
+ // if there is an additional wrapper for resource, overwrite default definition with it
+ for (let additional_item of additional_wrappers) {
+ let { parent_object, parent_object_property } = additional_item;
+ let resource = `${parent_object}.${parent_object_property}`;
+ if (resource in tmp_build_wrapping_code) {
+ tmp_build_wrapping_code[resource] = additional_item;
}
+ }
- for (let level in fp_levels.wrappers) {
- // define wrapper for each FPD endpoint (using default JSS definition of wrappers)
- let tmp_build_wrapping_code = {};
- for (let wrap_item of fp_levels.wrappers[level]) {
- if (wrap_item.type == "property") {
- tmp_build_wrapping_code[wrap_item.resource] = fp_build_property_wrapper(wrap_item);
- }
- else if (wrap_item.type == "function") {
- tmp_build_wrapping_code[wrap_item.resource] = fp_build_function_wrapper(wrap_item);
- }
- }
-
- // if there is an additional wrapper for resource, overwrite default definition with it
- for (let additional_item of additional_wrappers) {
- let { parent_object, parent_object_property } = additional_item;
- let resource = `${parent_object}.${parent_object_property}`;
- if (resource in tmp_build_wrapping_code) {
- tmp_build_wrapping_code[resource] = additional_item;
- }
- }
-
- // transform each wrapper to wrapping code and index it in memory for quick access
- fp_wrapped_codes[level] = {};
- for (let build_item in tmp_build_wrapping_code) {
- try {
- fp_wrapped_codes[level][build_item] = build_code(tmp_build_wrapping_code[build_item]);
- } catch (e) {
- console.error(e);
- fp_wrapped_codes[level][build_item] = "";
- }
- }
+ // transform each wrapper to wrapping code
+ let fp_wrapped_codes = {};
+ for (let build_item in tmp_build_wrapping_code) {
+ try {
+ fp_wrapped_codes[build_item] = build_code(tmp_build_wrapping_code[build_item]);
+ } catch (e) {
+ console.error(e);
+ fp_wrapped_codes[build_item] = "";
}
-
- // initialize FPD module (background script and event listeners)
- initFpd();
}
- loadFpdConfig();
+ return fp_wrapped_codes;
}
-/// \endcond
/**
* The function that appends FPD wrappers into injectable code, if JSS hasn't wrapped certain FPD endpoints already.
@@ -209,26 +142,24 @@ var additional_wrappers = [
*
* \returns Modified injectable code that also contains FPD wrapping code.
*/
-function fp_update_wrapping_code(code, jss_wrappers, fpd_level) {
- let fpd_wrappers = Object.keys(fp_wrapped_codes[fpd_level])
- .filter(key => !jss_wrappers.map(x => x[0]).includes(key))
- .reduce((obj, key) => {
- obj[key] = fp_wrapped_codes[fpd_level][key];
- return obj;
- }, {});
- let fpd_code = joinWrappingCode(Object.values(fpd_wrappers));
+function fp_update_wrapping_code(code, jss_wrappers, fpd_wrappers) {
+ const jss_wrapper_resources = jss_wrappers.map(x => x[0]);
+ const fpd_wrappers_filtered = fpd_wrappers.filter(w => !jss_wrapper_resources.includes(w[0]));
+ const fpd_wrapped_codes = fp_generate_from_wrappers(fpd_wrappers_filtered);
+ const fpd_code = joinWrappingCode(Object.values(fpd_wrapped_codes));
return code.replace("// FPD_S\n", `// FPD_S\n ${fpd_code}`);
}
/**
* The function that creates injectable code specifically for FPD wrappers in case that JSS hasn't wrapped anything.
*
- * \param fpd_level Identifier of the current FPD level/config.
+ * \param fpd_wrappers Array of wrappers defined by FPD configuration.
*
* \returns Injectable code containing only FPD wrapping code.
*/
-function fp_generate_wrapping_code(fpd_level) {
- return generate_code("// FPD_S\n" + joinWrappingCode(Object.values(fp_wrapped_codes[fpd_level])) + "\n// FPD_E");
+function fp_generate_wrapping_code(fpd_wrappers) {
+ let fpd_wrapped_codes = fp_generate_from_wrappers(fpd_wrappers);
+ return generate_code("// FPD_S\n" + joinWrappingCode(Object.values(fpd_wrapped_codes)) + "\n// FPD_E");
}
/**
@@ -240,10 +171,10 @@ function fp_generate_wrapping_code(fpd_level) {
* \returns Object consisting of two properties (path, name) for given resource.
*/
function split_resource(text) {
- var index = text.lastIndexOf('.');
- return {
+ var index = text.lastIndexOf('.');
+ return {
path: text.slice(0, index),
- name: text.slice(index + 1)
+ name: text.slice(index + 1)
}
}
@@ -257,14 +188,10 @@ function split_resource(text) {
function fp_build_property_wrapper(wrap_item) {
// return object initialization
var wrapper_object = {};
-
- // get unique array of property types (set, get), if property not defined => implicit get
- var propTypes = Array.from(new Set(wrap_item.groups.map(
- (x) => { return x.property != undefined ? x.property : "get" })));
// if properties to wrap exist, create property wrapper based on wrap_item input
- if (propTypes.size != 0) {
- var resource_splitted = split_resource(wrap_item.resource);
+ if (wrap_item[2].size != 0) {
+ var resource_splitted = split_resource(wrap_item[0]);
wrapper_object = {
parent_object: resource_splitted["path"],
parent_object_property: resource_splitted["name"],
@@ -276,19 +203,20 @@ function fp_build_property_wrapper(wrap_item) {
parent_object_property: resource_splitted["name"],
wrapped_objects: [],
wrapped_properties: [],
+ report_args: wrap_item[3],
}
],
};
// create post_wrapping_code to wrap every property type
- for (let type of propTypes) {
+ for (let type of wrap_item[2]) {
// save original resource - get property from descriptor, if do not exists, save it directly
wrapper_object.post_wrapping_code[0].wrapped_objects.push({
original_name: `
Object.getOwnPropertyDescriptor(${resource_splitted["path"]}, "${resource_splitted["name"]}") ?
Object.getOwnPropertyDescriptor(${resource_splitted["path"]}, "${resource_splitted["name"]}")["${type}"] :
- ${type == "get" ? wrap_item.resource : undefined}
+ ${type == "get" ? wrap_item[0] : undefined}
`,
wrapped_name: `originalD_${type}`,
});
@@ -313,8 +241,8 @@ function fp_build_property_wrapper(wrap_item) {
* \returns New declarative function wrapper supported by code_builder (same structure as explicitly defined wrappers).
*/
function fp_build_function_wrapper(wrap_item) {
- var resource_splitted = split_resource(wrap_item.resource);
-
+ var resource_splitted = split_resource(wrap_item[0]);
+
var wrapper_object = {
parent_object: resource_splitted["path"],
parent_object_property: resource_splitted["name"],
@@ -325,11 +253,37 @@ function fp_build_function_wrapper(wrap_item) {
wrapped_name: `originalF_${resource_splitted["name"]}`
}],
wrapping_function_args: "...args",
-
+
// call original function on return with same arguments and context (do not change semantics)
wrapping_function_body: `
return originalF_${resource_splitted["name"]}.call(this, ...args);
`,
+ report_args: wrap_item[3],
};
return wrapper_object;
}
+
+/**
+ * The function that adds argument reporting settings to every JSS wrapper definition where specified by FPD configuration.
+ * This is for removing unnecessary reporting of arguments in cases where the arguments may be large
+ * (such as arrays for image/audio data), which results in their slow synchronous serialization.
+ *
+ * \param fpd_wrappers Array of wrappers defined by FPD configuration.
+ */
+function fp_append_reporting_to_jss_wrappers(fpd_wrappers) {
+ const resources_with_reporting = new Set(fpd_wrappers.map(w => w[3] ? w[0] : undefined));
+ resources_with_reporting.delete(undefined);
+ function append_reporting(wrapper) {
+ let {parent_object, parent_object_property} = wrapper;
+ let resource = `${parent_object}.${parent_object_property}`;
+ wrapper.report_args = resources_with_reporting.has(resource);
+ }
+
+ for (let wrapper of Object.values(build_wrapping_code)) {
+ append_reporting(wrapper);
+ if (wrapper.post_wrapping_code) {
+ // Objects wrapped in post wrapping code might be tracked as well
+ Object.values(wrapper.post_wrapping_code).forEach(append_reporting);
+ }
+ }
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_0.json b/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_0.json
index 34fa563..8e657a1 100644
--- a/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_0.json
+++ b/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_0.json
@@ -2,11 +2,11 @@
"name":"FingerprintingActivity",
"description":"Definition of fingerprinting behavior by FPD module.",
"severity": [
- [0, "None", "#3CA519"],
- [1, "Low", "#80B012"],
- [2, "Moderate", "#CD9600"],
- [3, "High", "#E64B19"],
- [5, "Very High", "#C8004B"]
+ [0, "FPDSeverityNone", "#3CA519"],
+ [1, "FPDSeverityLow", "#80B012"],
+ [2, "FPDSeverityModerate", "#CD9600"],
+ [3, "FPDSeverityHigh", "#E64B19"],
+ [5, "FPDSeverityVeryHigh", "#C8004B"]
],
"criteria":[
{
@@ -405,4 +405,4 @@
]
}
]
-} \ No newline at end of file
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_1.json b/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_1.json
index 47f5939..66d7b38 100644
--- a/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_1.json
+++ b/data/extensions/jsr@javascriptrestrictor/fp_config/groups-lvl_1.json
@@ -2,11 +2,11 @@
"name":"FingerprintingActivity",
"description":"Definition of fingerprinting behavior by FPD module.",
"severity": [
- [0, "None", "#3CA519"],
- [1, "Low", "#80B012"],
- [2, "Moderate", "#CD9600"],
- [3, "High", "#E64B19"],
- [5, "Very High", "#C8004B"]
+ [0, "FPDSeverityNone", "#3CA519"],
+ [1, "FPDSeverityLow", "#80B012"],
+ [2, "FPDSeverityModerate", "#CD9600"],
+ [3, "FPDSeverityHigh", "#E64B19"],
+ [5, "FPDSeverityVeryHigh", "#C8004B"]
],
"criteria":[
{
@@ -405,4 +405,4 @@
]
}
]
-} \ No newline at end of file
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/fp_detect_background.js b/data/extensions/jsr@javascriptrestrictor/fp_detect_background.js
index c1a0d87..8b3e3bf 100644
--- a/data/extensions/jsr@javascriptrestrictor/fp_detect_background.js
+++ b/data/extensions/jsr@javascriptrestrictor/fp_detect_background.js
@@ -115,78 +115,78 @@ var availableTabs = {};
*/
const FPD_DEF_SETTINGS = {
behavior: {
- description: "Specify preffered behavior of the module.",
+ label: browser.i18n.getMessage("fpdBehavior"),
+ description: browser.i18n.getMessage("fpdBehaviorDescription"),
description2: [],
- label: "Behavior",
params: [
{
// 0
- short: "Passive",
- description: "Use extension icon badge color to signalize likelihood of ongoing fingerprinting without any interaction."
+ short: browser.i18n.getMessage("fpdBehaviorPassive"),
+ description: browser.i18n.getMessage("fpdBehaviorPassiveDescription")
},
{
// 1
- short: "Limited Blocking",
- description: "Allow the extension to react whenever there is a high likelihood of fingerprinting.",
+ short: browser.i18n.getMessage("fpdBehaviorLimitedBlocking"),
+ description: browser.i18n.getMessage("fpdBehaviorBlockingDescription"),
description2: [
- "• Interrupt network traffic for the page to prevent possible fingerprint leakage.",
- "• Clear some browser storage of the page to remove possibly cached fingerprint. (<strong>No additional permissions required.</strong>)",
- "• Clearing: <strong>localStorage, sessionStorage, JS cookies, IndexedDB, caches, window.name</strong>",
- "NOTE: Blocking behavior may break some functionality on fingerprinting websites."
+ browser.i18n.getMessage("fpdBehaviorBlockingDescription2"),
+ browser.i18n.getMessage("fpdBehaviorLimitedBlockingDescription3"),
+ browser.i18n.getMessage("fpdBehaviorLimitedBlockingDescription4"),
+ browser.i18n.getMessage("fpdBehaviorBlockingDescriptionWarning")
]
},
{
// 2
- short: "Full Blocking",
- description: "Allow the extension to react whenever there is a high likelihood of fingerprinting.",
+ short: browser.i18n.getMessage("fpdBehaviorFullBlocking"),
+ description: browser.i18n.getMessage("fpdBehaviorBlockingDescription"),
description2: [
- "• Interrupt network traffic for the page to prevent possible fingerprint leakage.",
- "• Clear <strong>all</strong> available storage mechanisms of the page where fingerprint may be cached. (Requires <strong>BrowsingData</strong> permission.)",
- "• Clearing: <strong>localStorage, sessionStorage, cookies, IndexedDB, caches, window.name, fileSystems, WebSQL, serviceWorkers</strong>",
- "NOTE: Blocking behavior may break some functionality on fingerprinting websites."
+ browser.i18n.getMessage("fpdBehaviorBlockingDescription2"),
+ browser.i18n.getMessage("fpdBehaviorFullBlockingDescription3"),
+ browser.i18n.getMessage("fpdBehaviorFullBlockingDescription4"),
+ browser.i18n.getMessage("fpdBehaviorBlockingDescriptionWarning")
],
permissions: ["browsingData"]
}
]
},
notifications: {
- description: "Turn on/off notifications about fingerprinting detection and HTTP requests blocking.",
- description2: ["NOTE: We recommend having notifications turned on for blocking behavior."],
- label: "Notifications",
+ label: browser.i18n.getMessage("shieldNotifications"),
+ description: browser.i18n.getMessage("fpdNotificationsDescription"),
+ description2: [browser.i18n.getMessage("fpdNotificationsDescription2")],
params: [
{
// 0
- short: "Off",
- description: "Detection/blocking notifications turned off."
+ short: browser.i18n.getMessage("protectionConfigurationOptionActivatedOff"),
+ description: browser.i18n.getMessage("fpdNotificationsOffDescription")
},
{
// 1
- short: "On",
- description: "Detection/blocking notifications turned on."
+ short: browser.i18n.getMessage("protectionConfigurationOptionActivatedOn"),
+ description: browser.i18n.getMessage("fpdNotificationsOnDescription")
}
]
},
detection: {
- description: "Adjust heuristic thresholds which determine likelihood of fingerprinting.",
+ label: browser.i18n.getMessage("fpdDetection"),
+ description: browser.i18n.getMessage("fpdDetectionDescription"),
description2: [],
- label: "Detection",
params: [
{
// 0
- short: "Default",
- description: "Recommended setting for most users.",
+ short: browser.i18n.getMessage("fpdDetectionDefault"),
+ description: browser.i18n.getMessage("fpdDetectionDefaultDescription"),
description2: [
- "• Very low number of false positive detections (focus on excessive fingerprinting, very low number of unreasonably blocked sites)",
- "• Acceptable amount of false negative detections (some fingerprinting websites may get around detection)",
+ browser.i18n.getMessage("fpdDetectionDefaultDescription2"),
+ browser.i18n.getMessage("fpdDetectionDefaultDescription3"),
]
},
{
// 1
- short: "Strict",
- description: "Optional setting for more cautious users.",
+ short: browser.i18n.getMessage("fpdStrict"),
+ description: browser.i18n.getMessage("fpdStrictDescription"),
description2: [
- "• Lower number of false negative detections (detects also websites with less excessive fingerprinting)",
- "• Higher probability of false positive detections (in edge cases benign websites may be falsely blocked)",
+ browser.i18n.getMessage("fpdStrictDescription2"),
+ browser.i18n.getMessage("fpdStrictDescription3")
]
}
]
@@ -209,6 +209,11 @@ function initFpd() {
for (let groupsLevel in fp_levels.groups) {
fpGroups[groupsLevel] = fpGroups[groupsLevel] || {};
processGroupsRecursive(fp_levels.groups[groupsLevel], groupsLevel);
+
+ // Translate severity names
+ for (record of fp_levels.groups[groupsLevel].severity) {
+ record[1] = browser.i18n.getMessage(record[1]);
+ }
}
// load configuration and settings from storage
@@ -954,19 +959,22 @@ function isFpdOn(tabId) {
function notifyFingerprintBlocking(tabId) {
let msg;
if (fpdSettings.behavior > 0) {
- msg = "Blocking all subsequent requests.";
+ msg = browser.i18n.getMessage("fpdBlockingSubsequent");
}
if (fpdSettings.behavior == 0) {
- msg = "Click the notification for more details.";
+ msg = browser.i18n.getMessage("fpdClickNotificationDetails");
}
browser.notifications.create("fpd-" + tabId, {
type: "basic",
iconUrl: browser.runtime.getURL("img/icon-48.png"),
- title: "Fingerprinting activity detected!",
- message: `${msg}\n\n` +
- `Page: ${availableTabs[tabId].title.slice(0, 30)}\n` +
- `Host: ${getEffectiveDomain(availableTabs[tabId].url)}`
+ title: browser.i18n.getMessage("fpdNotificationTitle"),
+ message: browser.i18n.getMessage("fpdNotificationMessage",
+ [
+ msg,
+ availableTabs[tabId].title.slice(0, 30),
+ getEffectiveDomain(availableTabs[tabId].url)
+ ])
});
setTimeout(() => {
browser.notifications.clear("fpd-" + tabId);
@@ -1119,3 +1127,19 @@ function clearStorageFacilities(url) {
}
}
}
+
+/**
+ * The function splitting resource string into path and name.
+ * For example: "window.navigator.userAgent" => path: "window.navigator", name: "userAgent"
+ *
+ * \param wrappers text String representing full name of resource.
+ *
+ * \returns Object consisting of two properties (path, name) for given resource.
+ */
+function split_resource(text) {
+ var index = text.lastIndexOf('.');
+ return {
+ path: text.slice(0, index),
+ name: text.slice(index + 1)
+ }
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/fp_levels.js b/data/extensions/jsr@javascriptrestrictor/fp_levels.js
new file mode 100644
index 0000000..bfe7124
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/fp_levels.js
@@ -0,0 +1,111 @@
+/** \file
+ * \brief FPD module initial configuration
+ *
+ * \author Copyright (C) 2021 Marek Salon
+ * \author Copyright (C) 2023 Martin Zmitko
+ *
+ * \license SPDX-License-Identifier: GPL-3.0-or-later
+ */
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+//
+
+/** \file
+ *
+ * \brief This file is part of Fingerprint Detector (FPD) and contains the function for loading configuration files.
+ *
+ * \ingroup FPD
+ */
+
+//DEF_FPD_FILES_S
+var fp_config_files = ["groups-lvl_0", "groups-lvl_1", "wrappers-lvl_0_1"]
+//DEF_FPD_FILES_E
+
+/**
+ * Object containing parsed input from JSON configuration files of FPD module.
+ */
+var fp_levels = {};
+
+/// \cond (Exclude this section from the doxygen documentation. If this section is not excluded, it is documented as a separate function.)
+{
+ // parse input files into fp_levels for each level, generate wrapping code and initialize FPD module
+ let loadFpdConfig = async () => {
+ for (let file of fp_config_files) {
+ try {
+ let config = JSON.parse(await readFile(browser.runtime.getURL(`fp_config/${file}.json`)));
+ let file_splitted = file.split("-");
+ let file_levels = file_splitted[1].split("_").filter(x => x != 'lvl');
+ fp_levels[file_splitted[0]] = fp_levels[file_splitted[0]] || {};
+ for (let level of file_levels) {
+ fp_levels[file_splitted[0]][level] = config;
+ }
+ }
+ catch (e) {
+ console.error(e);
+ }
+ }
+
+ // merge duplicit entries of the same resource to be wrapped only once
+ let mergeWrappers = (sameResources) => {
+ let mergeGroups = () => {
+ let accArray = [];
+ for (let resource of sameResources) {
+ accArray.push(...resource.groups);
+ }
+ return accArray;
+ }
+
+ return {
+ resource: sameResources[0].resource,
+ type: sameResources[0].type,
+ groups: mergeGroups()
+ }
+ }
+
+ fp_levels.page_wrappers = [];
+ for (let level in fp_levels.wrappers) {
+ let tmpWrappers = {};
+ for (let wrapper of fp_levels.wrappers[level]) {
+ if (!Object.keys(tmpWrappers).includes(wrapper.resource)) {
+ let sameResources = fp_levels.wrappers[level].filter(x => x.resource == wrapper.resource);
+ tmpWrappers[wrapper.resource] = mergeWrappers(sameResources);
+ }
+ }
+ fp_levels.wrappers[level] = Object.values(tmpWrappers);
+
+ // Save FPD wrappers for page configuration
+ fp_levels.page_wrappers[level] = fp_levels.wrappers[level].map(w => [
+ // Wrapped object name
+ w.resource,
+ // Wrapped object type (0 - function, 1 - property)
+ w.type === "property" ? 1 : 0,
+ // Array specifying property types to wrap (getter, setter or both)
+ Array.from(new Set(w.groups.map(x => x.property != undefined ? x.property : "get"))),
+ // Specify if arguments should be sent for evaulation
+ w.groups.some(group => "arguments" in group) ? 1 : 0,
+ ]);
+ }
+
+ // initialize FPD module (background script and event listeners)
+ initFpd();
+
+ fp_levels_initialised = true;
+ if (levels_initialised) { // Wait for both levels_initialised and fp_levels_initialised
+ var orig_levels_updated_callbacks = levels_updated_callbacks;
+ levels_updated_callbacks = [];
+ orig_levels_updated_callbacks.forEach((it) => it());
+ }
+ }
+ loadFpdConfig();
+}
+/// \endcond
diff --git a/data/extensions/jsr@javascriptrestrictor/fp_report.html b/data/extensions/jsr@javascriptrestrictor/fp_report.html
index 63ac3fc..0541ce3 100644
--- a/data/extensions/jsr@javascriptrestrictor/fp_report.html
+++ b/data/extensions/jsr@javascriptrestrictor/fp_report.html
@@ -10,28 +10,27 @@ SPDX-License-Identifier: GPL-3.0-or-later
<link rel="stylesheet" type="text/css" href="common.css">
<link rel="stylesheet" type="text/css" href="fp_report.css">
<script src="/nscl/lib/browser-polyfill.js" type="text/javascript"></script>
- <script src="fp_report.js" type="text/javascript"></script>
+ <script src="i18n_translate_dom.js" type="text/javascript" defer></script>
+ <script src="fp_report.js" type="text/javascript" defer></script>
+ <title data-localize="FPDReportTitle">JShelter FPD report</title>
</head>
<body>
<header>
<div>
- <h3 id="titletext">
+ <h3 id="titletext" data-localize="FPDReportTitle">
FingerPrint Detector Report
- <button id="help" class="help">
- ?
- </button>
</h3>
- <p class="description hidden">
+ <p class="description hidden" data-localize="FPDReportDescriptionPara1">
This report lists all JavaScript API endpoints that were accessed by the web page and are considered critical in terms of browser fingerprinting.
Fingerprint Detector (FPD) uses this data to decide whether the page is collecting a browser fingerprint.
</p>
- <p class="description hidden">
+ <p class="description hidden" data-localize="FPDReportDescriptionPara2" htmltranslation>
FPD processes API calls in groups based on their semantic properties. This window shows the detected number of API calls on the visited page.
The default view shows only groups accessed at least once. This way the report can be empty if the page did not access any fingerprintable API.
If you want to see all APIs monitored by FPD, click <span id="unhideAll">here</span>.
</p>
- <p class="description hidden">
+ <p class="description hidden" data-localize="FPDReportDescriptionPara3" htmltranslation>
You can export full FPD Report that contains all the data collected and used by FPD to evaluate the page. This comprehensive report
shows the current weights assigned to the groups/endpoints (<i>fpd_evaluation_statistics</i>). It also lists all accessed API endpoints
with corresponding arguments (<i>fpd_access_logs</i>).
@@ -45,8 +44,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
</header>
<div id="fpd-report">
- <button id="showBtn" class="sticky-button">Show details</button>
- <button id="exportBtn" class="sticky-button">
+ <button id="showBtn" class="sticky-button" data-localize="FPDReportShowDetails">Show details</button>
+ <button id="hideBtn" class="sticky-button hidden" data-localize="FPDReportHideDetails">Hide details</button>
+ <button id="exportBtn" class="sticky-button" data-localize="FPDReportExportJSON">
Export full FPD Report as JSON
</button>
</div>
diff --git a/data/extensions/jsr@javascriptrestrictor/fp_report.js b/data/extensions/jsr@javascriptrestrictor/fp_report.js
index 77b65ae..2606dc9 100644
--- a/data/extensions/jsr@javascriptrestrictor/fp_report.js
+++ b/data/extensions/jsr@javascriptrestrictor/fp_report.js
@@ -44,7 +44,7 @@ function createReport(data) {
var {tabObj, groups, latestEvals, fpDb, exceptionWrappers} = data;
var report = document.getElementById("fpd-report");
if (!tabObj || !groups || !groups.root || !groups.all || !fpDb || !latestEvals) {
- report.innerHTML = "ERROR: Missing data, cannot create report! Try to reload the page and reopen the report."
+ report.innerHTML = browser.i18n.getMessage("FPDReportMissingData");
return;
}
@@ -168,14 +168,19 @@ function createReport(data) {
// show resources for every group in FPD report
let showAll = (event) => {
for (let element of document.querySelectorAll(".fpd-group > h4")) {
- if (event.target.innerText == "Show details") {
- element.classList.remove("hidden");
- }
- else {
- element.classList.add("hidden");
- }
+ element.classList.remove("hidden");
+ }
+ showBtn.classList.add("hidden");
+ hideBtn.classList.remove("hidden");
+ }
+
+ // hide resources for every group in FPD report
+ let hideDetails = (event) => {
+ for (let element of document.querySelectorAll(".fpd-group > h4")) {
+ element.classList.add("hidden");
}
- event.target.innerText = event.target.innerText == "Show details" ? "Hide details" : "Show details";
+ showBtn.classList.remove("hidden");
+ hideBtn.classList.add("hidden");
}
// show description/help for the report
@@ -209,7 +214,9 @@ function createReport(data) {
}
document.getElementById("showBtn").addEventListener("click", showAll);
+ document.getElementById("hideBtn").addEventListener("click", hideDetails);
document.getElementById("exportBtn").addEventListener("click", exportReport.bind(null, `fpd_report_${url}.json`))
+ document.getElementById("titletext").innerHTML += '<button id="help" class="help">?</button>';
document.getElementById("help").addEventListener("click", showDescription);
document.getElementById("unhideAll").addEventListener("click", showNotAccessed);
}
diff --git a/data/extensions/jsr@javascriptrestrictor/helpers.js b/data/extensions/jsr@javascriptrestrictor/helpers.js
index 6396790..caf65a9 100644
--- a/data/extensions/jsr@javascriptrestrictor/helpers.js
+++ b/data/extensions/jsr@javascriptrestrictor/helpers.js
@@ -146,19 +146,6 @@ function shuffleArray(array) {
[array[i], array[j]] = [array[j], array[i]];
}
}
-/**
- * \brief makes number from substring of given string - should work as reinterpret_cast
- * \param str String
- * \param length Number specifying substring length
- */
-function strToUint(str, length){
- var sub = str.substring(0,length);
- var ret = "";
- for (var i = sub.length-1; i >= 0; i--) {
- ret += ((sub[i].charCodeAt(0)).toString(2).padStart(8, "0"));
- }
- return "0b"+ret;
-};
/**
* \brief Asynchronously sleep for given number of milliseconds
@@ -223,10 +210,15 @@ Observable.prototype = {
*/
function create_short_text(text, LIMIT) {
if (text.length > LIMIT) {
- let remove_parentheses = / \([^)]*\)/;;
+ let remove_parentheses = / \([^)]*\)/;
text = text.replace(remove_parentheses, "");
let sentences = text.split(".");
- sentences = sentences.map(s => s + ".");
+ sentences = sentences.map(function (s) {
+ if (s.length === 0) {
+ return s;
+ }
+ return s + ".";
+ });
let done = false;
text = sentences.reduce(function (acc, current) {
if (!done) {
diff --git a/data/extensions/jsr@javascriptrestrictor/http_shield_common.js b/data/extensions/jsr@javascriptrestrictor/http_shield_common.js
index 29705f7..53f13ba 100644
--- a/data/extensions/jsr@javascriptrestrictor/http_shield_common.js
+++ b/data/extensions/jsr@javascriptrestrictor/http_shield_common.js
@@ -89,36 +89,36 @@ var nbsNotifications = {};
*/
const NBS_DEF_SETTINGS = {
blocking: {
- description: "Block requests that are trying to access your local network.",
- description2: ["NOTE: We recommend having requests blocking turned on in most cases. However, you can opt in to be only notified without any protection."],
- label: "Blocking",
+ label: browser.i18n.getMessage("nbsBlocking"),
+ description: browser.i18n.getMessage("nbsBlockingDescription"),
+ description2: [browser.i18n.getMessage("nbsBlockingDescription2")],
params: [
{
// 0
- short: "Off",
- description: "Requests blocking turned off."
+ short: browser.i18n.getMessage("protectionConfigurationOptionActivatedOff"),
+ description: browser.i18n.getMessage("nbsBlockingOffDescription")
},
{
// 1
- short: "On",
- description: "Requests blocking turned on."
+ short: browser.i18n.getMessage("protectionConfigurationOptionActivatedOn"),
+ description: browser.i18n.getMessage("nbsBlockingOnDescription")
}
]
},
notifications: {
- description: "Turn on/off notifications about suspicious requests or hosts being blocked.",
- description2: [],
- label: "Notifications",
+ label: browser.i18n.getMessage("shieldNotifications"),
+ description: browser.i18n.getMessage("NBSNotificationsDescription"),
+ description2: [browser.i18n.getMessage("NBSNotificationsDescription2")],
params: [
{
// 0
- short: "Off",
- description: "Blocking notifications turned off."
+ short: browser.i18n.getMessage("protectionConfigurationOptionActivatedOff"),
+ description: browser.i18n.getMessage("NBSNotificationsOffDescription")
},
{
// 1
- short: "On",
- description: "Blocking notifications turned on."
+ short: browser.i18n.getMessage("protectionConfigurationOptionActivatedOn"),
+ description: browser.i18n.getMessage("NBSNotificationsOnDescription")
}
]
}
@@ -552,18 +552,25 @@ async function createCumulativeNotification(tabId) {
*/
function showNbsNotification(tabId) {
nbsNotifications[tabId].last = nbsNotifications[tabId].total;
- let host = getEffectiveDomain(availableTabs[tabId].url);
- let message = `${nbsSettings.blocking ? "Blocked" : "Detected"} ${nbsNotifications[tabId].total} attempts from ${host} to access local network.`;
+ let message;
let records = Object.keys(nbsNotifications[tabId].records);
if (records.length == 1) {
+ // The page contacted just one target, display both host and target
let [origin, target] = records[0].split(",");
let count = nbsNotifications[tabId].records[records[0]];
- message = `${nbsSettings.blocking ? "Blocked" : "Detected"} ${count} request${count == 1 ? "" : "s"} from ${origin} to ${target}.`;
+ let params = [origin, target, count];
+ message = nbsSettings.blocking ? browser.i18n.getMessage("NBSBlockedMessageWithTarget", params) : browser.i18n.getMessage("NBSDetectedMessageWithTarget", params);
+ }
+ else {
+ // The page contacted multiple targets, display just the host
+ let host = getEffectiveDomain(availableTabs[tabId].url);
+ let params = [host, nbsNotifications[tabId].total];
+ message = nbsSettings.blocking ? browser.i18n.getMessage("NBSBlockedMessageMultipleTargets", params) : browser.i18n.getMessage("NBSDetectedMessageMultipleTargets", params);
}
browser.notifications.create("nbs-" + tabId, {
"type": "basic",
"iconUrl": browser.runtime.getURL("img/icon-48.png"),
- "title": `Network Boundary Shield ${nbsSettings.blocking ? "blocked" : "detected"} suspicious requests!`,
+ "title": nbsSettings.blocking ? browser.i18n.getMessage("NBSBlockedTitle") : browser.i18n.getMessage("NBSDetectedTitle"),
"message": message
});
setTimeout(() => {
diff --git a/data/extensions/jsr@javascriptrestrictor/http_shield_firefox.js b/data/extensions/jsr@javascriptrestrictor/http_shield_firefox.js
index 56e5459..44ddfc8 100644
--- a/data/extensions/jsr@javascriptrestrictor/http_shield_firefox.js
+++ b/data/extensions/jsr@javascriptrestrictor/http_shield_firefox.js
@@ -31,7 +31,9 @@
* and handle messages (on message event).
*
* NBS for Firefox uses the DNS web extension API to resolve domain names. As the domain names are
- * cached and needs to be resolved without NBS, the performance impact should be negligible.
+ * cached and needs to be resolved without NBS, the performance impact should be negligible. The DNS
+ * API is not used for proxied requests to prevent DNS leaks of resolutions that would be initiated
+ * by the DNS proxy. See https://pagure.io/JShelter/webextension/issue/41 for more details.
*/
/**
@@ -65,6 +67,9 @@ async function beforeSendHeadersListener(requestDetail)
var sourceResolution = "";
var blockNotifications = false;
+ const {proxyInfo} = requestDetail; // see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/proxy/ProxyInfo
+ const dnsAllowed = !(proxyInfo && (proxyInfo.type && proxyInfo.type.startsWith("http") || proxyInfo.proxyDNS));
+
//Host found among user's trusted hosts, allow it right away
if (isNbsWhitelisted(sourceDomain))
{
@@ -90,9 +95,9 @@ async function beforeSendHeadersListener(requestDetail)
isSourcePrivate = true;
}
}
- else //SOURCE is hostname
- {
- //Resoluting DNS query for source domain
+ else if (dnsAllowed) //SOURCE is hostname
+ {
+ //Resolving DNS query for source domain
sourceResolution = browser.dns.resolve(fullSourceDomain).then((val) =>
{
//Assigning source IPs
@@ -143,9 +148,9 @@ async function beforeSendHeadersListener(requestDetail)
}
}
}
- else //Target is hostname
+ else if (dnsAllowed) //Target is hostname
{
- //Resoluting DNS query for destination domain
+ //Resolving DNS query for destination domain
destinationResolution = browser.dns.resolve(fullTargetDomain).then((val) =>
{
//Assigning source IPs
diff --git a/data/extensions/jsr@javascriptrestrictor/i18n_translate_dom.js b/data/extensions/jsr@javascriptrestrictor/i18n_translate_dom.js
new file mode 100644
index 0000000..9cd01de
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/i18n_translate_dom.js
@@ -0,0 +1,46 @@
+/** \file
+ * \brief JS code that retrieves all HTML files with data-localize attributes and localizes them
+ *
+ * \author Copyright (C) 2022 TotalCaesar659
+ *
+ * See https://github.com/polcak/jsrestrictor/pull/189 for the origins of the code.
+ *
+ * \license SPDX-License-Identifier: GPL-3.0-or-later
+ */
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+//
+
+function localizeHTMLelement(e) {
+ const translateStringName = e.dataset.localize;
+ if (translateStringName) {
+ const translated = browser.i18n.getMessage(translateStringName);
+ if (translated) {
+ if (e.hasAttribute("htmltranslation")) {
+ e.innerHTML = translated;
+ }
+ else {
+ e.innerText = translated;
+ }
+ }
+ }
+}
+
+const textElements = document.querySelectorAll('[data-localize]');
+textElements.forEach(localizeHTMLelement);
+
+const templates = document.getElementsByTagName("template");
+for (t of templates) {
+ t.content.querySelectorAll('[data-localize]').forEach(localizeHTMLelement);
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/level_cache.js b/data/extensions/jsr@javascriptrestrictor/level_cache.js
index b0bef17..a094827 100644
--- a/data/extensions/jsr@javascriptrestrictor/level_cache.js
+++ b/data/extensions/jsr@javascriptrestrictor/level_cache.js
@@ -4,6 +4,7 @@
* \author Copyright (C) 2020 Libor Polcak
* \author Copyright (C) 2021 Giorgio Maone
* \author Copyright (C) 2022 Marek Salon
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
*/
@@ -27,13 +28,11 @@
* @param {url} string
* @param isPrivate bool specifying incognito mode
*/
-
-
function getContentConfiguration(url, frameId, tabId) {
return new Promise(resolve => {
function resolve_promise() {
let level = getCurrentLevelJSON(url);
- if (level[0].is_default && frameId !== 0) {
+ if (level.is_default && frameId !== 0) {
/**
* \bug iframes nested within an iframe with user-specific level do not get this level
*
@@ -59,26 +58,16 @@ function getContentConfiguration(url, frameId, tabId) {
* gets the user-defined settings for domain B but the iframe from domain C
* is set with the level of domain A.
*/
- level = getCurrentLevelJSON(TabCache.get(tabId).url);
+ level = getCurrentLevelJSON(TabCache.get(tabId).url);
}
- let [{wrappers}, code] = level;
let {domainHash} = Hashes.getFor(url);
- if (isFpdOn(tabId)) {
- if (!code) {
- code = fp_generate_wrapping_code(fpdSettings.detection);
- }
- else {
- code = fp_update_wrapping_code(code, wrappers, fpdSettings.detection);
- }
- }
resolve({
- currentLevel: level[0],
- code,
- wrappers,
+ currentLevel: level,
+ fpdWrappers: isFpdOn(tabId) ? fp_levels.page_wrappers[fpdSettings.detection] : [],
domainHash
});
}
- if (levels_initialised === true) {
+ if (levels_initialised && fp_levels_initialised) {
resolve_promise();
}
else {
@@ -129,6 +118,7 @@ DocStartInjection.register(async ({url, frameId, tabId}) => {
*/
NavCache.onUrlChanged.addListener(({tabId, frameId, previousUrl, url}) => {
if (getSiteForURL(previousUrl) === getSiteForURL(url)) return;
+ if (previousUrl === undefined) return; // First page in this window, see https://pagure.io/JShelter/webextension/issue/116#comment-875070
(async () => {
let configuration = await getContentConfiguration(url, frameId, tabId);
if (configuration.currentLevel.windowname) {
diff --git a/data/extensions/jsr@javascriptrestrictor/levels.js b/data/extensions/jsr@javascriptrestrictor/levels.js
index 3737b73..58e2c1f 100644
--- a/data/extensions/jsr@javascriptrestrictor/levels.js
+++ b/data/extensions/jsr@javascriptrestrictor/levels.js
@@ -6,6 +6,7 @@
* \author Copyright (C) 2021 Matus Svancar
* \author Copyright (C) 2022 Marek Salon
* \author Copyright (C) 2022 Martin Bednar
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
*/
@@ -50,23 +51,23 @@ var wrapping_groups = {
groups: [
{
name: "time_precision",
- label: "Time precision",
- description: "Prevent attacks and fingerprinting techniques relying on precise time measurement (or make them harder).",
- description2: ["Limit the precision of high resolution time stamps (Date, Performance, events, Gamepad API, Web VR API). Timestamps provided by the Geolocation API are wrapped as well if you enable Geolocation API wrapping"],
+ label: browser.i18n.getMessage("jssgroupTimePrecision"),
+ description: browser.i18n.getMessage("jssgroupTimePrecision"),
+ description2: [browser.i18n.getMessage("jssgroupTimePrecisionDescription2", browser.i18n.getMessage("jssgroupPhysicalLocationGeolocation"))],
params: [
{
- short: "Poor",
- description: "Round time to hundredths of a second (1.230)",
+ short: browser.i18n.getMessage("jssgroupPoor"),
+ description: browser.i18n.getMessage("jssgroupTimePoorDescription"),
config: [2, false],
},
{
- short: "Low",
- description: "Round time to tenths of a second (1.200)",
+ short: browser.i18n.getMessage("jssgroupLow"),
+ description: browser.i18n.getMessage("jssgroupTimeLowDescription"),
config: [1, false],
},
{
- short: "High",
- description: "Randomize decimal digits with noise (1.451)",
+ short: browser.i18n.getMessage("jssgroupHigh"),
+ description: browser.i18n.getMessage("jssgroupTimeHighDescription"),
config: [0, true],
},
],
@@ -89,21 +90,21 @@ var wrapping_groups = {
},
{
name: "htmlcanvaselement",
- label: "Localy rendered images",
- description: "Protect against canvas fingerprinting.",
+ label: browser.i18n.getMessage("jssgroupLocallyRenderedImages"),
+ description: browser.i18n.getMessage("jssgroupLocallyRenderedImagesDescription"),
description2: [
- "Functions canvas.toDataURL(), canvas.toBlob(), CanvasRenderingContext2D.getImageData(), OffscreenCanvas.convertToBlob(), WebGLRenderingContext.readPixels return modified image data to prevent fingerprinting",
- "CanvasRenderingContext2D.isPointInStroke() and CanvasRenderingContext2D.isPointInPath() are modified to lie with probability"
+ browser.i18n.getMessage("jssgroupCanvasLocallyRenderedImagesDescription2"),
+ browser.i18n.getMessage("jssgroupCanvasLocallyRenderedImagesDescription3")
],
params: [
{
- short: "Little lies",
- description: "Alter image data based on domain hash",
+ short: browser.i18n.getMessage("jssgroupLittleLies"),
+ description: browser.i18n.getMessage("jssgroupLocallyRenderedImagesLittleLiesDescription"),
config: [0],
},
{
- short: "Strict",
- description: "Replace by white image (WebGL canvas returns an empty array)",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupLocallyRenderedImagesStrictDescription"),
config: [1],
},
],
@@ -121,20 +122,20 @@ var wrapping_groups = {
},
{
name: "audiobuffer",
- label: "Locally generated audio",
- description: "Protect against audio fingerprinting.",
+ label: browser.i18n.getMessage("jssgroupLocallyGeneratedAudio"),
+ description: browser.i18n.getMessage("jssgroupLocallyGeneratedAudioDescription"),
description2: [
- "Functions AudioBuffer.getChannelData(), AudioBuffer.copyFromChannel(), AnalyserNode.getByteTimeDomainData(), AnalyserNode.getFloatTimeDomainData(), AnalyserNode.getByteFrequencyData() and AnalyserNode.getFloatFrequencyData() are modified to alter audio data based on domain key"
+ browser.i18n.getMessage("jssgroupLocallyGeneratedAudioDescription2"),
],
params: [
{
- short: "Little lies",
- description: "Add amplitude noise based on domain hash",
+ short: browser.i18n.getMessage("jssgroupLittleLies"),
+ description: browser.i18n.getMessage("jssgroupLocallyGeneratedAudioLittleLiesDescription"),
config: [0],
},
{
- short: "Strict",
- description: "Replace by white noise based on domain hash",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupLocallyGeneratedAudioStrictDescription"),
config: [1],
},
],
@@ -150,21 +151,21 @@ var wrapping_groups = {
},
{
name: "webgl",
- label: "Graphic card information",
- description: "Spoof details of your graphic card.",
+ label: browser.i18n.getMessage("jssgroupGraphicCardInformation"),
+ description: browser.i18n.getMessage("jssgroupGraphicCardInformationDescription"),
description2: [
- "Function WebGLRenderingContext.getParameter() returns modified/bottom values for certain parameters",
- "WebGLRenderingContext functions .getFramebufferAttachmentParameter(), .getActiveAttrib(), .getActiveUniform(), .getAttribLocation(), .getBufferParameter(), .getProgramParameter(), .getRenderbufferParameter(), .getShaderParameter(), .getShaderPrecisionFormat(), .getTexParameter(), .getUniformLocation(), .getVertexAttribOffset(), .getSupportedExtensions() and .getExtension() return modified values"
+ browser.i18n.getMessage("jssgroupGraphicCardInformationDescription2"),
+ browser.i18n.getMessage("jssgroupGraphicCardInformationDescription3"),
],
params: [
{
- short: "Little lies",
- description: "Generate random numbers/strings using domain hash",
+ short: browser.i18n.getMessage("jssgroupLittleLies"),
+ description: browser.i18n.getMessage("jssgroupGraphicCardInformationLittleLiesDescription"),
config: [0],
},
{
- short: "Strict",
- description: "Return bottom values (null, empty string)",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupGraphicCardInformationStrictDescription"),
config: [1],
},
],
@@ -204,23 +205,23 @@ var wrapping_groups = {
},
{
name: "plugins",
- label: "Installed browser plugins",
- description: "Protect against plugin fingerprinting",
- description2: [],
+ label: browser.i18n.getMessage("jssgroupInstalledBrowserPlugins"),
+ description: browser.i18n.getMessage("jssgroupInstalledBrowserPluginsDescription"),
+ description2: [browser.i18n.getMessage("jssgroupInstalledBrowserPluginsDescription2")],
params: [
{
- short: "Little lies",
- description: "Edit current and add two fake plugins",
+ short: browser.i18n.getMessage("jssgroupLittleLies"),
+ description: browser.i18n.getMessage("jssgroupInstalledBrowserPluginsLittleLiesDescription"),
config: [0],
},
{
- short: "Fake",
- description: "Return two fake plugins",
+ short: browser.i18n.getMessage("jssgroupFake"),
+ description: browser.i18n.getMessage("jssgroupInstalledBrowserPluginsFakeDescription"),
config: [1],
},
{
- short: "Empty",
- description: "Return empty",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupInstalledBrowserPluginsStrictDescription"),
config: [2],
},
],
@@ -231,25 +232,25 @@ var wrapping_groups = {
},
{
name: "enumerateDevices",
- label: "Connected cameras and microphones",
- description: "Prevent fingerprinting based on the multimedia devices connected to the computer",
+ label: browser.i18n.getMessage("jssgroupConnectedCamerasAndMicrophones"),
+ description: browser.i18n.getMessage("jssgroupConnectedCamerasAndMicrophonesDescription"),
description2: [
- "Function MediaDevices.enumerateDevices() is modified to return empty or modified result"
+ browser.i18n.getMessage("jssgroupConnectedCamerasAndMicrophonesDescription2"),
],
params: [
{
- short: "Little lies",
- description: "Randomize order",
+ short: browser.i18n.getMessage("jssgroupLittleLies"),
+ description: browser.i18n.getMessage("jssgroupConnectedCamerasAndMicrophonesLittleLiesDescription"),
config: [0],
},
{
- short: "Add fake",
- description: "Add 0-4 fake devices and randomize order",
+ short: browser.i18n.getMessage("jssgroupAddFake"),
+ description: browser.i18n.getMessage("jssgroupConnectedCamerasAndMicrophonesAddFakeDescription"),
config: [1],
},
{
- short: "Empty",
- description: "Return empty",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupConnectedCamerasAndMicrophonesStrictDescription"),
config: [2],
},
],
@@ -260,25 +261,25 @@ var wrapping_groups = {
},
{
name: "hardware",
- label: "Device memory and CPU",
- description: "Spoof hardware information on the amount of RAM and CPU count.",
+ label: browser.i18n.getMessage("jssgroupHardware"),
+ description: browser.i18n.getMessage("jssgroupHardwareDescription"),
description2: [
- "Getters navigator.deviceMemory and navigator.hardwareConcurrency return modified values",
+ browser.i18n.getMessage("jssgroupHardwareDescription2"),
],
params: [
{
- short: "Low",
- description: "Return random valid value between minimum and real value",
+ short: browser.i18n.getMessage("jssgroupLow"),
+ description: browser.i18n.getMessage("jssgroupHardwareLowDescription"),
config: [0],
},
{
- short: "Medium",
- description: "Return random valid value between minimum and 8",
+ short: browser.i18n.getMessage("jssgroupMedium"),
+ description: browser.i18n.getMessage("jssgroupHardwareMediumDescription"),
config: [1],
},
{
- short: "High",
- description: "Return 4 for navigator.deviceMemory and 2 for navigator.hardwareConcurrency",
+ short: browser.i18n.getMessage("jssgroupHigh"),
+ description: browser.i18n.getMessage("jssgroupHardwareHighDescription"),
config: [2],
},
],
@@ -291,13 +292,13 @@ var wrapping_groups = {
},
{
name: "net",
- label: "Network conditions",
- description: "Disable access to network information to limit fingerprinting and remove the possibility of observing patterns in accessed networks to learn if the user is at home, work, or travel.",
+ label: browser.i18n.getMessage("jssgroupNetworkConditions"),
+ description: browser.i18n.getMessage("jssgroupNetworkConditionsDescription"),
description2: [],
params: [
{
- short: "Strict",
- description: "Disable NetworkInformation API",
+ short: browser.i18n.getMessage("jssgroupRemove"),
+ description: browser.i18n.getMessage("jssgroupNetworkConditionsRemoveDescription"),
config: [0],
},
],
@@ -309,18 +310,18 @@ var wrapping_groups = {
},
{
name: "xhr",
- label: "XMLHttpRequest requests (XHR)",
- description: "Filter reliable XHR requests to server.",
- description2: ["Note that these requests are broadly employed for benign purposes and also note that Fetch, SSE, WebRTC, and WebSockets APIs are not blocked. All provide similar and some even better means of communication with server. For practical usage, we recommend activating Fingerprint Detector instead of XHR wrappers. JShelter keeps the wrapper as it is useful for some users mainly for experimental reasons."],
+ label: browser.i18n.getMessage("jssgroupXMLHttpRequestRequests"),
+ description: browser.i18n.getMessage("jssgroupXMLHttpRequestRequestsDescription"),
+ description2: [browser.i18n.getMessage("jssgroupXMLHttpRequestRequestsDescription2")],
params: [
{
- short: "Ask",
- description: "Ask before executing an XHR request",
+ short: browser.i18n.getMessage("jssgroupAsk"),
+ description: browser.i18n.getMessage("jssgroupXMLHttpRequestRequestsAskDescription"),
config: [false, true],
},
{
- short: "Block",
- description: "Block all XMLHttpRequests",
+ short: browser.i18n.getMessage("jssgroupBlock"),
+ description: browser.i18n.getMessage("jssgroupXMLHttpRequestRequestsBlockDescription"),
config: [true, false],
},
],
@@ -332,18 +333,18 @@ var wrapping_groups = {
},
{
name: "arrays",
- label: "ArrayBuffer",
- description: "Protect against ArrayBuffer exploitation, for example, to prevent side channel attacks on memory layout (or make them harder).",
+ label: browser.i18n.getMessage("jssgroupArrays"),
+ description: browser.i18n.getMessage("jssgroupArraysDescription"),
description2: [],
params: [
{
- short: "Shift",
- description: "Shift indexes to make memory page boundaries detection harder",
+ short: browser.i18n.getMessage("jssgroupArraysShift"),
+ description: browser.i18n.getMessage("jssgroupArraysShiftDescription"),
config: [false],
},
{
- short: "Randomize",
- description: "Use random mapping of array indexing to memory",
+ short: browser.i18n.getMessage("jssgroupArraysRandomize"),
+ description: browser.i18n.getMessage("jssgroupArraysRandomizeDescription"),
config: [true],
},
],
@@ -364,18 +365,18 @@ var wrapping_groups = {
},
{
name: "shared_array",
- label: "SharedArrayBuffer",
- description: "Protect against SharedArrayBuffer exploitation, for example, to prevent side channel attacks on memory layout (or make them harder).",
+ label: browser.i18n.getMessage("jssgroupSharedArraysBuffer"),
+ description: browser.i18n.getMessage("jssgroupSharedArraysBufferDescription"),
description2: [],
params: [
{
- short: "Medium",
- description: "Randomly slow messages to prevent high resolution timers",
+ short: browser.i18n.getMessage("jssgroupMedium"),
+ description: browser.i18n.getMessage("jssgroupSharedArraysBufferMediumDescription"),
config: [false],
},
{
- short: "Strict",
- description: "Block SharedArrayBuffer",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupSharedArraysBufferStrictDescription"),
config: [true],
},
],
@@ -386,19 +387,24 @@ var wrapping_groups = {
},
{
name: "webworker",
- label: "WebWorker",
- description: "Protect against WebWorker exploitation, for example, to provide high resolution timers",
- description2: [],
+ label: browser.i18n.getMessage("jssgroupWebWorker"),
+ description: browser.i18n.getMessage("jssgroupWebWorkerDescription"),
+ description2: [browser.i18n.getMessage("jssgroupWebWorkerDescription2")],
params: [
{
- short: "Medium",
- description: "Randomly slow messages to prevent high resolution timers",
- config: [false],
+ short: browser.i18n.getMessage("jssgroupLow"),
+ description: browser.i18n.getMessage("jssgroupWebWorkerLowDescription"),
+ config: [false, false],
},
{
- short: "Strict",
- description: "Remove real parallelism, use WebWorker polyfill",
- config: [true],
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupWebWorkerStrictDescription"),
+ config: [true, false],
+ },
+ {
+ short: browser.i18n.getMessage("jssgroupRemove"),
+ description: browser.i18n.getMessage("jssgroupWebWorkerRemoveDescription"),
+ config: [false, true],
},
],
wrappers: [
@@ -407,38 +413,38 @@ var wrapping_groups = {
},
{
name: "geolocation",
- label: "Physical location (geolocation)",
- description: "Limit the information on real-world position provided by Geolocation API.",
- description2: ["Use domain hash for the position spoofing so the position will be the same at one domain for the whole session."],
+ label: browser.i18n.getMessage("jssgroupPhysicalLocationGeolocation"),
+ description: browser.i18n.getMessage("jssgroupPhysicalLocationGeolocationDescription"),
+ description2: [browser.i18n.getMessage("jssgroupPhysicalLocationGeolocationDescription2")],
params: [
{
- short: "Timestamp-only",
- description: "Provide accurate data (use when you really need to provide exact location and you want to protect geolocation timestamps)",
+ short: browser.i18n.getMessage("jssgroupGeolocationTimestampOnly"),
+ description: browser.i18n.getMessage("jssgroupGeolocationTimestampOnlyDescription", browser.i18n.getMessage("jssgroupTimePrecision")),
config: [-1],
},
{
- short: "Village",
- description: "Use accuracy of hundreds of meters",
+ short: browser.i18n.getMessage("jssgroupGeolocationVillage"),
+ description: browser.i18n.getMessage("jssgroupGeolocationVillageDescription"),
config: [2],
},
{
- short: "Town",
- description: "Use accuracy of kilometers",
+ short: browser.i18n.getMessage("jssgroupGeolocationTown"),
+ description: browser.i18n.getMessage("jssgroupGeolocationTownDescription"),
config: [3],
},
{
- short: "Region",
- description: "Use accuracy of tens of kilometers",
+ short: browser.i18n.getMessage("jssgroupGeolocationRegion"),
+ description: browser.i18n.getMessage("jssgroupGeolocationRegionDescription"),
config: [4],
},
{
- short: "Long distance",
- description: "Use accuracy of hundreds of kilometers",
+ short: browser.i18n.getMessage("jssgroupGeolocationLongDistance"),
+ description: browser.i18n.getMessage("jssgroupGeolocationLongDistanceDescription"),
config: [5],
},
{
- short: "Strict",
- description: "Turn location services off",
+ short: browser.i18n.getMessage("jssgroupRemove"),
+ description: browser.i18n.getMessage("jssgroupGeolocationRemoveDescription"),
config: [0],
},
],
@@ -456,13 +462,13 @@ var wrapping_groups = {
},
{
name: "physical_environment",
- label: "Physical environement sensors",
- description: "Limit the information provided by physical environment sensors like Magnetometer or Accelerometer.",
- description2: [],
+ label: browser.i18n.getMessage("jssgroupPhysicalEnvironmentSensors"),
+ description: browser.i18n.getMessage("jssgroupPhysicalEnvironmentSensorsDescription"),
+ description2: [browser.i18n.getMessage("jssgroupPhysicalEnvironmentSensorsDescription2")],
params: [
{
- short: "High",
- description: "Emulate stationary device based on domain hash",
+ short: browser.i18n.getMessage("jssgroupHigh"),
+ description: browser.i18n.getMessage("jssgroupPhysicalEnvironmentSensorsHighDescription"),
config: [true],
},
],
@@ -493,23 +499,23 @@ var wrapping_groups = {
},
{
name: "useridle",
- label: "User idle detection",
- description: "The Idle Detection API can detect inactive users and locked screens.",
- description2: ["The API can be misused to stalk the user and to improve fingerprinting."],
+ label: browser.i18n.getMessage("jssgroupUserIdleDetection"),
+ description: browser.i18n.getMessage("jssgroupUserIdleDetectionDescription"),
+ description2: [browser.i18n.getMessage("jssgroupUserIdleDetectionDescription2")],
params: [
{
- short: "Confuse",
- description: "Always return active user with unlocked screen",
+ short: browser.i18n.getMessage("jssgroupConfuse"),
+ description: browser.i18n.getMessage("jssgroupConfuseDescription"),
config: [0],
},
{
- short: "Deny access",
- description: "Do not show prompts and automatically decline",
+ short: browser.i18n.getMessage("jssgroupBlock"),
+ description: browser.i18n.getMessage("jssgroupBlockDescription"),
config: [1],
},
{
- short: "Remove",
- description: "Remove the API",
+ short: browser.i18n.getMessage("jssgroupRemove"),
+ description: browser.i18n.getMessage("jssgroupRemoveDescription"),
config: [2],
},
],
@@ -523,13 +529,13 @@ var wrapping_groups = {
},
{
name: "coopschedule",
- label: "Idle period task scheduling",
- description: "The Cooperative Scheduling of Background Tasks API can schedule background tasks such that they do not introduce delays to other high priority tasks that share the same event loop.",
- description2: ["The API leaks information about the other tasks running in the browser as it leaks information on currently scheduled tasks, vsync deadlines, user-interaction and so on."],
+ label: browser.i18n.getMessage("jssgroupCoopschedule"),
+ description: browser.i18n.getMessage("jssgroupCoopscheduleDescription"),
+ description2: [browser.i18n.getMessage("jssgroupCoopscheduleDescription2")],
params: [
{
- short: "Little lies",
- description: "Modify the available information to confuse adversaries",
+ short: browser.i18n.getMessage("jssgroupConfuse"),
+ description: browser.i18n.getMessage("jssgroupCoopscheduleConfuseDescription"),
config: [],
},
],
@@ -541,13 +547,13 @@ var wrapping_groups = {
},
{
name: "gamepads",
- label: "Gamepads",
- description: "Prevent websites from accessing and learning information on local gamepads.",
+ label: browser.i18n.getMessage("jssgroupGamepads"),
+ description: browser.i18n.getMessage("jssgroupGamepadsDescription"),
description2: [],
params: [
{
- short: "Strict",
- description: "Hide all gamepads",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupGamepadsStrictDescription"),
config: [true],
},
],
@@ -558,13 +564,13 @@ var wrapping_groups = {
},
{
name: "vr",
- label: "Virtual and augmented reality devices",
- description: "Prevent websites from accessing and learning information on local virtual and augmented reality displays.",
- description2: [],
+ label: browser.i18n.getMessage("jssgroupVirtualAndAugmentedRealityDevices"),
+ description: browser.i18n.getMessage("jssgroupVirtualAndAugmentedRealityDevicesDescription"),
+ description2: [browser.i18n.getMessage("jssgroupVirtualAndAugmentedRealityDevicesDescription2")],
params: [
{
- short: "Strict",
- description: "Hide all devices",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupVirtualAndAugmentedRealityDevicesStrictDescription"),
config: [],
},
],
@@ -577,23 +583,23 @@ var wrapping_groups = {
},
{
name: "playback",
- label: "Multimedia playback",
- description: "Prevent websites from accessing and learning information on localy installed codecs and encoding/decoding capabilities and performance.",
- description2: ["You can enable the protection for sites that do not process audio or video. Sites processing audio or video might be broken by the protection."],
+ label: browser.i18n.getMessage("jssgroupMultimediaPlayback"),
+ description: browser.i18n.getMessage("jssgroupMultimediaPlaybackDescription"),
+ description2: [browser.i18n.getMessage("jssgroupMultimediaPlaybackDescription2")],
params: [
{
- short: "Little lies",
- description: "Report a codec/encryption mechanism as unsupported with 12.5% probability",
+ short: browser.i18n.getMessage("jssgroupLittleLies"),
+ description: browser.i18n.getMessage("jssgroupMultimediaPlaybackLittleLiesDescription"),
config: [0],
},
{
- short: "Strict",
- description: "Report all codecs/encryption mechanisms as unsupported",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupMultimediaPlaybackStrictDescription"),
config: [1],
},
{
- short: "Silence",
- description: "Do not return any information at all",
+ short: browser.i18n.getMessage("jssgroupBlock"),
+ description: browser.i18n.getMessage("jssgroupMultimediaPlaybackBlockDescription"),
config: [2],
},
],
@@ -609,13 +615,13 @@ var wrapping_groups = {
},
{
name: "analytics",
- label: "Unreliable transfers to server (beacons)",
- description: "Prevent unreliable transfers to server (beacons).",
- description2: ["Such transfers are typically misused for analytics but occassionally may be used by e-shops or other pages.", "Prevent sending information through Beacon API."],
+ label: browser.i18n.getMessage("jssgroupUnreliableTransfersToServerBeacons"),
+ description: browser.i18n.getMessage("jssgroupUnreliableTransfersToServerBeaconsDescription"),
+ description2: [browser.i18n.getMessage("jssgroupUnreliableTransfersToServerBeaconsDescription2"), browser.i18n.getMessage("jssgroupUnreliableTransfersToServerBeaconsDescription3")],
params: [
{
- short: "Disabled",
- description: "The wrapper performs no action",
+ short: browser.i18n.getMessage("jssgroupBlock"),
+ description: browser.i18n.getMessage("jssgroupUnreliableTransfersToServerBeaconsBlockDescription"),
config: [],
},
],
@@ -626,13 +632,13 @@ var wrapping_groups = {
},
{
name: "battery",
- label: "Hardware battery",
- description: "Disable Battery status API",
+ label: browser.i18n.getMessage("jssgroupHardwareBattery"),
+ description: browser.i18n.getMessage("jssgroupHardwareBatteryDescription"),
description2: [],
params: [
{
- short: "Disabled",
- description: "Disable the API",
+ short: browser.i18n.getMessage("jssgroupRemove"),
+ description: browser.i18n.getMessage("jssgroupHardwareBatteryRemoveDescription"),
config: [],
},
],
@@ -644,13 +650,13 @@ var wrapping_groups = {
},
{
name: "windowname",
- label: "Persistent identifier of the browser tab",
- description: "Clear window.name value on eTLD+1 domain changes.",
- description2: ["This API might be occasionally used for benign purposes.", "This API provides a possibility to detect cross-site browsing in one tab and browser session."],
+ label: browser.i18n.getMessage("jssgroupPersistentIdentifierOfTheBrowserTab"),
+ description: browser.i18n.getMessage("jssgroupPersistentIdentifierOfTheBrowserTabDescription"),
+ description2: [browser.i18n.getMessage("jssgroupPersistentIdentifierOfTheBrowserTabDescription2")],
params: [
{
- short: "Strict",
- description: "Clear during page reload",
+ short: browser.i18n.getMessage("jssgroupStrict"),
+ description: browser.i18n.getMessage("jssgroupPersistentIdentifierOfTheBrowserTabStrictDescription"),
config: [],
},
],
@@ -661,13 +667,13 @@ var wrapping_groups = {
},
{
name: "nfc",
- label: "Near Field Communication (NFC)",
- description: "Near Field Communication (NFC) enables wireless communication between two devices at close proximity, usually less than a few centimeters.",
- description2: ["NFC is an international standard (ISO/IEC 18092) defining an interface and protocol for simple wireless interconnection of closely coupled devices operating at 13.56 MHz."],
+ label: browser.i18n.getMessage("jssgroupNFC"),
+ description: browser.i18n.getMessage("jssgroupNFCDescription"),
+ description2: [browser.i18n.getMessage("jssgroupNFCDescription2")],
params: [
{
- short: "Disabled",
- description: "Disable the API",
+ short: browser.i18n.getMessage("jssgroupRemove"),
+ description: browser.i18n.getMessage("jssgroupNFCRemoveDescription"),
config: [],
},
],
@@ -678,6 +684,36 @@ var wrapping_groups = {
"window.NDEFRecord",
],
},
+ {
+ name: "wasm",
+ label: browser.i18n.getMessage("jssgroupWASM"),
+ description: browser.i18n.getMessage("jssgroupWASMDescription"),
+ description2: [
+ browser.i18n.getMessage("jssgroupWASMDescription2", [browser.i18n.getMessage("jssgroupLocallyRenderedImages"), browser.i18n.getMessage("jssgroupLocallyGeneratedAudio"), browser.i18n.getMessage("jssgroupLittleLies")]),
+ browser.i18n.getMessage("jssgroupWASMDescription3"),
+ ],
+ params: [
+ {
+ short: browser.i18n.getMessage("jssgroupWASMDisabled"),
+ description: browser.i18n.getMessage("jssgroupWASMDisabledDescription"),
+ config: [0],
+ },
+ {
+ short: browser.i18n.getMessage("jssgroupWASMPassive"),
+ description: browser.i18n.getMessage("jssgroupWASMPassiveDescription"),
+ config: [1],
+ },
+ {
+ short: browser.i18n.getMessage("jssgroupWASMActive"),
+ description: browser.i18n.getMessage("jssgroupWASMActiveDescription"),
+ description2: [
+ "jssgroupWASMActiveDescription2","jssgroupWASMActiveDescription3","jssgroupWASMActiveDescription4"
+ ],
+ config: [2],
+ },
+ ],
+ wrappers: [], // Special case with no wrappers, this group is for modifying htmlcanvaselement, webgl and audiobuffer farbling behaviour
+ },
],
}
var modify_wrapping_groups = modify_wrapping_groups || (() => null); // Give other scripts the possibility to modify the wrapping_groups objects
@@ -721,7 +757,7 @@ function are_all_api_unsupported(wrappers) {
/// Automatically populate infered metadata in wrapping_groups.
wrapping_groups.groups.forEach(function (group) {
group.id = group.name;
- if (!are_all_api_unsupported(group.wrappers)) {
+ if (!are_all_api_unsupported(group.wrappers) || group.wrappers.length === 0) {
wrapping_groups.group_names.push(group.name);
wrapping_groups.empty_level[group.id] = 0;
}
@@ -745,18 +781,18 @@ const L_EXPERIMENTAL = "Experiment"; // Use a long ID so that it is not in confl
var level_0 = {
"builtin": true,
"level_id": L0,
- "level_text": "Turn JavaScript Shield off",
- "level_description": "JavaScript APIs are not wrapped. Use this level if you (1) trust the oprator of the visited page(s) and you want to give them access to full APIs supported by the browser, or (2) if you do not like JavaScript Shield but you want to apply other protection mechanisms.",
+ "level_text": browser.i18n.getMessage("JSSL0Name"),
+ "level_description": browser.i18n.getMessage("JSSL0Description"),
};
var level_1 = {
"builtin": true,
"level_id": L1,
- "level_text": "Turn fingerprinting protection off",
- "level_description": "Apply security counter-measures that are likely not to break web pages but do not defend against fingerprinting. Disable APIs that are not commonly used. Use this level if Fingerprint Detector reports low likelihood of fingerprinting, you trust the visited service, and/or you think that the protection makes the page slow or broken and your temptation to use the service is so high that you do not want to be protected.",
+ "level_text": browser.i18n.getMessage("JSSL1Name"),
+ "level_description": browser.i18n.getMessage("JSSL1Description"),
"time_precision": 3,
"net": 1,
- "webworker": 2,
+ "webworker": 3,
"geolocation": 3,
"physical_environment": 1,
"useridle": 1,
@@ -771,8 +807,8 @@ var level_1 = {
var level_2 = {
"builtin": true,
"level_id": L2,
- "level_text": "Recommended",
- "level_description": "Make the browser appear differently to distinct fingerprinters. Apply security counter-measures that are likely not to break web pages. Slightly modify the results of API calls in different way on different domains so that the cross-site fingerprint is not stable. The generated fingerprint values also differ with each browser restart. If you need a different fingerprint for the same website without restart, use incognito mode. Keep in mind that even if you log out from a site, clear your cookies, change your IP address, the modified APIs will provide a way to compute the same fingerprint. Restart your browser if you want to change your fingerprint. If in doubt, use this level.",
+ "level_text": browser.i18n.getMessage("JSSL2Name"),
+ "level_description": browser.i18n.getMessage("JSSL2Description"),
"time_precision": 3,
"htmlcanvaselement": 1,
"audiobuffer": 1,
@@ -792,13 +828,14 @@ var level_2 = {
"battery": 1,
"windowname": 1,
"nfc": 1,
+ "wasm": 1,
};
var level_3 = {
"builtin": true,
"level_id": L3,
- "level_text": "Strict",
- "level_description": "Enable all non-experimental protection. The wrapped APIs return fake values. Some APIs are blocked completely, others provide meaningful but rare values. Some return values are meaningless. This level will make you fingerprintable because the results of API calls are generally modified in the same way on all webistes and in each session. Use this level if you want to limit the information provided by your browser. If you are worried about fingerprinters, make sure the Fingerprint Detector is activated.",
+ "level_text": browser.i18n.getMessage("JSSL3Name"),
+ "level_description": browser.i18n.getMessage("JSSL3Description"),
"time_precision": 3,
"htmlcanvaselement": 2,
"audiobuffer": 2,
@@ -807,7 +844,7 @@ var level_3 = {
"enumerateDevices": 3,
"hardware": 3,
"net": 1,
- "webworker": 2,
+ "webworker": 3,
"geolocation": 6,
"physical_environment": 1,
"useridle": 3,
@@ -824,8 +861,8 @@ var level_3 = {
var level_experimental = {
"builtin": true,
"level_id": L_EXPERIMENTAL,
- "level_text": "Experimental",
- "level_description": "Strict level protections with additional wrappers enabled (including APIs known to regularly break webpages and APIs that do not work perfectly). Use this level if you want to experiment with JShelter. Use Recommended or Strict level with active Fingerprint Detector for your regular activities.",
+ "level_text": browser.i18n.getMessage("JSSLexperimentalName"),
+ "level_description": browser.i18n.getMessage("JSSLexperimentalDescription"),
"time_precision": 3,
"htmlcanvaselement": 2,
"audiobuffer": 2,
@@ -857,7 +894,6 @@ modify_builtin_levels();
var levels = {};
var default_level = {};
var domains = {};
-var wrapped_codes = {};
function init_levels() {
levels = {
[level_0.level_id]: level_0,
@@ -869,11 +905,11 @@ function init_levels() {
default_level = Object.create(levels[L2]);
default_level.level_text = "Default";
domains = {};
- wrapped_codes = {};
}
init_levels();
-let levels_initialised = false;
+let levels_initialised = false; // Initialized in updateLevels()
+let fp_levels_initialised = false; // Initialized in fp_levels.js/loadFpdConfig()
let levels_updated_callbacks = [];
function updateLevels(res) {
init_levels();
@@ -884,11 +920,6 @@ function updateLevels(res) {
for (let key in levels) {
levels[key].wrappers = wrapping_groups.get_wrappers(levels[key]);
}
- if (window.wrap_code !== undefined) {
- for (l in levels) {
- wrapped_codes[l] = wrap_code(levels[l].wrappers) || "";
- }
- }
var new_default_level = res["__default__"];
if (new_default_level === undefined || new_default_level === null || !(new_default_level in levels)) {
default_level = Object.assign({}, levels[L2]);
@@ -920,10 +951,13 @@ function updateLevels(res) {
}
domains[d] = level;
}
- var orig_levels_updated_callbacks = levels_updated_callbacks;
- levels_updated_callbacks = [];
- orig_levels_updated_callbacks.forEach((it) => it());
+
levels_initialised = true;
+ if (fp_levels_initialised) { // Wait for both levels_initialised and fp_levels_initialised
+ var orig_levels_updated_callbacks = levels_updated_callbacks;
+ levels_updated_callbacks = [];
+ orig_levels_updated_callbacks.forEach((it) => it());
+ }
}
browser.storage.sync.get(null).then(updateLevels);
@@ -969,14 +1003,13 @@ function getCurrentLevelJSON(url) {
for (let domain of subDomains.reverse()) {
if (domain in domains) {
let l = domains[domain];
- if (l.tweaks && !("wrapper_code" in l)) {
- l.wrappers = wrapping_groups.get_wrappers(l);
- l.wrapped_code = wrap_code(l.wrappers) || "";
+ if (l.tweaks) {
+ l.wrappers = wrapping_groups.get_wrappers(l);
}
- return [l, l.tweaks ? l.wrapped_code : wrapped_codes[l.level_id]];
+ return l;
}
}
- return [default_level, wrapped_codes[default_level.level_id]];
+ return default_level;
}
function getTweaksForLevel(level_id, tweaks_obj) {
diff --git a/data/extensions/jsr@javascriptrestrictor/levels_browser.js b/data/extensions/jsr@javascriptrestrictor/levels_browser.js
index 76d6e48..082c888 100644
--- a/data/extensions/jsr@javascriptrestrictor/levels_browser.js
+++ b/data/extensions/jsr@javascriptrestrictor/levels_browser.js
@@ -22,7 +22,21 @@
var modify_wrapping_groups = function() {
wrapping_groups.groups.forEach(function (group) {
if (group.name === "windowname") {
- group.description2.push("Firefox 88 and above already protects you.")
+ group.description2.push(browser.i18n.getMessage("jssgroupPersistentIdentifierOfTheBrowserTabFirefox88"))
+ }
+ else if (group.name === "wasm") {
+ group.params = [
+ {
+ short: browser.i18n.getMessage("jssgroupWASMDisabled"),
+ description: browser.i18n.getMessage("jssgroupWASMDisabledDescription"),
+ config: [0],
+ },
+ {
+ short: browser.i18n.getMessage("jssgroupWASMEnabled"),
+ description: browser.i18n.getMessage("jssgroupWASMEnabledDescription"),
+ config: [1],
+ },
+ ];
}
});
};
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/lib/sha256.js b/data/extensions/jsr@javascriptrestrictor/lib/sha256.js
index 14bcf45..4e0d065 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/lib/sha256.js
+++ b/data/extensions/jsr@javascriptrestrictor/lib/sha256.js
@@ -1,9 +1,9 @@
/**
* [js-sha256]{@link https://github.com/emn178/js-sha256}
*
- * @version 0.9.0
+ * @version 0.10.1
* @author Chen, Yi-Cyuan [emn178@gmail.com]
- * @copyright Chen, Yi-Cyuan 2014-2017
+ * @copyright Chen, Yi-Cyuan 2014-2023
* @license MIT
*/
/*jslint bitwise: true */
@@ -80,9 +80,17 @@
};
var nodeWrap = function (method, is224) {
- var crypto = eval("require('crypto')");
- var Buffer = eval("require('buffer').Buffer");
+ var crypto = require('crypto')
+ var Buffer = require('buffer').Buffer;
var algorithm = is224 ? 'sha224' : 'sha256';
+ var bufferFrom;
+ if (Buffer.from && !root.JS_SHA256_NO_BUFFER_FROM) {
+ bufferFrom = Buffer.from;
+ } else {
+ bufferFrom = function (message) {
+ return new Buffer(message);
+ };
+ }
var nodeMethod = function (message) {
if (typeof message === 'string') {
return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
@@ -95,7 +103,7 @@
}
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
message.constructor === Buffer) {
- return crypto.createHash(algorithm).update(new Buffer(message)).digest('hex');
+ return crypto.createHash(algorithm).update(bufferFrom(message)).digest('hex');
} else {
return method(message);
}
@@ -328,6 +336,7 @@
t2 = s0 + maj;
e = a + t1 << 0;
a = t1 + t2 << 0;
+ this.chromeBugWorkAround = true;
}
this.h0 = this.h0 + a << 0;
diff --git a/data/extensions/jsr@javascriptrestrictor/manifest.json b/data/extensions/jsr@javascriptrestrictor/manifest.json
index caeba40..92f11cf 100644
--- a/data/extensions/jsr@javascriptrestrictor/manifest.json
+++ b/data/extensions/jsr@javascriptrestrictor/manifest.json
@@ -1,61 +1,23 @@
{
- "author": "Libor Pol\u010d\u00e1k, Martin Bedn\u00e1\u0159, Martin Timko, Pavel Pohner, Peter Hor\u0148\u00e1k, Mat\u00fa\u0161 \u0160vanc\u00e1r, Giorgio Maone, Marek Salo\u0148, Radek Hranick\u00fd",
+ "author": "Libor Pol\u010d\u00e1k, Martin Bedn\u00e1\u0159, Martin Timko, Pavel Pohner, Peter Hor\u0148\u00e1k, Mat\u00fa\u0161 \u0160vanc\u00e1r, Giorgio Maone, Marek Salo\u0148, Radek Hranick\u00fd, Martin Zmitko",
"background": {
"scripts": [
"nscl/lib/browser-polyfill.js",
"nscl/service/TabCache.js",
"nscl/service/NavCache.js",
"nscl/service/DocStartInjection.js",
- "nscl/lib/sha256.js",
"nscl/common/log.js",
"nscl/common/uuid.js",
"nscl/common/SyncMessage.js",
"nscl/common/tld.js",
+ "lib/sha256.js",
"helpers.js",
"session_hash.js",
"update.js",
"url.js",
- "wrapping.js",
- "wrappingL-CANVAS.js",
- "wrappingL-SENSOR.js",
- "wrappingS-AJAX.js",
- "wrappingS-BATTERY-CR.js",
- "wrappingS-BE.js",
- "wrappingS-COOP-SCHEDULING.js",
- "wrappingS-DM.js",
- "wrappingS-DOM.js",
- "wrappingS-ECMA-ARRAY.js",
- "wrappingS-ECMA-DATE.js",
- "wrappingS-ECMA-SHARED.js",
- "wrappingS-EME.js",
- "wrappingS-GEO.js",
- "wrappingS-GP.js",
- "wrappingS-H-C.js",
- "wrappingS-HRT.js",
- "wrappingS-HTML.js",
- "wrappingS-HTML-LS.js",
- "wrappingS-HTML5.js",
- "wrappingS-IDLE.js",
- "wrappingS-MCS.js",
- "wrappingS-MEDIA-CAPABILITIES.js",
- "wrappingS-NET.js",
- "wrappingS-NFC.js",
- "wrappingS-NP.js",
- "wrappingS-PT2.js",
- "wrappingS-SENSOR-ACCEL.js",
- "wrappingS-SENSOR-GYRO.js",
- "wrappingS-SENSOR.js",
- "wrappingS-SENSOR-LIGHT.js",
- "wrappingS-SENSOR-MAGNET.js",
- "wrappingS-SENSOR-ORIENT.js",
- "wrappingS-VR.js",
- "wrappingS-WEBA.js",
- "wrappingS-WEBGL.js",
- "wrappingS-XR.js",
- "code_builders.js",
"levels_browser.js",
"levels.js",
- "fp_code_builders.js",
+ "fp_levels.js",
"fp_detect_background.js",
"background.js",
"level_cache.js",
@@ -89,16 +51,56 @@
"nscl/common/uuid.js",
"nscl/common/SyncMessage.js",
"nscl/content/patchWindow.js",
- "nscl/lib/sha256.js",
+ "lib/sha256.js",
"alea.js",
"crc16.js",
"helpers.js",
+ "wrapping.js",
+ "wrappingL-CANVAS.js",
+ "wrappingL-SENSOR.js",
+ "wrappingS-AJAX.js",
+ "wrappingS-BATTERY-CR.js",
+ "wrappingS-BE.js",
+ "wrappingS-COOP-SCHEDULING.js",
+ "wrappingS-DM.js",
+ "wrappingS-DOM.js",
+ "wrappingS-ECMA-ARRAY.js",
+ "wrappingS-ECMA-DATE.js",
+ "wrappingS-ECMA-SHARED.js",
+ "wrappingS-EME.js",
+ "wrappingS-GEO.js",
+ "wrappingS-GP.js",
+ "wrappingS-H-C.js",
+ "wrappingS-HRT.js",
+ "wrappingS-HTML.js",
+ "wrappingS-HTML-LS.js",
+ "wrappingS-HTML5.js",
+ "wrappingS-IDLE.js",
+ "wrappingS-MCS.js",
+ "wrappingS-MEDIA-CAPABILITIES.js",
+ "wrappingS-NET.js",
+ "wrappingS-NFC.js",
+ "wrappingS-NP.js",
+ "wrappingS-PT2.js",
+ "wrappingS-SENSOR-ACCEL.js",
+ "wrappingS-SENSOR-GYRO.js",
+ "wrappingS-SENSOR.js",
+ "wrappingS-SENSOR-LIGHT.js",
+ "wrappingS-SENSOR-MAGNET.js",
+ "wrappingS-SENSOR-ORIENT.js",
+ "wrappingS-VR.js",
+ "wrappingS-WEBA.js",
+ "wrappingS-WEBGL.js",
+ "wrappingS-XR.js",
+ "code_builders.js",
+ "fp_code_builders.js",
"document_start.js"
],
"run_at": "document_start"
}
],
- "description": "Extension for increasing security and privacy level of the user.",
+ "default_locale": "en",
+ "description": "__MSG_extensionDescription__",
"homepage_url": "https://JShelter.org",
"icons": {
"16": "img/icon-16.png",
@@ -111,7 +113,7 @@
"512": "img/icon-512.png"
},
"manifest_version": 2,
- "name": "JShelter",
+ "name": "__MSG_extensionName__",
"options_ui": {
"page": "options.html",
"open_in_tab": true
@@ -131,7 +133,7 @@
"browsingData"
],
"short_name": "JShelter",
- "version": "0.11.1",
+ "version": "0.15.2",
"browser_specific_settings": {
"gecko": {
"id": "jsr@javascriptrestrictor",
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js
index 1fb7955..af83b76 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/SyncMessage.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/log.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/log.js
index 7bc7739..b71fbc5 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/common/log.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/log.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/sha256.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/sha256.js
new file mode 100644
index 0000000..73d2b66
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/sha256.js
@@ -0,0 +1,27 @@
+/*
+ * NoScript Commons Library
+ * Reusable building blocks for cross-browser security/privacy WebExtensions.
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+async function sha256(aString) {
+ const bytes = new TextEncoder().encode(aString);
+ const hashBytes = await crypto.subtle.digest("SHA-256", bytes);
+ return new Uint8Array(hashBytes).reduce(
+ (s, b) => s + b.toString(16).padStart(2, "0"), ""
+ );
+} \ No newline at end of file
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js
index b9e357a..d7c08ed 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/tld.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
@@ -77,7 +77,7 @@ var tld = (() => {
}
};
- const tlds = {"icann":{"ac":1,"com.ac":2,"edu.ac":2,"gov.ac":2,"net.ac":2,"mil.ac":2,"org.ac":2,"ad":1,"nom.ad":2,"ae":1,"co.ae":2,"net.ae":2,"org.ae":2,"sch.ae":2,"ac.ae":2,"gov.ae":2,"mil.ae":2,"aero":1,"accident-investigation.aero":2,"accident-prevention.aero":2,"aerobatic.aero":2,"aeroclub.aero":2,"aerodrome.aero":2,"agents.aero":2,"aircraft.aero":2,"airline.aero":2,"airport.aero":2,"air-surveillance.aero":2,"airtraffic.aero":2,"air-traffic-control.aero":2,"ambulance.aero":2,"amusement.aero":2,"association.aero":2,"author.aero":2,"ballooning.aero":2,"broker.aero":2,"caa.aero":2,"cargo.aero":2,"catering.aero":2,"certification.aero":2,"championship.aero":2,"charter.aero":2,"civilaviation.aero":2,"club.aero":2,"conference.aero":2,"consultant.aero":2,"consulting.aero":2,"control.aero":2,"council.aero":2,"crew.aero":2,"design.aero":2,"dgca.aero":2,"educator.aero":2,"emergency.aero":2,"engine.aero":2,"engineer.aero":2,"entertainment.aero":2,"equipment.aero":2,"exchange.aero":2,"express.aero":2,"federation.aero":2,"flight.aero":2,"fuel.aero":2,"gliding.aero":2,"government.aero":2,"groundhandling.aero":2,"group.aero":2,"hanggliding.aero":2,"homebuilt.aero":2,"insurance.aero":2,"journal.aero":2,"journalist.aero":2,"leasing.aero":2,"logistics.aero":2,"magazine.aero":2,"maintenance.aero":2,"media.aero":2,"microlight.aero":2,"modelling.aero":2,"navigation.aero":2,"parachuting.aero":2,"paragliding.aero":2,"passenger-association.aero":2,"pilot.aero":2,"press.aero":2,"production.aero":2,"recreation.aero":2,"repbody.aero":2,"res.aero":2,"research.aero":2,"rotorcraft.aero":2,"safety.aero":2,"scientist.aero":2,"services.aero":2,"show.aero":2,"skydiving.aero":2,"software.aero":2,"student.aero":2,"trader.aero":2,"trading.aero":2,"trainer.aero":2,"union.aero":2,"workinggroup.aero":2,"works.aero":2,"af":1,"gov.af":2,"com.af":2,"org.af":2,"net.af":2,"edu.af":2,"ag":1,"com.ag":2,"org.ag":2,"net.ag":2,"co.ag":2,"nom.ag":2,"ai":1,"off.ai":2,"com.ai":2,"net.ai":2,"org.ai":2,"al":1,"com.al":2,"edu.al":2,"gov.al":2,"mil.al":2,"net.al":2,"org.al":2,"am":1,"co.am":2,"com.am":2,"commune.am":2,"net.am":2,"org.am":2,"ao":1,"ed.ao":2,"gv.ao":2,"og.ao":2,"co.ao":2,"pb.ao":2,"it.ao":2,"aq":1,"ar":1,"bet.ar":2,"com.ar":2,"coop.ar":2,"edu.ar":2,"gob.ar":2,"gov.ar":2,"int.ar":2,"mil.ar":2,"musica.ar":2,"mutual.ar":2,"net.ar":2,"org.ar":2,"senasa.ar":2,"tur.ar":2,"arpa":1,"e164.arpa":2,"in-addr.arpa":2,"ip6.arpa":2,"iris.arpa":2,"uri.arpa":2,"urn.arpa":2,"as":1,"gov.as":2,"asia":1,"at":1,"ac.at":2,"co.at":2,"gv.at":2,"or.at":2,"sth.ac.at":3,"au":1,"com.au":2,"net.au":2,"org.au":2,"edu.au":2,"gov.au":2,"asn.au":2,"id.au":2,"info.au":2,"conf.au":2,"oz.au":2,"act.au":2,"nsw.au":2,"nt.au":2,"qld.au":2,"sa.au":2,"tas.au":2,"vic.au":2,"wa.au":2,"act.edu.au":3,"catholic.edu.au":3,"nsw.edu.au":3,"nt.edu.au":3,"qld.edu.au":3,"sa.edu.au":3,"tas.edu.au":3,"vic.edu.au":3,"wa.edu.au":3,"qld.gov.au":3,"sa.gov.au":3,"tas.gov.au":3,"vic.gov.au":3,"wa.gov.au":3,"schools.nsw.edu.au":4,"aw":1,"com.aw":2,"ax":1,"az":1,"com.az":2,"net.az":2,"int.az":2,"gov.az":2,"org.az":2,"edu.az":2,"info.az":2,"pp.az":2,"mil.az":2,"name.az":2,"pro.az":2,"biz.az":2,"ba":1,"com.ba":2,"edu.ba":2,"gov.ba":2,"mil.ba":2,"net.ba":2,"org.ba":2,"bb":1,"biz.bb":2,"co.bb":2,"com.bb":2,"edu.bb":2,"gov.bb":2,"info.bb":2,"net.bb":2,"org.bb":2,"store.bb":2,"tv.bb":2,"bd":2,"be":1,"ac.be":2,"bf":1,"gov.bf":2,"bg":1,"a.bg":2,"b.bg":2,"c.bg":2,"d.bg":2,"e.bg":2,"f.bg":2,"g.bg":2,"h.bg":2,"i.bg":2,"j.bg":2,"k.bg":2,"l.bg":2,"m.bg":2,"n.bg":2,"o.bg":2,"p.bg":2,"q.bg":2,"r.bg":2,"s.bg":2,"t.bg":2,"u.bg":2,"v.bg":2,"w.bg":2,"x.bg":2,"y.bg":2,"z.bg":2,"0.bg":2,"1.bg":2,"2.bg":2,"3.bg":2,"4.bg":2,"5.bg":2,"6.bg":2,"7.bg":2,"8.bg":2,"9.bg":2,"bh":1,"com.bh":2,"edu.bh":2,"net.bh":2,"org.bh":2,"gov.bh":2,"bi":1,"co.bi":2,"com.bi":2,"edu.bi":2,"or.bi":2,"org.bi":2,"biz":1,"bj":1,"asso.bj":2,"barreau.bj":2,"gouv.bj":2,"bm":1,"com.bm":2,"edu.bm":2,"gov.bm":2,"net.bm":2,"org.bm":2,"bn":1,"com.bn":2,"edu.bn":2,"gov.bn":2,"net.bn":2,"org.bn":2,"bo":1,"com.bo":2,"edu.bo":2,"gob.bo":2,"int.bo":2,"org.bo":2,"net.bo":2,"mil.bo":2,"tv.bo":2,"web.bo":2,"academia.bo":2,"agro.bo":2,"arte.bo":2,"blog.bo":2,"bolivia.bo":2,"ciencia.bo":2,"cooperativa.bo":2,"democracia.bo":2,"deporte.bo":2,"ecologia.bo":2,"economia.bo":2,"empresa.bo":2,"indigena.bo":2,"industria.bo":2,"info.bo":2,"medicina.bo":2,"movimiento.bo":2,"musica.bo":2,"natural.bo":2,"nombre.bo":2,"noticias.bo":2,"patria.bo":2,"politica.bo":2,"profesional.bo":2,"plurinacional.bo":2,"pueblo.bo":2,"revista.bo":2,"salud.bo":2,"tecnologia.bo":2,"tksat.bo":2,"transporte.bo":2,"wiki.bo":2,"br":1,"9guacu.br":2,"abc.br":2,"adm.br":2,"adv.br":2,"agr.br":2,"aju.br":2,"am.br":2,"anani.br":2,"aparecida.br":2,"app.br":2,"arq.br":2,"art.br":2,"ato.br":2,"b.br":2,"barueri.br":2,"belem.br":2,"bhz.br":2,"bib.br":2,"bio.br":2,"blog.br":2,"bmd.br":2,"boavista.br":2,"bsb.br":2,"campinagrande.br":2,"campinas.br":2,"caxias.br":2,"cim.br":2,"cng.br":2,"cnt.br":2,"com.br":2,"contagem.br":2,"coop.br":2,"coz.br":2,"cri.br":2,"cuiaba.br":2,"curitiba.br":2,"def.br":2,"des.br":2,"det.br":2,"dev.br":2,"ecn.br":2,"eco.br":2,"edu.br":2,"emp.br":2,"enf.br":2,"eng.br":2,"esp.br":2,"etc.br":2,"eti.br":2,"far.br":2,"feira.br":2,"flog.br":2,"floripa.br":2,"fm.br":2,"fnd.br":2,"fortal.br":2,"fot.br":2,"foz.br":2,"fst.br":2,"g12.br":2,"geo.br":2,"ggf.br":2,"goiania.br":2,"gov.br":2,"ac.gov.br":3,"al.gov.br":3,"am.gov.br":3,"ap.gov.br":3,"ba.gov.br":3,"ce.gov.br":3,"df.gov.br":3,"es.gov.br":3,"go.gov.br":3,"ma.gov.br":3,"mg.gov.br":3,"ms.gov.br":3,"mt.gov.br":3,"pa.gov.br":3,"pb.gov.br":3,"pe.gov.br":3,"pi.gov.br":3,"pr.gov.br":3,"rj.gov.br":3,"rn.gov.br":3,"ro.gov.br":3,"rr.gov.br":3,"rs.gov.br":3,"sc.gov.br":3,"se.gov.br":3,"sp.gov.br":3,"to.gov.br":3,"gru.br":2,"imb.br":2,"ind.br":2,"inf.br":2,"jab.br":2,"jampa.br":2,"jdf.br":2,"joinville.br":2,"jor.br":2,"jus.br":2,"leg.br":2,"lel.br":2,"log.br":2,"londrina.br":2,"macapa.br":2,"maceio.br":2,"manaus.br":2,"maringa.br":2,"mat.br":2,"med.br":2,"mil.br":2,"morena.br":2,"mp.br":2,"mus.br":2,"natal.br":2,"net.br":2,"niteroi.br":2,"nom.br":3,"not.br":2,"ntr.br":2,"odo.br":2,"ong.br":2,"org.br":2,"osasco.br":2,"palmas.br":2,"poa.br":2,"ppg.br":2,"pro.br":2,"psc.br":2,"psi.br":2,"pvh.br":2,"qsl.br":2,"radio.br":2,"rec.br":2,"recife.br":2,"rep.br":2,"ribeirao.br":2,"rio.br":2,"riobranco.br":2,"riopreto.br":2,"salvador.br":2,"sampa.br":2,"santamaria.br":2,"santoandre.br":2,"saobernardo.br":2,"saogonca.br":2,"seg.br":2,"sjc.br":2,"slg.br":2,"slz.br":2,"sorocaba.br":2,"srv.br":2,"taxi.br":2,"tc.br":2,"tec.br":2,"teo.br":2,"the.br":2,"tmp.br":2,"trd.br":2,"tur.br":2,"tv.br":2,"udi.br":2,"vet.br":2,"vix.br":2,"vlog.br":2,"wiki.br":2,"zlg.br":2,"bs":1,"com.bs":2,"net.bs":2,"org.bs":2,"edu.bs":2,"gov.bs":2,"bt":1,"com.bt":2,"edu.bt":2,"gov.bt":2,"net.bt":2,"org.bt":2,"bv":1,"bw":1,"co.bw":2,"org.bw":2,"by":1,"gov.by":2,"mil.by":2,"com.by":2,"of.by":2,"bz":1,"com.bz":2,"net.bz":2,"org.bz":2,"edu.bz":2,"gov.bz":2,"ca":1,"ab.ca":2,"bc.ca":2,"mb.ca":2,"nb.ca":2,"nf.ca":2,"nl.ca":2,"ns.ca":2,"nt.ca":2,"nu.ca":2,"on.ca":2,"pe.ca":2,"qc.ca":2,"sk.ca":2,"yk.ca":2,"gc.ca":2,"cat":1,"cc":1,"cd":1,"gov.cd":2,"cf":1,"cg":1,"ch":1,"ci":1,"org.ci":2,"or.ci":2,"com.ci":2,"co.ci":2,"edu.ci":2,"ed.ci":2,"ac.ci":2,"net.ci":2,"go.ci":2,"asso.ci":2,"xn--aroport-bya.ci":2,"int.ci":2,"presse.ci":2,"md.ci":2,"gouv.ci":2,"ck":2,"www.ck":1,"cl":1,"co.cl":2,"gob.cl":2,"gov.cl":2,"mil.cl":2,"cm":1,"co.cm":2,"com.cm":2,"gov.cm":2,"net.cm":2,"cn":1,"ac.cn":2,"com.cn":2,"edu.cn":2,"gov.cn":2,"net.cn":2,"org.cn":2,"mil.cn":2,"xn--55qx5d.cn":2,"xn--io0a7i.cn":2,"xn--od0alg.cn":2,"ah.cn":2,"bj.cn":2,"cq.cn":2,"fj.cn":2,"gd.cn":2,"gs.cn":2,"gz.cn":2,"gx.cn":2,"ha.cn":2,"hb.cn":2,"he.cn":2,"hi.cn":2,"hl.cn":2,"hn.cn":2,"jl.cn":2,"js.cn":2,"jx.cn":2,"ln.cn":2,"nm.cn":2,"nx.cn":2,"qh.cn":2,"sc.cn":2,"sd.cn":2,"sh.cn":2,"sn.cn":2,"sx.cn":2,"tj.cn":2,"xj.cn":2,"xz.cn":2,"yn.cn":2,"zj.cn":2,"hk.cn":2,"mo.cn":2,"tw.cn":2,"co":1,"arts.co":2,"com.co":2,"edu.co":2,"firm.co":2,"gov.co":2,"info.co":2,"int.co":2,"mil.co":2,"net.co":2,"nom.co":2,"org.co":2,"rec.co":2,"web.co":2,"com":1,"coop":1,"cr":1,"ac.cr":2,"co.cr":2,"ed.cr":2,"fi.cr":2,"go.cr":2,"or.cr":2,"sa.cr":2,"cu":1,"com.cu":2,"edu.cu":2,"org.cu":2,"net.cu":2,"gov.cu":2,"inf.cu":2,"cv":1,"com.cv":2,"edu.cv":2,"int.cv":2,"nome.cv":2,"org.cv":2,"cw":1,"com.cw":2,"edu.cw":2,"net.cw":2,"org.cw":2,"cx":1,"gov.cx":2,"cy":1,"ac.cy":2,"biz.cy":2,"com.cy":2,"ekloges.cy":2,"gov.cy":2,"ltd.cy":2,"mil.cy":2,"net.cy":2,"org.cy":2,"press.cy":2,"pro.cy":2,"tm.cy":2,"cz":1,"de":1,"dj":1,"dk":1,"dm":1,"com.dm":2,"net.dm":2,"org.dm":2,"edu.dm":2,"gov.dm":2,"do":1,"art.do":2,"com.do":2,"edu.do":2,"gob.do":2,"gov.do":2,"mil.do":2,"net.do":2,"org.do":2,"sld.do":2,"web.do":2,"dz":1,"art.dz":2,"asso.dz":2,"com.dz":2,"edu.dz":2,"gov.dz":2,"org.dz":2,"net.dz":2,"pol.dz":2,"soc.dz":2,"tm.dz":2,"ec":1,"com.ec":2,"info.ec":2,"net.ec":2,"fin.ec":2,"k12.ec":2,"med.ec":2,"pro.ec":2,"org.ec":2,"edu.ec":2,"gov.ec":2,"gob.ec":2,"mil.ec":2,"edu":1,"ee":1,"edu.ee":2,"gov.ee":2,"riik.ee":2,"lib.ee":2,"med.ee":2,"com.ee":2,"pri.ee":2,"aip.ee":2,"org.ee":2,"fie.ee":2,"eg":1,"com.eg":2,"edu.eg":2,"eun.eg":2,"gov.eg":2,"mil.eg":2,"name.eg":2,"net.eg":2,"org.eg":2,"sci.eg":2,"er":2,"es":1,"com.es":2,"nom.es":2,"org.es":2,"gob.es":2,"edu.es":2,"et":1,"com.et":2,"gov.et":2,"org.et":2,"edu.et":2,"biz.et":2,"name.et":2,"info.et":2,"net.et":2,"eu":1,"fi":1,"aland.fi":2,"fj":1,"ac.fj":2,"biz.fj":2,"com.fj":2,"gov.fj":2,"info.fj":2,"mil.fj":2,"name.fj":2,"net.fj":2,"org.fj":2,"pro.fj":2,"fk":2,"com.fm":2,"edu.fm":2,"net.fm":2,"org.fm":2,"fm":1,"fo":1,"fr":1,"asso.fr":2,"com.fr":2,"gouv.fr":2,"nom.fr":2,"prd.fr":2,"tm.fr":2,"aeroport.fr":2,"avocat.fr":2,"avoues.fr":2,"cci.fr":2,"chambagri.fr":2,"chirurgiens-dentistes.fr":2,"experts-comptables.fr":2,"geometre-expert.fr":2,"greta.fr":2,"huissier-justice.fr":2,"medecin.fr":2,"notaires.fr":2,"pharmacien.fr":2,"port.fr":2,"veterinaire.fr":2,"ga":1,"gb":1,"edu.gd":2,"gov.gd":2,"gd":1,"ge":1,"com.ge":2,"edu.ge":2,"gov.ge":2,"org.ge":2,"mil.ge":2,"net.ge":2,"pvt.ge":2,"gf":1,"gg":1,"co.gg":2,"net.gg":2,"org.gg":2,"gh":1,"com.gh":2,"edu.gh":2,"gov.gh":2,"org.gh":2,"mil.gh":2,"gi":1,"com.gi":2,"ltd.gi":2,"gov.gi":2,"mod.gi":2,"edu.gi":2,"org.gi":2,"gl":1,"co.gl":2,"com.gl":2,"edu.gl":2,"net.gl":2,"org.gl":2,"gm":1,"gn":1,"ac.gn":2,"com.gn":2,"edu.gn":2,"gov.gn":2,"org.gn":2,"net.gn":2,"gov":1,"gp":1,"com.gp":2,"net.gp":2,"mobi.gp":2,"edu.gp":2,"org.gp":2,"asso.gp":2,"gq":1,"gr":1,"com.gr":2,"edu.gr":2,"net.gr":2,"org.gr":2,"gov.gr":2,"gs":1,"gt":1,"com.gt":2,"edu.gt":2,"gob.gt":2,"ind.gt":2,"mil.gt":2,"net.gt":2,"org.gt":2,"gu":1,"com.gu":2,"edu.gu":2,"gov.gu":2,"guam.gu":2,"info.gu":2,"net.gu":2,"org.gu":2,"web.gu":2,"gw":1,"gy":1,"co.gy":2,"com.gy":2,"edu.gy":2,"gov.gy":2,"net.gy":2,"org.gy":2,"hk":1,"com.hk":2,"edu.hk":2,"gov.hk":2,"idv.hk":2,"net.hk":2,"org.hk":2,"xn--55qx5d.hk":2,"xn--wcvs22d.hk":2,"xn--lcvr32d.hk":2,"xn--mxtq1m.hk":2,"xn--gmqw5a.hk":2,"xn--ciqpn.hk":2,"xn--gmq050i.hk":2,"xn--zf0avx.hk":2,"xn--io0a7i.hk":2,"xn--mk0axi.hk":2,"xn--od0alg.hk":2,"xn--od0aq3b.hk":2,"xn--tn0ag.hk":2,"xn--uc0atv.hk":2,"xn--uc0ay4a.hk":2,"hm":1,"hn":1,"com.hn":2,"edu.hn":2,"org.hn":2,"net.hn":2,"mil.hn":2,"gob.hn":2,"hr":1,"iz.hr":2,"from.hr":2,"name.hr":2,"com.hr":2,"ht":1,"com.ht":2,"shop.ht":2,"firm.ht":2,"info.ht":2,"adult.ht":2,"net.ht":2,"pro.ht":2,"org.ht":2,"med.ht":2,"art.ht":2,"coop.ht":2,"pol.ht":2,"asso.ht":2,"edu.ht":2,"rel.ht":2,"gouv.ht":2,"perso.ht":2,"hu":1,"co.hu":2,"info.hu":2,"org.hu":2,"priv.hu":2,"sport.hu":2,"tm.hu":2,"2000.hu":2,"agrar.hu":2,"bolt.hu":2,"casino.hu":2,"city.hu":2,"erotica.hu":2,"erotika.hu":2,"film.hu":2,"forum.hu":2,"games.hu":2,"hotel.hu":2,"ingatlan.hu":2,"jogasz.hu":2,"konyvelo.hu":2,"lakas.hu":2,"media.hu":2,"news.hu":2,"reklam.hu":2,"sex.hu":2,"shop.hu":2,"suli.hu":2,"szex.hu":2,"tozsde.hu":2,"utazas.hu":2,"video.hu":2,"id":1,"ac.id":2,"biz.id":2,"co.id":2,"desa.id":2,"go.id":2,"mil.id":2,"my.id":2,"net.id":2,"or.id":2,"ponpes.id":2,"sch.id":2,"web.id":2,"ie":1,"gov.ie":2,"il":1,"ac.il":2,"co.il":2,"gov.il":2,"idf.il":2,"k12.il":2,"muni.il":2,"net.il":2,"org.il":2,"im":1,"ac.im":2,"co.im":2,"com.im":2,"ltd.co.im":3,"net.im":2,"org.im":2,"plc.co.im":3,"tt.im":2,"tv.im":2,"in":1,"co.in":2,"firm.in":2,"net.in":2,"org.in":2,"gen.in":2,"ind.in":2,"nic.in":2,"ac.in":2,"edu.in":2,"res.in":2,"gov.in":2,"mil.in":2,"info":1,"int":1,"eu.int":2,"io":1,"com.io":2,"iq":1,"gov.iq":2,"edu.iq":2,"mil.iq":2,"com.iq":2,"org.iq":2,"net.iq":2,"ir":1,"ac.ir":2,"co.ir":2,"gov.ir":2,"id.ir":2,"net.ir":2,"org.ir":2,"sch.ir":2,"xn--mgba3a4f16a.ir":2,"xn--mgba3a4fra.ir":2,"is":1,"net.is":2,"com.is":2,"edu.is":2,"gov.is":2,"org.is":2,"int.is":2,"it":1,"gov.it":2,"edu.it":2,"abr.it":2,"abruzzo.it":2,"aosta-valley.it":2,"aostavalley.it":2,"bas.it":2,"basilicata.it":2,"cal.it":2,"calabria.it":2,"cam.it":2,"campania.it":2,"emilia-romagna.it":2,"emiliaromagna.it":2,"emr.it":2,"friuli-v-giulia.it":2,"friuli-ve-giulia.it":2,"friuli-vegiulia.it":2,"friuli-venezia-giulia.it":2,"friuli-veneziagiulia.it":2,"friuli-vgiulia.it":2,"friuliv-giulia.it":2,"friulive-giulia.it":2,"friulivegiulia.it":2,"friulivenezia-giulia.it":2,"friuliveneziagiulia.it":2,"friulivgiulia.it":2,"fvg.it":2,"laz.it":2,"lazio.it":2,"lig.it":2,"liguria.it":2,"lom.it":2,"lombardia.it":2,"lombardy.it":2,"lucania.it":2,"mar.it":2,"marche.it":2,"mol.it":2,"molise.it":2,"piedmont.it":2,"piemonte.it":2,"pmn.it":2,"pug.it":2,"puglia.it":2,"sar.it":2,"sardegna.it":2,"sardinia.it":2,"sic.it":2,"sicilia.it":2,"sicily.it":2,"taa.it":2,"tos.it":2,"toscana.it":2,"trentin-sud-tirol.it":2,"xn--trentin-sd-tirol-rzb.it":2,"trentin-sudtirol.it":2,"xn--trentin-sdtirol-7vb.it":2,"trentin-sued-tirol.it":2,"trentin-suedtirol.it":2,"trentino-a-adige.it":2,"trentino-aadige.it":2,"trentino-alto-adige.it":2,"trentino-altoadige.it":2,"trentino-s-tirol.it":2,"trentino-stirol.it":2,"trentino-sud-tirol.it":2,"xn--trentino-sd-tirol-c3b.it":2,"trentino-sudtirol.it":2,"xn--trentino-sdtirol-szb.it":2,"trentino-sued-tirol.it":2,"trentino-suedtirol.it":2,"trentino.it":2,"trentinoa-adige.it":2,"trentinoaadige.it":2,"trentinoalto-adige.it":2,"trentinoaltoadige.it":2,"trentinos-tirol.it":2,"trentinostirol.it":2,"trentinosud-tirol.it":2,"xn--trentinosd-tirol-rzb.it":2,"trentinosudtirol.it":2,"xn--trentinosdtirol-7vb.it":2,"trentinosued-tirol.it":2,"trentinosuedtirol.it":2,"trentinsud-tirol.it":2,"xn--trentinsd-tirol-6vb.it":2,"trentinsudtirol.it":2,"xn--trentinsdtirol-nsb.it":2,"trentinsued-tirol.it":2,"trentinsuedtirol.it":2,"tuscany.it":2,"umb.it":2,"umbria.it":2,"val-d-aosta.it":2,"val-daosta.it":2,"vald-aosta.it":2,"valdaosta.it":2,"valle-aosta.it":2,"valle-d-aosta.it":2,"valle-daosta.it":2,"valleaosta.it":2,"valled-aosta.it":2,"valledaosta.it":2,"vallee-aoste.it":2,"xn--valle-aoste-ebb.it":2,"vallee-d-aoste.it":2,"xn--valle-d-aoste-ehb.it":2,"valleeaoste.it":2,"xn--valleaoste-e7a.it":2,"valleedaoste.it":2,"xn--valledaoste-ebb.it":2,"vao.it":2,"vda.it":2,"ven.it":2,"veneto.it":2,"ag.it":2,"agrigento.it":2,"al.it":2,"alessandria.it":2,"alto-adige.it":2,"altoadige.it":2,"an.it":2,"ancona.it":2,"andria-barletta-trani.it":2,"andria-trani-barletta.it":2,"andriabarlettatrani.it":2,"andriatranibarletta.it":2,"ao.it":2,"aosta.it":2,"aoste.it":2,"ap.it":2,"aq.it":2,"aquila.it":2,"ar.it":2,"arezzo.it":2,"ascoli-piceno.it":2,"ascolipiceno.it":2,"asti.it":2,"at.it":2,"av.it":2,"avellino.it":2,"ba.it":2,"balsan-sudtirol.it":2,"xn--balsan-sdtirol-nsb.it":2,"balsan-suedtirol.it":2,"balsan.it":2,"bari.it":2,"barletta-trani-andria.it":2,"barlettatraniandria.it":2,"belluno.it":2,"benevento.it":2,"bergamo.it":2,"bg.it":2,"bi.it":2,"biella.it":2,"bl.it":2,"bn.it":2,"bo.it":2,"bologna.it":2,"bolzano-altoadige.it":2,"bolzano.it":2,"bozen-sudtirol.it":2,"xn--bozen-sdtirol-2ob.it":2,"bozen-suedtirol.it":2,"bozen.it":2,"br.it":2,"brescia.it":2,"brindisi.it":2,"bs.it":2,"bt.it":2,"bulsan-sudtirol.it":2,"xn--bulsan-sdtirol-nsb.it":2,"bulsan-suedtirol.it":2,"bulsan.it":2,"bz.it":2,"ca.it":2,"cagliari.it":2,"caltanissetta.it":2,"campidano-medio.it":2,"campidanomedio.it":2,"campobasso.it":2,"carbonia-iglesias.it":2,"carboniaiglesias.it":2,"carrara-massa.it":2,"carraramassa.it":2,"caserta.it":2,"catania.it":2,"catanzaro.it":2,"cb.it":2,"ce.it":2,"cesena-forli.it":2,"xn--cesena-forl-mcb.it":2,"cesenaforli.it":2,"xn--cesenaforl-i8a.it":2,"ch.it":2,"chieti.it":2,"ci.it":2,"cl.it":2,"cn.it":2,"co.it":2,"como.it":2,"cosenza.it":2,"cr.it":2,"cremona.it":2,"crotone.it":2,"cs.it":2,"ct.it":2,"cuneo.it":2,"cz.it":2,"dell-ogliastra.it":2,"dellogliastra.it":2,"en.it":2,"enna.it":2,"fc.it":2,"fe.it":2,"fermo.it":2,"ferrara.it":2,"fg.it":2,"fi.it":2,"firenze.it":2,"florence.it":2,"fm.it":2,"foggia.it":2,"forli-cesena.it":2,"xn--forl-cesena-fcb.it":2,"forlicesena.it":2,"xn--forlcesena-c8a.it":2,"fr.it":2,"frosinone.it":2,"ge.it":2,"genoa.it":2,"genova.it":2,"go.it":2,"gorizia.it":2,"gr.it":2,"grosseto.it":2,"iglesias-carbonia.it":2,"iglesiascarbonia.it":2,"im.it":2,"imperia.it":2,"is.it":2,"isernia.it":2,"kr.it":2,"la-spezia.it":2,"laquila.it":2,"laspezia.it":2,"latina.it":2,"lc.it":2,"le.it":2,"lecce.it":2,"lecco.it":2,"li.it":2,"livorno.it":2,"lo.it":2,"lodi.it":2,"lt.it":2,"lu.it":2,"lucca.it":2,"macerata.it":2,"mantova.it":2,"massa-carrara.it":2,"massacarrara.it":2,"matera.it":2,"mb.it":2,"mc.it":2,"me.it":2,"medio-campidano.it":2,"mediocampidano.it":2,"messina.it":2,"mi.it":2,"milan.it":2,"milano.it":2,"mn.it":2,"mo.it":2,"modena.it":2,"monza-brianza.it":2,"monza-e-della-brianza.it":2,"monza.it":2,"monzabrianza.it":2,"monzaebrianza.it":2,"monzaedellabrianza.it":2,"ms.it":2,"mt.it":2,"na.it":2,"naples.it":2,"napoli.it":2,"no.it":2,"novara.it":2,"nu.it":2,"nuoro.it":2,"og.it":2,"ogliastra.it":2,"olbia-tempio.it":2,"olbiatempio.it":2,"or.it":2,"oristano.it":2,"ot.it":2,"pa.it":2,"padova.it":2,"padua.it":2,"palermo.it":2,"parma.it":2,"pavia.it":2,"pc.it":2,"pd.it":2,"pe.it":2,"perugia.it":2,"pesaro-urbino.it":2,"pesarourbino.it":2,"pescara.it":2,"pg.it":2,"pi.it":2,"piacenza.it":2,"pisa.it":2,"pistoia.it":2,"pn.it":2,"po.it":2,"pordenone.it":2,"potenza.it":2,"pr.it":2,"prato.it":2,"pt.it":2,"pu.it":2,"pv.it":2,"pz.it":2,"ra.it":2,"ragusa.it":2,"ravenna.it":2,"rc.it":2,"re.it":2,"reggio-calabria.it":2,"reggio-emilia.it":2,"reggiocalabria.it":2,"reggioemilia.it":2,"rg.it":2,"ri.it":2,"rieti.it":2,"rimini.it":2,"rm.it":2,"rn.it":2,"ro.it":2,"roma.it":2,"rome.it":2,"rovigo.it":2,"sa.it":2,"salerno.it":2,"sassari.it":2,"savona.it":2,"si.it":2,"siena.it":2,"siracusa.it":2,"so.it":2,"sondrio.it":2,"sp.it":2,"sr.it":2,"ss.it":2,"suedtirol.it":2,"xn--sdtirol-n2a.it":2,"sv.it":2,"ta.it":2,"taranto.it":2,"te.it":2,"tempio-olbia.it":2,"tempioolbia.it":2,"teramo.it":2,"terni.it":2,"tn.it":2,"to.it":2,"torino.it":2,"tp.it":2,"tr.it":2,"trani-andria-barletta.it":2,"trani-barletta-andria.it":2,"traniandriabarletta.it":2,"tranibarlettaandria.it":2,"trapani.it":2,"trento.it":2,"treviso.it":2,"trieste.it":2,"ts.it":2,"turin.it":2,"tv.it":2,"ud.it":2,"udine.it":2,"urbino-pesaro.it":2,"urbinopesaro.it":2,"va.it":2,"varese.it":2,"vb.it":2,"vc.it":2,"ve.it":2,"venezia.it":2,"venice.it":2,"verbania.it":2,"vercelli.it":2,"verona.it":2,"vi.it":2,"vibo-valentia.it":2,"vibovalentia.it":2,"vicenza.it":2,"viterbo.it":2,"vr.it":2,"vs.it":2,"vt.it":2,"vv.it":2,"je":1,"co.je":2,"net.je":2,"org.je":2,"jm":2,"jo":1,"com.jo":2,"org.jo":2,"net.jo":2,"edu.jo":2,"sch.jo":2,"gov.jo":2,"mil.jo":2,"name.jo":2,"jobs":1,"jp":1,"ac.jp":2,"ad.jp":2,"co.jp":2,"ed.jp":2,"go.jp":2,"gr.jp":2,"lg.jp":2,"ne.jp":2,"or.jp":2,"aichi.jp":2,"akita.jp":2,"aomori.jp":2,"chiba.jp":2,"ehime.jp":2,"fukui.jp":2,"fukuoka.jp":2,"fukushima.jp":2,"gifu.jp":2,"gunma.jp":2,"hiroshima.jp":2,"hokkaido.jp":2,"hyogo.jp":2,"ibaraki.jp":2,"ishikawa.jp":2,"iwate.jp":2,"kagawa.jp":2,"kagoshima.jp":2,"kanagawa.jp":2,"kochi.jp":2,"kumamoto.jp":2,"kyoto.jp":2,"mie.jp":2,"miyagi.jp":2,"miyazaki.jp":2,"nagano.jp":2,"nagasaki.jp":2,"nara.jp":2,"niigata.jp":2,"oita.jp":2,"okayama.jp":2,"okinawa.jp":2,"osaka.jp":2,"saga.jp":2,"saitama.jp":2,"shiga.jp":2,"shimane.jp":2,"shizuoka.jp":2,"tochigi.jp":2,"tokushima.jp":2,"tokyo.jp":2,"tottori.jp":2,"toyama.jp":2,"wakayama.jp":2,"yamagata.jp":2,"yamaguchi.jp":2,"yamanashi.jp":2,"xn--4pvxs.jp":2,"xn--vgu402c.jp":2,"xn--c3s14m.jp":2,"xn--f6qx53a.jp":2,"xn--8pvr4u.jp":2,"xn--uist22h.jp":2,"xn--djrs72d6uy.jp":2,"xn--mkru45i.jp":2,"xn--0trq7p7nn.jp":2,"xn--8ltr62k.jp":2,"xn--2m4a15e.jp":2,"xn--efvn9s.jp":2,"xn--32vp30h.jp":2,"xn--4it797k.jp":2,"xn--1lqs71d.jp":2,"xn--5rtp49c.jp":2,"xn--5js045d.jp":2,"xn--ehqz56n.jp":2,"xn--1lqs03n.jp":2,"xn--qqqt11m.jp":2,"xn--kbrq7o.jp":2,"xn--pssu33l.jp":2,"xn--ntsq17g.jp":2,"xn--uisz3g.jp":2,"xn--6btw5a.jp":2,"xn--1ctwo.jp":2,"xn--6orx2r.jp":2,"xn--rht61e.jp":2,"xn--rht27z.jp":2,"xn--djty4k.jp":2,"xn--nit225k.jp":2,"xn--rht3d.jp":2,"xn--klty5x.jp":2,"xn--kltx9a.jp":2,"xn--kltp7d.jp":2,"xn--uuwu58a.jp":2,"xn--zbx025d.jp":2,"xn--ntso0iqx3a.jp":2,"xn--elqq16h.jp":2,"xn--4it168d.jp":2,"xn--klt787d.jp":2,"xn--rny31h.jp":2,"xn--7t0a264c.jp":2,"xn--5rtq34k.jp":2,"xn--k7yn95e.jp":2,"xn--tor131o.jp":2,"xn--d5qv7z876c.jp":2,"kawasaki.jp":3,"kitakyushu.jp":3,"kobe.jp":3,"nagoya.jp":3,"sapporo.jp":3,"sendai.jp":3,"yokohama.jp":3,"city.kawasaki.jp":2,"city.kitakyushu.jp":2,"city.kobe.jp":2,"city.nagoya.jp":2,"city.sapporo.jp":2,"city.sendai.jp":2,"city.yokohama.jp":2,"aisai.aichi.jp":3,"ama.aichi.jp":3,"anjo.aichi.jp":3,"asuke.aichi.jp":3,"chiryu.aichi.jp":3,"chita.aichi.jp":3,"fuso.aichi.jp":3,"gamagori.aichi.jp":3,"handa.aichi.jp":3,"hazu.aichi.jp":3,"hekinan.aichi.jp":3,"higashiura.aichi.jp":3,"ichinomiya.aichi.jp":3,"inazawa.aichi.jp":3,"inuyama.aichi.jp":3,"isshiki.aichi.jp":3,"iwakura.aichi.jp":3,"kanie.aichi.jp":3,"kariya.aichi.jp":3,"kasugai.aichi.jp":3,"kira.aichi.jp":3,"kiyosu.aichi.jp":3,"komaki.aichi.jp":3,"konan.aichi.jp":3,"kota.aichi.jp":3,"mihama.aichi.jp":3,"miyoshi.aichi.jp":3,"nishio.aichi.jp":3,"nisshin.aichi.jp":3,"obu.aichi.jp":3,"oguchi.aichi.jp":3,"oharu.aichi.jp":3,"okazaki.aichi.jp":3,"owariasahi.aichi.jp":3,"seto.aichi.jp":3,"shikatsu.aichi.jp":3,"shinshiro.aichi.jp":3,"shitara.aichi.jp":3,"tahara.aichi.jp":3,"takahama.aichi.jp":3,"tobishima.aichi.jp":3,"toei.aichi.jp":3,"togo.aichi.jp":3,"tokai.aichi.jp":3,"tokoname.aichi.jp":3,"toyoake.aichi.jp":3,"toyohashi.aichi.jp":3,"toyokawa.aichi.jp":3,"toyone.aichi.jp":3,"toyota.aichi.jp":3,"tsushima.aichi.jp":3,"yatomi.aichi.jp":3,"akita.akita.jp":3,"daisen.akita.jp":3,"fujisato.akita.jp":3,"gojome.akita.jp":3,"hachirogata.akita.jp":3,"happou.akita.jp":3,"higashinaruse.akita.jp":3,"honjo.akita.jp":3,"honjyo.akita.jp":3,"ikawa.akita.jp":3,"kamikoani.akita.jp":3,"kamioka.akita.jp":3,"katagami.akita.jp":3,"kazuno.akita.jp":3,"kitaakita.akita.jp":3,"kosaka.akita.jp":3,"kyowa.akita.jp":3,"misato.akita.jp":3,"mitane.akita.jp":3,"moriyoshi.akita.jp":3,"nikaho.akita.jp":3,"noshiro.akita.jp":3,"odate.akita.jp":3,"oga.akita.jp":3,"ogata.akita.jp":3,"semboku.akita.jp":3,"yokote.akita.jp":3,"yurihonjo.akita.jp":3,"aomori.aomori.jp":3,"gonohe.aomori.jp":3,"hachinohe.aomori.jp":3,"hashikami.aomori.jp":3,"hiranai.aomori.jp":3,"hirosaki.aomori.jp":3,"itayanagi.aomori.jp":3,"kuroishi.aomori.jp":3,"misawa.aomori.jp":3,"mutsu.aomori.jp":3,"nakadomari.aomori.jp":3,"noheji.aomori.jp":3,"oirase.aomori.jp":3,"owani.aomori.jp":3,"rokunohe.aomori.jp":3,"sannohe.aomori.jp":3,"shichinohe.aomori.jp":3,"shingo.aomori.jp":3,"takko.aomori.jp":3,"towada.aomori.jp":3,"tsugaru.aomori.jp":3,"tsuruta.aomori.jp":3,"abiko.chiba.jp":3,"asahi.chiba.jp":3,"chonan.chiba.jp":3,"chosei.chiba.jp":3,"choshi.chiba.jp":3,"chuo.chiba.jp":3,"funabashi.chiba.jp":3,"futtsu.chiba.jp":3,"hanamigawa.chiba.jp":3,"ichihara.chiba.jp":3,"ichikawa.chiba.jp":3,"ichinomiya.chiba.jp":3,"inzai.chiba.jp":3,"isumi.chiba.jp":3,"kamagaya.chiba.jp":3,"kamogawa.chiba.jp":3,"kashiwa.chiba.jp":3,"katori.chiba.jp":3,"katsuura.chiba.jp":3,"kimitsu.chiba.jp":3,"kisarazu.chiba.jp":3,"kozaki.chiba.jp":3,"kujukuri.chiba.jp":3,"kyonan.chiba.jp":3,"matsudo.chiba.jp":3,"midori.chiba.jp":3,"mihama.chiba.jp":3,"minamiboso.chiba.jp":3,"mobara.chiba.jp":3,"mutsuzawa.chiba.jp":3,"nagara.chiba.jp":3,"nagareyama.chiba.jp":3,"narashino.chiba.jp":3,"narita.chiba.jp":3,"noda.chiba.jp":3,"oamishirasato.chiba.jp":3,"omigawa.chiba.jp":3,"onjuku.chiba.jp":3,"otaki.chiba.jp":3,"sakae.chiba.jp":3,"sakura.chiba.jp":3,"shimofusa.chiba.jp":3,"shirako.chiba.jp":3,"shiroi.chiba.jp":3,"shisui.chiba.jp":3,"sodegaura.chiba.jp":3,"sosa.chiba.jp":3,"tako.chiba.jp":3,"tateyama.chiba.jp":3,"togane.chiba.jp":3,"tohnosho.chiba.jp":3,"tomisato.chiba.jp":3,"urayasu.chiba.jp":3,"yachimata.chiba.jp":3,"yachiyo.chiba.jp":3,"yokaichiba.chiba.jp":3,"yokoshibahikari.chiba.jp":3,"yotsukaido.chiba.jp":3,"ainan.ehime.jp":3,"honai.ehime.jp":3,"ikata.ehime.jp":3,"imabari.ehime.jp":3,"iyo.ehime.jp":3,"kamijima.ehime.jp":3,"kihoku.ehime.jp":3,"kumakogen.ehime.jp":3,"masaki.ehime.jp":3,"matsuno.ehime.jp":3,"matsuyama.ehime.jp":3,"namikata.ehime.jp":3,"niihama.ehime.jp":3,"ozu.ehime.jp":3,"saijo.ehime.jp":3,"seiyo.ehime.jp":3,"shikokuchuo.ehime.jp":3,"tobe.ehime.jp":3,"toon.ehime.jp":3,"uchiko.ehime.jp":3,"uwajima.ehime.jp":3,"yawatahama.ehime.jp":3,"echizen.fukui.jp":3,"eiheiji.fukui.jp":3,"fukui.fukui.jp":3,"ikeda.fukui.jp":3,"katsuyama.fukui.jp":3,"mihama.fukui.jp":3,"minamiechizen.fukui.jp":3,"obama.fukui.jp":3,"ohi.fukui.jp":3,"ono.fukui.jp":3,"sabae.fukui.jp":3,"sakai.fukui.jp":3,"takahama.fukui.jp":3,"tsuruga.fukui.jp":3,"wakasa.fukui.jp":3,"ashiya.fukuoka.jp":3,"buzen.fukuoka.jp":3,"chikugo.fukuoka.jp":3,"chikuho.fukuoka.jp":3,"chikujo.fukuoka.jp":3,"chikushino.fukuoka.jp":3,"chikuzen.fukuoka.jp":3,"chuo.fukuoka.jp":3,"dazaifu.fukuoka.jp":3,"fukuchi.fukuoka.jp":3,"hakata.fukuoka.jp":3,"higashi.fukuoka.jp":3,"hirokawa.fukuoka.jp":3,"hisayama.fukuoka.jp":3,"iizuka.fukuoka.jp":3,"inatsuki.fukuoka.jp":3,"kaho.fukuoka.jp":3,"kasuga.fukuoka.jp":3,"kasuya.fukuoka.jp":3,"kawara.fukuoka.jp":3,"keisen.fukuoka.jp":3,"koga.fukuoka.jp":3,"kurate.fukuoka.jp":3,"kurogi.fukuoka.jp":3,"kurume.fukuoka.jp":3,"minami.fukuoka.jp":3,"miyako.fukuoka.jp":3,"miyama.fukuoka.jp":3,"miyawaka.fukuoka.jp":3,"mizumaki.fukuoka.jp":3,"munakata.fukuoka.jp":3,"nakagawa.fukuoka.jp":3,"nakama.fukuoka.jp":3,"nishi.fukuoka.jp":3,"nogata.fukuoka.jp":3,"ogori.fukuoka.jp":3,"okagaki.fukuoka.jp":3,"okawa.fukuoka.jp":3,"oki.fukuoka.jp":3,"omuta.fukuoka.jp":3,"onga.fukuoka.jp":3,"onojo.fukuoka.jp":3,"oto.fukuoka.jp":3,"saigawa.fukuoka.jp":3,"sasaguri.fukuoka.jp":3,"shingu.fukuoka.jp":3,"shinyoshitomi.fukuoka.jp":3,"shonai.fukuoka.jp":3,"soeda.fukuoka.jp":3,"sue.fukuoka.jp":3,"tachiarai.fukuoka.jp":3,"tagawa.fukuoka.jp":3,"takata.fukuoka.jp":3,"toho.fukuoka.jp":3,"toyotsu.fukuoka.jp":3,"tsuiki.fukuoka.jp":3,"ukiha.fukuoka.jp":3,"umi.fukuoka.jp":3,"usui.fukuoka.jp":3,"yamada.fukuoka.jp":3,"yame.fukuoka.jp":3,"yanagawa.fukuoka.jp":3,"yukuhashi.fukuoka.jp":3,"aizubange.fukushima.jp":3,"aizumisato.fukushima.jp":3,"aizuwakamatsu.fukushima.jp":3,"asakawa.fukushima.jp":3,"bandai.fukushima.jp":3,"date.fukushima.jp":3,"fukushima.fukushima.jp":3,"furudono.fukushima.jp":3,"futaba.fukushima.jp":3,"hanawa.fukushima.jp":3,"higashi.fukushima.jp":3,"hirata.fukushima.jp":3,"hirono.fukushima.jp":3,"iitate.fukushima.jp":3,"inawashiro.fukushima.jp":3,"ishikawa.fukushima.jp":3,"iwaki.fukushima.jp":3,"izumizaki.fukushima.jp":3,"kagamiishi.fukushima.jp":3,"kaneyama.fukushima.jp":3,"kawamata.fukushima.jp":3,"kitakata.fukushima.jp":3,"kitashiobara.fukushima.jp":3,"koori.fukushima.jp":3,"koriyama.fukushima.jp":3,"kunimi.fukushima.jp":3,"miharu.fukushima.jp":3,"mishima.fukushima.jp":3,"namie.fukushima.jp":3,"nango.fukushima.jp":3,"nishiaizu.fukushima.jp":3,"nishigo.fukushima.jp":3,"okuma.fukushima.jp":3,"omotego.fukushima.jp":3,"ono.fukushima.jp":3,"otama.fukushima.jp":3,"samegawa.fukushima.jp":3,"shimogo.fukushima.jp":3,"shirakawa.fukushima.jp":3,"showa.fukushima.jp":3,"soma.fukushima.jp":3,"sukagawa.fukushima.jp":3,"taishin.fukushima.jp":3,"tamakawa.fukushima.jp":3,"tanagura.fukushima.jp":3,"tenei.fukushima.jp":3,"yabuki.fukushima.jp":3,"yamato.fukushima.jp":3,"yamatsuri.fukushima.jp":3,"yanaizu.fukushima.jp":3,"yugawa.fukushima.jp":3,"anpachi.gifu.jp":3,"ena.gifu.jp":3,"gifu.gifu.jp":3,"ginan.gifu.jp":3,"godo.gifu.jp":3,"gujo.gifu.jp":3,"hashima.gifu.jp":3,"hichiso.gifu.jp":3,"hida.gifu.jp":3,"higashishirakawa.gifu.jp":3,"ibigawa.gifu.jp":3,"ikeda.gifu.jp":3,"kakamigahara.gifu.jp":3,"kani.gifu.jp":3,"kasahara.gifu.jp":3,"kasamatsu.gifu.jp":3,"kawaue.gifu.jp":3,"kitagata.gifu.jp":3,"mino.gifu.jp":3,"minokamo.gifu.jp":3,"mitake.gifu.jp":3,"mizunami.gifu.jp":3,"motosu.gifu.jp":3,"nakatsugawa.gifu.jp":3,"ogaki.gifu.jp":3,"sakahogi.gifu.jp":3,"seki.gifu.jp":3,"sekigahara.gifu.jp":3,"shirakawa.gifu.jp":3,"tajimi.gifu.jp":3,"takayama.gifu.jp":3,"tarui.gifu.jp":3,"toki.gifu.jp":3,"tomika.gifu.jp":3,"wanouchi.gifu.jp":3,"yamagata.gifu.jp":3,"yaotsu.gifu.jp":3,"yoro.gifu.jp":3,"annaka.gunma.jp":3,"chiyoda.gunma.jp":3,"fujioka.gunma.jp":3,"higashiagatsuma.gunma.jp":3,"isesaki.gunma.jp":3,"itakura.gunma.jp":3,"kanna.gunma.jp":3,"kanra.gunma.jp":3,"katashina.gunma.jp":3,"kawaba.gunma.jp":3,"kiryu.gunma.jp":3,"kusatsu.gunma.jp":3,"maebashi.gunma.jp":3,"meiwa.gunma.jp":3,"midori.gunma.jp":3,"minakami.gunma.jp":3,"naganohara.gunma.jp":3,"nakanojo.gunma.jp":3,"nanmoku.gunma.jp":3,"numata.gunma.jp":3,"oizumi.gunma.jp":3,"ora.gunma.jp":3,"ota.gunma.jp":3,"shibukawa.gunma.jp":3,"shimonita.gunma.jp":3,"shinto.gunma.jp":3,"showa.gunma.jp":3,"takasaki.gunma.jp":3,"takayama.gunma.jp":3,"tamamura.gunma.jp":3,"tatebayashi.gunma.jp":3,"tomioka.gunma.jp":3,"tsukiyono.gunma.jp":3,"tsumagoi.gunma.jp":3,"ueno.gunma.jp":3,"yoshioka.gunma.jp":3,"asaminami.hiroshima.jp":3,"daiwa.hiroshima.jp":3,"etajima.hiroshima.jp":3,"fuchu.hiroshima.jp":3,"fukuyama.hiroshima.jp":3,"hatsukaichi.hiroshima.jp":3,"higashihiroshima.hiroshima.jp":3,"hongo.hiroshima.jp":3,"jinsekikogen.hiroshima.jp":3,"kaita.hiroshima.jp":3,"kui.hiroshima.jp":3,"kumano.hiroshima.jp":3,"kure.hiroshima.jp":3,"mihara.hiroshima.jp":3,"miyoshi.hiroshima.jp":3,"naka.hiroshima.jp":3,"onomichi.hiroshima.jp":3,"osakikamijima.hiroshima.jp":3,"otake.hiroshima.jp":3,"saka.hiroshima.jp":3,"sera.hiroshima.jp":3,"seranishi.hiroshima.jp":3,"shinichi.hiroshima.jp":3,"shobara.hiroshima.jp":3,"takehara.hiroshima.jp":3,"abashiri.hokkaido.jp":3,"abira.hokkaido.jp":3,"aibetsu.hokkaido.jp":3,"akabira.hokkaido.jp":3,"akkeshi.hokkaido.jp":3,"asahikawa.hokkaido.jp":3,"ashibetsu.hokkaido.jp":3,"ashoro.hokkaido.jp":3,"assabu.hokkaido.jp":3,"atsuma.hokkaido.jp":3,"bibai.hokkaido.jp":3,"biei.hokkaido.jp":3,"bifuka.hokkaido.jp":3,"bihoro.hokkaido.jp":3,"biratori.hokkaido.jp":3,"chippubetsu.hokkaido.jp":3,"chitose.hokkaido.jp":3,"date.hokkaido.jp":3,"ebetsu.hokkaido.jp":3,"embetsu.hokkaido.jp":3,"eniwa.hokkaido.jp":3,"erimo.hokkaido.jp":3,"esan.hokkaido.jp":3,"esashi.hokkaido.jp":3,"fukagawa.hokkaido.jp":3,"fukushima.hokkaido.jp":3,"furano.hokkaido.jp":3,"furubira.hokkaido.jp":3,"haboro.hokkaido.jp":3,"hakodate.hokkaido.jp":3,"hamatonbetsu.hokkaido.jp":3,"hidaka.hokkaido.jp":3,"higashikagura.hokkaido.jp":3,"higashikawa.hokkaido.jp":3,"hiroo.hokkaido.jp":3,"hokuryu.hokkaido.jp":3,"hokuto.hokkaido.jp":3,"honbetsu.hokkaido.jp":3,"horokanai.hokkaido.jp":3,"horonobe.hokkaido.jp":3,"ikeda.hokkaido.jp":3,"imakane.hokkaido.jp":3,"ishikari.hokkaido.jp":3,"iwamizawa.hokkaido.jp":3,"iwanai.hokkaido.jp":3,"kamifurano.hokkaido.jp":3,"kamikawa.hokkaido.jp":3,"kamishihoro.hokkaido.jp":3,"kamisunagawa.hokkaido.jp":3,"kamoenai.hokkaido.jp":3,"kayabe.hokkaido.jp":3,"kembuchi.hokkaido.jp":3,"kikonai.hokkaido.jp":3,"kimobetsu.hokkaido.jp":3,"kitahiroshima.hokkaido.jp":3,"kitami.hokkaido.jp":3,"kiyosato.hokkaido.jp":3,"koshimizu.hokkaido.jp":3,"kunneppu.hokkaido.jp":3,"kuriyama.hokkaido.jp":3,"kuromatsunai.hokkaido.jp":3,"kushiro.hokkaido.jp":3,"kutchan.hokkaido.jp":3,"kyowa.hokkaido.jp":3,"mashike.hokkaido.jp":3,"matsumae.hokkaido.jp":3,"mikasa.hokkaido.jp":3,"minamifurano.hokkaido.jp":3,"mombetsu.hokkaido.jp":3,"moseushi.hokkaido.jp":3,"mukawa.hokkaido.jp":3,"muroran.hokkaido.jp":3,"naie.hokkaido.jp":3,"nakagawa.hokkaido.jp":3,"nakasatsunai.hokkaido.jp":3,"nakatombetsu.hokkaido.jp":3,"nanae.hokkaido.jp":3,"nanporo.hokkaido.jp":3,"nayoro.hokkaido.jp":3,"nemuro.hokkaido.jp":3,"niikappu.hokkaido.jp":3,"niki.hokkaido.jp":3,"nishiokoppe.hokkaido.jp":3,"noboribetsu.hokkaido.jp":3,"numata.hokkaido.jp":3,"obihiro.hokkaido.jp":3,"obira.hokkaido.jp":3,"oketo.hokkaido.jp":3,"okoppe.hokkaido.jp":3,"otaru.hokkaido.jp":3,"otobe.hokkaido.jp":3,"otofuke.hokkaido.jp":3,"otoineppu.hokkaido.jp":3,"oumu.hokkaido.jp":3,"ozora.hokkaido.jp":3,"pippu.hokkaido.jp":3,"rankoshi.hokkaido.jp":3,"rebun.hokkaido.jp":3,"rikubetsu.hokkaido.jp":3,"rishiri.hokkaido.jp":3,"rishirifuji.hokkaido.jp":3,"saroma.hokkaido.jp":3,"sarufutsu.hokkaido.jp":3,"shakotan.hokkaido.jp":3,"shari.hokkaido.jp":3,"shibecha.hokkaido.jp":3,"shibetsu.hokkaido.jp":3,"shikabe.hokkaido.jp":3,"shikaoi.hokkaido.jp":3,"shimamaki.hokkaido.jp":3,"shimizu.hokkaido.jp":3,"shimokawa.hokkaido.jp":3,"shinshinotsu.hokkaido.jp":3,"shintoku.hokkaido.jp":3,"shiranuka.hokkaido.jp":3,"shiraoi.hokkaido.jp":3,"shiriuchi.hokkaido.jp":3,"sobetsu.hokkaido.jp":3,"sunagawa.hokkaido.jp":3,"taiki.hokkaido.jp":3,"takasu.hokkaido.jp":3,"takikawa.hokkaido.jp":3,"takinoue.hokkaido.jp":3,"teshikaga.hokkaido.jp":3,"tobetsu.hokkaido.jp":3,"tohma.hokkaido.jp":3,"tomakomai.hokkaido.jp":3,"tomari.hokkaido.jp":3,"toya.hokkaido.jp":3,"toyako.hokkaido.jp":3,"toyotomi.hokkaido.jp":3,"toyoura.hokkaido.jp":3,"tsubetsu.hokkaido.jp":3,"tsukigata.hokkaido.jp":3,"urakawa.hokkaido.jp":3,"urausu.hokkaido.jp":3,"uryu.hokkaido.jp":3,"utashinai.hokkaido.jp":3,"wakkanai.hokkaido.jp":3,"wassamu.hokkaido.jp":3,"yakumo.hokkaido.jp":3,"yoichi.hokkaido.jp":3,"aioi.hyogo.jp":3,"akashi.hyogo.jp":3,"ako.hyogo.jp":3,"amagasaki.hyogo.jp":3,"aogaki.hyogo.jp":3,"asago.hyogo.jp":3,"ashiya.hyogo.jp":3,"awaji.hyogo.jp":3,"fukusaki.hyogo.jp":3,"goshiki.hyogo.jp":3,"harima.hyogo.jp":3,"himeji.hyogo.jp":3,"ichikawa.hyogo.jp":3,"inagawa.hyogo.jp":3,"itami.hyogo.jp":3,"kakogawa.hyogo.jp":3,"kamigori.hyogo.jp":3,"kamikawa.hyogo.jp":3,"kasai.hyogo.jp":3,"kasuga.hyogo.jp":3,"kawanishi.hyogo.jp":3,"miki.hyogo.jp":3,"minamiawaji.hyogo.jp":3,"nishinomiya.hyogo.jp":3,"nishiwaki.hyogo.jp":3,"ono.hyogo.jp":3,"sanda.hyogo.jp":3,"sannan.hyogo.jp":3,"sasayama.hyogo.jp":3,"sayo.hyogo.jp":3,"shingu.hyogo.jp":3,"shinonsen.hyogo.jp":3,"shiso.hyogo.jp":3,"sumoto.hyogo.jp":3,"taishi.hyogo.jp":3,"taka.hyogo.jp":3,"takarazuka.hyogo.jp":3,"takasago.hyogo.jp":3,"takino.hyogo.jp":3,"tamba.hyogo.jp":3,"tatsuno.hyogo.jp":3,"toyooka.hyogo.jp":3,"yabu.hyogo.jp":3,"yashiro.hyogo.jp":3,"yoka.hyogo.jp":3,"yokawa.hyogo.jp":3,"ami.ibaraki.jp":3,"asahi.ibaraki.jp":3,"bando.ibaraki.jp":3,"chikusei.ibaraki.jp":3,"daigo.ibaraki.jp":3,"fujishiro.ibaraki.jp":3,"hitachi.ibaraki.jp":3,"hitachinaka.ibaraki.jp":3,"hitachiomiya.ibaraki.jp":3,"hitachiota.ibaraki.jp":3,"ibaraki.ibaraki.jp":3,"ina.ibaraki.jp":3,"inashiki.ibaraki.jp":3,"itako.ibaraki.jp":3,"iwama.ibaraki.jp":3,"joso.ibaraki.jp":3,"kamisu.ibaraki.jp":3,"kasama.ibaraki.jp":3,"kashima.ibaraki.jp":3,"kasumigaura.ibaraki.jp":3,"koga.ibaraki.jp":3,"miho.ibaraki.jp":3,"mito.ibaraki.jp":3,"moriya.ibaraki.jp":3,"naka.ibaraki.jp":3,"namegata.ibaraki.jp":3,"oarai.ibaraki.jp":3,"ogawa.ibaraki.jp":3,"omitama.ibaraki.jp":3,"ryugasaki.ibaraki.jp":3,"sakai.ibaraki.jp":3,"sakuragawa.ibaraki.jp":3,"shimodate.ibaraki.jp":3,"shimotsuma.ibaraki.jp":3,"shirosato.ibaraki.jp":3,"sowa.ibaraki.jp":3,"suifu.ibaraki.jp":3,"takahagi.ibaraki.jp":3,"tamatsukuri.ibaraki.jp":3,"tokai.ibaraki.jp":3,"tomobe.ibaraki.jp":3,"tone.ibaraki.jp":3,"toride.ibaraki.jp":3,"tsuchiura.ibaraki.jp":3,"tsukuba.ibaraki.jp":3,"uchihara.ibaraki.jp":3,"ushiku.ibaraki.jp":3,"yachiyo.ibaraki.jp":3,"yamagata.ibaraki.jp":3,"yawara.ibaraki.jp":3,"yuki.ibaraki.jp":3,"anamizu.ishikawa.jp":3,"hakui.ishikawa.jp":3,"hakusan.ishikawa.jp":3,"kaga.ishikawa.jp":3,"kahoku.ishikawa.jp":3,"kanazawa.ishikawa.jp":3,"kawakita.ishikawa.jp":3,"komatsu.ishikawa.jp":3,"nakanoto.ishikawa.jp":3,"nanao.ishikawa.jp":3,"nomi.ishikawa.jp":3,"nonoichi.ishikawa.jp":3,"noto.ishikawa.jp":3,"shika.ishikawa.jp":3,"suzu.ishikawa.jp":3,"tsubata.ishikawa.jp":3,"tsurugi.ishikawa.jp":3,"uchinada.ishikawa.jp":3,"wajima.ishikawa.jp":3,"fudai.iwate.jp":3,"fujisawa.iwate.jp":3,"hanamaki.iwate.jp":3,"hiraizumi.iwate.jp":3,"hirono.iwate.jp":3,"ichinohe.iwate.jp":3,"ichinoseki.iwate.jp":3,"iwaizumi.iwate.jp":3,"iwate.iwate.jp":3,"joboji.iwate.jp":3,"kamaishi.iwate.jp":3,"kanegasaki.iwate.jp":3,"karumai.iwate.jp":3,"kawai.iwate.jp":3,"kitakami.iwate.jp":3,"kuji.iwate.jp":3,"kunohe.iwate.jp":3,"kuzumaki.iwate.jp":3,"miyako.iwate.jp":3,"mizusawa.iwate.jp":3,"morioka.iwate.jp":3,"ninohe.iwate.jp":3,"noda.iwate.jp":3,"ofunato.iwate.jp":3,"oshu.iwate.jp":3,"otsuchi.iwate.jp":3,"rikuzentakata.iwate.jp":3,"shiwa.iwate.jp":3,"shizukuishi.iwate.jp":3,"sumita.iwate.jp":3,"tanohata.iwate.jp":3,"tono.iwate.jp":3,"yahaba.iwate.jp":3,"yamada.iwate.jp":3,"ayagawa.kagawa.jp":3,"higashikagawa.kagawa.jp":3,"kanonji.kagawa.jp":3,"kotohira.kagawa.jp":3,"manno.kagawa.jp":3,"marugame.kagawa.jp":3,"mitoyo.kagawa.jp":3,"naoshima.kagawa.jp":3,"sanuki.kagawa.jp":3,"tadotsu.kagawa.jp":3,"takamatsu.kagawa.jp":3,"tonosho.kagawa.jp":3,"uchinomi.kagawa.jp":3,"utazu.kagawa.jp":3,"zentsuji.kagawa.jp":3,"akune.kagoshima.jp":3,"amami.kagoshima.jp":3,"hioki.kagoshima.jp":3,"isa.kagoshima.jp":3,"isen.kagoshima.jp":3,"izumi.kagoshima.jp":3,"kagoshima.kagoshima.jp":3,"kanoya.kagoshima.jp":3,"kawanabe.kagoshima.jp":3,"kinko.kagoshima.jp":3,"kouyama.kagoshima.jp":3,"makurazaki.kagoshima.jp":3,"matsumoto.kagoshima.jp":3,"minamitane.kagoshima.jp":3,"nakatane.kagoshima.jp":3,"nishinoomote.kagoshima.jp":3,"satsumasendai.kagoshima.jp":3,"soo.kagoshima.jp":3,"tarumizu.kagoshima.jp":3,"yusui.kagoshima.jp":3,"aikawa.kanagawa.jp":3,"atsugi.kanagawa.jp":3,"ayase.kanagawa.jp":3,"chigasaki.kanagawa.jp":3,"ebina.kanagawa.jp":3,"fujisawa.kanagawa.jp":3,"hadano.kanagawa.jp":3,"hakone.kanagawa.jp":3,"hiratsuka.kanagawa.jp":3,"isehara.kanagawa.jp":3,"kaisei.kanagawa.jp":3,"kamakura.kanagawa.jp":3,"kiyokawa.kanagawa.jp":3,"matsuda.kanagawa.jp":3,"minamiashigara.kanagawa.jp":3,"miura.kanagawa.jp":3,"nakai.kanagawa.jp":3,"ninomiya.kanagawa.jp":3,"odawara.kanagawa.jp":3,"oi.kanagawa.jp":3,"oiso.kanagawa.jp":3,"sagamihara.kanagawa.jp":3,"samukawa.kanagawa.jp":3,"tsukui.kanagawa.jp":3,"yamakita.kanagawa.jp":3,"yamato.kanagawa.jp":3,"yokosuka.kanagawa.jp":3,"yugawara.kanagawa.jp":3,"zama.kanagawa.jp":3,"zushi.kanagawa.jp":3,"aki.kochi.jp":3,"geisei.kochi.jp":3,"hidaka.kochi.jp":3,"higashitsuno.kochi.jp":3,"ino.kochi.jp":3,"kagami.kochi.jp":3,"kami.kochi.jp":3,"kitagawa.kochi.jp":3,"kochi.kochi.jp":3,"mihara.kochi.jp":3,"motoyama.kochi.jp":3,"muroto.kochi.jp":3,"nahari.kochi.jp":3,"nakamura.kochi.jp":3,"nankoku.kochi.jp":3,"nishitosa.kochi.jp":3,"niyodogawa.kochi.jp":3,"ochi.kochi.jp":3,"okawa.kochi.jp":3,"otoyo.kochi.jp":3,"otsuki.kochi.jp":3,"sakawa.kochi.jp":3,"sukumo.kochi.jp":3,"susaki.kochi.jp":3,"tosa.kochi.jp":3,"tosashimizu.kochi.jp":3,"toyo.kochi.jp":3,"tsuno.kochi.jp":3,"umaji.kochi.jp":3,"yasuda.kochi.jp":3,"yusuhara.kochi.jp":3,"amakusa.kumamoto.jp":3,"arao.kumamoto.jp":3,"aso.kumamoto.jp":3,"choyo.kumamoto.jp":3,"gyokuto.kumamoto.jp":3,"kamiamakusa.kumamoto.jp":3,"kikuchi.kumamoto.jp":3,"kumamoto.kumamoto.jp":3,"mashiki.kumamoto.jp":3,"mifune.kumamoto.jp":3,"minamata.kumamoto.jp":3,"minamioguni.kumamoto.jp":3,"nagasu.kumamoto.jp":3,"nishihara.kumamoto.jp":3,"oguni.kumamoto.jp":3,"ozu.kumamoto.jp":3,"sumoto.kumamoto.jp":3,"takamori.kumamoto.jp":3,"uki.kumamoto.jp":3,"uto.kumamoto.jp":3,"yamaga.kumamoto.jp":3,"yamato.kumamoto.jp":3,"yatsushiro.kumamoto.jp":3,"ayabe.kyoto.jp":3,"fukuchiyama.kyoto.jp":3,"higashiyama.kyoto.jp":3,"ide.kyoto.jp":3,"ine.kyoto.jp":3,"joyo.kyoto.jp":3,"kameoka.kyoto.jp":3,"kamo.kyoto.jp":3,"kita.kyoto.jp":3,"kizu.kyoto.jp":3,"kumiyama.kyoto.jp":3,"kyotamba.kyoto.jp":3,"kyotanabe.kyoto.jp":3,"kyotango.kyoto.jp":3,"maizuru.kyoto.jp":3,"minami.kyoto.jp":3,"minamiyamashiro.kyoto.jp":3,"miyazu.kyoto.jp":3,"muko.kyoto.jp":3,"nagaokakyo.kyoto.jp":3,"nakagyo.kyoto.jp":3,"nantan.kyoto.jp":3,"oyamazaki.kyoto.jp":3,"sakyo.kyoto.jp":3,"seika.kyoto.jp":3,"tanabe.kyoto.jp":3,"uji.kyoto.jp":3,"ujitawara.kyoto.jp":3,"wazuka.kyoto.jp":3,"yamashina.kyoto.jp":3,"yawata.kyoto.jp":3,"asahi.mie.jp":3,"inabe.mie.jp":3,"ise.mie.jp":3,"kameyama.mie.jp":3,"kawagoe.mie.jp":3,"kiho.mie.jp":3,"kisosaki.mie.jp":3,"kiwa.mie.jp":3,"komono.mie.jp":3,"kumano.mie.jp":3,"kuwana.mie.jp":3,"matsusaka.mie.jp":3,"meiwa.mie.jp":3,"mihama.mie.jp":3,"minamiise.mie.jp":3,"misugi.mie.jp":3,"miyama.mie.jp":3,"nabari.mie.jp":3,"shima.mie.jp":3,"suzuka.mie.jp":3,"tado.mie.jp":3,"taiki.mie.jp":3,"taki.mie.jp":3,"tamaki.mie.jp":3,"toba.mie.jp":3,"tsu.mie.jp":3,"udono.mie.jp":3,"ureshino.mie.jp":3,"watarai.mie.jp":3,"yokkaichi.mie.jp":3,"furukawa.miyagi.jp":3,"higashimatsushima.miyagi.jp":3,"ishinomaki.miyagi.jp":3,"iwanuma.miyagi.jp":3,"kakuda.miyagi.jp":3,"kami.miyagi.jp":3,"kawasaki.miyagi.jp":3,"marumori.miyagi.jp":3,"matsushima.miyagi.jp":3,"minamisanriku.miyagi.jp":3,"misato.miyagi.jp":3,"murata.miyagi.jp":3,"natori.miyagi.jp":3,"ogawara.miyagi.jp":3,"ohira.miyagi.jp":3,"onagawa.miyagi.jp":3,"osaki.miyagi.jp":3,"rifu.miyagi.jp":3,"semine.miyagi.jp":3,"shibata.miyagi.jp":3,"shichikashuku.miyagi.jp":3,"shikama.miyagi.jp":3,"shiogama.miyagi.jp":3,"shiroishi.miyagi.jp":3,"tagajo.miyagi.jp":3,"taiwa.miyagi.jp":3,"tome.miyagi.jp":3,"tomiya.miyagi.jp":3,"wakuya.miyagi.jp":3,"watari.miyagi.jp":3,"yamamoto.miyagi.jp":3,"zao.miyagi.jp":3,"aya.miyazaki.jp":3,"ebino.miyazaki.jp":3,"gokase.miyazaki.jp":3,"hyuga.miyazaki.jp":3,"kadogawa.miyazaki.jp":3,"kawaminami.miyazaki.jp":3,"kijo.miyazaki.jp":3,"kitagawa.miyazaki.jp":3,"kitakata.miyazaki.jp":3,"kitaura.miyazaki.jp":3,"kobayashi.miyazaki.jp":3,"kunitomi.miyazaki.jp":3,"kushima.miyazaki.jp":3,"mimata.miyazaki.jp":3,"miyakonojo.miyazaki.jp":3,"miyazaki.miyazaki.jp":3,"morotsuka.miyazaki.jp":3,"nichinan.miyazaki.jp":3,"nishimera.miyazaki.jp":3,"nobeoka.miyazaki.jp":3,"saito.miyazaki.jp":3,"shiiba.miyazaki.jp":3,"shintomi.miyazaki.jp":3,"takaharu.miyazaki.jp":3,"takanabe.miyazaki.jp":3,"takazaki.miyazaki.jp":3,"tsuno.miyazaki.jp":3,"achi.nagano.jp":3,"agematsu.nagano.jp":3,"anan.nagano.jp":3,"aoki.nagano.jp":3,"asahi.nagano.jp":3,"azumino.nagano.jp":3,"chikuhoku.nagano.jp":3,"chikuma.nagano.jp":3,"chino.nagano.jp":3,"fujimi.nagano.jp":3,"hakuba.nagano.jp":3,"hara.nagano.jp":3,"hiraya.nagano.jp":3,"iida.nagano.jp":3,"iijima.nagano.jp":3,"iiyama.nagano.jp":3,"iizuna.nagano.jp":3,"ikeda.nagano.jp":3,"ikusaka.nagano.jp":3,"ina.nagano.jp":3,"karuizawa.nagano.jp":3,"kawakami.nagano.jp":3,"kiso.nagano.jp":3,"kisofukushima.nagano.jp":3,"kitaaiki.nagano.jp":3,"komagane.nagano.jp":3,"komoro.nagano.jp":3,"matsukawa.nagano.jp":3,"matsumoto.nagano.jp":3,"miasa.nagano.jp":3,"minamiaiki.nagano.jp":3,"minamimaki.nagano.jp":3,"minamiminowa.nagano.jp":3,"minowa.nagano.jp":3,"miyada.nagano.jp":3,"miyota.nagano.jp":3,"mochizuki.nagano.jp":3,"nagano.nagano.jp":3,"nagawa.nagano.jp":3,"nagiso.nagano.jp":3,"nakagawa.nagano.jp":3,"nakano.nagano.jp":3,"nozawaonsen.nagano.jp":3,"obuse.nagano.jp":3,"ogawa.nagano.jp":3,"okaya.nagano.jp":3,"omachi.nagano.jp":3,"omi.nagano.jp":3,"ookuwa.nagano.jp":3,"ooshika.nagano.jp":3,"otaki.nagano.jp":3,"otari.nagano.jp":3,"sakae.nagano.jp":3,"sakaki.nagano.jp":3,"saku.nagano.jp":3,"sakuho.nagano.jp":3,"shimosuwa.nagano.jp":3,"shinanomachi.nagano.jp":3,"shiojiri.nagano.jp":3,"suwa.nagano.jp":3,"suzaka.nagano.jp":3,"takagi.nagano.jp":3,"takamori.nagano.jp":3,"takayama.nagano.jp":3,"tateshina.nagano.jp":3,"tatsuno.nagano.jp":3,"togakushi.nagano.jp":3,"togura.nagano.jp":3,"tomi.nagano.jp":3,"ueda.nagano.jp":3,"wada.nagano.jp":3,"yamagata.nagano.jp":3,"yamanouchi.nagano.jp":3,"yasaka.nagano.jp":3,"yasuoka.nagano.jp":3,"chijiwa.nagasaki.jp":3,"futsu.nagasaki.jp":3,"goto.nagasaki.jp":3,"hasami.nagasaki.jp":3,"hirado.nagasaki.jp":3,"iki.nagasaki.jp":3,"isahaya.nagasaki.jp":3,"kawatana.nagasaki.jp":3,"kuchinotsu.nagasaki.jp":3,"matsuura.nagasaki.jp":3,"nagasaki.nagasaki.jp":3,"obama.nagasaki.jp":3,"omura.nagasaki.jp":3,"oseto.nagasaki.jp":3,"saikai.nagasaki.jp":3,"sasebo.nagasaki.jp":3,"seihi.nagasaki.jp":3,"shimabara.nagasaki.jp":3,"shinkamigoto.nagasaki.jp":3,"togitsu.nagasaki.jp":3,"tsushima.nagasaki.jp":3,"unzen.nagasaki.jp":3,"ando.nara.jp":3,"gose.nara.jp":3,"heguri.nara.jp":3,"higashiyoshino.nara.jp":3,"ikaruga.nara.jp":3,"ikoma.nara.jp":3,"kamikitayama.nara.jp":3,"kanmaki.nara.jp":3,"kashiba.nara.jp":3,"kashihara.nara.jp":3,"katsuragi.nara.jp":3,"kawai.nara.jp":3,"kawakami.nara.jp":3,"kawanishi.nara.jp":3,"koryo.nara.jp":3,"kurotaki.nara.jp":3,"mitsue.nara.jp":3,"miyake.nara.jp":3,"nara.nara.jp":3,"nosegawa.nara.jp":3,"oji.nara.jp":3,"ouda.nara.jp":3,"oyodo.nara.jp":3,"sakurai.nara.jp":3,"sango.nara.jp":3,"shimoichi.nara.jp":3,"shimokitayama.nara.jp":3,"shinjo.nara.jp":3,"soni.nara.jp":3,"takatori.nara.jp":3,"tawaramoto.nara.jp":3,"tenkawa.nara.jp":3,"tenri.nara.jp":3,"uda.nara.jp":3,"yamatokoriyama.nara.jp":3,"yamatotakada.nara.jp":3,"yamazoe.nara.jp":3,"yoshino.nara.jp":3,"aga.niigata.jp":3,"agano.niigata.jp":3,"gosen.niigata.jp":3,"itoigawa.niigata.jp":3,"izumozaki.niigata.jp":3,"joetsu.niigata.jp":3,"kamo.niigata.jp":3,"kariwa.niigata.jp":3,"kashiwazaki.niigata.jp":3,"minamiuonuma.niigata.jp":3,"mitsuke.niigata.jp":3,"muika.niigata.jp":3,"murakami.niigata.jp":3,"myoko.niigata.jp":3,"nagaoka.niigata.jp":3,"niigata.niigata.jp":3,"ojiya.niigata.jp":3,"omi.niigata.jp":3,"sado.niigata.jp":3,"sanjo.niigata.jp":3,"seiro.niigata.jp":3,"seirou.niigata.jp":3,"sekikawa.niigata.jp":3,"shibata.niigata.jp":3,"tagami.niigata.jp":3,"tainai.niigata.jp":3,"tochio.niigata.jp":3,"tokamachi.niigata.jp":3,"tsubame.niigata.jp":3,"tsunan.niigata.jp":3,"uonuma.niigata.jp":3,"yahiko.niigata.jp":3,"yoita.niigata.jp":3,"yuzawa.niigata.jp":3,"beppu.oita.jp":3,"bungoono.oita.jp":3,"bungotakada.oita.jp":3,"hasama.oita.jp":3,"hiji.oita.jp":3,"himeshima.oita.jp":3,"hita.oita.jp":3,"kamitsue.oita.jp":3,"kokonoe.oita.jp":3,"kuju.oita.jp":3,"kunisaki.oita.jp":3,"kusu.oita.jp":3,"oita.oita.jp":3,"saiki.oita.jp":3,"taketa.oita.jp":3,"tsukumi.oita.jp":3,"usa.oita.jp":3,"usuki.oita.jp":3,"yufu.oita.jp":3,"akaiwa.okayama.jp":3,"asakuchi.okayama.jp":3,"bizen.okayama.jp":3,"hayashima.okayama.jp":3,"ibara.okayama.jp":3,"kagamino.okayama.jp":3,"kasaoka.okayama.jp":3,"kibichuo.okayama.jp":3,"kumenan.okayama.jp":3,"kurashiki.okayama.jp":3,"maniwa.okayama.jp":3,"misaki.okayama.jp":3,"nagi.okayama.jp":3,"niimi.okayama.jp":3,"nishiawakura.okayama.jp":3,"okayama.okayama.jp":3,"satosho.okayama.jp":3,"setouchi.okayama.jp":3,"shinjo.okayama.jp":3,"shoo.okayama.jp":3,"soja.okayama.jp":3,"takahashi.okayama.jp":3,"tamano.okayama.jp":3,"tsuyama.okayama.jp":3,"wake.okayama.jp":3,"yakage.okayama.jp":3,"aguni.okinawa.jp":3,"ginowan.okinawa.jp":3,"ginoza.okinawa.jp":3,"gushikami.okinawa.jp":3,"haebaru.okinawa.jp":3,"higashi.okinawa.jp":3,"hirara.okinawa.jp":3,"iheya.okinawa.jp":3,"ishigaki.okinawa.jp":3,"ishikawa.okinawa.jp":3,"itoman.okinawa.jp":3,"izena.okinawa.jp":3,"kadena.okinawa.jp":3,"kin.okinawa.jp":3,"kitadaito.okinawa.jp":3,"kitanakagusuku.okinawa.jp":3,"kumejima.okinawa.jp":3,"kunigami.okinawa.jp":3,"minamidaito.okinawa.jp":3,"motobu.okinawa.jp":3,"nago.okinawa.jp":3,"naha.okinawa.jp":3,"nakagusuku.okinawa.jp":3,"nakijin.okinawa.jp":3,"nanjo.okinawa.jp":3,"nishihara.okinawa.jp":3,"ogimi.okinawa.jp":3,"okinawa.okinawa.jp":3,"onna.okinawa.jp":3,"shimoji.okinawa.jp":3,"taketomi.okinawa.jp":3,"tarama.okinawa.jp":3,"tokashiki.okinawa.jp":3,"tomigusuku.okinawa.jp":3,"tonaki.okinawa.jp":3,"urasoe.okinawa.jp":3,"uruma.okinawa.jp":3,"yaese.okinawa.jp":3,"yomitan.okinawa.jp":3,"yonabaru.okinawa.jp":3,"yonaguni.okinawa.jp":3,"zamami.okinawa.jp":3,"abeno.osaka.jp":3,"chihayaakasaka.osaka.jp":3,"chuo.osaka.jp":3,"daito.osaka.jp":3,"fujiidera.osaka.jp":3,"habikino.osaka.jp":3,"hannan.osaka.jp":3,"higashiosaka.osaka.jp":3,"higashisumiyoshi.osaka.jp":3,"higashiyodogawa.osaka.jp":3,"hirakata.osaka.jp":3,"ibaraki.osaka.jp":3,"ikeda.osaka.jp":3,"izumi.osaka.jp":3,"izumiotsu.osaka.jp":3,"izumisano.osaka.jp":3,"kadoma.osaka.jp":3,"kaizuka.osaka.jp":3,"kanan.osaka.jp":3,"kashiwara.osaka.jp":3,"katano.osaka.jp":3,"kawachinagano.osaka.jp":3,"kishiwada.osaka.jp":3,"kita.osaka.jp":3,"kumatori.osaka.jp":3,"matsubara.osaka.jp":3,"minato.osaka.jp":3,"minoh.osaka.jp":3,"misaki.osaka.jp":3,"moriguchi.osaka.jp":3,"neyagawa.osaka.jp":3,"nishi.osaka.jp":3,"nose.osaka.jp":3,"osakasayama.osaka.jp":3,"sakai.osaka.jp":3,"sayama.osaka.jp":3,"sennan.osaka.jp":3,"settsu.osaka.jp":3,"shijonawate.osaka.jp":3,"shimamoto.osaka.jp":3,"suita.osaka.jp":3,"tadaoka.osaka.jp":3,"taishi.osaka.jp":3,"tajiri.osaka.jp":3,"takaishi.osaka.jp":3,"takatsuki.osaka.jp":3,"tondabayashi.osaka.jp":3,"toyonaka.osaka.jp":3,"toyono.osaka.jp":3,"yao.osaka.jp":3,"ariake.saga.jp":3,"arita.saga.jp":3,"fukudomi.saga.jp":3,"genkai.saga.jp":3,"hamatama.saga.jp":3,"hizen.saga.jp":3,"imari.saga.jp":3,"kamimine.saga.jp":3,"kanzaki.saga.jp":3,"karatsu.saga.jp":3,"kashima.saga.jp":3,"kitagata.saga.jp":3,"kitahata.saga.jp":3,"kiyama.saga.jp":3,"kouhoku.saga.jp":3,"kyuragi.saga.jp":3,"nishiarita.saga.jp":3,"ogi.saga.jp":3,"omachi.saga.jp":3,"ouchi.saga.jp":3,"saga.saga.jp":3,"shiroishi.saga.jp":3,"taku.saga.jp":3,"tara.saga.jp":3,"tosu.saga.jp":3,"yoshinogari.saga.jp":3,"arakawa.saitama.jp":3,"asaka.saitama.jp":3,"chichibu.saitama.jp":3,"fujimi.saitama.jp":3,"fujimino.saitama.jp":3,"fukaya.saitama.jp":3,"hanno.saitama.jp":3,"hanyu.saitama.jp":3,"hasuda.saitama.jp":3,"hatogaya.saitama.jp":3,"hatoyama.saitama.jp":3,"hidaka.saitama.jp":3,"higashichichibu.saitama.jp":3,"higashimatsuyama.saitama.jp":3,"honjo.saitama.jp":3,"ina.saitama.jp":3,"iruma.saitama.jp":3,"iwatsuki.saitama.jp":3,"kamiizumi.saitama.jp":3,"kamikawa.saitama.jp":3,"kamisato.saitama.jp":3,"kasukabe.saitama.jp":3,"kawagoe.saitama.jp":3,"kawaguchi.saitama.jp":3,"kawajima.saitama.jp":3,"kazo.saitama.jp":3,"kitamoto.saitama.jp":3,"koshigaya.saitama.jp":3,"kounosu.saitama.jp":3,"kuki.saitama.jp":3,"kumagaya.saitama.jp":3,"matsubushi.saitama.jp":3,"minano.saitama.jp":3,"misato.saitama.jp":3,"miyashiro.saitama.jp":3,"miyoshi.saitama.jp":3,"moroyama.saitama.jp":3,"nagatoro.saitama.jp":3,"namegawa.saitama.jp":3,"niiza.saitama.jp":3,"ogano.saitama.jp":3,"ogawa.saitama.jp":3,"ogose.saitama.jp":3,"okegawa.saitama.jp":3,"omiya.saitama.jp":3,"otaki.saitama.jp":3,"ranzan.saitama.jp":3,"ryokami.saitama.jp":3,"saitama.saitama.jp":3,"sakado.saitama.jp":3,"satte.saitama.jp":3,"sayama.saitama.jp":3,"shiki.saitama.jp":3,"shiraoka.saitama.jp":3,"soka.saitama.jp":3,"sugito.saitama.jp":3,"toda.saitama.jp":3,"tokigawa.saitama.jp":3,"tokorozawa.saitama.jp":3,"tsurugashima.saitama.jp":3,"urawa.saitama.jp":3,"warabi.saitama.jp":3,"yashio.saitama.jp":3,"yokoze.saitama.jp":3,"yono.saitama.jp":3,"yorii.saitama.jp":3,"yoshida.saitama.jp":3,"yoshikawa.saitama.jp":3,"yoshimi.saitama.jp":3,"aisho.shiga.jp":3,"gamo.shiga.jp":3,"higashiomi.shiga.jp":3,"hikone.shiga.jp":3,"koka.shiga.jp":3,"konan.shiga.jp":3,"kosei.shiga.jp":3,"koto.shiga.jp":3,"kusatsu.shiga.jp":3,"maibara.shiga.jp":3,"moriyama.shiga.jp":3,"nagahama.shiga.jp":3,"nishiazai.shiga.jp":3,"notogawa.shiga.jp":3,"omihachiman.shiga.jp":3,"otsu.shiga.jp":3,"ritto.shiga.jp":3,"ryuoh.shiga.jp":3,"takashima.shiga.jp":3,"takatsuki.shiga.jp":3,"torahime.shiga.jp":3,"toyosato.shiga.jp":3,"yasu.shiga.jp":3,"akagi.shimane.jp":3,"ama.shimane.jp":3,"gotsu.shimane.jp":3,"hamada.shimane.jp":3,"higashiizumo.shimane.jp":3,"hikawa.shimane.jp":3,"hikimi.shimane.jp":3,"izumo.shimane.jp":3,"kakinoki.shimane.jp":3,"masuda.shimane.jp":3,"matsue.shimane.jp":3,"misato.shimane.jp":3,"nishinoshima.shimane.jp":3,"ohda.shimane.jp":3,"okinoshima.shimane.jp":3,"okuizumo.shimane.jp":3,"shimane.shimane.jp":3,"tamayu.shimane.jp":3,"tsuwano.shimane.jp":3,"unnan.shimane.jp":3,"yakumo.shimane.jp":3,"yasugi.shimane.jp":3,"yatsuka.shimane.jp":3,"arai.shizuoka.jp":3,"atami.shizuoka.jp":3,"fuji.shizuoka.jp":3,"fujieda.shizuoka.jp":3,"fujikawa.shizuoka.jp":3,"fujinomiya.shizuoka.jp":3,"fukuroi.shizuoka.jp":3,"gotemba.shizuoka.jp":3,"haibara.shizuoka.jp":3,"hamamatsu.shizuoka.jp":3,"higashiizu.shizuoka.jp":3,"ito.shizuoka.jp":3,"iwata.shizuoka.jp":3,"izu.shizuoka.jp":3,"izunokuni.shizuoka.jp":3,"kakegawa.shizuoka.jp":3,"kannami.shizuoka.jp":3,"kawanehon.shizuoka.jp":3,"kawazu.shizuoka.jp":3,"kikugawa.shizuoka.jp":3,"kosai.shizuoka.jp":3,"makinohara.shizuoka.jp":3,"matsuzaki.shizuoka.jp":3,"minamiizu.shizuoka.jp":3,"mishima.shizuoka.jp":3,"morimachi.shizuoka.jp":3,"nishiizu.shizuoka.jp":3,"numazu.shizuoka.jp":3,"omaezaki.shizuoka.jp":3,"shimada.shizuoka.jp":3,"shimizu.shizuoka.jp":3,"shimoda.shizuoka.jp":3,"shizuoka.shizuoka.jp":3,"susono.shizuoka.jp":3,"yaizu.shizuoka.jp":3,"yoshida.shizuoka.jp":3,"ashikaga.tochigi.jp":3,"bato.tochigi.jp":3,"haga.tochigi.jp":3,"ichikai.tochigi.jp":3,"iwafune.tochigi.jp":3,"kaminokawa.tochigi.jp":3,"kanuma.tochigi.jp":3,"karasuyama.tochigi.jp":3,"kuroiso.tochigi.jp":3,"mashiko.tochigi.jp":3,"mibu.tochigi.jp":3,"moka.tochigi.jp":3,"motegi.tochigi.jp":3,"nasu.tochigi.jp":3,"nasushiobara.tochigi.jp":3,"nikko.tochigi.jp":3,"nishikata.tochigi.jp":3,"nogi.tochigi.jp":3,"ohira.tochigi.jp":3,"ohtawara.tochigi.jp":3,"oyama.tochigi.jp":3,"sakura.tochigi.jp":3,"sano.tochigi.jp":3,"shimotsuke.tochigi.jp":3,"shioya.tochigi.jp":3,"takanezawa.tochigi.jp":3,"tochigi.tochigi.jp":3,"tsuga.tochigi.jp":3,"ujiie.tochigi.jp":3,"utsunomiya.tochigi.jp":3,"yaita.tochigi.jp":3,"aizumi.tokushima.jp":3,"anan.tokushima.jp":3,"ichiba.tokushima.jp":3,"itano.tokushima.jp":3,"kainan.tokushima.jp":3,"komatsushima.tokushima.jp":3,"matsushige.tokushima.jp":3,"mima.tokushima.jp":3,"minami.tokushima.jp":3,"miyoshi.tokushima.jp":3,"mugi.tokushima.jp":3,"nakagawa.tokushima.jp":3,"naruto.tokushima.jp":3,"sanagochi.tokushima.jp":3,"shishikui.tokushima.jp":3,"tokushima.tokushima.jp":3,"wajiki.tokushima.jp":3,"adachi.tokyo.jp":3,"akiruno.tokyo.jp":3,"akishima.tokyo.jp":3,"aogashima.tokyo.jp":3,"arakawa.tokyo.jp":3,"bunkyo.tokyo.jp":3,"chiyoda.tokyo.jp":3,"chofu.tokyo.jp":3,"chuo.tokyo.jp":3,"edogawa.tokyo.jp":3,"fuchu.tokyo.jp":3,"fussa.tokyo.jp":3,"hachijo.tokyo.jp":3,"hachioji.tokyo.jp":3,"hamura.tokyo.jp":3,"higashikurume.tokyo.jp":3,"higashimurayama.tokyo.jp":3,"higashiyamato.tokyo.jp":3,"hino.tokyo.jp":3,"hinode.tokyo.jp":3,"hinohara.tokyo.jp":3,"inagi.tokyo.jp":3,"itabashi.tokyo.jp":3,"katsushika.tokyo.jp":3,"kita.tokyo.jp":3,"kiyose.tokyo.jp":3,"kodaira.tokyo.jp":3,"koganei.tokyo.jp":3,"kokubunji.tokyo.jp":3,"komae.tokyo.jp":3,"koto.tokyo.jp":3,"kouzushima.tokyo.jp":3,"kunitachi.tokyo.jp":3,"machida.tokyo.jp":3,"meguro.tokyo.jp":3,"minato.tokyo.jp":3,"mitaka.tokyo.jp":3,"mizuho.tokyo.jp":3,"musashimurayama.tokyo.jp":3,"musashino.tokyo.jp":3,"nakano.tokyo.jp":3,"nerima.tokyo.jp":3,"ogasawara.tokyo.jp":3,"okutama.tokyo.jp":3,"ome.tokyo.jp":3,"oshima.tokyo.jp":3,"ota.tokyo.jp":3,"setagaya.tokyo.jp":3,"shibuya.tokyo.jp":3,"shinagawa.tokyo.jp":3,"shinjuku.tokyo.jp":3,"suginami.tokyo.jp":3,"sumida.tokyo.jp":3,"tachikawa.tokyo.jp":3,"taito.tokyo.jp":3,"tama.tokyo.jp":3,"toshima.tokyo.jp":3,"chizu.tottori.jp":3,"hino.tottori.jp":3,"kawahara.tottori.jp":3,"koge.tottori.jp":3,"kotoura.tottori.jp":3,"misasa.tottori.jp":3,"nanbu.tottori.jp":3,"nichinan.tottori.jp":3,"sakaiminato.tottori.jp":3,"tottori.tottori.jp":3,"wakasa.tottori.jp":3,"yazu.tottori.jp":3,"yonago.tottori.jp":3,"asahi.toyama.jp":3,"fuchu.toyama.jp":3,"fukumitsu.toyama.jp":3,"funahashi.toyama.jp":3,"himi.toyama.jp":3,"imizu.toyama.jp":3,"inami.toyama.jp":3,"johana.toyama.jp":3,"kamiichi.toyama.jp":3,"kurobe.toyama.jp":3,"nakaniikawa.toyama.jp":3,"namerikawa.toyama.jp":3,"nanto.toyama.jp":3,"nyuzen.toyama.jp":3,"oyabe.toyama.jp":3,"taira.toyama.jp":3,"takaoka.toyama.jp":3,"tateyama.toyama.jp":3,"toga.toyama.jp":3,"tonami.toyama.jp":3,"toyama.toyama.jp":3,"unazuki.toyama.jp":3,"uozu.toyama.jp":3,"yamada.toyama.jp":3,"arida.wakayama.jp":3,"aridagawa.wakayama.jp":3,"gobo.wakayama.jp":3,"hashimoto.wakayama.jp":3,"hidaka.wakayama.jp":3,"hirogawa.wakayama.jp":3,"inami.wakayama.jp":3,"iwade.wakayama.jp":3,"kainan.wakayama.jp":3,"kamitonda.wakayama.jp":3,"katsuragi.wakayama.jp":3,"kimino.wakayama.jp":3,"kinokawa.wakayama.jp":3,"kitayama.wakayama.jp":3,"koya.wakayama.jp":3,"koza.wakayama.jp":3,"kozagawa.wakayama.jp":3,"kudoyama.wakayama.jp":3,"kushimoto.wakayama.jp":3,"mihama.wakayama.jp":3,"misato.wakayama.jp":3,"nachikatsuura.wakayama.jp":3,"shingu.wakayama.jp":3,"shirahama.wakayama.jp":3,"taiji.wakayama.jp":3,"tanabe.wakayama.jp":3,"wakayama.wakayama.jp":3,"yuasa.wakayama.jp":3,"yura.wakayama.jp":3,"asahi.yamagata.jp":3,"funagata.yamagata.jp":3,"higashine.yamagata.jp":3,"iide.yamagata.jp":3,"kahoku.yamagata.jp":3,"kaminoyama.yamagata.jp":3,"kaneyama.yamagata.jp":3,"kawanishi.yamagata.jp":3,"mamurogawa.yamagata.jp":3,"mikawa.yamagata.jp":3,"murayama.yamagata.jp":3,"nagai.yamagata.jp":3,"nakayama.yamagata.jp":3,"nanyo.yamagata.jp":3,"nishikawa.yamagata.jp":3,"obanazawa.yamagata.jp":3,"oe.yamagata.jp":3,"oguni.yamagata.jp":3,"ohkura.yamagata.jp":3,"oishida.yamagata.jp":3,"sagae.yamagata.jp":3,"sakata.yamagata.jp":3,"sakegawa.yamagata.jp":3,"shinjo.yamagata.jp":3,"shirataka.yamagata.jp":3,"shonai.yamagata.jp":3,"takahata.yamagata.jp":3,"tendo.yamagata.jp":3,"tozawa.yamagata.jp":3,"tsuruoka.yamagata.jp":3,"yamagata.yamagata.jp":3,"yamanobe.yamagata.jp":3,"yonezawa.yamagata.jp":3,"yuza.yamagata.jp":3,"abu.yamaguchi.jp":3,"hagi.yamaguchi.jp":3,"hikari.yamaguchi.jp":3,"hofu.yamaguchi.jp":3,"iwakuni.yamaguchi.jp":3,"kudamatsu.yamaguchi.jp":3,"mitou.yamaguchi.jp":3,"nagato.yamaguchi.jp":3,"oshima.yamaguchi.jp":3,"shimonoseki.yamaguchi.jp":3,"shunan.yamaguchi.jp":3,"tabuse.yamaguchi.jp":3,"tokuyama.yamaguchi.jp":3,"toyota.yamaguchi.jp":3,"ube.yamaguchi.jp":3,"yuu.yamaguchi.jp":3,"chuo.yamanashi.jp":3,"doshi.yamanashi.jp":3,"fuefuki.yamanashi.jp":3,"fujikawa.yamanashi.jp":3,"fujikawaguchiko.yamanashi.jp":3,"fujiyoshida.yamanashi.jp":3,"hayakawa.yamanashi.jp":3,"hokuto.yamanashi.jp":3,"ichikawamisato.yamanashi.jp":3,"kai.yamanashi.jp":3,"kofu.yamanashi.jp":3,"koshu.yamanashi.jp":3,"kosuge.yamanashi.jp":3,"minami-alps.yamanashi.jp":3,"minobu.yamanashi.jp":3,"nakamichi.yamanashi.jp":3,"nanbu.yamanashi.jp":3,"narusawa.yamanashi.jp":3,"nirasaki.yamanashi.jp":3,"nishikatsura.yamanashi.jp":3,"oshino.yamanashi.jp":3,"otsuki.yamanashi.jp":3,"showa.yamanashi.jp":3,"tabayama.yamanashi.jp":3,"tsuru.yamanashi.jp":3,"uenohara.yamanashi.jp":3,"yamanakako.yamanashi.jp":3,"yamanashi.yamanashi.jp":3,"ke":1,"ac.ke":2,"co.ke":2,"go.ke":2,"info.ke":2,"me.ke":2,"mobi.ke":2,"ne.ke":2,"or.ke":2,"sc.ke":2,"kg":1,"org.kg":2,"net.kg":2,"com.kg":2,"edu.kg":2,"gov.kg":2,"mil.kg":2,"kh":2,"ki":1,"edu.ki":2,"biz.ki":2,"net.ki":2,"org.ki":2,"gov.ki":2,"info.ki":2,"com.ki":2,"km":1,"org.km":2,"nom.km":2,"gov.km":2,"prd.km":2,"tm.km":2,"edu.km":2,"mil.km":2,"ass.km":2,"com.km":2,"coop.km":2,"asso.km":2,"presse.km":2,"medecin.km":2,"notaires.km":2,"pharmaciens.km":2,"veterinaire.km":2,"gouv.km":2,"kn":1,"net.kn":2,"org.kn":2,"edu.kn":2,"gov.kn":2,"kp":1,"com.kp":2,"edu.kp":2,"gov.kp":2,"org.kp":2,"rep.kp":2,"tra.kp":2,"kr":1,"ac.kr":2,"co.kr":2,"es.kr":2,"go.kr":2,"hs.kr":2,"kg.kr":2,"mil.kr":2,"ms.kr":2,"ne.kr":2,"or.kr":2,"pe.kr":2,"re.kr":2,"sc.kr":2,"busan.kr":2,"chungbuk.kr":2,"chungnam.kr":2,"daegu.kr":2,"daejeon.kr":2,"gangwon.kr":2,"gwangju.kr":2,"gyeongbuk.kr":2,"gyeonggi.kr":2,"gyeongnam.kr":2,"incheon.kr":2,"jeju.kr":2,"jeonbuk.kr":2,"jeonnam.kr":2,"seoul.kr":2,"ulsan.kr":2,"kw":1,"com.kw":2,"edu.kw":2,"emb.kw":2,"gov.kw":2,"ind.kw":2,"net.kw":2,"org.kw":2,"ky":1,"com.ky":2,"edu.ky":2,"net.ky":2,"org.ky":2,"kz":1,"org.kz":2,"edu.kz":2,"net.kz":2,"gov.kz":2,"mil.kz":2,"com.kz":2,"la":1,"int.la":2,"net.la":2,"info.la":2,"edu.la":2,"gov.la":2,"per.la":2,"com.la":2,"org.la":2,"lb":1,"com.lb":2,"edu.lb":2,"gov.lb":2,"net.lb":2,"org.lb":2,"lc":1,"com.lc":2,"net.lc":2,"co.lc":2,"org.lc":2,"edu.lc":2,"gov.lc":2,"li":1,"lk":1,"gov.lk":2,"sch.lk":2,"net.lk":2,"int.lk":2,"com.lk":2,"org.lk":2,"edu.lk":2,"ngo.lk":2,"soc.lk":2,"web.lk":2,"ltd.lk":2,"assn.lk":2,"grp.lk":2,"hotel.lk":2,"ac.lk":2,"lr":1,"com.lr":2,"edu.lr":2,"gov.lr":2,"org.lr":2,"net.lr":2,"ls":1,"ac.ls":2,"biz.ls":2,"co.ls":2,"edu.ls":2,"gov.ls":2,"info.ls":2,"net.ls":2,"org.ls":2,"sc.ls":2,"lt":1,"gov.lt":2,"lu":1,"lv":1,"com.lv":2,"edu.lv":2,"gov.lv":2,"org.lv":2,"mil.lv":2,"id.lv":2,"net.lv":2,"asn.lv":2,"conf.lv":2,"ly":1,"com.ly":2,"net.ly":2,"gov.ly":2,"plc.ly":2,"edu.ly":2,"sch.ly":2,"med.ly":2,"org.ly":2,"id.ly":2,"ma":1,"co.ma":2,"net.ma":2,"gov.ma":2,"org.ma":2,"ac.ma":2,"press.ma":2,"mc":1,"tm.mc":2,"asso.mc":2,"md":1,"me":1,"co.me":2,"net.me":2,"org.me":2,"edu.me":2,"ac.me":2,"gov.me":2,"its.me":2,"priv.me":2,"mg":1,"org.mg":2,"nom.mg":2,"gov.mg":2,"prd.mg":2,"tm.mg":2,"edu.mg":2,"mil.mg":2,"com.mg":2,"co.mg":2,"mh":1,"mil":1,"mk":1,"com.mk":2,"org.mk":2,"net.mk":2,"edu.mk":2,"gov.mk":2,"inf.mk":2,"name.mk":2,"ml":1,"com.ml":2,"edu.ml":2,"gouv.ml":2,"gov.ml":2,"net.ml":2,"org.ml":2,"presse.ml":2,"mm":2,"mn":1,"gov.mn":2,"edu.mn":2,"org.mn":2,"mo":1,"com.mo":2,"net.mo":2,"org.mo":2,"edu.mo":2,"gov.mo":2,"mobi":1,"mp":1,"mq":1,"mr":1,"gov.mr":2,"ms":1,"com.ms":2,"edu.ms":2,"gov.ms":2,"net.ms":2,"org.ms":2,"mt":1,"com.mt":2,"edu.mt":2,"net.mt":2,"org.mt":2,"mu":1,"com.mu":2,"net.mu":2,"org.mu":2,"gov.mu":2,"ac.mu":2,"co.mu":2,"or.mu":2,"museum":1,"academy.museum":2,"agriculture.museum":2,"air.museum":2,"airguard.museum":2,"alabama.museum":2,"alaska.museum":2,"amber.museum":2,"ambulance.museum":2,"american.museum":2,"americana.museum":2,"americanantiques.museum":2,"americanart.museum":2,"amsterdam.museum":2,"and.museum":2,"annefrank.museum":2,"anthro.museum":2,"anthropology.museum":2,"antiques.museum":2,"aquarium.museum":2,"arboretum.museum":2,"archaeological.museum":2,"archaeology.museum":2,"architecture.museum":2,"art.museum":2,"artanddesign.museum":2,"artcenter.museum":2,"artdeco.museum":2,"arteducation.museum":2,"artgallery.museum":2,"arts.museum":2,"artsandcrafts.museum":2,"asmatart.museum":2,"assassination.museum":2,"assisi.museum":2,"association.museum":2,"astronomy.museum":2,"atlanta.museum":2,"austin.museum":2,"australia.museum":2,"automotive.museum":2,"aviation.museum":2,"axis.museum":2,"badajoz.museum":2,"baghdad.museum":2,"bahn.museum":2,"bale.museum":2,"baltimore.museum":2,"barcelona.museum":2,"baseball.museum":2,"basel.museum":2,"baths.museum":2,"bauern.museum":2,"beauxarts.museum":2,"beeldengeluid.museum":2,"bellevue.museum":2,"bergbau.museum":2,"berkeley.museum":2,"berlin.museum":2,"bern.museum":2,"bible.museum":2,"bilbao.museum":2,"bill.museum":2,"birdart.museum":2,"birthplace.museum":2,"bonn.museum":2,"boston.museum":2,"botanical.museum":2,"botanicalgarden.museum":2,"botanicgarden.museum":2,"botany.museum":2,"brandywinevalley.museum":2,"brasil.museum":2,"bristol.museum":2,"british.museum":2,"britishcolumbia.museum":2,"broadcast.museum":2,"brunel.museum":2,"brussel.museum":2,"brussels.museum":2,"bruxelles.museum":2,"building.museum":2,"burghof.museum":2,"bus.museum":2,"bushey.museum":2,"cadaques.museum":2,"california.museum":2,"cambridge.museum":2,"can.museum":2,"canada.museum":2,"capebreton.museum":2,"carrier.museum":2,"cartoonart.museum":2,"casadelamoneda.museum":2,"castle.museum":2,"castres.museum":2,"celtic.museum":2,"center.museum":2,"chattanooga.museum":2,"cheltenham.museum":2,"chesapeakebay.museum":2,"chicago.museum":2,"children.museum":2,"childrens.museum":2,"childrensgarden.museum":2,"chiropractic.museum":2,"chocolate.museum":2,"christiansburg.museum":2,"cincinnati.museum":2,"cinema.museum":2,"circus.museum":2,"civilisation.museum":2,"civilization.museum":2,"civilwar.museum":2,"clinton.museum":2,"clock.museum":2,"coal.museum":2,"coastaldefence.museum":2,"cody.museum":2,"coldwar.museum":2,"collection.museum":2,"colonialwilliamsburg.museum":2,"coloradoplateau.museum":2,"columbia.museum":2,"columbus.museum":2,"communication.museum":2,"communications.museum":2,"community.museum":2,"computer.museum":2,"computerhistory.museum":2,"xn--comunicaes-v6a2o.museum":2,"contemporary.museum":2,"contemporaryart.museum":2,"convent.museum":2,"copenhagen.museum":2,"corporation.museum":2,"xn--correios-e-telecomunicaes-ghc29a.museum":2,"corvette.museum":2,"costume.museum":2,"countryestate.museum":2,"county.museum":2,"crafts.museum":2,"cranbrook.museum":2,"creation.museum":2,"cultural.museum":2,"culturalcenter.museum":2,"culture.museum":2,"cyber.museum":2,"cymru.museum":2,"dali.museum":2,"dallas.museum":2,"database.museum":2,"ddr.museum":2,"decorativearts.museum":2,"delaware.museum":2,"delmenhorst.museum":2,"denmark.museum":2,"depot.museum":2,"design.museum":2,"detroit.museum":2,"dinosaur.museum":2,"discovery.museum":2,"dolls.museum":2,"donostia.museum":2,"durham.museum":2,"eastafrica.museum":2,"eastcoast.museum":2,"education.museum":2,"educational.museum":2,"egyptian.museum":2,"eisenbahn.museum":2,"elburg.museum":2,"elvendrell.museum":2,"embroidery.museum":2,"encyclopedic.museum":2,"england.museum":2,"entomology.museum":2,"environment.museum":2,"environmentalconservation.museum":2,"epilepsy.museum":2,"essex.museum":2,"estate.museum":2,"ethnology.museum":2,"exeter.museum":2,"exhibition.museum":2,"family.museum":2,"farm.museum":2,"farmequipment.museum":2,"farmers.museum":2,"farmstead.museum":2,"field.museum":2,"figueres.museum":2,"filatelia.museum":2,"film.museum":2,"fineart.museum":2,"finearts.museum":2,"finland.museum":2,"flanders.museum":2,"florida.museum":2,"force.museum":2,"fortmissoula.museum":2,"fortworth.museum":2,"foundation.museum":2,"francaise.museum":2,"frankfurt.museum":2,"franziskaner.museum":2,"freemasonry.museum":2,"freiburg.museum":2,"fribourg.museum":2,"frog.museum":2,"fundacio.museum":2,"furniture.museum":2,"gallery.museum":2,"garden.museum":2,"gateway.museum":2,"geelvinck.museum":2,"gemological.museum":2,"geology.museum":2,"georgia.museum":2,"giessen.museum":2,"glas.museum":2,"glass.museum":2,"gorge.museum":2,"grandrapids.museum":2,"graz.museum":2,"guernsey.museum":2,"halloffame.museum":2,"hamburg.museum":2,"handson.museum":2,"harvestcelebration.museum":2,"hawaii.museum":2,"health.museum":2,"heimatunduhren.museum":2,"hellas.museum":2,"helsinki.museum":2,"hembygdsforbund.museum":2,"heritage.museum":2,"histoire.museum":2,"historical.museum":2,"historicalsociety.museum":2,"historichouses.museum":2,"historisch.museum":2,"historisches.museum":2,"history.museum":2,"historyofscience.museum":2,"horology.museum":2,"house.museum":2,"humanities.museum":2,"illustration.museum":2,"imageandsound.museum":2,"indian.museum":2,"indiana.museum":2,"indianapolis.museum":2,"indianmarket.museum":2,"intelligence.museum":2,"interactive.museum":2,"iraq.museum":2,"iron.museum":2,"isleofman.museum":2,"jamison.museum":2,"jefferson.museum":2,"jerusalem.museum":2,"jewelry.museum":2,"jewish.museum":2,"jewishart.museum":2,"jfk.museum":2,"journalism.museum":2,"judaica.museum":2,"judygarland.museum":2,"juedisches.museum":2,"juif.museum":2,"karate.museum":2,"karikatur.museum":2,"kids.museum":2,"koebenhavn.museum":2,"koeln.museum":2,"kunst.museum":2,"kunstsammlung.museum":2,"kunstunddesign.museum":2,"labor.museum":2,"labour.museum":2,"lajolla.museum":2,"lancashire.museum":2,"landes.museum":2,"lans.museum":2,"xn--lns-qla.museum":2,"larsson.museum":2,"lewismiller.museum":2,"lincoln.museum":2,"linz.museum":2,"living.museum":2,"livinghistory.museum":2,"localhistory.museum":2,"london.museum":2,"losangeles.museum":2,"louvre.museum":2,"loyalist.museum":2,"lucerne.museum":2,"luxembourg.museum":2,"luzern.museum":2,"mad.museum":2,"madrid.museum":2,"mallorca.museum":2,"manchester.museum":2,"mansion.museum":2,"mansions.museum":2,"manx.museum":2,"marburg.museum":2,"maritime.museum":2,"maritimo.museum":2,"maryland.museum":2,"marylhurst.museum":2,"media.museum":2,"medical.museum":2,"medizinhistorisches.museum":2,"meeres.museum":2,"memorial.museum":2,"mesaverde.museum":2,"michigan.museum":2,"midatlantic.museum":2,"military.museum":2,"mill.museum":2,"miners.museum":2,"mining.museum":2,"minnesota.museum":2,"missile.museum":2,"missoula.museum":2,"modern.museum":2,"moma.museum":2,"money.museum":2,"monmouth.museum":2,"monticello.museum":2,"montreal.museum":2,"moscow.museum":2,"motorcycle.museum":2,"muenchen.museum":2,"muenster.museum":2,"mulhouse.museum":2,"muncie.museum":2,"museet.museum":2,"museumcenter.museum":2,"museumvereniging.museum":2,"music.museum":2,"national.museum":2,"nationalfirearms.museum":2,"nationalheritage.museum":2,"nativeamerican.museum":2,"naturalhistory.museum":2,"naturalhistorymuseum.museum":2,"naturalsciences.museum":2,"nature.museum":2,"naturhistorisches.museum":2,"natuurwetenschappen.museum":2,"naumburg.museum":2,"naval.museum":2,"nebraska.museum":2,"neues.museum":2,"newhampshire.museum":2,"newjersey.museum":2,"newmexico.museum":2,"newport.museum":2,"newspaper.museum":2,"newyork.museum":2,"niepce.museum":2,"norfolk.museum":2,"north.museum":2,"nrw.museum":2,"nyc.museum":2,"nyny.museum":2,"oceanographic.museum":2,"oceanographique.museum":2,"omaha.museum":2,"online.museum":2,"ontario.museum":2,"openair.museum":2,"oregon.museum":2,"oregontrail.museum":2,"otago.museum":2,"oxford.museum":2,"pacific.museum":2,"paderborn.museum":2,"palace.museum":2,"paleo.museum":2,"palmsprings.museum":2,"panama.museum":2,"paris.museum":2,"pasadena.museum":2,"pharmacy.museum":2,"philadelphia.museum":2,"philadelphiaarea.museum":2,"philately.museum":2,"phoenix.museum":2,"photography.museum":2,"pilots.museum":2,"pittsburgh.museum":2,"planetarium.museum":2,"plantation.museum":2,"plants.museum":2,"plaza.museum":2,"portal.museum":2,"portland.museum":2,"portlligat.museum":2,"posts-and-telecommunications.museum":2,"preservation.museum":2,"presidio.museum":2,"press.museum":2,"project.museum":2,"public.museum":2,"pubol.museum":2,"quebec.museum":2,"railroad.museum":2,"railway.museum":2,"research.museum":2,"resistance.museum":2,"riodejaneiro.museum":2,"rochester.museum":2,"rockart.museum":2,"roma.museum":2,"russia.museum":2,"saintlouis.museum":2,"salem.museum":2,"salvadordali.museum":2,"salzburg.museum":2,"sandiego.museum":2,"sanfrancisco.museum":2,"santabarbara.museum":2,"santacruz.museum":2,"santafe.museum":2,"saskatchewan.museum":2,"satx.museum":2,"savannahga.museum":2,"schlesisches.museum":2,"schoenbrunn.museum":2,"schokoladen.museum":2,"school.museum":2,"schweiz.museum":2,"science.museum":2,"scienceandhistory.museum":2,"scienceandindustry.museum":2,"sciencecenter.museum":2,"sciencecenters.museum":2,"science-fiction.museum":2,"sciencehistory.museum":2,"sciences.museum":2,"sciencesnaturelles.museum":2,"scotland.museum":2,"seaport.museum":2,"settlement.museum":2,"settlers.museum":2,"shell.museum":2,"sherbrooke.museum":2,"sibenik.museum":2,"silk.museum":2,"ski.museum":2,"skole.museum":2,"society.museum":2,"sologne.museum":2,"soundandvision.museum":2,"southcarolina.museum":2,"southwest.museum":2,"space.museum":2,"spy.museum":2,"square.museum":2,"stadt.museum":2,"stalbans.museum":2,"starnberg.museum":2,"state.museum":2,"stateofdelaware.museum":2,"station.museum":2,"steam.museum":2,"steiermark.museum":2,"stjohn.museum":2,"stockholm.museum":2,"stpetersburg.museum":2,"stuttgart.museum":2,"suisse.museum":2,"surgeonshall.museum":2,"surrey.museum":2,"svizzera.museum":2,"sweden.museum":2,"sydney.museum":2,"tank.museum":2,"tcm.museum":2,"technology.museum":2,"telekommunikation.museum":2,"television.museum":2,"texas.museum":2,"textile.museum":2,"theater.museum":2,"time.museum":2,"timekeeping.museum":2,"topology.museum":2,"torino.museum":2,"touch.museum":2,"town.museum":2,"transport.museum":2,"tree.museum":2,"trolley.museum":2,"trust.museum":2,"trustee.museum":2,"uhren.museum":2,"ulm.museum":2,"undersea.museum":2,"university.museum":2,"usa.museum":2,"usantiques.museum":2,"usarts.museum":2,"uscountryestate.museum":2,"usculture.museum":2,"usdecorativearts.museum":2,"usgarden.museum":2,"ushistory.museum":2,"ushuaia.museum":2,"uslivinghistory.museum":2,"utah.museum":2,"uvic.museum":2,"valley.museum":2,"vantaa.museum":2,"versailles.museum":2,"viking.museum":2,"village.museum":2,"virginia.museum":2,"virtual.museum":2,"virtuel.museum":2,"vlaanderen.museum":2,"volkenkunde.museum":2,"wales.museum":2,"wallonie.museum":2,"war.museum":2,"washingtondc.museum":2,"watchandclock.museum":2,"watch-and-clock.museum":2,"western.museum":2,"westfalen.museum":2,"whaling.museum":2,"wildlife.museum":2,"williamsburg.museum":2,"windmill.museum":2,"workshop.museum":2,"york.museum":2,"yorkshire.museum":2,"yosemite.museum":2,"youth.museum":2,"zoological.museum":2,"zoology.museum":2,"xn--9dbhblg6di.museum":2,"xn--h1aegh.museum":2,"mv":1,"aero.mv":2,"biz.mv":2,"com.mv":2,"coop.mv":2,"edu.mv":2,"gov.mv":2,"info.mv":2,"int.mv":2,"mil.mv":2,"museum.mv":2,"name.mv":2,"net.mv":2,"org.mv":2,"pro.mv":2,"mw":1,"ac.mw":2,"biz.mw":2,"co.mw":2,"com.mw":2,"coop.mw":2,"edu.mw":2,"gov.mw":2,"int.mw":2,"museum.mw":2,"net.mw":2,"org.mw":2,"mx":1,"com.mx":2,"org.mx":2,"gob.mx":2,"edu.mx":2,"net.mx":2,"my":1,"biz.my":2,"com.my":2,"edu.my":2,"gov.my":2,"mil.my":2,"name.my":2,"net.my":2,"org.my":2,"mz":1,"ac.mz":2,"adv.mz":2,"co.mz":2,"edu.mz":2,"gov.mz":2,"mil.mz":2,"net.mz":2,"org.mz":2,"na":1,"info.na":2,"pro.na":2,"name.na":2,"school.na":2,"or.na":2,"dr.na":2,"us.na":2,"mx.na":2,"ca.na":2,"in.na":2,"cc.na":2,"tv.na":2,"ws.na":2,"mobi.na":2,"co.na":2,"com.na":2,"org.na":2,"name":1,"nc":1,"asso.nc":2,"nom.nc":2,"ne":1,"net":1,"nf":1,"com.nf":2,"net.nf":2,"per.nf":2,"rec.nf":2,"web.nf":2,"arts.nf":2,"firm.nf":2,"info.nf":2,"other.nf":2,"store.nf":2,"ng":1,"com.ng":2,"edu.ng":2,"gov.ng":2,"i.ng":2,"mil.ng":2,"mobi.ng":2,"name.ng":2,"net.ng":2,"org.ng":2,"sch.ng":2,"ni":1,"ac.ni":2,"biz.ni":2,"co.ni":2,"com.ni":2,"edu.ni":2,"gob.ni":2,"in.ni":2,"info.ni":2,"int.ni":2,"mil.ni":2,"net.ni":2,"nom.ni":2,"org.ni":2,"web.ni":2,"nl":1,"no":1,"fhs.no":2,"vgs.no":2,"fylkesbibl.no":2,"folkebibl.no":2,"museum.no":2,"idrett.no":2,"priv.no":2,"mil.no":2,"stat.no":2,"dep.no":2,"kommune.no":2,"herad.no":2,"aa.no":2,"ah.no":2,"bu.no":2,"fm.no":2,"hl.no":2,"hm.no":2,"jan-mayen.no":2,"mr.no":2,"nl.no":2,"nt.no":2,"of.no":2,"ol.no":2,"oslo.no":2,"rl.no":2,"sf.no":2,"st.no":2,"svalbard.no":2,"tm.no":2,"tr.no":2,"va.no":2,"vf.no":2,"gs.aa.no":3,"gs.ah.no":3,"gs.bu.no":3,"gs.fm.no":3,"gs.hl.no":3,"gs.hm.no":3,"gs.jan-mayen.no":3,"gs.mr.no":3,"gs.nl.no":3,"gs.nt.no":3,"gs.of.no":3,"gs.ol.no":3,"gs.oslo.no":3,"gs.rl.no":3,"gs.sf.no":3,"gs.st.no":3,"gs.svalbard.no":3,"gs.tm.no":3,"gs.tr.no":3,"gs.va.no":3,"gs.vf.no":3,"akrehamn.no":2,"xn--krehamn-dxa.no":2,"algard.no":2,"xn--lgrd-poac.no":2,"arna.no":2,"brumunddal.no":2,"bryne.no":2,"bronnoysund.no":2,"xn--brnnysund-m8ac.no":2,"drobak.no":2,"xn--drbak-wua.no":2,"egersund.no":2,"fetsund.no":2,"floro.no":2,"xn--flor-jra.no":2,"fredrikstad.no":2,"hokksund.no":2,"honefoss.no":2,"xn--hnefoss-q1a.no":2,"jessheim.no":2,"jorpeland.no":2,"xn--jrpeland-54a.no":2,"kirkenes.no":2,"kopervik.no":2,"krokstadelva.no":2,"langevag.no":2,"xn--langevg-jxa.no":2,"leirvik.no":2,"mjondalen.no":2,"xn--mjndalen-64a.no":2,"mo-i-rana.no":2,"mosjoen.no":2,"xn--mosjen-eya.no":2,"nesoddtangen.no":2,"orkanger.no":2,"osoyro.no":2,"xn--osyro-wua.no":2,"raholt.no":2,"xn--rholt-mra.no":2,"sandnessjoen.no":2,"xn--sandnessjen-ogb.no":2,"skedsmokorset.no":2,"slattum.no":2,"spjelkavik.no":2,"stathelle.no":2,"stavern.no":2,"stjordalshalsen.no":2,"xn--stjrdalshalsen-sqb.no":2,"tananger.no":2,"tranby.no":2,"vossevangen.no":2,"afjord.no":2,"xn--fjord-lra.no":2,"agdenes.no":2,"al.no":2,"xn--l-1fa.no":2,"alesund.no":2,"xn--lesund-hua.no":2,"alstahaug.no":2,"alta.no":2,"xn--lt-liac.no":2,"alaheadju.no":2,"xn--laheadju-7ya.no":2,"alvdal.no":2,"amli.no":2,"xn--mli-tla.no":2,"amot.no":2,"xn--mot-tla.no":2,"andebu.no":2,"andoy.no":2,"xn--andy-ira.no":2,"andasuolo.no":2,"ardal.no":2,"xn--rdal-poa.no":2,"aremark.no":2,"arendal.no":2,"xn--s-1fa.no":2,"aseral.no":2,"xn--seral-lra.no":2,"asker.no":2,"askim.no":2,"askvoll.no":2,"askoy.no":2,"xn--asky-ira.no":2,"asnes.no":2,"xn--snes-poa.no":2,"audnedaln.no":2,"aukra.no":2,"aure.no":2,"aurland.no":2,"aurskog-holand.no":2,"xn--aurskog-hland-jnb.no":2,"austevoll.no":2,"austrheim.no":2,"averoy.no":2,"xn--avery-yua.no":2,"balestrand.no":2,"ballangen.no":2,"balat.no":2,"xn--blt-elab.no":2,"balsfjord.no":2,"bahccavuotna.no":2,"xn--bhccavuotna-k7a.no":2,"bamble.no":2,"bardu.no":2,"beardu.no":2,"beiarn.no":2,"bajddar.no":2,"xn--bjddar-pta.no":2,"baidar.no":2,"xn--bidr-5nac.no":2,"berg.no":2,"bergen.no":2,"berlevag.no":2,"xn--berlevg-jxa.no":2,"bearalvahki.no":2,"xn--bearalvhki-y4a.no":2,"bindal.no":2,"birkenes.no":2,"bjarkoy.no":2,"xn--bjarky-fya.no":2,"bjerkreim.no":2,"bjugn.no":2,"bodo.no":2,"xn--bod-2na.no":2,"badaddja.no":2,"xn--bdddj-mrabd.no":2,"budejju.no":2,"bokn.no":2,"bremanger.no":2,"bronnoy.no":2,"xn--brnny-wuac.no":2,"bygland.no":2,"bykle.no":2,"barum.no":2,"xn--brum-voa.no":2,"bo.telemark.no":3,"xn--b-5ga.telemark.no":3,"bo.nordland.no":3,"xn--b-5ga.nordland.no":3,"bievat.no":2,"xn--bievt-0qa.no":2,"bomlo.no":2,"xn--bmlo-gra.no":2,"batsfjord.no":2,"xn--btsfjord-9za.no":2,"bahcavuotna.no":2,"xn--bhcavuotna-s4a.no":2,"dovre.no":2,"drammen.no":2,"drangedal.no":2,"dyroy.no":2,"xn--dyry-ira.no":2,"donna.no":2,"xn--dnna-gra.no":2,"eid.no":2,"eidfjord.no":2,"eidsberg.no":2,"eidskog.no":2,"eidsvoll.no":2,"eigersund.no":2,"elverum.no":2,"enebakk.no":2,"engerdal.no":2,"etne.no":2,"etnedal.no":2,"evenes.no":2,"evenassi.no":2,"xn--eveni-0qa01ga.no":2,"evje-og-hornnes.no":2,"farsund.no":2,"fauske.no":2,"fuossko.no":2,"fuoisku.no":2,"fedje.no":2,"fet.no":2,"finnoy.no":2,"xn--finny-yua.no":2,"fitjar.no":2,"fjaler.no":2,"fjell.no":2,"flakstad.no":2,"flatanger.no":2,"flekkefjord.no":2,"flesberg.no":2,"flora.no":2,"fla.no":2,"xn--fl-zia.no":2,"folldal.no":2,"forsand.no":2,"fosnes.no":2,"frei.no":2,"frogn.no":2,"froland.no":2,"frosta.no":2,"frana.no":2,"xn--frna-woa.no":2,"froya.no":2,"xn--frya-hra.no":2,"fusa.no":2,"fyresdal.no":2,"forde.no":2,"xn--frde-gra.no":2,"gamvik.no":2,"gangaviika.no":2,"xn--ggaviika-8ya47h.no":2,"gaular.no":2,"gausdal.no":2,"gildeskal.no":2,"xn--gildeskl-g0a.no":2,"giske.no":2,"gjemnes.no":2,"gjerdrum.no":2,"gjerstad.no":2,"gjesdal.no":2,"gjovik.no":2,"xn--gjvik-wua.no":2,"gloppen.no":2,"gol.no":2,"gran.no":2,"grane.no":2,"granvin.no":2,"gratangen.no":2,"grimstad.no":2,"grong.no":2,"kraanghke.no":2,"xn--kranghke-b0a.no":2,"grue.no":2,"gulen.no":2,"hadsel.no":2,"halden.no":2,"halsa.no":2,"hamar.no":2,"hamaroy.no":2,"habmer.no":2,"xn--hbmer-xqa.no":2,"hapmir.no":2,"xn--hpmir-xqa.no":2,"hammerfest.no":2,"hammarfeasta.no":2,"xn--hmmrfeasta-s4ac.no":2,"haram.no":2,"hareid.no":2,"harstad.no":2,"hasvik.no":2,"aknoluokta.no":2,"xn--koluokta-7ya57h.no":2,"hattfjelldal.no":2,"aarborte.no":2,"haugesund.no":2,"hemne.no":2,"hemnes.no":2,"hemsedal.no":2,"heroy.more-og-romsdal.no":3,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":3,"heroy.nordland.no":3,"xn--hery-ira.nordland.no":3,"hitra.no":2,"hjartdal.no":2,"hjelmeland.no":2,"hobol.no":2,"xn--hobl-ira.no":2,"hof.no":2,"hol.no":2,"hole.no":2,"holmestrand.no":2,"holtalen.no":2,"xn--holtlen-hxa.no":2,"hornindal.no":2,"horten.no":2,"hurdal.no":2,"hurum.no":2,"hvaler.no":2,"hyllestad.no":2,"hagebostad.no":2,"xn--hgebostad-g3a.no":2,"hoyanger.no":2,"xn--hyanger-q1a.no":2,"hoylandet.no":2,"xn--hylandet-54a.no":2,"ha.no":2,"xn--h-2fa.no":2,"ibestad.no":2,"inderoy.no":2,"xn--indery-fya.no":2,"iveland.no":2,"jevnaker.no":2,"jondal.no":2,"jolster.no":2,"xn--jlster-bya.no":2,"karasjok.no":2,"karasjohka.no":2,"xn--krjohka-hwab49j.no":2,"karlsoy.no":2,"galsa.no":2,"xn--gls-elac.no":2,"karmoy.no":2,"xn--karmy-yua.no":2,"kautokeino.no":2,"guovdageaidnu.no":2,"klepp.no":2,"klabu.no":2,"xn--klbu-woa.no":2,"kongsberg.no":2,"kongsvinger.no":2,"kragero.no":2,"xn--krager-gya.no":2,"kristiansand.no":2,"kristiansund.no":2,"krodsherad.no":2,"xn--krdsherad-m8a.no":2,"kvalsund.no":2,"rahkkeravju.no":2,"xn--rhkkervju-01af.no":2,"kvam.no":2,"kvinesdal.no":2,"kvinnherad.no":2,"kviteseid.no":2,"kvitsoy.no":2,"xn--kvitsy-fya.no":2,"kvafjord.no":2,"xn--kvfjord-nxa.no":2,"giehtavuoatna.no":2,"kvanangen.no":2,"xn--kvnangen-k0a.no":2,"navuotna.no":2,"xn--nvuotna-hwa.no":2,"kafjord.no":2,"xn--kfjord-iua.no":2,"gaivuotna.no":2,"xn--givuotna-8ya.no":2,"larvik.no":2,"lavangen.no":2,"lavagis.no":2,"loabat.no":2,"xn--loabt-0qa.no":2,"lebesby.no":2,"davvesiida.no":2,"leikanger.no":2,"leirfjord.no":2,"leka.no":2,"leksvik.no":2,"lenvik.no":2,"leangaviika.no":2,"xn--leagaviika-52b.no":2,"lesja.no":2,"levanger.no":2,"lier.no":2,"lierne.no":2,"lillehammer.no":2,"lillesand.no":2,"lindesnes.no":2,"lindas.no":2,"xn--linds-pra.no":2,"lom.no":2,"loppa.no":2,"lahppi.no":2,"xn--lhppi-xqa.no":2,"lund.no":2,"lunner.no":2,"luroy.no":2,"xn--lury-ira.no":2,"luster.no":2,"lyngdal.no":2,"lyngen.no":2,"ivgu.no":2,"lardal.no":2,"lerdal.no":2,"xn--lrdal-sra.no":2,"lodingen.no":2,"xn--ldingen-q1a.no":2,"lorenskog.no":2,"xn--lrenskog-54a.no":2,"loten.no":2,"xn--lten-gra.no":2,"malvik.no":2,"masoy.no":2,"xn--msy-ula0h.no":2,"muosat.no":2,"xn--muost-0qa.no":2,"mandal.no":2,"marker.no":2,"marnardal.no":2,"masfjorden.no":2,"meland.no":2,"meldal.no":2,"melhus.no":2,"meloy.no":2,"xn--mely-ira.no":2,"meraker.no":2,"xn--merker-kua.no":2,"moareke.no":2,"xn--moreke-jua.no":2,"midsund.no":2,"midtre-gauldal.no":2,"modalen.no":2,"modum.no":2,"molde.no":2,"moskenes.no":2,"moss.no":2,"mosvik.no":2,"malselv.no":2,"xn--mlselv-iua.no":2,"malatvuopmi.no":2,"xn--mlatvuopmi-s4a.no":2,"namdalseid.no":2,"aejrie.no":2,"namsos.no":2,"namsskogan.no":2,"naamesjevuemie.no":2,"xn--nmesjevuemie-tcba.no":2,"laakesvuemie.no":2,"nannestad.no":2,"narvik.no":2,"narviika.no":2,"naustdal.no":2,"nedre-eiker.no":2,"nes.akershus.no":3,"nes.buskerud.no":3,"nesna.no":2,"nesodden.no":2,"nesseby.no":2,"unjarga.no":2,"xn--unjrga-rta.no":2,"nesset.no":2,"nissedal.no":2,"nittedal.no":2,"nord-aurdal.no":2,"nord-fron.no":2,"nord-odal.no":2,"norddal.no":2,"nordkapp.no":2,"davvenjarga.no":2,"xn--davvenjrga-y4a.no":2,"nordre-land.no":2,"nordreisa.no":2,"raisa.no":2,"xn--risa-5na.no":2,"nore-og-uvdal.no":2,"notodden.no":2,"naroy.no":2,"xn--nry-yla5g.no":2,"notteroy.no":2,"xn--nttery-byae.no":2,"odda.no":2,"oksnes.no":2,"xn--ksnes-uua.no":2,"oppdal.no":2,"oppegard.no":2,"xn--oppegrd-ixa.no":2,"orkdal.no":2,"orland.no":2,"xn--rland-uua.no":2,"orskog.no":2,"xn--rskog-uua.no":2,"orsta.no":2,"xn--rsta-fra.no":2,"os.hedmark.no":3,"os.hordaland.no":3,"osen.no":2,"osteroy.no":2,"xn--ostery-fya.no":2,"ostre-toten.no":2,"xn--stre-toten-zcb.no":2,"overhalla.no":2,"ovre-eiker.no":2,"xn--vre-eiker-k8a.no":2,"oyer.no":2,"xn--yer-zna.no":2,"oygarden.no":2,"xn--ygarden-p1a.no":2,"oystre-slidre.no":2,"xn--ystre-slidre-ujb.no":2,"porsanger.no":2,"porsangu.no":2,"xn--porsgu-sta26f.no":2,"porsgrunn.no":2,"radoy.no":2,"xn--rady-ira.no":2,"rakkestad.no":2,"rana.no":2,"ruovat.no":2,"randaberg.no":2,"rauma.no":2,"rendalen.no":2,"rennebu.no":2,"rennesoy.no":2,"xn--rennesy-v1a.no":2,"rindal.no":2,"ringebu.no":2,"ringerike.no":2,"ringsaker.no":2,"rissa.no":2,"risor.no":2,"xn--risr-ira.no":2,"roan.no":2,"rollag.no":2,"rygge.no":2,"ralingen.no":2,"xn--rlingen-mxa.no":2,"rodoy.no":2,"xn--rdy-0nab.no":2,"romskog.no":2,"xn--rmskog-bya.no":2,"roros.no":2,"xn--rros-gra.no":2,"rost.no":2,"xn--rst-0na.no":2,"royken.no":2,"xn--ryken-vua.no":2,"royrvik.no":2,"xn--ryrvik-bya.no":2,"rade.no":2,"xn--rde-ula.no":2,"salangen.no":2,"siellak.no":2,"saltdal.no":2,"salat.no":2,"xn--slt-elab.no":2,"xn--slat-5na.no":2,"samnanger.no":2,"sande.more-og-romsdal.no":3,"sande.xn--mre-og-romsdal-qqb.no":3,"sande.vestfold.no":3,"sandefjord.no":2,"sandnes.no":2,"sandoy.no":2,"xn--sandy-yua.no":2,"sarpsborg.no":2,"sauda.no":2,"sauherad.no":2,"sel.no":2,"selbu.no":2,"selje.no":2,"seljord.no":2,"sigdal.no":2,"siljan.no":2,"sirdal.no":2,"skaun.no":2,"skedsmo.no":2,"ski.no":2,"skien.no":2,"skiptvet.no":2,"skjervoy.no":2,"xn--skjervy-v1a.no":2,"skierva.no":2,"xn--skierv-uta.no":2,"skjak.no":2,"xn--skjk-soa.no":2,"skodje.no":2,"skanland.no":2,"xn--sknland-fxa.no":2,"skanit.no":2,"xn--sknit-yqa.no":2,"smola.no":2,"xn--smla-hra.no":2,"snillfjord.no":2,"snasa.no":2,"xn--snsa-roa.no":2,"snoasa.no":2,"snaase.no":2,"xn--snase-nra.no":2,"sogndal.no":2,"sokndal.no":2,"sola.no":2,"solund.no":2,"songdalen.no":2,"sortland.no":2,"spydeberg.no":2,"stange.no":2,"stavanger.no":2,"steigen.no":2,"steinkjer.no":2,"stjordal.no":2,"xn--stjrdal-s1a.no":2,"stokke.no":2,"stor-elvdal.no":2,"stord.no":2,"stordal.no":2,"storfjord.no":2,"omasvuotna.no":2,"strand.no":2,"stranda.no":2,"stryn.no":2,"sula.no":2,"suldal.no":2,"sund.no":2,"sunndal.no":2,"surnadal.no":2,"sveio.no":2,"svelvik.no":2,"sykkylven.no":2,"sogne.no":2,"xn--sgne-gra.no":2,"somna.no":2,"xn--smna-gra.no":2,"sondre-land.no":2,"xn--sndre-land-0cb.no":2,"sor-aurdal.no":2,"xn--sr-aurdal-l8a.no":2,"sor-fron.no":2,"xn--sr-fron-q1a.no":2,"sor-odal.no":2,"xn--sr-odal-q1a.no":2,"sor-varanger.no":2,"xn--sr-varanger-ggb.no":2,"matta-varjjat.no":2,"xn--mtta-vrjjat-k7af.no":2,"sorfold.no":2,"xn--srfold-bya.no":2,"sorreisa.no":2,"xn--srreisa-q1a.no":2,"sorum.no":2,"xn--srum-gra.no":2,"tana.no":2,"deatnu.no":2,"time.no":2,"tingvoll.no":2,"tinn.no":2,"tjeldsund.no":2,"dielddanuorri.no":2,"tjome.no":2,"xn--tjme-hra.no":2,"tokke.no":2,"tolga.no":2,"torsken.no":2,"tranoy.no":2,"xn--trany-yua.no":2,"tromso.no":2,"xn--troms-zua.no":2,"tromsa.no":2,"romsa.no":2,"trondheim.no":2,"troandin.no":2,"trysil.no":2,"trana.no":2,"xn--trna-woa.no":2,"trogstad.no":2,"xn--trgstad-r1a.no":2,"tvedestrand.no":2,"tydal.no":2,"tynset.no":2,"tysfjord.no":2,"divtasvuodna.no":2,"divttasvuotna.no":2,"tysnes.no":2,"tysvar.no":2,"xn--tysvr-vra.no":2,"tonsberg.no":2,"xn--tnsberg-q1a.no":2,"ullensaker.no":2,"ullensvang.no":2,"ulvik.no":2,"utsira.no":2,"vadso.no":2,"xn--vads-jra.no":2,"cahcesuolo.no":2,"xn--hcesuolo-7ya35b.no":2,"vaksdal.no":2,"valle.no":2,"vang.no":2,"vanylven.no":2,"vardo.no":2,"xn--vard-jra.no":2,"varggat.no":2,"xn--vrggt-xqad.no":2,"vefsn.no":2,"vaapste.no":2,"vega.no":2,"vegarshei.no":2,"xn--vegrshei-c0a.no":2,"vennesla.no":2,"verdal.no":2,"verran.no":2,"vestby.no":2,"vestnes.no":2,"vestre-slidre.no":2,"vestre-toten.no":2,"vestvagoy.no":2,"xn--vestvgy-ixa6o.no":2,"vevelstad.no":2,"vik.no":2,"vikna.no":2,"vindafjord.no":2,"volda.no":2,"voss.no":2,"varoy.no":2,"xn--vry-yla5g.no":2,"vagan.no":2,"xn--vgan-qoa.no":2,"voagat.no":2,"vagsoy.no":2,"xn--vgsy-qoa0j.no":2,"vaga.no":2,"xn--vg-yiab.no":2,"valer.ostfold.no":3,"xn--vler-qoa.xn--stfold-9xa.no":3,"valer.hedmark.no":3,"xn--vler-qoa.hedmark.no":3,"np":2,"nr":1,"biz.nr":2,"info.nr":2,"gov.nr":2,"edu.nr":2,"org.nr":2,"net.nr":2,"com.nr":2,"nu":1,"nz":1,"ac.nz":2,"co.nz":2,"cri.nz":2,"geek.nz":2,"gen.nz":2,"govt.nz":2,"health.nz":2,"iwi.nz":2,"kiwi.nz":2,"maori.nz":2,"mil.nz":2,"xn--mori-qsa.nz":2,"net.nz":2,"org.nz":2,"parliament.nz":2,"school.nz":2,"om":1,"co.om":2,"com.om":2,"edu.om":2,"gov.om":2,"med.om":2,"museum.om":2,"net.om":2,"org.om":2,"pro.om":2,"onion":1,"org":1,"pa":1,"ac.pa":2,"gob.pa":2,"com.pa":2,"org.pa":2,"sld.pa":2,"edu.pa":2,"net.pa":2,"ing.pa":2,"abo.pa":2,"med.pa":2,"nom.pa":2,"pe":1,"edu.pe":2,"gob.pe":2,"nom.pe":2,"mil.pe":2,"org.pe":2,"com.pe":2,"net.pe":2,"pf":1,"com.pf":2,"org.pf":2,"edu.pf":2,"pg":2,"ph":1,"com.ph":2,"net.ph":2,"org.ph":2,"gov.ph":2,"edu.ph":2,"ngo.ph":2,"mil.ph":2,"i.ph":2,"pk":1,"com.pk":2,"net.pk":2,"edu.pk":2,"org.pk":2,"fam.pk":2,"biz.pk":2,"web.pk":2,"gov.pk":2,"gob.pk":2,"gok.pk":2,"gon.pk":2,"gop.pk":2,"gos.pk":2,"info.pk":2,"pl":1,"com.pl":2,"net.pl":2,"org.pl":2,"aid.pl":2,"agro.pl":2,"atm.pl":2,"auto.pl":2,"biz.pl":2,"edu.pl":2,"gmina.pl":2,"gsm.pl":2,"info.pl":2,"mail.pl":2,"miasta.pl":2,"media.pl":2,"mil.pl":2,"nieruchomosci.pl":2,"nom.pl":2,"pc.pl":2,"powiat.pl":2,"priv.pl":2,"realestate.pl":2,"rel.pl":2,"sex.pl":2,"shop.pl":2,"sklep.pl":2,"sos.pl":2,"szkola.pl":2,"targi.pl":2,"tm.pl":2,"tourism.pl":2,"travel.pl":2,"turystyka.pl":2,"gov.pl":2,"ap.gov.pl":3,"ic.gov.pl":3,"is.gov.pl":3,"us.gov.pl":3,"kmpsp.gov.pl":3,"kppsp.gov.pl":3,"kwpsp.gov.pl":3,"psp.gov.pl":3,"wskr.gov.pl":3,"kwp.gov.pl":3,"mw.gov.pl":3,"ug.gov.pl":3,"um.gov.pl":3,"umig.gov.pl":3,"ugim.gov.pl":3,"upow.gov.pl":3,"uw.gov.pl":3,"starostwo.gov.pl":3,"pa.gov.pl":3,"po.gov.pl":3,"psse.gov.pl":3,"pup.gov.pl":3,"rzgw.gov.pl":3,"sa.gov.pl":3,"so.gov.pl":3,"sr.gov.pl":3,"wsa.gov.pl":3,"sko.gov.pl":3,"uzs.gov.pl":3,"wiih.gov.pl":3,"winb.gov.pl":3,"pinb.gov.pl":3,"wios.gov.pl":3,"witd.gov.pl":3,"wzmiuw.gov.pl":3,"piw.gov.pl":3,"wiw.gov.pl":3,"griw.gov.pl":3,"wif.gov.pl":3,"oum.gov.pl":3,"sdn.gov.pl":3,"zp.gov.pl":3,"uppo.gov.pl":3,"mup.gov.pl":3,"wuoz.gov.pl":3,"konsulat.gov.pl":3,"oirm.gov.pl":3,"augustow.pl":2,"babia-gora.pl":2,"bedzin.pl":2,"beskidy.pl":2,"bialowieza.pl":2,"bialystok.pl":2,"bielawa.pl":2,"bieszczady.pl":2,"boleslawiec.pl":2,"bydgoszcz.pl":2,"bytom.pl":2,"cieszyn.pl":2,"czeladz.pl":2,"czest.pl":2,"dlugoleka.pl":2,"elblag.pl":2,"elk.pl":2,"glogow.pl":2,"gniezno.pl":2,"gorlice.pl":2,"grajewo.pl":2,"ilawa.pl":2,"jaworzno.pl":2,"jelenia-gora.pl":2,"jgora.pl":2,"kalisz.pl":2,"kazimierz-dolny.pl":2,"karpacz.pl":2,"kartuzy.pl":2,"kaszuby.pl":2,"katowice.pl":2,"kepno.pl":2,"ketrzyn.pl":2,"klodzko.pl":2,"kobierzyce.pl":2,"kolobrzeg.pl":2,"konin.pl":2,"konskowola.pl":2,"kutno.pl":2,"lapy.pl":2,"lebork.pl":2,"legnica.pl":2,"lezajsk.pl":2,"limanowa.pl":2,"lomza.pl":2,"lowicz.pl":2,"lubin.pl":2,"lukow.pl":2,"malbork.pl":2,"malopolska.pl":2,"mazowsze.pl":2,"mazury.pl":2,"mielec.pl":2,"mielno.pl":2,"mragowo.pl":2,"naklo.pl":2,"nowaruda.pl":2,"nysa.pl":2,"olawa.pl":2,"olecko.pl":2,"olkusz.pl":2,"olsztyn.pl":2,"opoczno.pl":2,"opole.pl":2,"ostroda.pl":2,"ostroleka.pl":2,"ostrowiec.pl":2,"ostrowwlkp.pl":2,"pila.pl":2,"pisz.pl":2,"podhale.pl":2,"podlasie.pl":2,"polkowice.pl":2,"pomorze.pl":2,"pomorskie.pl":2,"prochowice.pl":2,"pruszkow.pl":2,"przeworsk.pl":2,"pulawy.pl":2,"radom.pl":2,"rawa-maz.pl":2,"rybnik.pl":2,"rzeszow.pl":2,"sanok.pl":2,"sejny.pl":2,"slask.pl":2,"slupsk.pl":2,"sosnowiec.pl":2,"stalowa-wola.pl":2,"skoczow.pl":2,"starachowice.pl":2,"stargard.pl":2,"suwalki.pl":2,"swidnica.pl":2,"swiebodzin.pl":2,"swinoujscie.pl":2,"szczecin.pl":2,"szczytno.pl":2,"tarnobrzeg.pl":2,"tgory.pl":2,"turek.pl":2,"tychy.pl":2,"ustka.pl":2,"walbrzych.pl":2,"warmia.pl":2,"warszawa.pl":2,"waw.pl":2,"wegrow.pl":2,"wielun.pl":2,"wlocl.pl":2,"wloclawek.pl":2,"wodzislaw.pl":2,"wolomin.pl":2,"wroclaw.pl":2,"zachpomor.pl":2,"zagan.pl":2,"zarow.pl":2,"zgora.pl":2,"zgorzelec.pl":2,"pm":1,"pn":1,"gov.pn":2,"co.pn":2,"org.pn":2,"edu.pn":2,"net.pn":2,"post":1,"pr":1,"com.pr":2,"net.pr":2,"org.pr":2,"gov.pr":2,"edu.pr":2,"isla.pr":2,"pro.pr":2,"biz.pr":2,"info.pr":2,"name.pr":2,"est.pr":2,"prof.pr":2,"ac.pr":2,"pro":1,"aaa.pro":2,"aca.pro":2,"acct.pro":2,"avocat.pro":2,"bar.pro":2,"cpa.pro":2,"eng.pro":2,"jur.pro":2,"law.pro":2,"med.pro":2,"recht.pro":2,"ps":1,"edu.ps":2,"gov.ps":2,"sec.ps":2,"plo.ps":2,"com.ps":2,"org.ps":2,"net.ps":2,"pt":1,"net.pt":2,"gov.pt":2,"org.pt":2,"edu.pt":2,"int.pt":2,"publ.pt":2,"com.pt":2,"nome.pt":2,"pw":1,"co.pw":2,"ne.pw":2,"or.pw":2,"ed.pw":2,"go.pw":2,"belau.pw":2,"py":1,"com.py":2,"coop.py":2,"edu.py":2,"gov.py":2,"mil.py":2,"net.py":2,"org.py":2,"qa":1,"com.qa":2,"edu.qa":2,"gov.qa":2,"mil.qa":2,"name.qa":2,"net.qa":2,"org.qa":2,"sch.qa":2,"re":1,"asso.re":2,"com.re":2,"nom.re":2,"ro":1,"arts.ro":2,"com.ro":2,"firm.ro":2,"info.ro":2,"nom.ro":2,"nt.ro":2,"org.ro":2,"rec.ro":2,"store.ro":2,"tm.ro":2,"www.ro":2,"rs":1,"ac.rs":2,"co.rs":2,"edu.rs":2,"gov.rs":2,"in.rs":2,"org.rs":2,"ru":1,"rw":1,"ac.rw":2,"co.rw":2,"coop.rw":2,"gov.rw":2,"mil.rw":2,"net.rw":2,"org.rw":2,"sa":1,"com.sa":2,"net.sa":2,"org.sa":2,"gov.sa":2,"med.sa":2,"pub.sa":2,"edu.sa":2,"sch.sa":2,"sb":1,"com.sb":2,"edu.sb":2,"gov.sb":2,"net.sb":2,"org.sb":2,"sc":1,"com.sc":2,"gov.sc":2,"net.sc":2,"org.sc":2,"edu.sc":2,"sd":1,"com.sd":2,"net.sd":2,"org.sd":2,"edu.sd":2,"med.sd":2,"tv.sd":2,"gov.sd":2,"info.sd":2,"se":1,"a.se":2,"ac.se":2,"b.se":2,"bd.se":2,"brand.se":2,"c.se":2,"d.se":2,"e.se":2,"f.se":2,"fh.se":2,"fhsk.se":2,"fhv.se":2,"g.se":2,"h.se":2,"i.se":2,"k.se":2,"komforb.se":2,"kommunalforbund.se":2,"komvux.se":2,"l.se":2,"lanbib.se":2,"m.se":2,"n.se":2,"naturbruksgymn.se":2,"o.se":2,"org.se":2,"p.se":2,"parti.se":2,"pp.se":2,"press.se":2,"r.se":2,"s.se":2,"t.se":2,"tm.se":2,"u.se":2,"w.se":2,"x.se":2,"y.se":2,"z.se":2,"sg":1,"com.sg":2,"net.sg":2,"org.sg":2,"gov.sg":2,"edu.sg":2,"per.sg":2,"sh":1,"com.sh":2,"net.sh":2,"gov.sh":2,"org.sh":2,"mil.sh":2,"si":1,"sj":1,"sk":1,"sl":1,"com.sl":2,"net.sl":2,"edu.sl":2,"gov.sl":2,"org.sl":2,"sm":1,"sn":1,"art.sn":2,"com.sn":2,"edu.sn":2,"gouv.sn":2,"org.sn":2,"perso.sn":2,"univ.sn":2,"so":1,"com.so":2,"edu.so":2,"gov.so":2,"me.so":2,"net.so":2,"org.so":2,"sr":1,"ss":1,"biz.ss":2,"com.ss":2,"edu.ss":2,"gov.ss":2,"me.ss":2,"net.ss":2,"org.ss":2,"sch.ss":2,"st":1,"co.st":2,"com.st":2,"consulado.st":2,"edu.st":2,"embaixada.st":2,"mil.st":2,"net.st":2,"org.st":2,"principe.st":2,"saotome.st":2,"store.st":2,"su":1,"sv":1,"com.sv":2,"edu.sv":2,"gob.sv":2,"org.sv":2,"red.sv":2,"sx":1,"gov.sx":2,"sy":1,"edu.sy":2,"gov.sy":2,"net.sy":2,"mil.sy":2,"com.sy":2,"org.sy":2,"sz":1,"co.sz":2,"ac.sz":2,"org.sz":2,"tc":1,"td":1,"tel":1,"tf":1,"tg":1,"th":1,"ac.th":2,"co.th":2,"go.th":2,"in.th":2,"mi.th":2,"net.th":2,"or.th":2,"tj":1,"ac.tj":2,"biz.tj":2,"co.tj":2,"com.tj":2,"edu.tj":2,"go.tj":2,"gov.tj":2,"int.tj":2,"mil.tj":2,"name.tj":2,"net.tj":2,"nic.tj":2,"org.tj":2,"test.tj":2,"web.tj":2,"tk":1,"tl":1,"gov.tl":2,"tm":1,"com.tm":2,"co.tm":2,"org.tm":2,"net.tm":2,"nom.tm":2,"gov.tm":2,"mil.tm":2,"edu.tm":2,"tn":1,"com.tn":2,"ens.tn":2,"fin.tn":2,"gov.tn":2,"ind.tn":2,"info.tn":2,"intl.tn":2,"mincom.tn":2,"nat.tn":2,"net.tn":2,"org.tn":2,"perso.tn":2,"tourism.tn":2,"to":1,"com.to":2,"gov.to":2,"net.to":2,"org.to":2,"edu.to":2,"mil.to":2,"tr":1,"av.tr":2,"bbs.tr":2,"bel.tr":2,"biz.tr":2,"com.tr":2,"dr.tr":2,"edu.tr":2,"gen.tr":2,"gov.tr":2,"info.tr":2,"mil.tr":2,"k12.tr":2,"kep.tr":2,"name.tr":2,"net.tr":2,"org.tr":2,"pol.tr":2,"tel.tr":2,"tsk.tr":2,"tv.tr":2,"web.tr":2,"nc.tr":2,"gov.nc.tr":3,"tt":1,"co.tt":2,"com.tt":2,"org.tt":2,"net.tt":2,"biz.tt":2,"info.tt":2,"pro.tt":2,"int.tt":2,"coop.tt":2,"jobs.tt":2,"mobi.tt":2,"travel.tt":2,"museum.tt":2,"aero.tt":2,"name.tt":2,"gov.tt":2,"edu.tt":2,"tv":1,"tw":1,"edu.tw":2,"gov.tw":2,"mil.tw":2,"com.tw":2,"net.tw":2,"org.tw":2,"idv.tw":2,"game.tw":2,"ebiz.tw":2,"club.tw":2,"xn--zf0ao64a.tw":2,"xn--uc0atv.tw":2,"xn--czrw28b.tw":2,"tz":1,"ac.tz":2,"co.tz":2,"go.tz":2,"hotel.tz":2,"info.tz":2,"me.tz":2,"mil.tz":2,"mobi.tz":2,"ne.tz":2,"or.tz":2,"sc.tz":2,"tv.tz":2,"ua":1,"com.ua":2,"edu.ua":2,"gov.ua":2,"in.ua":2,"net.ua":2,"org.ua":2,"cherkassy.ua":2,"cherkasy.ua":2,"chernigov.ua":2,"chernihiv.ua":2,"chernivtsi.ua":2,"chernovtsy.ua":2,"ck.ua":2,"cn.ua":2,"cr.ua":2,"crimea.ua":2,"cv.ua":2,"dn.ua":2,"dnepropetrovsk.ua":2,"dnipropetrovsk.ua":2,"donetsk.ua":2,"dp.ua":2,"if.ua":2,"ivano-frankivsk.ua":2,"kh.ua":2,"kharkiv.ua":2,"kharkov.ua":2,"kherson.ua":2,"khmelnitskiy.ua":2,"khmelnytskyi.ua":2,"kiev.ua":2,"kirovograd.ua":2,"km.ua":2,"kr.ua":2,"krym.ua":2,"ks.ua":2,"kv.ua":2,"kyiv.ua":2,"lg.ua":2,"lt.ua":2,"lugansk.ua":2,"lutsk.ua":2,"lv.ua":2,"lviv.ua":2,"mk.ua":2,"mykolaiv.ua":2,"nikolaev.ua":2,"od.ua":2,"odesa.ua":2,"odessa.ua":2,"pl.ua":2,"poltava.ua":2,"rivne.ua":2,"rovno.ua":2,"rv.ua":2,"sb.ua":2,"sebastopol.ua":2,"sevastopol.ua":2,"sm.ua":2,"sumy.ua":2,"te.ua":2,"ternopil.ua":2,"uz.ua":2,"uzhgorod.ua":2,"vinnica.ua":2,"vinnytsia.ua":2,"vn.ua":2,"volyn.ua":2,"yalta.ua":2,"zaporizhzhe.ua":2,"zaporizhzhia.ua":2,"zhitomir.ua":2,"zhytomyr.ua":2,"zp.ua":2,"zt.ua":2,"ug":1,"co.ug":2,"or.ug":2,"ac.ug":2,"sc.ug":2,"go.ug":2,"ne.ug":2,"com.ug":2,"org.ug":2,"uk":1,"ac.uk":2,"co.uk":2,"gov.uk":2,"ltd.uk":2,"me.uk":2,"net.uk":2,"nhs.uk":2,"org.uk":2,"plc.uk":2,"police.uk":2,"sch.uk":3,"us":1,"dni.us":2,"fed.us":2,"isa.us":2,"kids.us":2,"nsn.us":2,"ak.us":2,"al.us":2,"ar.us":2,"as.us":2,"az.us":2,"ca.us":2,"co.us":2,"ct.us":2,"dc.us":2,"de.us":2,"fl.us":2,"ga.us":2,"gu.us":2,"hi.us":2,"ia.us":2,"id.us":2,"il.us":2,"in.us":2,"ks.us":2,"ky.us":2,"la.us":2,"ma.us":2,"md.us":2,"me.us":2,"mi.us":2,"mn.us":2,"mo.us":2,"ms.us":2,"mt.us":2,"nc.us":2,"nd.us":2,"ne.us":2,"nh.us":2,"nj.us":2,"nm.us":2,"nv.us":2,"ny.us":2,"oh.us":2,"ok.us":2,"or.us":2,"pa.us":2,"pr.us":2,"ri.us":2,"sc.us":2,"sd.us":2,"tn.us":2,"tx.us":2,"ut.us":2,"vi.us":2,"vt.us":2,"va.us":2,"wa.us":2,"wi.us":2,"wv.us":2,"wy.us":2,"k12.ak.us":3,"k12.al.us":3,"k12.ar.us":3,"k12.as.us":3,"k12.az.us":3,"k12.ca.us":3,"k12.co.us":3,"k12.ct.us":3,"k12.dc.us":3,"k12.de.us":3,"k12.fl.us":3,"k12.ga.us":3,"k12.gu.us":3,"k12.ia.us":3,"k12.id.us":3,"k12.il.us":3,"k12.in.us":3,"k12.ks.us":3,"k12.ky.us":3,"k12.la.us":3,"k12.ma.us":3,"k12.md.us":3,"k12.me.us":3,"k12.mi.us":3,"k12.mn.us":3,"k12.mo.us":3,"k12.ms.us":3,"k12.mt.us":3,"k12.nc.us":3,"k12.ne.us":3,"k12.nh.us":3,"k12.nj.us":3,"k12.nm.us":3,"k12.nv.us":3,"k12.ny.us":3,"k12.oh.us":3,"k12.ok.us":3,"k12.or.us":3,"k12.pa.us":3,"k12.pr.us":3,"k12.sc.us":3,"k12.tn.us":3,"k12.tx.us":3,"k12.ut.us":3,"k12.vi.us":3,"k12.vt.us":3,"k12.va.us":3,"k12.wa.us":3,"k12.wi.us":3,"k12.wy.us":3,"cc.ak.us":3,"cc.al.us":3,"cc.ar.us":3,"cc.as.us":3,"cc.az.us":3,"cc.ca.us":3,"cc.co.us":3,"cc.ct.us":3,"cc.dc.us":3,"cc.de.us":3,"cc.fl.us":3,"cc.ga.us":3,"cc.gu.us":3,"cc.hi.us":3,"cc.ia.us":3,"cc.id.us":3,"cc.il.us":3,"cc.in.us":3,"cc.ks.us":3,"cc.ky.us":3,"cc.la.us":3,"cc.ma.us":3,"cc.md.us":3,"cc.me.us":3,"cc.mi.us":3,"cc.mn.us":3,"cc.mo.us":3,"cc.ms.us":3,"cc.mt.us":3,"cc.nc.us":3,"cc.nd.us":3,"cc.ne.us":3,"cc.nh.us":3,"cc.nj.us":3,"cc.nm.us":3,"cc.nv.us":3,"cc.ny.us":3,"cc.oh.us":3,"cc.ok.us":3,"cc.or.us":3,"cc.pa.us":3,"cc.pr.us":3,"cc.ri.us":3,"cc.sc.us":3,"cc.sd.us":3,"cc.tn.us":3,"cc.tx.us":3,"cc.ut.us":3,"cc.vi.us":3,"cc.vt.us":3,"cc.va.us":3,"cc.wa.us":3,"cc.wi.us":3,"cc.wv.us":3,"cc.wy.us":3,"lib.ak.us":3,"lib.al.us":3,"lib.ar.us":3,"lib.as.us":3,"lib.az.us":3,"lib.ca.us":3,"lib.co.us":3,"lib.ct.us":3,"lib.dc.us":3,"lib.fl.us":3,"lib.ga.us":3,"lib.gu.us":3,"lib.hi.us":3,"lib.ia.us":3,"lib.id.us":3,"lib.il.us":3,"lib.in.us":3,"lib.ks.us":3,"lib.ky.us":3,"lib.la.us":3,"lib.ma.us":3,"lib.md.us":3,"lib.me.us":3,"lib.mi.us":3,"lib.mn.us":3,"lib.mo.us":3,"lib.ms.us":3,"lib.mt.us":3,"lib.nc.us":3,"lib.nd.us":3,"lib.ne.us":3,"lib.nh.us":3,"lib.nj.us":3,"lib.nm.us":3,"lib.nv.us":3,"lib.ny.us":3,"lib.oh.us":3,"lib.ok.us":3,"lib.or.us":3,"lib.pa.us":3,"lib.pr.us":3,"lib.ri.us":3,"lib.sc.us":3,"lib.sd.us":3,"lib.tn.us":3,"lib.tx.us":3,"lib.ut.us":3,"lib.vi.us":3,"lib.vt.us":3,"lib.va.us":3,"lib.wa.us":3,"lib.wi.us":3,"lib.wy.us":3,"pvt.k12.ma.us":4,"chtr.k12.ma.us":4,"paroch.k12.ma.us":4,"ann-arbor.mi.us":3,"cog.mi.us":3,"dst.mi.us":3,"eaton.mi.us":3,"gen.mi.us":3,"mus.mi.us":3,"tec.mi.us":3,"washtenaw.mi.us":3,"uy":1,"com.uy":2,"edu.uy":2,"gub.uy":2,"mil.uy":2,"net.uy":2,"org.uy":2,"uz":1,"co.uz":2,"com.uz":2,"net.uz":2,"org.uz":2,"va":1,"vc":1,"com.vc":2,"net.vc":2,"org.vc":2,"gov.vc":2,"mil.vc":2,"edu.vc":2,"ve":1,"arts.ve":2,"bib.ve":2,"co.ve":2,"com.ve":2,"e12.ve":2,"edu.ve":2,"firm.ve":2,"gob.ve":2,"gov.ve":2,"info.ve":2,"int.ve":2,"mil.ve":2,"net.ve":2,"nom.ve":2,"org.ve":2,"rar.ve":2,"rec.ve":2,"store.ve":2,"tec.ve":2,"web.ve":2,"vg":1,"vi":1,"co.vi":2,"com.vi":2,"k12.vi":2,"net.vi":2,"org.vi":2,"vn":1,"com.vn":2,"net.vn":2,"org.vn":2,"edu.vn":2,"gov.vn":2,"int.vn":2,"ac.vn":2,"biz.vn":2,"info.vn":2,"name.vn":2,"pro.vn":2,"health.vn":2,"vu":1,"com.vu":2,"edu.vu":2,"net.vu":2,"org.vu":2,"wf":1,"ws":1,"com.ws":2,"net.ws":2,"org.ws":2,"gov.ws":2,"edu.ws":2,"yt":1,"xn--mgbaam7a8h":1,"xn--y9a3aq":1,"xn--54b7fta0cc":1,"xn--90ae":1,"xn--mgbcpq6gpa1a":1,"xn--90ais":1,"xn--fiqs8s":1,"xn--fiqz9s":1,"xn--lgbbat1ad8j":1,"xn--wgbh1c":1,"xn--e1a4c":1,"xn--qxa6a":1,"xn--mgbah1a3hjkrd":1,"xn--node":1,"xn--qxam":1,"xn--j6w193g":1,"xn--55qx5d.xn--j6w193g":2,"xn--wcvs22d.xn--j6w193g":2,"xn--mxtq1m.xn--j6w193g":2,"xn--gmqw5a.xn--j6w193g":2,"xn--od0alg.xn--j6w193g":2,"xn--uc0atv.xn--j6w193g":2,"xn--2scrj9c":1,"xn--3hcrj9c":1,"xn--45br5cyl":1,"xn--h2breg3eve":1,"xn--h2brj9c8c":1,"xn--mgbgu82a":1,"xn--rvc1e0am3e":1,"xn--h2brj9c":1,"xn--mgbbh1a":1,"xn--mgbbh1a71e":1,"xn--fpcrj9c3d":1,"xn--gecrj9c":1,"xn--s9brj9c":1,"xn--45brj9c":1,"xn--xkc2dl3a5ee0h":1,"xn--mgba3a4f16a":1,"xn--mgba3a4fra":1,"xn--mgbtx2b":1,"xn--mgbayh7gpa":1,"xn--3e0b707e":1,"xn--80ao21a":1,"xn--q7ce6a":1,"xn--fzc2c9e2c":1,"xn--xkc2al3hye2a":1,"xn--mgbc0a9azcg":1,"xn--d1alf":1,"xn--l1acc":1,"xn--mix891f":1,"xn--mix082f":1,"xn--mgbx4cd0ab":1,"xn--mgb9awbf":1,"xn--mgbai9azgqp6j":1,"xn--mgbai9a5eva00b":1,"xn--ygbi2ammx":1,"xn--90a3ac":1,"xn--o1ac.xn--90a3ac":2,"xn--c1avg.xn--90a3ac":2,"xn--90azh.xn--90a3ac":2,"xn--d1at.xn--90a3ac":2,"xn--o1ach.xn--90a3ac":2,"xn--80au.xn--90a3ac":2,"xn--p1ai":1,"xn--wgbl6a":1,"xn--mgberp4a5d4ar":1,"xn--mgberp4a5d4a87g":1,"xn--mgbqly7c0a67fbc":1,"xn--mgbqly7cvafr":1,"xn--mgbpl2fh":1,"xn--yfro4i67o":1,"xn--clchc0ea0b2g2a9gcd":1,"xn--ogbpf8fl":1,"xn--mgbtf8fl":1,"xn--o3cw4h":1,"xn--12c1fe0br.xn--o3cw4h":2,"xn--12co0c3b4eva.xn--o3cw4h":2,"xn--h3cuzk1di.xn--o3cw4h":2,"xn--o3cyx2a.xn--o3cw4h":2,"xn--m3ch0j3a.xn--o3cw4h":2,"xn--12cfi8ixb8l.xn--o3cw4h":2,"xn--pgbs0dh":1,"xn--kpry57d":1,"xn--kprw13d":1,"xn--nnx388a":1,"xn--j1amh":1,"xn--mgb2ddes":1,"xxx":1,"ye":1,"com.ye":2,"edu.ye":2,"gov.ye":2,"net.ye":2,"mil.ye":2,"org.ye":2,"ac.za":2,"agric.za":2,"alt.za":2,"co.za":2,"edu.za":2,"gov.za":2,"grondar.za":2,"law.za":2,"mil.za":2,"net.za":2,"ngo.za":2,"nic.za":2,"nis.za":2,"nom.za":2,"org.za":2,"school.za":2,"tm.za":2,"web.za":2,"zm":1,"ac.zm":2,"biz.zm":2,"co.zm":2,"com.zm":2,"edu.zm":2,"gov.zm":2,"info.zm":2,"mil.zm":2,"net.zm":2,"org.zm":2,"sch.zm":2,"zw":1,"ac.zw":2,"co.zw":2,"gov.zw":2,"mil.zw":2,"org.zw":2,"aaa":1,"aarp":1,"abarth":1,"abb":1,"abbott":1,"abbvie":1,"abc":1,"able":1,"abogado":1,"abudhabi":1,"academy":1,"accenture":1,"accountant":1,"accountants":1,"aco":1,"actor":1,"adac":1,"ads":1,"adult":1,"aeg":1,"aetna":1,"afl":1,"africa":1,"agakhan":1,"agency":1,"aig":1,"airbus":1,"airforce":1,"airtel":1,"akdn":1,"alfaromeo":1,"alibaba":1,"alipay":1,"allfinanz":1,"allstate":1,"ally":1,"alsace":1,"alstom":1,"amazon":1,"americanexpress":1,"americanfamily":1,"amex":1,"amfam":1,"amica":1,"amsterdam":1,"analytics":1,"android":1,"anquan":1,"anz":1,"aol":1,"apartments":1,"app":1,"apple":1,"aquarelle":1,"arab":1,"aramco":1,"archi":1,"army":1,"art":1,"arte":1,"asda":1,"associates":1,"athleta":1,"attorney":1,"auction":1,"audi":1,"audible":1,"audio":1,"auspost":1,"author":1,"auto":1,"autos":1,"avianca":1,"aws":1,"axa":1,"azure":1,"baby":1,"baidu":1,"banamex":1,"bananarepublic":1,"band":1,"bank":1,"bar":1,"barcelona":1,"barclaycard":1,"barclays":1,"barefoot":1,"bargains":1,"baseball":1,"basketball":1,"bauhaus":1,"bayern":1,"bbc":1,"bbt":1,"bbva":1,"bcg":1,"bcn":1,"beats":1,"beauty":1,"beer":1,"bentley":1,"berlin":1,"best":1,"bestbuy":1,"bet":1,"bharti":1,"bible":1,"bid":1,"bike":1,"bing":1,"bingo":1,"bio":1,"black":1,"blackfriday":1,"blockbuster":1,"blog":1,"bloomberg":1,"blue":1,"bms":1,"bmw":1,"bnpparibas":1,"boats":1,"boehringer":1,"bofa":1,"bom":1,"bond":1,"boo":1,"book":1,"booking":1,"bosch":1,"bostik":1,"boston":1,"bot":1,"boutique":1,"box":1,"bradesco":1,"bridgestone":1,"broadway":1,"broker":1,"brother":1,"brussels":1,"bugatti":1,"build":1,"builders":1,"business":1,"buy":1,"buzz":1,"bzh":1,"cab":1,"cafe":1,"cal":1,"call":1,"calvinklein":1,"cam":1,"camera":1,"camp":1,"cancerresearch":1,"canon":1,"capetown":1,"capital":1,"capitalone":1,"car":1,"caravan":1,"cards":1,"care":1,"career":1,"careers":1,"cars":1,"casa":1,"case":1,"cash":1,"casino":1,"catering":1,"catholic":1,"cba":1,"cbn":1,"cbre":1,"cbs":1,"center":1,"ceo":1,"cern":1,"cfa":1,"cfd":1,"chanel":1,"channel":1,"charity":1,"chase":1,"chat":1,"cheap":1,"chintai":1,"christmas":1,"chrome":1,"church":1,"cipriani":1,"circle":1,"cisco":1,"citadel":1,"citi":1,"citic":1,"city":1,"cityeats":1,"claims":1,"cleaning":1,"click":1,"clinic":1,"clinique":1,"clothing":1,"cloud":1,"club":1,"clubmed":1,"coach":1,"codes":1,"coffee":1,"college":1,"cologne":1,"comcast":1,"commbank":1,"community":1,"company":1,"compare":1,"computer":1,"comsec":1,"condos":1,"construction":1,"consulting":1,"contact":1,"contractors":1,"cooking":1,"cookingchannel":1,"cool":1,"corsica":1,"country":1,"coupon":1,"coupons":1,"courses":1,"cpa":1,"credit":1,"creditcard":1,"creditunion":1,"cricket":1,"crown":1,"crs":1,"cruise":1,"cruises":1,"cuisinella":1,"cymru":1,"cyou":1,"dabur":1,"dad":1,"dance":1,"data":1,"date":1,"dating":1,"datsun":1,"day":1,"dclk":1,"dds":1,"deal":1,"dealer":1,"deals":1,"degree":1,"delivery":1,"dell":1,"deloitte":1,"delta":1,"democrat":1,"dental":1,"dentist":1,"desi":1,"design":1,"dev":1,"dhl":1,"diamonds":1,"diet":1,"digital":1,"direct":1,"directory":1,"discount":1,"discover":1,"dish":1,"diy":1,"dnp":1,"docs":1,"doctor":1,"dog":1,"domains":1,"dot":1,"download":1,"drive":1,"dtv":1,"dubai":1,"dunlop":1,"dupont":1,"durban":1,"dvag":1,"dvr":1,"earth":1,"eat":1,"eco":1,"edeka":1,"education":1,"email":1,"emerck":1,"energy":1,"engineer":1,"engineering":1,"enterprises":1,"epson":1,"equipment":1,"ericsson":1,"erni":1,"esq":1,"estate":1,"etisalat":1,"eurovision":1,"eus":1,"events":1,"exchange":1,"expert":1,"exposed":1,"express":1,"extraspace":1,"fage":1,"fail":1,"fairwinds":1,"faith":1,"family":1,"fan":1,"fans":1,"farm":1,"farmers":1,"fashion":1,"fast":1,"fedex":1,"feedback":1,"ferrari":1,"ferrero":1,"fiat":1,"fidelity":1,"fido":1,"film":1,"final":1,"finance":1,"financial":1,"fire":1,"firestone":1,"firmdale":1,"fish":1,"fishing":1,"fit":1,"fitness":1,"flickr":1,"flights":1,"flir":1,"florist":1,"flowers":1,"fly":1,"foo":1,"food":1,"foodnetwork":1,"football":1,"ford":1,"forex":1,"forsale":1,"forum":1,"foundation":1,"fox":1,"free":1,"fresenius":1,"frl":1,"frogans":1,"frontdoor":1,"frontier":1,"ftr":1,"fujitsu":1,"fun":1,"fund":1,"furniture":1,"futbol":1,"fyi":1,"gal":1,"gallery":1,"gallo":1,"gallup":1,"game":1,"games":1,"gap":1,"garden":1,"gay":1,"gbiz":1,"gdn":1,"gea":1,"gent":1,"genting":1,"george":1,"ggee":1,"gift":1,"gifts":1,"gives":1,"giving":1,"glass":1,"gle":1,"global":1,"globo":1,"gmail":1,"gmbh":1,"gmo":1,"gmx":1,"godaddy":1,"gold":1,"goldpoint":1,"golf":1,"goo":1,"goodyear":1,"goog":1,"google":1,"gop":1,"got":1,"grainger":1,"graphics":1,"gratis":1,"green":1,"gripe":1,"grocery":1,"group":1,"guardian":1,"gucci":1,"guge":1,"guide":1,"guitars":1,"guru":1,"hair":1,"hamburg":1,"hangout":1,"haus":1,"hbo":1,"hdfc":1,"hdfcbank":1,"health":1,"healthcare":1,"help":1,"helsinki":1,"here":1,"hermes":1,"hgtv":1,"hiphop":1,"hisamitsu":1,"hitachi":1,"hiv":1,"hkt":1,"hockey":1,"holdings":1,"holiday":1,"homedepot":1,"homegoods":1,"homes":1,"homesense":1,"honda":1,"horse":1,"hospital":1,"host":1,"hosting":1,"hot":1,"hoteles":1,"hotels":1,"hotmail":1,"house":1,"how":1,"hsbc":1,"hughes":1,"hyatt":1,"hyundai":1,"ibm":1,"icbc":1,"ice":1,"icu":1,"ieee":1,"ifm":1,"ikano":1,"imamat":1,"imdb":1,"immo":1,"immobilien":1,"inc":1,"industries":1,"infiniti":1,"ing":1,"ink":1,"institute":1,"insurance":1,"insure":1,"international":1,"intuit":1,"investments":1,"ipiranga":1,"irish":1,"ismaili":1,"ist":1,"istanbul":1,"itau":1,"itv":1,"jaguar":1,"java":1,"jcb":1,"jeep":1,"jetzt":1,"jewelry":1,"jio":1,"jll":1,"jmp":1,"jnj":1,"joburg":1,"jot":1,"joy":1,"jpmorgan":1,"jprs":1,"juegos":1,"juniper":1,"kaufen":1,"kddi":1,"kerryhotels":1,"kerrylogistics":1,"kerryproperties":1,"kfh":1,"kia":1,"kids":1,"kim":1,"kinder":1,"kindle":1,"kitchen":1,"kiwi":1,"koeln":1,"komatsu":1,"kosher":1,"kpmg":1,"kpn":1,"krd":1,"kred":1,"kuokgroup":1,"kyoto":1,"lacaixa":1,"lamborghini":1,"lamer":1,"lancaster":1,"lancia":1,"land":1,"landrover":1,"lanxess":1,"lasalle":1,"lat":1,"latino":1,"latrobe":1,"law":1,"lawyer":1,"lds":1,"lease":1,"leclerc":1,"lefrak":1,"legal":1,"lego":1,"lexus":1,"lgbt":1,"lidl":1,"life":1,"lifeinsurance":1,"lifestyle":1,"lighting":1,"like":1,"lilly":1,"limited":1,"limo":1,"lincoln":1,"linde":1,"link":1,"lipsy":1,"live":1,"living":1,"llc":1,"llp":1,"loan":1,"loans":1,"locker":1,"locus":1,"loft":1,"lol":1,"london":1,"lotte":1,"lotto":1,"love":1,"lpl":1,"lplfinancial":1,"ltd":1,"ltda":1,"lundbeck":1,"luxe":1,"luxury":1,"macys":1,"madrid":1,"maif":1,"maison":1,"makeup":1,"man":1,"management":1,"mango":1,"map":1,"market":1,"marketing":1,"markets":1,"marriott":1,"marshalls":1,"maserati":1,"mattel":1,"mba":1,"mckinsey":1,"med":1,"media":1,"meet":1,"melbourne":1,"meme":1,"memorial":1,"men":1,"menu":1,"merckmsd":1,"miami":1,"microsoft":1,"mini":1,"mint":1,"mit":1,"mitsubishi":1,"mlb":1,"mls":1,"mma":1,"mobile":1,"moda":1,"moe":1,"moi":1,"mom":1,"monash":1,"money":1,"monster":1,"mormon":1,"mortgage":1,"moscow":1,"moto":1,"motorcycles":1,"mov":1,"movie":1,"msd":1,"mtn":1,"mtr":1,"music":1,"mutual":1,"nab":1,"nagoya":1,"natura":1,"navy":1,"nba":1,"nec":1,"netbank":1,"netflix":1,"network":1,"neustar":1,"new":1,"news":1,"next":1,"nextdirect":1,"nexus":1,"nfl":1,"ngo":1,"nhk":1,"nico":1,"nike":1,"nikon":1,"ninja":1,"nissan":1,"nissay":1,"nokia":1,"northwesternmutual":1,"norton":1,"now":1,"nowruz":1,"nowtv":1,"nra":1,"nrw":1,"ntt":1,"nyc":1,"obi":1,"observer":1,"office":1,"okinawa":1,"olayan":1,"olayangroup":1,"oldnavy":1,"ollo":1,"omega":1,"one":1,"ong":1,"onl":1,"online":1,"ooo":1,"open":1,"oracle":1,"orange":1,"organic":1,"origins":1,"osaka":1,"otsuka":1,"ott":1,"ovh":1,"page":1,"panasonic":1,"paris":1,"pars":1,"partners":1,"parts":1,"party":1,"passagens":1,"pay":1,"pccw":1,"pet":1,"pfizer":1,"pharmacy":1,"phd":1,"philips":1,"phone":1,"photo":1,"photography":1,"photos":1,"physio":1,"pics":1,"pictet":1,"pictures":1,"pid":1,"pin":1,"ping":1,"pink":1,"pioneer":1,"pizza":1,"place":1,"play":1,"playstation":1,"plumbing":1,"plus":1,"pnc":1,"pohl":1,"poker":1,"politie":1,"porn":1,"pramerica":1,"praxi":1,"press":1,"prime":1,"prod":1,"productions":1,"prof":1,"progressive":1,"promo":1,"properties":1,"property":1,"protection":1,"pru":1,"prudential":1,"pub":1,"pwc":1,"qpon":1,"quebec":1,"quest":1,"racing":1,"radio":1,"read":1,"realestate":1,"realtor":1,"realty":1,"recipes":1,"red":1,"redstone":1,"redumbrella":1,"rehab":1,"reise":1,"reisen":1,"reit":1,"reliance":1,"ren":1,"rent":1,"rentals":1,"repair":1,"report":1,"republican":1,"rest":1,"restaurant":1,"review":1,"reviews":1,"rexroth":1,"rich":1,"richardli":1,"ricoh":1,"ril":1,"rio":1,"rip":1,"rocher":1,"rocks":1,"rodeo":1,"rogers":1,"room":1,"rsvp":1,"rugby":1,"ruhr":1,"run":1,"rwe":1,"ryukyu":1,"saarland":1,"safe":1,"safety":1,"sakura":1,"sale":1,"salon":1,"samsclub":1,"samsung":1,"sandvik":1,"sandvikcoromant":1,"sanofi":1,"sap":1,"sarl":1,"sas":1,"save":1,"saxo":1,"sbi":1,"sbs":1,"sca":1,"scb":1,"schaeffler":1,"schmidt":1,"scholarships":1,"school":1,"schule":1,"schwarz":1,"science":1,"scot":1,"search":1,"seat":1,"secure":1,"security":1,"seek":1,"select":1,"sener":1,"services":1,"ses":1,"seven":1,"sew":1,"sex":1,"sexy":1,"sfr":1,"shangrila":1,"sharp":1,"shaw":1,"shell":1,"shia":1,"shiksha":1,"shoes":1,"shop":1,"shopping":1,"shouji":1,"show":1,"showtime":1,"silk":1,"sina":1,"singles":1,"site":1,"ski":1,"skin":1,"sky":1,"skype":1,"sling":1,"smart":1,"smile":1,"sncf":1,"soccer":1,"social":1,"softbank":1,"software":1,"sohu":1,"solar":1,"solutions":1,"song":1,"sony":1,"soy":1,"spa":1,"space":1,"sport":1,"spot":1,"srl":1,"stada":1,"staples":1,"star":1,"statebank":1,"statefarm":1,"stc":1,"stcgroup":1,"stockholm":1,"storage":1,"store":1,"stream":1,"studio":1,"study":1,"style":1,"sucks":1,"supplies":1,"supply":1,"support":1,"surf":1,"surgery":1,"suzuki":1,"swatch":1,"swiss":1,"sydney":1,"systems":1,"tab":1,"taipei":1,"talk":1,"taobao":1,"target":1,"tatamotors":1,"tatar":1,"tattoo":1,"tax":1,"taxi":1,"tci":1,"tdk":1,"team":1,"tech":1,"technology":1,"temasek":1,"tennis":1,"teva":1,"thd":1,"theater":1,"theatre":1,"tiaa":1,"tickets":1,"tienda":1,"tiffany":1,"tips":1,"tires":1,"tirol":1,"tjmaxx":1,"tjx":1,"tkmaxx":1,"tmall":1,"today":1,"tokyo":1,"tools":1,"top":1,"toray":1,"toshiba":1,"total":1,"tours":1,"town":1,"toyota":1,"toys":1,"trade":1,"trading":1,"training":1,"travel":1,"travelchannel":1,"travelers":1,"travelersinsurance":1,"trust":1,"trv":1,"tube":1,"tui":1,"tunes":1,"tushu":1,"tvs":1,"ubank":1,"ubs":1,"unicom":1,"university":1,"uno":1,"uol":1,"ups":1,"vacations":1,"vana":1,"vanguard":1,"vegas":1,"ventures":1,"verisign":1,"versicherung":1,"vet":1,"viajes":1,"video":1,"vig":1,"viking":1,"villas":1,"vin":1,"vip":1,"virgin":1,"visa":1,"vision":1,"viva":1,"vivo":1,"vlaanderen":1,"vodka":1,"volkswagen":1,"volvo":1,"vote":1,"voting":1,"voto":1,"voyage":1,"vuelos":1,"wales":1,"walmart":1,"walter":1,"wang":1,"wanggou":1,"watch":1,"watches":1,"weather":1,"weatherchannel":1,"webcam":1,"weber":1,"website":1,"wedding":1,"weibo":1,"weir":1,"whoswho":1,"wien":1,"wiki":1,"williamhill":1,"win":1,"windows":1,"wine":1,"winners":1,"wme":1,"wolterskluwer":1,"woodside":1,"work":1,"works":1,"world":1,"wow":1,"wtc":1,"wtf":1,"xbox":1,"xerox":1,"xfinity":1,"xihuan":1,"xin":1,"xn--11b4c3d":1,"xn--1ck2e1b":1,"xn--1qqw23a":1,"xn--30rr7y":1,"xn--3bst00m":1,"xn--3ds443g":1,"xn--3pxu8k":1,"xn--42c2d9a":1,"xn--45q11c":1,"xn--4gbrim":1,"xn--55qw42g":1,"xn--55qx5d":1,"xn--5su34j936bgsg":1,"xn--5tzm5g":1,"xn--6frz82g":1,"xn--6qq986b3xl":1,"xn--80adxhks":1,"xn--80aqecdr1a":1,"xn--80asehdb":1,"xn--80aswg":1,"xn--8y0a063a":1,"xn--9dbq2a":1,"xn--9et52u":1,"xn--9krt00a":1,"xn--b4w605ferd":1,"xn--bck1b9a5dre4c":1,"xn--c1avg":1,"xn--c2br7g":1,"xn--cck2b3b":1,"xn--cckwcxetd":1,"xn--cg4bki":1,"xn--czr694b":1,"xn--czrs0t":1,"xn--czru2d":1,"xn--d1acj3b":1,"xn--eckvdtc9d":1,"xn--efvy88h":1,"xn--fct429k":1,"xn--fhbei":1,"xn--fiq228c5hs":1,"xn--fiq64b":1,"xn--fjq720a":1,"xn--flw351e":1,"xn--fzys8d69uvgm":1,"xn--g2xx48c":1,"xn--gckr3f0f":1,"xn--gk3at1e":1,"xn--hxt814e":1,"xn--i1b6b1a6a2e":1,"xn--imr513n":1,"xn--io0a7i":1,"xn--j1aef":1,"xn--jlq480n2rg":1,"xn--jlq61u9w7b":1,"xn--jvr189m":1,"xn--kcrx77d1x4a":1,"xn--kput3i":1,"xn--mgba3a3ejt":1,"xn--mgba7c0bbn0a":1,"xn--mgbaakc7dvf":1,"xn--mgbab2bd":1,"xn--mgbca7dzdo":1,"xn--mgbi4ecexp":1,"xn--mgbt3dhd":1,"xn--mk1bu44c":1,"xn--mxtq1m":1,"xn--ngbc5azd":1,"xn--ngbe9e0a":1,"xn--ngbrx":1,"xn--nqv7f":1,"xn--nqv7fs00ema":1,"xn--nyqy26a":1,"xn--otu796d":1,"xn--p1acf":1,"xn--pssy2u":1,"xn--q9jyb4c":1,"xn--qcka1pmc":1,"xn--rhqv96g":1,"xn--rovu88b":1,"xn--ses554g":1,"xn--t60b56a":1,"xn--tckwe":1,"xn--tiq49xqyj":1,"xn--unup4y":1,"xn--vermgensberater-ctb":1,"xn--vermgensberatung-pwb":1,"xn--vhquv":1,"xn--vuq861b":1,"xn--w4r85el8fhu5dnra":1,"xn--w4rs40l":1,"xn--xhq521b":1,"xn--zfr164b":1,"xyz":1,"yachts":1,"yahoo":1,"yamaxun":1,"yandex":1,"yodobashi":1,"yoga":1,"yokohama":1,"you":1,"youtube":1,"yun":1,"zappos":1,"zara":1,"zero":1,"zip":1,"zone":1,"zuerich":1},"private":{"cc.ua":2,"inf.ua":2,"ltd.ua":2,"611.to":2,"graphox.us":2,"devcdnaccesso.com":3,"adobeaemcloud.com":2,"dev.adobeaemcloud.com":4,"hlx.live":2,"adobeaemcloud.net":2,"hlx.page":2,"hlx3.page":2,"beep.pl":2,"airkitapps.com":2,"airkitapps-au.com":2,"airkitapps.eu":2,"aivencloud.com":2,"barsy.ca":2,"compute.estate":3,"alces.network":3,"kasserver.com":2,"altervista.org":2,"alwaysdata.net":2,"cloudfront.net":2,"compute.amazonaws.com":4,"compute-1.amazonaws.com":4,"compute.amazonaws.com.cn":5,"us-east-1.amazonaws.com":3,"cn-north-1.eb.amazonaws.com.cn":5,"cn-northwest-1.eb.amazonaws.com.cn":5,"elasticbeanstalk.com":2,"ap-northeast-1.elasticbeanstalk.com":3,"ap-northeast-2.elasticbeanstalk.com":3,"ap-northeast-3.elasticbeanstalk.com":3,"ap-south-1.elasticbeanstalk.com":3,"ap-southeast-1.elasticbeanstalk.com":3,"ap-southeast-2.elasticbeanstalk.com":3,"ca-central-1.elasticbeanstalk.com":3,"eu-central-1.elasticbeanstalk.com":3,"eu-west-1.elasticbeanstalk.com":3,"eu-west-2.elasticbeanstalk.com":3,"eu-west-3.elasticbeanstalk.com":3,"sa-east-1.elasticbeanstalk.com":3,"us-east-1.elasticbeanstalk.com":3,"us-east-2.elasticbeanstalk.com":3,"us-gov-west-1.elasticbeanstalk.com":3,"us-west-1.elasticbeanstalk.com":3,"us-west-2.elasticbeanstalk.com":3,"elb.amazonaws.com":4,"elb.amazonaws.com.cn":5,"awsglobalaccelerator.com":2,"s3.amazonaws.com":3,"s3-ap-northeast-1.amazonaws.com":3,"s3-ap-northeast-2.amazonaws.com":3,"s3-ap-south-1.amazonaws.com":3,"s3-ap-southeast-1.amazonaws.com":3,"s3-ap-southeast-2.amazonaws.com":3,"s3-ca-central-1.amazonaws.com":3,"s3-eu-central-1.amazonaws.com":3,"s3-eu-west-1.amazonaws.com":3,"s3-eu-west-2.amazonaws.com":3,"s3-eu-west-3.amazonaws.com":3,"s3-external-1.amazonaws.com":3,"s3-fips-us-gov-west-1.amazonaws.com":3,"s3-sa-east-1.amazonaws.com":3,"s3-us-gov-west-1.amazonaws.com":3,"s3-us-east-2.amazonaws.com":3,"s3-us-west-1.amazonaws.com":3,"s3-us-west-2.amazonaws.com":3,"s3.ap-northeast-2.amazonaws.com":4,"s3.ap-south-1.amazonaws.com":4,"s3.cn-north-1.amazonaws.com.cn":5,"s3.ca-central-1.amazonaws.com":4,"s3.eu-central-1.amazonaws.com":4,"s3.eu-west-2.amazonaws.com":4,"s3.eu-west-3.amazonaws.com":4,"s3.us-east-2.amazonaws.com":4,"s3.dualstack.ap-northeast-1.amazonaws.com":5,"s3.dualstack.ap-northeast-2.amazonaws.com":5,"s3.dualstack.ap-south-1.amazonaws.com":5,"s3.dualstack.ap-southeast-1.amazonaws.com":5,"s3.dualstack.ap-southeast-2.amazonaws.com":5,"s3.dualstack.ca-central-1.amazonaws.com":5,"s3.dualstack.eu-central-1.amazonaws.com":5,"s3.dualstack.eu-west-1.amazonaws.com":5,"s3.dualstack.eu-west-2.amazonaws.com":5,"s3.dualstack.eu-west-3.amazonaws.com":5,"s3.dualstack.sa-east-1.amazonaws.com":5,"s3.dualstack.us-east-1.amazonaws.com":5,"s3.dualstack.us-east-2.amazonaws.com":5,"s3-website-us-east-1.amazonaws.com":3,"s3-website-us-west-1.amazonaws.com":3,"s3-website-us-west-2.amazonaws.com":3,"s3-website-ap-northeast-1.amazonaws.com":3,"s3-website-ap-southeast-1.amazonaws.com":3,"s3-website-ap-southeast-2.amazonaws.com":3,"s3-website-eu-west-1.amazonaws.com":3,"s3-website-sa-east-1.amazonaws.com":3,"s3-website.ap-northeast-2.amazonaws.com":4,"s3-website.ap-south-1.amazonaws.com":4,"s3-website.ca-central-1.amazonaws.com":4,"s3-website.eu-central-1.amazonaws.com":4,"s3-website.eu-west-2.amazonaws.com":4,"s3-website.eu-west-3.amazonaws.com":4,"s3-website.us-east-2.amazonaws.com":4,"t3l3p0rt.net":2,"tele.amune.org":3,"apigee.io":2,"siiites.com":2,"appspacehosted.com":2,"appspaceusercontent.com":2,"appudo.net":2,"on-aptible.com":2,"user.aseinet.ne.jp":4,"gv.vc":2,"d.gv.vc":3,"user.party.eus":3,"pimienta.org":2,"poivron.org":2,"potager.org":2,"sweetpepper.org":2,"myasustor.com":2,"cdn.prod.atlassian-dev.net":4,"translated.page":2,"myfritz.net":2,"onavstack.net":2,"awdev.ca":3,"advisor.ws":3,"ecommerce-shop.pl":2,"b-data.io":2,"backplaneapp.io":2,"balena-devices.com":2,"rs.ba":2,"banzai.cloud":3,"app.banzaicloud.io":3,"backyards.banzaicloud.io":4,"base.ec":2,"official.ec":2,"buyshop.jp":2,"fashionstore.jp":2,"handcrafted.jp":2,"kawaiishop.jp":2,"supersale.jp":2,"theshop.jp":2,"shopselect.net":2,"base.shop":2,"beget.app":3,"betainabox.com":2,"bnr.la":2,"bitbucket.io":2,"blackbaudcdn.net":2,"of.je":2,"bluebite.io":2,"boomla.net":2,"boutir.com":2,"boxfuse.io":2,"square7.ch":2,"bplaced.com":2,"bplaced.de":2,"square7.de":2,"bplaced.net":2,"square7.net":2,"shop.brendly.rs":3,"browsersafetymark.io":2,"uk0.bigv.io":3,"dh.bytemark.co.uk":4,"vm.bytemark.co.uk":4,"cafjs.com":2,"mycd.eu":2,"drr.ac":2,"uwu.ai":2,"carrd.co":2,"crd.co":2,"ju.mp":2,"ae.org":2,"br.com":2,"cn.com":2,"com.de":2,"com.se":2,"de.com":2,"eu.com":2,"gb.net":2,"hu.net":2,"jp.net":2,"jpn.com":2,"mex.com":2,"ru.com":2,"sa.com":2,"se.net":2,"uk.com":2,"uk.net":2,"us.com":2,"za.bz":2,"za.com":2,"ar.com":2,"hu.com":2,"kr.com":2,"no.com":2,"qc.com":2,"uy.com":2,"africa.com":2,"gr.com":2,"in.net":2,"web.in":2,"us.org":2,"co.com":2,"aus.basketball":2,"nz.basketball":2,"radio.am":2,"radio.fm":2,"c.la":2,"certmgr.org":2,"cx.ua":2,"discourse.group":2,"discourse.team":2,"cleverapps.io":2,"clerk.app":2,"clerkstage.app":2,"lcl.dev":3,"lclstage.dev":3,"stg.dev":3,"stgstage.dev":3,"clickrising.net":2,"c66.me":2,"cloud66.ws":2,"cloud66.zone":2,"jdevcloud.com":2,"wpdevcloud.com":2,"cloudaccess.host":2,"freesite.host":2,"cloudaccess.net":2,"cloudcontrolled.com":2,"cloudcontrolapp.com":2,"cloudera.site":3,"pages.dev":2,"trycloudflare.com":2,"workers.dev":2,"wnext.app":2,"co.ca":2,"otap.co":3,"co.cz":2,"c.cdn77.org":3,"cdn77-ssl.net":2,"r.cdn77.net":3,"rsc.cdn77.org":3,"ssl.origin.cdn77-secure.org":4,"cloudns.asia":2,"cloudns.biz":2,"cloudns.club":2,"cloudns.cc":2,"cloudns.eu":2,"cloudns.in":2,"cloudns.info":2,"cloudns.org":2,"cloudns.pro":2,"cloudns.pw":2,"cloudns.us":2,"cnpy.gdn":2,"codeberg.page":2,"co.nl":2,"co.no":2,"webhosting.be":2,"hosting-cluster.nl":2,"ac.ru":2,"edu.ru":2,"gov.ru":2,"int.ru":2,"mil.ru":2,"test.ru":2,"dyn.cosidns.de":3,"dynamisches-dns.de":2,"dnsupdater.de":2,"internet-dns.de":2,"l-o-g-i-n.de":2,"dynamic-dns.info":2,"feste-ip.net":2,"knx-server.net":2,"static-access.net":2,"realm.cz":2,"cryptonomic.net":3,"cupcake.is":2,"curv.dev":2,"customer-oci.com":3,"oci.customer-oci.com":4,"ocp.customer-oci.com":4,"ocs.customer-oci.com":4,"cyon.link":2,"cyon.site":2,"fnwk.site":2,"folionetwork.site":2,"platform0.app":2,"daplie.me":2,"localhost.daplie.me":3,"dattolocal.com":2,"dattorelay.com":2,"dattoweb.com":2,"mydatto.com":2,"dattolocal.net":2,"mydatto.net":2,"biz.dk":2,"co.dk":2,"firm.dk":2,"reg.dk":2,"store.dk":2,"dyndns.dappnode.io":3,"dapps.earth":3,"bzz.dapps.earth":4,"builtwithdark.com":2,"demo.datadetect.com":3,"instance.datadetect.com":3,"edgestack.me":2,"ddns5.com":2,"debian.net":2,"deno.dev":2,"deno-staging.dev":2,"dedyn.io":2,"deta.app":2,"deta.dev":2,"rss.my.id":4,"diher.solutions":3,"discordsays.com":2,"discordsez.com":2,"jozi.biz":2,"dnshome.de":2,"online.th":2,"shop.th":2,"drayddns.com":2,"shoparena.pl":2,"dreamhosters.com":2,"mydrobo.com":2,"drud.io":2,"drud.us":2,"duckdns.org":2,"bip.sh":2,"bitbridge.net":2,"dy.fi":2,"tunk.org":2,"dyndns-at-home.com":2,"dyndns-at-work.com":2,"dyndns-blog.com":2,"dyndns-free.com":2,"dyndns-home.com":2,"dyndns-ip.com":2,"dyndns-mail.com":2,"dyndns-office.com":2,"dyndns-pics.com":2,"dyndns-remote.com":2,"dyndns-server.com":2,"dyndns-web.com":2,"dyndns-wiki.com":2,"dyndns-work.com":2,"dyndns.biz":2,"dyndns.info":2,"dyndns.org":2,"dyndns.tv":2,"at-band-camp.net":2,"ath.cx":2,"barrel-of-knowledge.info":2,"barrell-of-knowledge.info":2,"better-than.tv":2,"blogdns.com":2,"blogdns.net":2,"blogdns.org":2,"blogsite.org":2,"boldlygoingnowhere.org":2,"broke-it.net":2,"buyshouses.net":2,"cechire.com":2,"dnsalias.com":2,"dnsalias.net":2,"dnsalias.org":2,"dnsdojo.com":2,"dnsdojo.net":2,"dnsdojo.org":2,"does-it.net":2,"doesntexist.com":2,"doesntexist.org":2,"dontexist.com":2,"dontexist.net":2,"dontexist.org":2,"doomdns.com":2,"doomdns.org":2,"dvrdns.org":2,"dyn-o-saur.com":2,"dynalias.com":2,"dynalias.net":2,"dynalias.org":2,"dynathome.net":2,"dyndns.ws":2,"endofinternet.net":2,"endofinternet.org":2,"endoftheinternet.org":2,"est-a-la-maison.com":2,"est-a-la-masion.com":2,"est-le-patron.com":2,"est-mon-blogueur.com":2,"for-better.biz":2,"for-more.biz":2,"for-our.info":2,"for-some.biz":2,"for-the.biz":2,"forgot.her.name":3,"forgot.his.name":3,"from-ak.com":2,"from-al.com":2,"from-ar.com":2,"from-az.net":2,"from-ca.com":2,"from-co.net":2,"from-ct.com":2,"from-dc.com":2,"from-de.com":2,"from-fl.com":2,"from-ga.com":2,"from-hi.com":2,"from-ia.com":2,"from-id.com":2,"from-il.com":2,"from-in.com":2,"from-ks.com":2,"from-ky.com":2,"from-la.net":2,"from-ma.com":2,"from-md.com":2,"from-me.org":2,"from-mi.com":2,"from-mn.com":2,"from-mo.com":2,"from-ms.com":2,"from-mt.com":2,"from-nc.com":2,"from-nd.com":2,"from-ne.com":2,"from-nh.com":2,"from-nj.com":2,"from-nm.com":2,"from-nv.com":2,"from-ny.net":2,"from-oh.com":2,"from-ok.com":2,"from-or.com":2,"from-pa.com":2,"from-pr.com":2,"from-ri.com":2,"from-sc.com":2,"from-sd.com":2,"from-tn.com":2,"from-tx.com":2,"from-ut.com":2,"from-va.com":2,"from-vt.com":2,"from-wa.com":2,"from-wi.com":2,"from-wv.com":2,"from-wy.com":2,"ftpaccess.cc":2,"fuettertdasnetz.de":2,"game-host.org":2,"game-server.cc":2,"getmyip.com":2,"gets-it.net":2,"go.dyndns.org":3,"gotdns.com":2,"gotdns.org":2,"groks-the.info":2,"groks-this.info":2,"ham-radio-op.net":2,"here-for-more.info":2,"hobby-site.com":2,"hobby-site.org":2,"home.dyndns.org":3,"homedns.org":2,"homeftp.net":2,"homeftp.org":2,"homeip.net":2,"homelinux.com":2,"homelinux.net":2,"homelinux.org":2,"homeunix.com":2,"homeunix.net":2,"homeunix.org":2,"iamallama.com":2,"in-the-band.net":2,"is-a-anarchist.com":2,"is-a-blogger.com":2,"is-a-bookkeeper.com":2,"is-a-bruinsfan.org":2,"is-a-bulls-fan.com":2,"is-a-candidate.org":2,"is-a-caterer.com":2,"is-a-celticsfan.org":2,"is-a-chef.com":2,"is-a-chef.net":2,"is-a-chef.org":2,"is-a-conservative.com":2,"is-a-cpa.com":2,"is-a-cubicle-slave.com":2,"is-a-democrat.com":2,"is-a-designer.com":2,"is-a-doctor.com":2,"is-a-financialadvisor.com":2,"is-a-geek.com":2,"is-a-geek.net":2,"is-a-geek.org":2,"is-a-green.com":2,"is-a-guru.com":2,"is-a-hard-worker.com":2,"is-a-hunter.com":2,"is-a-knight.org":2,"is-a-landscaper.com":2,"is-a-lawyer.com":2,"is-a-liberal.com":2,"is-a-libertarian.com":2,"is-a-linux-user.org":2,"is-a-llama.com":2,"is-a-musician.com":2,"is-a-nascarfan.com":2,"is-a-nurse.com":2,"is-a-painter.com":2,"is-a-patsfan.org":2,"is-a-personaltrainer.com":2,"is-a-photographer.com":2,"is-a-player.com":2,"is-a-republican.com":2,"is-a-rockstar.com":2,"is-a-socialist.com":2,"is-a-soxfan.org":2,"is-a-student.com":2,"is-a-teacher.com":2,"is-a-techie.com":2,"is-a-therapist.com":2,"is-an-accountant.com":2,"is-an-actor.com":2,"is-an-actress.com":2,"is-an-anarchist.com":2,"is-an-artist.com":2,"is-an-engineer.com":2,"is-an-entertainer.com":2,"is-by.us":2,"is-certified.com":2,"is-found.org":2,"is-gone.com":2,"is-into-anime.com":2,"is-into-cars.com":2,"is-into-cartoons.com":2,"is-into-games.com":2,"is-leet.com":2,"is-lost.org":2,"is-not-certified.com":2,"is-saved.org":2,"is-slick.com":2,"is-uberleet.com":2,"is-very-bad.org":2,"is-very-evil.org":2,"is-very-good.org":2,"is-very-nice.org":2,"is-very-sweet.org":2,"is-with-theband.com":2,"isa-geek.com":2,"isa-geek.net":2,"isa-geek.org":2,"isa-hockeynut.com":2,"issmarterthanyou.com":2,"isteingeek.de":2,"istmein.de":2,"kicks-ass.net":2,"kicks-ass.org":2,"knowsitall.info":2,"land-4-sale.us":2,"lebtimnetz.de":2,"leitungsen.de":2,"likes-pie.com":2,"likescandy.com":2,"merseine.nu":2,"mine.nu":2,"misconfused.org":2,"mypets.ws":2,"myphotos.cc":2,"neat-url.com":2,"office-on-the.net":2,"on-the-web.tv":2,"podzone.net":2,"podzone.org":2,"readmyblog.org":2,"saves-the-whales.com":2,"scrapper-site.net":2,"scrapping.cc":2,"selfip.biz":2,"selfip.com":2,"selfip.info":2,"selfip.net":2,"selfip.org":2,"sells-for-less.com":2,"sells-for-u.com":2,"sells-it.net":2,"sellsyourhome.org":2,"servebbs.com":2,"servebbs.net":2,"servebbs.org":2,"serveftp.net":2,"serveftp.org":2,"servegame.org":2,"shacknet.nu":2,"simple-url.com":2,"space-to-rent.com":2,"stuff-4-sale.org":2,"stuff-4-sale.us":2,"teaches-yoga.com":2,"thruhere.net":2,"traeumtgerade.de":2,"webhop.biz":2,"webhop.info":2,"webhop.net":2,"webhop.org":2,"worse-than.tv":2,"writesthisblog.com":2,"ddnss.de":2,"dyn.ddnss.de":3,"dyndns.ddnss.de":3,"dyndns1.de":2,"dyn-ip24.de":2,"home-webserver.de":2,"dyn.home-webserver.de":3,"myhome-server.de":2,"ddnss.org":2,"definima.net":2,"definima.io":2,"ondigitalocean.app":2,"digitaloceanspaces.com":3,"bci.dnstrace.pro":3,"ddnsfree.com":2,"ddnsgeek.com":2,"giize.com":2,"gleeze.com":2,"kozow.com":2,"loseyourip.com":2,"ooguy.com":2,"theworkpc.com":2,"casacam.net":2,"dynu.net":2,"accesscam.org":2,"camdvr.org":2,"freeddns.org":2,"mywire.org":2,"webredirect.org":2,"myddns.rocks":2,"blogsite.xyz":2,"dynv6.net":2,"e4.cz":2,"eero.online":2,"eero-stage.online":2,"elementor.cloud":2,"elementor.cool":2,"en-root.fr":2,"mytuleap.com":2,"tuleap-partners.com":2,"encr.app":2,"encoreapi.com":2,"onred.one":2,"staging.onred.one":3,"eu.encoway.cloud":3,"eu.org":2,"al.eu.org":3,"asso.eu.org":3,"at.eu.org":3,"au.eu.org":3,"be.eu.org":3,"bg.eu.org":3,"ca.eu.org":3,"cd.eu.org":3,"ch.eu.org":3,"cn.eu.org":3,"cy.eu.org":3,"cz.eu.org":3,"de.eu.org":3,"dk.eu.org":3,"edu.eu.org":3,"ee.eu.org":3,"es.eu.org":3,"fi.eu.org":3,"fr.eu.org":3,"gr.eu.org":3,"hr.eu.org":3,"hu.eu.org":3,"ie.eu.org":3,"il.eu.org":3,"in.eu.org":3,"int.eu.org":3,"is.eu.org":3,"it.eu.org":3,"jp.eu.org":3,"kr.eu.org":3,"lt.eu.org":3,"lu.eu.org":3,"lv.eu.org":3,"mc.eu.org":3,"me.eu.org":3,"mk.eu.org":3,"mt.eu.org":3,"my.eu.org":3,"net.eu.org":3,"ng.eu.org":3,"nl.eu.org":3,"no.eu.org":3,"nz.eu.org":3,"paris.eu.org":3,"pl.eu.org":3,"pt.eu.org":3,"q-a.eu.org":3,"ro.eu.org":3,"ru.eu.org":3,"se.eu.org":3,"si.eu.org":3,"sk.eu.org":3,"tr.eu.org":3,"uk.eu.org":3,"us.eu.org":3,"eurodir.ru":2,"eu-1.evennode.com":3,"eu-2.evennode.com":3,"eu-3.evennode.com":3,"eu-4.evennode.com":3,"us-1.evennode.com":3,"us-2.evennode.com":3,"us-3.evennode.com":3,"us-4.evennode.com":3,"twmail.cc":2,"twmail.net":2,"twmail.org":2,"mymailer.com.tw":3,"url.tw":2,"onfabrica.com":2,"apps.fbsbx.com":3,"ru.net":2,"adygeya.ru":2,"bashkiria.ru":2,"bir.ru":2,"cbg.ru":2,"com.ru":2,"dagestan.ru":2,"grozny.ru":2,"kalmykia.ru":2,"kustanai.ru":2,"marine.ru":2,"mordovia.ru":2,"msk.ru":2,"mytis.ru":2,"nalchik.ru":2,"nov.ru":2,"pyatigorsk.ru":2,"spb.ru":2,"vladikavkaz.ru":2,"vladimir.ru":2,"abkhazia.su":2,"adygeya.su":2,"aktyubinsk.su":2,"arkhangelsk.su":2,"armenia.su":2,"ashgabad.su":2,"azerbaijan.su":2,"balashov.su":2,"bashkiria.su":2,"bryansk.su":2,"bukhara.su":2,"chimkent.su":2,"dagestan.su":2,"east-kazakhstan.su":2,"exnet.su":2,"georgia.su":2,"grozny.su":2,"ivanovo.su":2,"jambyl.su":2,"kalmykia.su":2,"kaluga.su":2,"karacol.su":2,"karaganda.su":2,"karelia.su":2,"khakassia.su":2,"krasnodar.su":2,"kurgan.su":2,"kustanai.su":2,"lenug.su":2,"mangyshlak.su":2,"mordovia.su":2,"msk.su":2,"murmansk.su":2,"nalchik.su":2,"navoi.su":2,"north-kazakhstan.su":2,"nov.su":2,"obninsk.su":2,"penza.su":2,"pokrovsk.su":2,"sochi.su":2,"spb.su":2,"tashkent.su":2,"termez.su":2,"togliatti.su":2,"troitsk.su":2,"tselinograd.su":2,"tula.su":2,"tuva.su":2,"vladikavkaz.su":2,"vladimir.su":2,"vologda.su":2,"channelsdvr.net":2,"u.channelsdvr.net":3,"edgecompute.app":2,"fastly-terrarium.com":2,"fastlylb.net":2,"map.fastlylb.net":3,"freetls.fastly.net":3,"map.fastly.net":3,"a.prod.fastly.net":4,"global.prod.fastly.net":4,"a.ssl.fastly.net":4,"b.ssl.fastly.net":4,"global.ssl.fastly.net":4,"fastvps-server.com":2,"fastvps.host":2,"myfast.host":2,"fastvps.site":2,"myfast.space":2,"fedorainfracloud.org":2,"fedorapeople.org":2,"cloud.fedoraproject.org":3,"app.os.fedoraproject.org":4,"app.os.stg.fedoraproject.org":5,"conn.uk":2,"copro.uk":2,"hosp.uk":2,"mydobiss.com":2,"fh-muenster.io":2,"filegear.me":2,"filegear-au.me":2,"filegear-de.me":2,"filegear-gb.me":2,"filegear-ie.me":2,"filegear-jp.me":2,"filegear-sg.me":2,"firebaseapp.com":2,"fireweb.app":2,"flap.id":2,"onflashdrive.app":2,"fldrv.com":2,"fly.dev":2,"edgeapp.net":2,"shw.io":2,"flynnhosting.net":2,"forgeblocks.com":2,"id.forgerock.io":3,"framer.app":2,"framercanvas.com":2,"frusky.de":3,"ravpage.co.il":3,"0e.vc":2,"freebox-os.com":2,"freeboxos.com":2,"fbx-os.fr":2,"fbxos.fr":2,"freebox-os.fr":2,"freeboxos.fr":2,"freedesktop.org":2,"freemyip.com":2,"wien.funkfeuer.at":3,"futurecms.at":3,"ex.futurecms.at":4,"in.futurecms.at":4,"futurehosting.at":2,"futuremailing.at":2,"ex.ortsinfo.at":4,"kunden.ortsinfo.at":4,"statics.cloud":3,"independent-commission.uk":2,"independent-inquest.uk":2,"independent-inquiry.uk":2,"independent-panel.uk":2,"independent-review.uk":2,"public-inquiry.uk":2,"royal-commission.uk":2,"campaign.gov.uk":3,"service.gov.uk":3,"api.gov.uk":3,"gehirn.ne.jp":3,"usercontent.jp":2,"gentapps.com":2,"gentlentapis.com":2,"lab.ms":2,"cdn-edges.net":2,"ghost.io":2,"gsj.bz":2,"githubusercontent.com":2,"githubpreview.dev":2,"github.io":2,"gitlab.io":2,"gitapp.si":2,"gitpage.si":2,"glitch.me":2,"nog.community":2,"co.ro":2,"shop.ro":2,"lolipop.io":2,"angry.jp":2,"babyblue.jp":2,"babymilk.jp":2,"backdrop.jp":2,"bambina.jp":2,"bitter.jp":2,"blush.jp":2,"boo.jp":2,"boy.jp":2,"boyfriend.jp":2,"but.jp":2,"candypop.jp":2,"capoo.jp":2,"catfood.jp":2,"cheap.jp":2,"chicappa.jp":2,"chillout.jp":2,"chips.jp":2,"chowder.jp":2,"chu.jp":2,"ciao.jp":2,"cocotte.jp":2,"coolblog.jp":2,"cranky.jp":2,"cutegirl.jp":2,"daa.jp":2,"deca.jp":2,"deci.jp":2,"digick.jp":2,"egoism.jp":2,"fakefur.jp":2,"fem.jp":2,"flier.jp":2,"floppy.jp":2,"fool.jp":2,"frenchkiss.jp":2,"girlfriend.jp":2,"girly.jp":2,"gloomy.jp":2,"gonna.jp":2,"greater.jp":2,"hacca.jp":2,"heavy.jp":2,"her.jp":2,"hiho.jp":2,"hippy.jp":2,"holy.jp":2,"hungry.jp":2,"icurus.jp":2,"itigo.jp":2,"jellybean.jp":2,"kikirara.jp":2,"kill.jp":2,"kilo.jp":2,"kuron.jp":2,"littlestar.jp":2,"lolitapunk.jp":2,"lomo.jp":2,"lovepop.jp":2,"lovesick.jp":2,"main.jp":2,"mods.jp":2,"mond.jp":2,"mongolian.jp":2,"moo.jp":2,"namaste.jp":2,"nikita.jp":2,"nobushi.jp":2,"noor.jp":2,"oops.jp":2,"parallel.jp":2,"parasite.jp":2,"pecori.jp":2,"peewee.jp":2,"penne.jp":2,"pepper.jp":2,"perma.jp":2,"pigboat.jp":2,"pinoko.jp":2,"punyu.jp":2,"pupu.jp":2,"pussycat.jp":2,"pya.jp":2,"raindrop.jp":2,"readymade.jp":2,"sadist.jp":2,"schoolbus.jp":2,"secret.jp":2,"staba.jp":2,"stripper.jp":2,"sub.jp":2,"sunnyday.jp":2,"thick.jp":2,"tonkotsu.jp":2,"under.jp":2,"upper.jp":2,"velvet.jp":2,"verse.jp":2,"versus.jp":2,"vivian.jp":2,"watson.jp":2,"weblike.jp":2,"whitesnow.jp":2,"zombie.jp":2,"heteml.net":2,"cloudapps.digital":2,"london.cloudapps.digital":3,"pymnt.uk":2,"homeoffice.gov.uk":3,"ro.im":2,"goip.de":2,"run.app":2,"a.run.app":3,"web.app":2,"0emm.com":3,"appspot.com":2,"r.appspot.com":4,"codespot.com":2,"googleapis.com":2,"googlecode.com":2,"pagespeedmobilizer.com":2,"publishproxy.com":2,"withgoogle.com":2,"withyoutube.com":2,"gateway.dev":3,"cloud.goog":2,"translate.goog":2,"usercontent.goog":3,"cloudfunctions.net":2,"blogspot.ae":2,"blogspot.al":2,"blogspot.am":2,"blogspot.ba":2,"blogspot.be":2,"blogspot.bg":2,"blogspot.bj":2,"blogspot.ca":2,"blogspot.cf":2,"blogspot.ch":2,"blogspot.cl":2,"blogspot.co.at":3,"blogspot.co.id":3,"blogspot.co.il":3,"blogspot.co.ke":3,"blogspot.co.nz":3,"blogspot.co.uk":3,"blogspot.co.za":3,"blogspot.com":2,"blogspot.com.ar":3,"blogspot.com.au":3,"blogspot.com.br":3,"blogspot.com.by":3,"blogspot.com.co":3,"blogspot.com.cy":3,"blogspot.com.ee":3,"blogspot.com.eg":3,"blogspot.com.es":3,"blogspot.com.mt":3,"blogspot.com.ng":3,"blogspot.com.tr":3,"blogspot.com.uy":3,"blogspot.cv":2,"blogspot.cz":2,"blogspot.de":2,"blogspot.dk":2,"blogspot.fi":2,"blogspot.fr":2,"blogspot.gr":2,"blogspot.hk":2,"blogspot.hr":2,"blogspot.hu":2,"blogspot.ie":2,"blogspot.in":2,"blogspot.is":2,"blogspot.it":2,"blogspot.jp":2,"blogspot.kr":2,"blogspot.li":2,"blogspot.lt":2,"blogspot.lu":2,"blogspot.md":2,"blogspot.mk":2,"blogspot.mr":2,"blogspot.mx":2,"blogspot.my":2,"blogspot.nl":2,"blogspot.no":2,"blogspot.pe":2,"blogspot.pt":2,"blogspot.qa":2,"blogspot.re":2,"blogspot.ro":2,"blogspot.rs":2,"blogspot.ru":2,"blogspot.se":2,"blogspot.sg":2,"blogspot.si":2,"blogspot.sk":2,"blogspot.sn":2,"blogspot.td":2,"blogspot.tw":2,"blogspot.ug":2,"blogspot.vn":2,"goupile.fr":2,"gov.nl":2,"awsmppl.com":2,"xn--gnstigbestellen-zvb.de":2,"xn--gnstigliefern-wob.de":2,"fin.ci":2,"free.hr":2,"caa.li":2,"ua.rs":2,"conf.se":2,"hs.zone":2,"hs.run":2,"hashbang.sh":2,"hasura.app":2,"hasura-app.io":2,"pages.it.hs-heilbronn.de":4,"hepforge.org":2,"herokuapp.com":2,"herokussl.com":2,"ravendb.cloud":2,"myravendb.com":2,"ravendb.community":2,"ravendb.me":2,"development.run":2,"ravendb.run":2,"homesklep.pl":2,"secaas.hk":2,"hoplix.shop":2,"orx.biz":2,"biz.gl":2,"col.ng":2,"firm.ng":2,"gen.ng":2,"ltd.ng":2,"ngo.ng":2,"edu.scot":2,"sch.so":2,"hostyhosting.io":2,"xn--hkkinen-5wa.fi":2,"moonscale.io":3,"moonscale.net":2,"iki.fi":2,"impertrixcdn.com":2,"impertrix.com":2,"smushcdn.com":2,"wphostedmail.com":2,"wpmucdn.com":2,"tempurl.host":2,"wpmudev.host":2,"dyn-berlin.de":2,"in-berlin.de":2,"in-brb.de":2,"in-butter.de":2,"in-dsl.de":2,"in-dsl.net":2,"in-dsl.org":2,"in-vpn.de":2,"in-vpn.net":2,"in-vpn.org":2,"biz.at":2,"info.at":2,"info.cx":2,"ac.leg.br":3,"al.leg.br":3,"am.leg.br":3,"ap.leg.br":3,"ba.leg.br":3,"ce.leg.br":3,"df.leg.br":3,"es.leg.br":3,"go.leg.br":3,"ma.leg.br":3,"mg.leg.br":3,"ms.leg.br":3,"mt.leg.br":3,"pa.leg.br":3,"pb.leg.br":3,"pe.leg.br":3,"pi.leg.br":3,"pr.leg.br":3,"rj.leg.br":3,"rn.leg.br":3,"ro.leg.br":3,"rr.leg.br":3,"rs.leg.br":3,"sc.leg.br":3,"se.leg.br":3,"sp.leg.br":3,"to.leg.br":3,"pixolino.com":2,"na4u.ru":2,"iopsys.se":2,"ipifony.net":2,"mein-iserv.de":2,"schulserver.de":2,"test-iserv.de":2,"iserv.dev":2,"iobb.net":2,"mel.cloudlets.com.au":4,"cloud.interhostsolutions.be":3,"users.scale.virtualcloud.com.br":5,"mycloud.by":2,"alp1.ae.flow.ch":4,"appengine.flow.ch":3,"es-1.axarnet.cloud":3,"diadem.cloud":2,"vip.jelastic.cloud":3,"jele.cloud":2,"it1.eur.aruba.jenv-aruba.cloud":5,"it1.jenv-aruba.cloud":3,"keliweb.cloud":2,"cs.keliweb.cloud":3,"oxa.cloud":2,"tn.oxa.cloud":3,"uk.oxa.cloud":3,"primetel.cloud":2,"uk.primetel.cloud":3,"ca.reclaim.cloud":3,"uk.reclaim.cloud":3,"us.reclaim.cloud":3,"ch.trendhosting.cloud":3,"de.trendhosting.cloud":3,"jele.club":2,"amscompute.com":2,"clicketcloud.com":2,"dopaas.com":2,"hidora.com":2,"paas.hosted-by-previder.com":3,"rag-cloud.hosteur.com":3,"rag-cloud-ch.hosteur.com":3,"jcloud.ik-server.com":3,"jcloud-ver-jpc.ik-server.com":3,"demo.jelastic.com":3,"kilatiron.com":2,"paas.massivegrid.com":3,"jed.wafaicloud.com":3,"lon.wafaicloud.com":3,"ryd.wafaicloud.com":3,"j.scaleforce.com.cy":4,"jelastic.dogado.eu":3,"fi.cloudplatform.fi":3,"demo.datacenter.fi":3,"paas.datacenter.fi":3,"jele.host":2,"mircloud.host":2,"paas.beebyte.io":3,"sekd1.beebyteapp.io":3,"jele.io":2,"cloud-fr1.unispace.io":3,"jc.neen.it":3,"cloud.jelastic.open.tim.it":5,"jcloud.kz":2,"upaas.kazteleport.kz":3,"cloudjiffy.net":2,"fra1-de.cloudjiffy.net":3,"west1-us.cloudjiffy.net":3,"jls-sto1.elastx.net":3,"jls-sto2.elastx.net":3,"jls-sto3.elastx.net":3,"faststacks.net":2,"fr-1.paas.massivegrid.net":4,"lon-1.paas.massivegrid.net":4,"lon-2.paas.massivegrid.net":4,"ny-1.paas.massivegrid.net":4,"ny-2.paas.massivegrid.net":4,"sg-1.paas.massivegrid.net":4,"jelastic.saveincloud.net":3,"nordeste-idc.saveincloud.net":3,"j.scaleforce.net":3,"jelastic.tsukaeru.net":3,"sdscloud.pl":2,"unicloud.pl":2,"mircloud.ru":2,"jelastic.regruhosting.ru":3,"enscaled.sg":2,"jele.site":2,"jelastic.team":2,"orangecloud.tn":2,"j.layershift.co.uk":4,"phx.enscaled.us":3,"mircloud.us":2,"myjino.ru":2,"hosting.myjino.ru":4,"landing.myjino.ru":4,"spectrum.myjino.ru":4,"vps.myjino.ru":4,"jotelulu.cloud":2,"triton.zone":3,"cns.joyent.com":4,"js.org":2,"kaas.gg":2,"khplay.nl":2,"ktistory.com":2,"kapsi.fi":2,"keymachine.de":2,"kinghost.net":2,"uni5.net":2,"knightpoint.systems":2,"koobin.events":2,"oya.to":2,"kuleuven.cloud":2,"ezproxy.kuleuven.be":3,"co.krd":2,"edu.krd":2,"krellian.net":2,"webthings.io":2,"git-repos.de":2,"lcube-server.de":2,"svn-repos.de":2,"leadpages.co":2,"lpages.co":2,"lpusercontent.com":2,"lelux.site":2,"co.business":2,"co.education":2,"co.events":2,"co.financial":2,"co.network":2,"co.place":2,"co.technology":2,"app.lmpm.com":3,"linkyard.cloud":2,"linkyard-cloud.ch":2,"members.linode.com":3,"nodebalancer.linode.com":4,"linodeobjects.com":3,"ip.linodeusercontent.com":3,"we.bs":2,"user.localcert.dev":4,"localzone.xyz":2,"loginline.app":2,"loginline.dev":2,"loginline.io":2,"loginline.services":2,"loginline.site":2,"servers.run":2,"lohmus.me":2,"krasnik.pl":2,"leczna.pl":2,"lubartow.pl":2,"lublin.pl":2,"poniatowa.pl":2,"swidnik.pl":2,"glug.org.uk":3,"lug.org.uk":3,"lugs.org.uk":3,"barsy.bg":2,"barsy.co.uk":3,"barsyonline.co.uk":3,"barsycenter.com":2,"barsyonline.com":2,"barsy.club":2,"barsy.de":2,"barsy.eu":2,"barsy.in":2,"barsy.info":2,"barsy.io":2,"barsy.me":2,"barsy.menu":2,"barsy.mobi":2,"barsy.net":2,"barsy.online":2,"barsy.org":2,"barsy.pro":2,"barsy.pub":2,"barsy.ro":2,"barsy.shop":2,"barsy.site":2,"barsy.support":2,"barsy.uk":2,"magentosite.cloud":3,"mayfirst.info":2,"mayfirst.org":2,"hb.cldmail.ru":3,"cn.vu":2,"mazeplay.com":2,"mcpe.me":2,"mcdir.me":2,"mcdir.ru":2,"mcpre.ru":2,"vps.mcdir.ru":3,"mediatech.by":2,"mediatech.dev":2,"hra.health":2,"miniserver.com":2,"memset.net":2,"cloud.metacentrum.cz":4,"custom.metacentrum.cz":3,"flt.cloud.muni.cz":4,"usr.cloud.muni.cz":4,"meteorapp.com":2,"eu.meteorapp.com":3,"co.pl":2,"azurecontainer.io":3,"azurewebsites.net":2,"azure-mobile.net":2,"cloudapp.net":2,"azurestaticapps.net":2,"1.azurestaticapps.net":3,"centralus.azurestaticapps.net":3,"eastasia.azurestaticapps.net":3,"eastus2.azurestaticapps.net":3,"westeurope.azurestaticapps.net":3,"westus2.azurestaticapps.net":3,"csx.cc":2,"mintere.site":2,"forte.id":2,"mozilla-iot.org":2,"bmoattachments.org":2,"net.ru":2,"org.ru":2,"pp.ru":2,"hostedpi.com":2,"customer.mythic-beasts.com":3,"caracal.mythic-beasts.com":3,"fentiger.mythic-beasts.com":3,"lynx.mythic-beasts.com":3,"ocelot.mythic-beasts.com":3,"oncilla.mythic-beasts.com":3,"onza.mythic-beasts.com":3,"sphinx.mythic-beasts.com":3,"vs.mythic-beasts.com":3,"x.mythic-beasts.com":3,"yali.mythic-beasts.com":3,"cust.retrosnub.co.uk":4,"ui.nabu.casa":3,"pony.club":2,"of.fashion":2,"in.london":2,"of.london":2,"from.marketing":2,"with.marketing":2,"for.men":2,"repair.men":2,"and.mom":2,"for.mom":2,"for.one":2,"under.one":2,"for.sale":2,"that.win":2,"from.work":2,"to.work":2,"cloud.nospamproxy.com":3,"netlify.app":2,"4u.com":2,"ngrok.io":2,"nh-serv.co.uk":3,"nfshost.com":2,"developer.app":3,"noop.app":2,"northflank.app":3,"build.run":3,"code.run":3,"database.run":3,"migration.run":3,"noticeable.news":2,"dnsking.ch":2,"mypi.co":2,"n4t.co":2,"001www.com":2,"ddnslive.com":2,"myiphost.com":2,"forumz.info":2,"16-b.it":2,"32-b.it":2,"64-b.it":2,"soundcast.me":2,"tcp4.me":2,"dnsup.net":2,"hicam.net":2,"now-dns.net":2,"ownip.net":2,"vpndns.net":2,"dynserv.org":2,"now-dns.org":2,"x443.pw":2,"now-dns.top":2,"ntdll.top":2,"freeddns.us":2,"crafting.xyz":2,"zapto.xyz":2,"nsupdate.info":2,"nerdpol.ovh":2,"blogsyte.com":2,"brasilia.me":2,"cable-modem.org":2,"ciscofreak.com":2,"collegefan.org":2,"couchpotatofries.org":2,"damnserver.com":2,"ddns.me":2,"ditchyourip.com":2,"dnsfor.me":2,"dnsiskinky.com":2,"dvrcam.info":2,"dynns.com":2,"eating-organic.net":2,"fantasyleague.cc":2,"geekgalaxy.com":2,"golffan.us":2,"health-carereform.com":2,"homesecuritymac.com":2,"homesecuritypc.com":2,"hopto.me":2,"ilovecollege.info":2,"loginto.me":2,"mlbfan.org":2,"mmafan.biz":2,"myactivedirectory.com":2,"mydissent.net":2,"myeffect.net":2,"mymediapc.net":2,"mypsx.net":2,"mysecuritycamera.com":2,"mysecuritycamera.net":2,"mysecuritycamera.org":2,"net-freaks.com":2,"nflfan.org":2,"nhlfan.net":2,"no-ip.ca":2,"no-ip.co.uk":3,"no-ip.net":2,"noip.us":2,"onthewifi.com":2,"pgafan.net":2,"point2this.com":2,"pointto.us":2,"privatizehealthinsurance.net":2,"quicksytes.com":2,"read-books.org":2,"securitytactics.com":2,"serveexchange.com":2,"servehumour.com":2,"servep2p.com":2,"servesarcasm.com":2,"stufftoread.com":2,"ufcfan.org":2,"unusualperson.com":2,"workisboring.com":2,"3utilities.com":2,"bounceme.net":2,"ddns.net":2,"ddnsking.com":2,"gotdns.ch":2,"hopto.org":2,"myftp.biz":2,"myftp.org":2,"myvnc.com":2,"no-ip.biz":2,"no-ip.info":2,"no-ip.org":2,"noip.me":2,"redirectme.net":2,"servebeer.com":2,"serveblog.net":2,"servecounterstrike.com":2,"serveftp.com":2,"servegame.com":2,"servehalflife.com":2,"servehttp.com":2,"serveirc.com":2,"serveminecraft.net":2,"servemp3.com":2,"servepics.com":2,"servequake.com":2,"sytes.net":2,"webhop.me":2,"zapto.org":2,"stage.nodeart.io":3,"pcloud.host":2,"nyc.mn":2,"static.observableusercontent.com":3,"cya.gg":2,"omg.lol":2,"cloudycluster.net":2,"omniwe.site":2,"service.one":2,"nid.io":2,"opensocial.site":2,"opencraft.hosting":2,"orsites.com":2,"operaunite.com":2,"tech.orange":2,"authgear-staging.com":2,"authgearapps.com":2,"skygearapp.com":2,"outsystemscloud.com":2,"webpaas.ovh.net":4,"hosting.ovh.net":4,"ownprovider.com":2,"own.pm":2,"owo.codes":3,"ox.rs":2,"oy.lc":2,"pgfog.com":2,"pagefrontapp.com":2,"pagexl.com":2,"paywhirl.com":3,"bar0.net":2,"bar1.net":2,"bar2.net":2,"rdv.to":2,"art.pl":2,"gliwice.pl":2,"krakow.pl":2,"poznan.pl":2,"wroc.pl":2,"zakopane.pl":2,"pantheonsite.io":2,"gotpantheon.com":2,"mypep.link":2,"perspecta.cloud":2,"lk3.ru":2,"on-web.fr":2,"bc.platform.sh":3,"ent.platform.sh":3,"eu.platform.sh":3,"us.platform.sh":3,"platformsh.site":3,"tst.site":3,"platter-app.com":2,"platter-app.dev":2,"platterp.us":2,"pdns.page":2,"plesk.page":2,"pleskns.com":2,"dyn53.io":2,"onporter.run":2,"co.bn":2,"postman-echo.com":2,"pstmn.io":2,"mock.pstmn.io":3,"httpbin.org":2,"prequalifyme.today":2,"xen.prgmr.com":3,"priv.at":2,"prvcy.page":2,"dweb.link":3,"protonet.io":2,"chirurgiens-dentistes-en-france.fr":2,"byen.site":2,"pubtls.org":2,"pythonanywhere.com":2,"eu.pythonanywhere.com":3,"qoto.io":2,"qualifioapp.com":2,"qbuser.com":2,"cloudsite.builders":2,"instances.spawn.cc":3,"instantcloud.cn":2,"ras.ru":2,"qa2.com":2,"qcx.io":2,"sys.qcx.io":4,"dev-myqnapcloud.com":2,"alpha-myqnapcloud.com":2,"myqnapcloud.com":2,"quipelements.com":3,"vapor.cloud":2,"vaporcloud.io":2,"rackmaze.com":2,"rackmaze.net":2,"g.vbrplsbx.io":3,"on-k3s.io":3,"on-rancher.cloud":3,"on-rio.io":3,"readthedocs.io":2,"rhcloud.com":2,"app.render.com":3,"onrender.com":2,"repl.co":2,"id.repl.co":3,"repl.run":2,"resindevice.io":2,"devices.resinstaging.io":3,"hzc.io":2,"wellbeingzone.eu":2,"wellbeingzone.co.uk":3,"adimo.co.uk":3,"itcouldbewor.se":2,"git-pages.rit.edu":3,"rocky.page":2,"xn--90amc.xn--p1acf":2,"xn--j1aef.xn--p1acf":2,"xn--j1ael8b.xn--p1acf":2,"xn--h1ahn.xn--p1acf":2,"xn--j1adp.xn--p1acf":2,"xn--c1avg.xn--p1acf":2,"xn--80aaa0cvac.xn--p1acf":2,"xn--h1aliz.xn--p1acf":2,"xn--90a1af.xn--p1acf":2,"xn--41a.xn--p1acf":2,"builder.code.com":3,"dev-builder.code.com":3,"stg-builder.code.com":3,"sandcats.io":2,"logoip.de":2,"logoip.com":2,"fr-par-1.baremetal.scw.cloud":4,"fr-par-2.baremetal.scw.cloud":4,"nl-ams-1.baremetal.scw.cloud":4,"fnc.fr-par.scw.cloud":4,"functions.fnc.fr-par.scw.cloud":5,"k8s.fr-par.scw.cloud":4,"nodes.k8s.fr-par.scw.cloud":5,"s3.fr-par.scw.cloud":4,"s3-website.fr-par.scw.cloud":4,"whm.fr-par.scw.cloud":4,"priv.instances.scw.cloud":4,"pub.instances.scw.cloud":4,"k8s.scw.cloud":3,"k8s.nl-ams.scw.cloud":4,"nodes.k8s.nl-ams.scw.cloud":5,"s3.nl-ams.scw.cloud":4,"s3-website.nl-ams.scw.cloud":4,"whm.nl-ams.scw.cloud":4,"k8s.pl-waw.scw.cloud":4,"nodes.k8s.pl-waw.scw.cloud":5,"s3.pl-waw.scw.cloud":4,"s3-website.pl-waw.scw.cloud":4,"scalebook.scw.cloud":3,"smartlabeling.scw.cloud":3,"dedibox.fr":2,"schokokeks.net":2,"gov.scot":2,"service.gov.scot":3,"scrysec.com":2,"firewall-gateway.com":2,"firewall-gateway.de":2,"my-gateway.de":2,"my-router.de":2,"spdns.de":2,"spdns.eu":2,"firewall-gateway.net":2,"my-firewall.org":2,"myfirewall.org":2,"spdns.org":2,"seidat.net":2,"sellfy.store":2,"senseering.net":2,"minisite.ms":2,"magnet.page":2,"biz.ua":2,"co.ua":2,"pp.ua":2,"shiftcrypto.dev":2,"shiftcrypto.io":2,"shiftedit.io":2,"myshopblocks.com":2,"myshopify.com":2,"shopitsite.com":2,"shopware.store":2,"mo-siemens.io":2,"1kapp.com":2,"appchizi.com":2,"applinzi.com":2,"sinaapp.com":2,"vipsinaapp.com":2,"siteleaf.net":2,"bounty-full.com":2,"alpha.bounty-full.com":3,"beta.bounty-full.com":3,"small-web.org":2,"vp4.me":2,"try-snowplow.com":2,"srht.site":2,"stackhero-network.com":2,"musician.io":2,"novecore.site":2,"static.land":2,"dev.static.land":3,"sites.static.land":3,"storebase.store":2,"vps-host.net":2,"atl.jelastic.vps-host.net":4,"njs.jelastic.vps-host.net":4,"ric.jelastic.vps-host.net":4,"playstation-cloud.com":2,"apps.lair.io":3,"stolos.io":3,"spacekit.io":2,"customer.speedpartner.de":3,"myspreadshop.at":2,"myspreadshop.com.au":3,"myspreadshop.be":2,"myspreadshop.ca":2,"myspreadshop.ch":2,"myspreadshop.com":2,"myspreadshop.de":2,"myspreadshop.dk":2,"myspreadshop.es":2,"myspreadshop.fi":2,"myspreadshop.fr":2,"myspreadshop.ie":2,"myspreadshop.it":2,"myspreadshop.net":2,"myspreadshop.nl":2,"myspreadshop.no":2,"myspreadshop.pl":2,"myspreadshop.se":2,"myspreadshop.co.uk":3,"api.stdlib.com":3,"storj.farm":2,"utwente.io":2,"soc.srcf.net":3,"user.srcf.net":3,"temp-dns.com":2,"supabase.co":2,"supabase.in":2,"supabase.net":2,"su.paba.se":3,"s5y.io":3,"sensiosite.cloud":3,"syncloud.it":2,"dscloud.biz":2,"direct.quickconnect.cn":3,"dsmynas.com":2,"familyds.com":2,"diskstation.me":2,"dscloud.me":2,"i234.me":2,"myds.me":2,"synology.me":2,"dscloud.mobi":2,"dsmynas.net":2,"familyds.net":2,"dsmynas.org":2,"familyds.org":2,"vpnplus.to":2,"direct.quickconnect.to":3,"tabitorder.co.il":3,"taifun-dns.de":2,"beta.tailscale.net":3,"ts.net":2,"gda.pl":2,"gdansk.pl":2,"gdynia.pl":2,"med.pl":2,"sopot.pl":2,"site.tb-hosting.com":3,"edugit.io":2,"s3.teckids.org":3,"telebit.app":2,"telebit.io":2,"telebit.xyz":3,"gwiddle.co.uk":3,"firenet.ch":3,"svc.firenet.ch":4,"reservd.com":2,"thingdustdata.com":2,"cust.dev.thingdust.io":4,"cust.disrec.thingdust.io":4,"cust.prod.thingdust.io":4,"cust.testing.thingdust.io":4,"reservd.dev.thingdust.io":4,"reservd.disrec.thingdust.io":4,"reservd.testing.thingdust.io":4,"tickets.io":2,"arvo.network":2,"azimuth.network":2,"tlon.network":2,"torproject.net":2,"pages.torproject.net":3,"bloxcms.com":2,"townnews-staging.com":2,"tbits.me":2,"12hp.at":2,"2ix.at":2,"4lima.at":2,"lima-city.at":2,"12hp.ch":2,"2ix.ch":2,"4lima.ch":2,"lima-city.ch":2,"trafficplex.cloud":2,"de.cool":2,"12hp.de":2,"2ix.de":2,"4lima.de":2,"lima-city.de":2,"1337.pictures":2,"clan.rip":2,"lima-city.rocks":2,"webspace.rocks":2,"lima.zone":2,"transurl.be":3,"transurl.eu":3,"transurl.nl":3,"site.transip.me":3,"tuxfamily.org":2,"dd-dns.de":2,"diskstation.eu":2,"diskstation.org":2,"dray-dns.de":2,"draydns.de":2,"dyn-vpn.de":2,"dynvpn.de":2,"mein-vigor.de":2,"my-vigor.de":2,"my-wan.de":2,"syno-ds.de":2,"synology-diskstation.de":2,"synology-ds.de":2,"typedream.app":2,"pro.typeform.com":3,"uber.space":2,"uberspace.de":3,"hk.com":2,"hk.org":2,"ltd.hk":2,"inc.hk":2,"name.pm":2,"sch.tf":2,"biz.wf":2,"sch.wf":2,"org.yt":2,"virtualuser.de":2,"virtual-user.de":2,"upli.io":2,"urown.cloud":2,"dnsupdate.info":2,"lib.de.us":3,"2038.io":2,"vercel.app":2,"vercel.dev":2,"now.sh":2,"router.management":2,"v-info.info":2,"voorloper.cloud":2,"neko.am":2,"nyaa.am":2,"be.ax":2,"cat.ax":2,"es.ax":2,"eu.ax":2,"gg.ax":2,"mc.ax":2,"us.ax":2,"xy.ax":2,"nl.ci":2,"xx.gl":2,"app.gp":2,"blog.gt":2,"de.gt":2,"to.gt":2,"be.gy":2,"cc.hn":2,"blog.kg":2,"io.kg":2,"jp.kg":2,"tv.kg":2,"uk.kg":2,"us.kg":2,"de.ls":2,"at.md":2,"de.md":2,"jp.md":2,"to.md":2,"indie.porn":2,"vxl.sh":2,"ch.tc":2,"me.tc":2,"we.tc":2,"nyan.to":2,"at.vg":2,"blog.vu":2,"dev.vu":2,"me.vu":2,"v.ua":2,"vultrobjects.com":3,"wafflecell.com":2,"webhare.dev":3,"reserve-online.net":2,"reserve-online.com":2,"bookonline.app":2,"hotelwithflight.com":2,"wedeploy.io":2,"wedeploy.me":2,"wedeploy.sh":2,"remotewd.com":2,"pages.wiardweb.com":3,"wmflabs.org":2,"toolforge.org":2,"wmcloud.org":2,"panel.gg":2,"daemon.panel.gg":3,"messwithdns.com":2,"woltlab-demo.com":2,"myforum.community":2,"community-pro.de":2,"diskussionsbereich.de":2,"community-pro.net":2,"meinforum.net":2,"affinitylottery.org.uk":3,"raffleentry.org.uk":3,"weeklylottery.org.uk":3,"wpenginepowered.com":2,"js.wpenginepowered.com":3,"wixsite.com":2,"editorx.io":2,"half.host":2,"xnbay.com":2,"u2.xnbay.com":3,"u2-local.xnbay.com":3,"cistron.nl":2,"demon.nl":2,"xs4all.space":2,"yandexcloud.net":2,"storage.yandexcloud.net":3,"website.yandexcloud.net":3,"official.academy":2,"yolasite.com":2,"ybo.faith":2,"yombo.me":2,"homelink.one":2,"ybo.party":2,"ybo.review":2,"ybo.science":2,"ybo.trade":2,"ynh.fr":2,"nohost.me":2,"noho.st":2,"za.net":2,"za.org":2,"bss.design":2,"basicserver.io":2,"virtualserver.io":2,"enterprisecloud.nu":2}};
+ const tlds = {"icann":{"ac":1,"com.ac":2,"edu.ac":2,"gov.ac":2,"net.ac":2,"mil.ac":2,"org.ac":2,"ad":1,"nom.ad":2,"ae":1,"co.ae":2,"net.ae":2,"org.ae":2,"sch.ae":2,"ac.ae":2,"gov.ae":2,"mil.ae":2,"aero":1,"accident-investigation.aero":2,"accident-prevention.aero":2,"aerobatic.aero":2,"aeroclub.aero":2,"aerodrome.aero":2,"agents.aero":2,"aircraft.aero":2,"airline.aero":2,"airport.aero":2,"air-surveillance.aero":2,"airtraffic.aero":2,"air-traffic-control.aero":2,"ambulance.aero":2,"amusement.aero":2,"association.aero":2,"author.aero":2,"ballooning.aero":2,"broker.aero":2,"caa.aero":2,"cargo.aero":2,"catering.aero":2,"certification.aero":2,"championship.aero":2,"charter.aero":2,"civilaviation.aero":2,"club.aero":2,"conference.aero":2,"consultant.aero":2,"consulting.aero":2,"control.aero":2,"council.aero":2,"crew.aero":2,"design.aero":2,"dgca.aero":2,"educator.aero":2,"emergency.aero":2,"engine.aero":2,"engineer.aero":2,"entertainment.aero":2,"equipment.aero":2,"exchange.aero":2,"express.aero":2,"federation.aero":2,"flight.aero":2,"fuel.aero":2,"gliding.aero":2,"government.aero":2,"groundhandling.aero":2,"group.aero":2,"hanggliding.aero":2,"homebuilt.aero":2,"insurance.aero":2,"journal.aero":2,"journalist.aero":2,"leasing.aero":2,"logistics.aero":2,"magazine.aero":2,"maintenance.aero":2,"media.aero":2,"microlight.aero":2,"modelling.aero":2,"navigation.aero":2,"parachuting.aero":2,"paragliding.aero":2,"passenger-association.aero":2,"pilot.aero":2,"press.aero":2,"production.aero":2,"recreation.aero":2,"repbody.aero":2,"res.aero":2,"research.aero":2,"rotorcraft.aero":2,"safety.aero":2,"scientist.aero":2,"services.aero":2,"show.aero":2,"skydiving.aero":2,"software.aero":2,"student.aero":2,"trader.aero":2,"trading.aero":2,"trainer.aero":2,"union.aero":2,"workinggroup.aero":2,"works.aero":2,"af":1,"gov.af":2,"com.af":2,"org.af":2,"net.af":2,"edu.af":2,"ag":1,"com.ag":2,"org.ag":2,"net.ag":2,"co.ag":2,"nom.ag":2,"ai":1,"off.ai":2,"com.ai":2,"net.ai":2,"org.ai":2,"al":1,"com.al":2,"edu.al":2,"gov.al":2,"mil.al":2,"net.al":2,"org.al":2,"am":1,"co.am":2,"com.am":2,"commune.am":2,"net.am":2,"org.am":2,"ao":1,"ed.ao":2,"gv.ao":2,"og.ao":2,"co.ao":2,"pb.ao":2,"it.ao":2,"aq":1,"ar":1,"bet.ar":2,"com.ar":2,"coop.ar":2,"edu.ar":2,"gob.ar":2,"gov.ar":2,"int.ar":2,"mil.ar":2,"musica.ar":2,"mutual.ar":2,"net.ar":2,"org.ar":2,"senasa.ar":2,"tur.ar":2,"arpa":1,"e164.arpa":2,"in-addr.arpa":2,"ip6.arpa":2,"iris.arpa":2,"uri.arpa":2,"urn.arpa":2,"as":1,"gov.as":2,"asia":1,"at":1,"ac.at":2,"co.at":2,"gv.at":2,"or.at":2,"sth.ac.at":3,"au":1,"com.au":2,"net.au":2,"org.au":2,"edu.au":2,"gov.au":2,"asn.au":2,"id.au":2,"info.au":2,"conf.au":2,"oz.au":2,"act.au":2,"nsw.au":2,"nt.au":2,"qld.au":2,"sa.au":2,"tas.au":2,"vic.au":2,"wa.au":2,"act.edu.au":3,"catholic.edu.au":3,"nsw.edu.au":3,"nt.edu.au":3,"qld.edu.au":3,"sa.edu.au":3,"tas.edu.au":3,"vic.edu.au":3,"wa.edu.au":3,"qld.gov.au":3,"sa.gov.au":3,"tas.gov.au":3,"vic.gov.au":3,"wa.gov.au":3,"schools.nsw.edu.au":4,"aw":1,"com.aw":2,"ax":1,"az":1,"com.az":2,"net.az":2,"int.az":2,"gov.az":2,"org.az":2,"edu.az":2,"info.az":2,"pp.az":2,"mil.az":2,"name.az":2,"pro.az":2,"biz.az":2,"ba":1,"com.ba":2,"edu.ba":2,"gov.ba":2,"mil.ba":2,"net.ba":2,"org.ba":2,"bb":1,"biz.bb":2,"co.bb":2,"com.bb":2,"edu.bb":2,"gov.bb":2,"info.bb":2,"net.bb":2,"org.bb":2,"store.bb":2,"tv.bb":2,"bd":2,"be":1,"ac.be":2,"bf":1,"gov.bf":2,"bg":1,"a.bg":2,"b.bg":2,"c.bg":2,"d.bg":2,"e.bg":2,"f.bg":2,"g.bg":2,"h.bg":2,"i.bg":2,"j.bg":2,"k.bg":2,"l.bg":2,"m.bg":2,"n.bg":2,"o.bg":2,"p.bg":2,"q.bg":2,"r.bg":2,"s.bg":2,"t.bg":2,"u.bg":2,"v.bg":2,"w.bg":2,"x.bg":2,"y.bg":2,"z.bg":2,"0.bg":2,"1.bg":2,"2.bg":2,"3.bg":2,"4.bg":2,"5.bg":2,"6.bg":2,"7.bg":2,"8.bg":2,"9.bg":2,"bh":1,"com.bh":2,"edu.bh":2,"net.bh":2,"org.bh":2,"gov.bh":2,"bi":1,"co.bi":2,"com.bi":2,"edu.bi":2,"or.bi":2,"org.bi":2,"biz":1,"bj":1,"africa.bj":2,"agro.bj":2,"architectes.bj":2,"assur.bj":2,"avocats.bj":2,"co.bj":2,"com.bj":2,"eco.bj":2,"econo.bj":2,"edu.bj":2,"info.bj":2,"loisirs.bj":2,"money.bj":2,"net.bj":2,"org.bj":2,"ote.bj":2,"resto.bj":2,"restaurant.bj":2,"tourism.bj":2,"univ.bj":2,"bm":1,"com.bm":2,"edu.bm":2,"gov.bm":2,"net.bm":2,"org.bm":2,"bn":1,"com.bn":2,"edu.bn":2,"gov.bn":2,"net.bn":2,"org.bn":2,"bo":1,"com.bo":2,"edu.bo":2,"gob.bo":2,"int.bo":2,"org.bo":2,"net.bo":2,"mil.bo":2,"tv.bo":2,"web.bo":2,"academia.bo":2,"agro.bo":2,"arte.bo":2,"blog.bo":2,"bolivia.bo":2,"ciencia.bo":2,"cooperativa.bo":2,"democracia.bo":2,"deporte.bo":2,"ecologia.bo":2,"economia.bo":2,"empresa.bo":2,"indigena.bo":2,"industria.bo":2,"info.bo":2,"medicina.bo":2,"movimiento.bo":2,"musica.bo":2,"natural.bo":2,"nombre.bo":2,"noticias.bo":2,"patria.bo":2,"politica.bo":2,"profesional.bo":2,"plurinacional.bo":2,"pueblo.bo":2,"revista.bo":2,"salud.bo":2,"tecnologia.bo":2,"tksat.bo":2,"transporte.bo":2,"wiki.bo":2,"br":1,"9guacu.br":2,"abc.br":2,"adm.br":2,"adv.br":2,"agr.br":2,"aju.br":2,"am.br":2,"anani.br":2,"aparecida.br":2,"app.br":2,"arq.br":2,"art.br":2,"ato.br":2,"b.br":2,"barueri.br":2,"belem.br":2,"bhz.br":2,"bib.br":2,"bio.br":2,"blog.br":2,"bmd.br":2,"boavista.br":2,"bsb.br":2,"campinagrande.br":2,"campinas.br":2,"caxias.br":2,"cim.br":2,"cng.br":2,"cnt.br":2,"com.br":2,"contagem.br":2,"coop.br":2,"coz.br":2,"cri.br":2,"cuiaba.br":2,"curitiba.br":2,"def.br":2,"des.br":2,"det.br":2,"dev.br":2,"ecn.br":2,"eco.br":2,"edu.br":2,"emp.br":2,"enf.br":2,"eng.br":2,"esp.br":2,"etc.br":2,"eti.br":2,"far.br":2,"feira.br":2,"flog.br":2,"floripa.br":2,"fm.br":2,"fnd.br":2,"fortal.br":2,"fot.br":2,"foz.br":2,"fst.br":2,"g12.br":2,"geo.br":2,"ggf.br":2,"goiania.br":2,"gov.br":2,"ac.gov.br":3,"al.gov.br":3,"am.gov.br":3,"ap.gov.br":3,"ba.gov.br":3,"ce.gov.br":3,"df.gov.br":3,"es.gov.br":3,"go.gov.br":3,"ma.gov.br":3,"mg.gov.br":3,"ms.gov.br":3,"mt.gov.br":3,"pa.gov.br":3,"pb.gov.br":3,"pe.gov.br":3,"pi.gov.br":3,"pr.gov.br":3,"rj.gov.br":3,"rn.gov.br":3,"ro.gov.br":3,"rr.gov.br":3,"rs.gov.br":3,"sc.gov.br":3,"se.gov.br":3,"sp.gov.br":3,"to.gov.br":3,"gru.br":2,"imb.br":2,"ind.br":2,"inf.br":2,"jab.br":2,"jampa.br":2,"jdf.br":2,"joinville.br":2,"jor.br":2,"jus.br":2,"leg.br":2,"lel.br":2,"log.br":2,"londrina.br":2,"macapa.br":2,"maceio.br":2,"manaus.br":2,"maringa.br":2,"mat.br":2,"med.br":2,"mil.br":2,"morena.br":2,"mp.br":2,"mus.br":2,"natal.br":2,"net.br":2,"niteroi.br":2,"nom.br":3,"not.br":2,"ntr.br":2,"odo.br":2,"ong.br":2,"org.br":2,"osasco.br":2,"palmas.br":2,"poa.br":2,"ppg.br":2,"pro.br":2,"psc.br":2,"psi.br":2,"pvh.br":2,"qsl.br":2,"radio.br":2,"rec.br":2,"recife.br":2,"rep.br":2,"ribeirao.br":2,"rio.br":2,"riobranco.br":2,"riopreto.br":2,"salvador.br":2,"sampa.br":2,"santamaria.br":2,"santoandre.br":2,"saobernardo.br":2,"saogonca.br":2,"seg.br":2,"sjc.br":2,"slg.br":2,"slz.br":2,"sorocaba.br":2,"srv.br":2,"taxi.br":2,"tc.br":2,"tec.br":2,"teo.br":2,"the.br":2,"tmp.br":2,"trd.br":2,"tur.br":2,"tv.br":2,"udi.br":2,"vet.br":2,"vix.br":2,"vlog.br":2,"wiki.br":2,"zlg.br":2,"bs":1,"com.bs":2,"net.bs":2,"org.bs":2,"edu.bs":2,"gov.bs":2,"bt":1,"com.bt":2,"edu.bt":2,"gov.bt":2,"net.bt":2,"org.bt":2,"bv":1,"bw":1,"co.bw":2,"org.bw":2,"by":1,"gov.by":2,"mil.by":2,"com.by":2,"of.by":2,"bz":1,"com.bz":2,"net.bz":2,"org.bz":2,"edu.bz":2,"gov.bz":2,"ca":1,"ab.ca":2,"bc.ca":2,"mb.ca":2,"nb.ca":2,"nf.ca":2,"nl.ca":2,"ns.ca":2,"nt.ca":2,"nu.ca":2,"on.ca":2,"pe.ca":2,"qc.ca":2,"sk.ca":2,"yk.ca":2,"gc.ca":2,"cat":1,"cc":1,"cd":1,"gov.cd":2,"cf":1,"cg":1,"ch":1,"ci":1,"org.ci":2,"or.ci":2,"com.ci":2,"co.ci":2,"edu.ci":2,"ed.ci":2,"ac.ci":2,"net.ci":2,"go.ci":2,"asso.ci":2,"xn--aroport-bya.ci":2,"int.ci":2,"presse.ci":2,"md.ci":2,"gouv.ci":2,"ck":2,"www.ck":1,"cl":1,"co.cl":2,"gob.cl":2,"gov.cl":2,"mil.cl":2,"cm":1,"co.cm":2,"com.cm":2,"gov.cm":2,"net.cm":2,"cn":1,"ac.cn":2,"com.cn":2,"edu.cn":2,"gov.cn":2,"net.cn":2,"org.cn":2,"mil.cn":2,"xn--55qx5d.cn":2,"xn--io0a7i.cn":2,"xn--od0alg.cn":2,"ah.cn":2,"bj.cn":2,"cq.cn":2,"fj.cn":2,"gd.cn":2,"gs.cn":2,"gz.cn":2,"gx.cn":2,"ha.cn":2,"hb.cn":2,"he.cn":2,"hi.cn":2,"hl.cn":2,"hn.cn":2,"jl.cn":2,"js.cn":2,"jx.cn":2,"ln.cn":2,"nm.cn":2,"nx.cn":2,"qh.cn":2,"sc.cn":2,"sd.cn":2,"sh.cn":2,"sn.cn":2,"sx.cn":2,"tj.cn":2,"xj.cn":2,"xz.cn":2,"yn.cn":2,"zj.cn":2,"hk.cn":2,"mo.cn":2,"tw.cn":2,"co":1,"arts.co":2,"com.co":2,"edu.co":2,"firm.co":2,"gov.co":2,"info.co":2,"int.co":2,"mil.co":2,"net.co":2,"nom.co":2,"org.co":2,"rec.co":2,"web.co":2,"com":1,"coop":1,"cr":1,"ac.cr":2,"co.cr":2,"ed.cr":2,"fi.cr":2,"go.cr":2,"or.cr":2,"sa.cr":2,"cu":1,"com.cu":2,"edu.cu":2,"org.cu":2,"net.cu":2,"gov.cu":2,"inf.cu":2,"cv":1,"com.cv":2,"edu.cv":2,"int.cv":2,"nome.cv":2,"org.cv":2,"cw":1,"com.cw":2,"edu.cw":2,"net.cw":2,"org.cw":2,"cx":1,"gov.cx":2,"cy":1,"ac.cy":2,"biz.cy":2,"com.cy":2,"ekloges.cy":2,"gov.cy":2,"ltd.cy":2,"mil.cy":2,"net.cy":2,"org.cy":2,"press.cy":2,"pro.cy":2,"tm.cy":2,"cz":1,"de":1,"dj":1,"dk":1,"dm":1,"com.dm":2,"net.dm":2,"org.dm":2,"edu.dm":2,"gov.dm":2,"do":1,"art.do":2,"com.do":2,"edu.do":2,"gob.do":2,"gov.do":2,"mil.do":2,"net.do":2,"org.do":2,"sld.do":2,"web.do":2,"dz":1,"art.dz":2,"asso.dz":2,"com.dz":2,"edu.dz":2,"gov.dz":2,"org.dz":2,"net.dz":2,"pol.dz":2,"soc.dz":2,"tm.dz":2,"ec":1,"com.ec":2,"info.ec":2,"net.ec":2,"fin.ec":2,"k12.ec":2,"med.ec":2,"pro.ec":2,"org.ec":2,"edu.ec":2,"gov.ec":2,"gob.ec":2,"mil.ec":2,"edu":1,"ee":1,"edu.ee":2,"gov.ee":2,"riik.ee":2,"lib.ee":2,"med.ee":2,"com.ee":2,"pri.ee":2,"aip.ee":2,"org.ee":2,"fie.ee":2,"eg":1,"com.eg":2,"edu.eg":2,"eun.eg":2,"gov.eg":2,"mil.eg":2,"name.eg":2,"net.eg":2,"org.eg":2,"sci.eg":2,"er":2,"es":1,"com.es":2,"nom.es":2,"org.es":2,"gob.es":2,"edu.es":2,"et":1,"com.et":2,"gov.et":2,"org.et":2,"edu.et":2,"biz.et":2,"name.et":2,"info.et":2,"net.et":2,"eu":1,"fi":1,"aland.fi":2,"fj":1,"ac.fj":2,"biz.fj":2,"com.fj":2,"gov.fj":2,"info.fj":2,"mil.fj":2,"name.fj":2,"net.fj":2,"org.fj":2,"pro.fj":2,"fk":2,"com.fm":2,"edu.fm":2,"net.fm":2,"org.fm":2,"fm":1,"fo":1,"fr":1,"asso.fr":2,"com.fr":2,"gouv.fr":2,"nom.fr":2,"prd.fr":2,"tm.fr":2,"aeroport.fr":2,"avocat.fr":2,"avoues.fr":2,"cci.fr":2,"chambagri.fr":2,"chirurgiens-dentistes.fr":2,"experts-comptables.fr":2,"geometre-expert.fr":2,"greta.fr":2,"huissier-justice.fr":2,"medecin.fr":2,"notaires.fr":2,"pharmacien.fr":2,"port.fr":2,"veterinaire.fr":2,"ga":1,"gb":1,"edu.gd":2,"gov.gd":2,"gd":1,"ge":1,"com.ge":2,"edu.ge":2,"gov.ge":2,"org.ge":2,"mil.ge":2,"net.ge":2,"pvt.ge":2,"gf":1,"gg":1,"co.gg":2,"net.gg":2,"org.gg":2,"gh":1,"com.gh":2,"edu.gh":2,"gov.gh":2,"org.gh":2,"mil.gh":2,"gi":1,"com.gi":2,"ltd.gi":2,"gov.gi":2,"mod.gi":2,"edu.gi":2,"org.gi":2,"gl":1,"co.gl":2,"com.gl":2,"edu.gl":2,"net.gl":2,"org.gl":2,"gm":1,"gn":1,"ac.gn":2,"com.gn":2,"edu.gn":2,"gov.gn":2,"org.gn":2,"net.gn":2,"gov":1,"gp":1,"com.gp":2,"net.gp":2,"mobi.gp":2,"edu.gp":2,"org.gp":2,"asso.gp":2,"gq":1,"gr":1,"com.gr":2,"edu.gr":2,"net.gr":2,"org.gr":2,"gov.gr":2,"gs":1,"gt":1,"com.gt":2,"edu.gt":2,"gob.gt":2,"ind.gt":2,"mil.gt":2,"net.gt":2,"org.gt":2,"gu":1,"com.gu":2,"edu.gu":2,"gov.gu":2,"guam.gu":2,"info.gu":2,"net.gu":2,"org.gu":2,"web.gu":2,"gw":1,"gy":1,"co.gy":2,"com.gy":2,"edu.gy":2,"gov.gy":2,"net.gy":2,"org.gy":2,"hk":1,"com.hk":2,"edu.hk":2,"gov.hk":2,"idv.hk":2,"net.hk":2,"org.hk":2,"xn--55qx5d.hk":2,"xn--wcvs22d.hk":2,"xn--lcvr32d.hk":2,"xn--mxtq1m.hk":2,"xn--gmqw5a.hk":2,"xn--ciqpn.hk":2,"xn--gmq050i.hk":2,"xn--zf0avx.hk":2,"xn--io0a7i.hk":2,"xn--mk0axi.hk":2,"xn--od0alg.hk":2,"xn--od0aq3b.hk":2,"xn--tn0ag.hk":2,"xn--uc0atv.hk":2,"xn--uc0ay4a.hk":2,"hm":1,"hn":1,"com.hn":2,"edu.hn":2,"org.hn":2,"net.hn":2,"mil.hn":2,"gob.hn":2,"hr":1,"iz.hr":2,"from.hr":2,"name.hr":2,"com.hr":2,"ht":1,"com.ht":2,"shop.ht":2,"firm.ht":2,"info.ht":2,"adult.ht":2,"net.ht":2,"pro.ht":2,"org.ht":2,"med.ht":2,"art.ht":2,"coop.ht":2,"pol.ht":2,"asso.ht":2,"edu.ht":2,"rel.ht":2,"gouv.ht":2,"perso.ht":2,"hu":1,"co.hu":2,"info.hu":2,"org.hu":2,"priv.hu":2,"sport.hu":2,"tm.hu":2,"2000.hu":2,"agrar.hu":2,"bolt.hu":2,"casino.hu":2,"city.hu":2,"erotica.hu":2,"erotika.hu":2,"film.hu":2,"forum.hu":2,"games.hu":2,"hotel.hu":2,"ingatlan.hu":2,"jogasz.hu":2,"konyvelo.hu":2,"lakas.hu":2,"media.hu":2,"news.hu":2,"reklam.hu":2,"sex.hu":2,"shop.hu":2,"suli.hu":2,"szex.hu":2,"tozsde.hu":2,"utazas.hu":2,"video.hu":2,"id":1,"ac.id":2,"biz.id":2,"co.id":2,"desa.id":2,"go.id":2,"mil.id":2,"my.id":2,"net.id":2,"or.id":2,"ponpes.id":2,"sch.id":2,"web.id":2,"ie":1,"gov.ie":2,"il":1,"ac.il":2,"co.il":2,"gov.il":2,"idf.il":2,"k12.il":2,"muni.il":2,"net.il":2,"org.il":2,"xn--4dbrk0ce":1,"xn--4dbgdty6c.xn--4dbrk0ce":2,"xn--5dbhl8d.xn--4dbrk0ce":2,"xn--8dbq2a.xn--4dbrk0ce":2,"xn--hebda8b.xn--4dbrk0ce":2,"im":1,"ac.im":2,"co.im":2,"com.im":2,"ltd.co.im":3,"net.im":2,"org.im":2,"plc.co.im":3,"tt.im":2,"tv.im":2,"in":1,"5g.in":2,"6g.in":2,"ac.in":2,"ai.in":2,"am.in":2,"bihar.in":2,"biz.in":2,"business.in":2,"ca.in":2,"cn.in":2,"co.in":2,"com.in":2,"coop.in":2,"cs.in":2,"delhi.in":2,"dr.in":2,"edu.in":2,"er.in":2,"firm.in":2,"gen.in":2,"gov.in":2,"gujarat.in":2,"ind.in":2,"info.in":2,"int.in":2,"internet.in":2,"io.in":2,"me.in":2,"mil.in":2,"net.in":2,"nic.in":2,"org.in":2,"pg.in":2,"post.in":2,"pro.in":2,"res.in":2,"travel.in":2,"tv.in":2,"uk.in":2,"up.in":2,"us.in":2,"info":1,"int":1,"eu.int":2,"io":1,"com.io":2,"iq":1,"gov.iq":2,"edu.iq":2,"mil.iq":2,"com.iq":2,"org.iq":2,"net.iq":2,"ir":1,"ac.ir":2,"co.ir":2,"gov.ir":2,"id.ir":2,"net.ir":2,"org.ir":2,"sch.ir":2,"xn--mgba3a4f16a.ir":2,"xn--mgba3a4fra.ir":2,"is":1,"net.is":2,"com.is":2,"edu.is":2,"gov.is":2,"org.is":2,"int.is":2,"it":1,"gov.it":2,"edu.it":2,"abr.it":2,"abruzzo.it":2,"aosta-valley.it":2,"aostavalley.it":2,"bas.it":2,"basilicata.it":2,"cal.it":2,"calabria.it":2,"cam.it":2,"campania.it":2,"emilia-romagna.it":2,"emiliaromagna.it":2,"emr.it":2,"friuli-v-giulia.it":2,"friuli-ve-giulia.it":2,"friuli-vegiulia.it":2,"friuli-venezia-giulia.it":2,"friuli-veneziagiulia.it":2,"friuli-vgiulia.it":2,"friuliv-giulia.it":2,"friulive-giulia.it":2,"friulivegiulia.it":2,"friulivenezia-giulia.it":2,"friuliveneziagiulia.it":2,"friulivgiulia.it":2,"fvg.it":2,"laz.it":2,"lazio.it":2,"lig.it":2,"liguria.it":2,"lom.it":2,"lombardia.it":2,"lombardy.it":2,"lucania.it":2,"mar.it":2,"marche.it":2,"mol.it":2,"molise.it":2,"piedmont.it":2,"piemonte.it":2,"pmn.it":2,"pug.it":2,"puglia.it":2,"sar.it":2,"sardegna.it":2,"sardinia.it":2,"sic.it":2,"sicilia.it":2,"sicily.it":2,"taa.it":2,"tos.it":2,"toscana.it":2,"trentin-sud-tirol.it":2,"xn--trentin-sd-tirol-rzb.it":2,"trentin-sudtirol.it":2,"xn--trentin-sdtirol-7vb.it":2,"trentin-sued-tirol.it":2,"trentin-suedtirol.it":2,"trentino-a-adige.it":2,"trentino-aadige.it":2,"trentino-alto-adige.it":2,"trentino-altoadige.it":2,"trentino-s-tirol.it":2,"trentino-stirol.it":2,"trentino-sud-tirol.it":2,"xn--trentino-sd-tirol-c3b.it":2,"trentino-sudtirol.it":2,"xn--trentino-sdtirol-szb.it":2,"trentino-sued-tirol.it":2,"trentino-suedtirol.it":2,"trentino.it":2,"trentinoa-adige.it":2,"trentinoaadige.it":2,"trentinoalto-adige.it":2,"trentinoaltoadige.it":2,"trentinos-tirol.it":2,"trentinostirol.it":2,"trentinosud-tirol.it":2,"xn--trentinosd-tirol-rzb.it":2,"trentinosudtirol.it":2,"xn--trentinosdtirol-7vb.it":2,"trentinosued-tirol.it":2,"trentinosuedtirol.it":2,"trentinsud-tirol.it":2,"xn--trentinsd-tirol-6vb.it":2,"trentinsudtirol.it":2,"xn--trentinsdtirol-nsb.it":2,"trentinsued-tirol.it":2,"trentinsuedtirol.it":2,"tuscany.it":2,"umb.it":2,"umbria.it":2,"val-d-aosta.it":2,"val-daosta.it":2,"vald-aosta.it":2,"valdaosta.it":2,"valle-aosta.it":2,"valle-d-aosta.it":2,"valle-daosta.it":2,"valleaosta.it":2,"valled-aosta.it":2,"valledaosta.it":2,"vallee-aoste.it":2,"xn--valle-aoste-ebb.it":2,"vallee-d-aoste.it":2,"xn--valle-d-aoste-ehb.it":2,"valleeaoste.it":2,"xn--valleaoste-e7a.it":2,"valleedaoste.it":2,"xn--valledaoste-ebb.it":2,"vao.it":2,"vda.it":2,"ven.it":2,"veneto.it":2,"ag.it":2,"agrigento.it":2,"al.it":2,"alessandria.it":2,"alto-adige.it":2,"altoadige.it":2,"an.it":2,"ancona.it":2,"andria-barletta-trani.it":2,"andria-trani-barletta.it":2,"andriabarlettatrani.it":2,"andriatranibarletta.it":2,"ao.it":2,"aosta.it":2,"aoste.it":2,"ap.it":2,"aq.it":2,"aquila.it":2,"ar.it":2,"arezzo.it":2,"ascoli-piceno.it":2,"ascolipiceno.it":2,"asti.it":2,"at.it":2,"av.it":2,"avellino.it":2,"ba.it":2,"balsan-sudtirol.it":2,"xn--balsan-sdtirol-nsb.it":2,"balsan-suedtirol.it":2,"balsan.it":2,"bari.it":2,"barletta-trani-andria.it":2,"barlettatraniandria.it":2,"belluno.it":2,"benevento.it":2,"bergamo.it":2,"bg.it":2,"bi.it":2,"biella.it":2,"bl.it":2,"bn.it":2,"bo.it":2,"bologna.it":2,"bolzano-altoadige.it":2,"bolzano.it":2,"bozen-sudtirol.it":2,"xn--bozen-sdtirol-2ob.it":2,"bozen-suedtirol.it":2,"bozen.it":2,"br.it":2,"brescia.it":2,"brindisi.it":2,"bs.it":2,"bt.it":2,"bulsan-sudtirol.it":2,"xn--bulsan-sdtirol-nsb.it":2,"bulsan-suedtirol.it":2,"bulsan.it":2,"bz.it":2,"ca.it":2,"cagliari.it":2,"caltanissetta.it":2,"campidano-medio.it":2,"campidanomedio.it":2,"campobasso.it":2,"carbonia-iglesias.it":2,"carboniaiglesias.it":2,"carrara-massa.it":2,"carraramassa.it":2,"caserta.it":2,"catania.it":2,"catanzaro.it":2,"cb.it":2,"ce.it":2,"cesena-forli.it":2,"xn--cesena-forl-mcb.it":2,"cesenaforli.it":2,"xn--cesenaforl-i8a.it":2,"ch.it":2,"chieti.it":2,"ci.it":2,"cl.it":2,"cn.it":2,"co.it":2,"como.it":2,"cosenza.it":2,"cr.it":2,"cremona.it":2,"crotone.it":2,"cs.it":2,"ct.it":2,"cuneo.it":2,"cz.it":2,"dell-ogliastra.it":2,"dellogliastra.it":2,"en.it":2,"enna.it":2,"fc.it":2,"fe.it":2,"fermo.it":2,"ferrara.it":2,"fg.it":2,"fi.it":2,"firenze.it":2,"florence.it":2,"fm.it":2,"foggia.it":2,"forli-cesena.it":2,"xn--forl-cesena-fcb.it":2,"forlicesena.it":2,"xn--forlcesena-c8a.it":2,"fr.it":2,"frosinone.it":2,"ge.it":2,"genoa.it":2,"genova.it":2,"go.it":2,"gorizia.it":2,"gr.it":2,"grosseto.it":2,"iglesias-carbonia.it":2,"iglesiascarbonia.it":2,"im.it":2,"imperia.it":2,"is.it":2,"isernia.it":2,"kr.it":2,"la-spezia.it":2,"laquila.it":2,"laspezia.it":2,"latina.it":2,"lc.it":2,"le.it":2,"lecce.it":2,"lecco.it":2,"li.it":2,"livorno.it":2,"lo.it":2,"lodi.it":2,"lt.it":2,"lu.it":2,"lucca.it":2,"macerata.it":2,"mantova.it":2,"massa-carrara.it":2,"massacarrara.it":2,"matera.it":2,"mb.it":2,"mc.it":2,"me.it":2,"medio-campidano.it":2,"mediocampidano.it":2,"messina.it":2,"mi.it":2,"milan.it":2,"milano.it":2,"mn.it":2,"mo.it":2,"modena.it":2,"monza-brianza.it":2,"monza-e-della-brianza.it":2,"monza.it":2,"monzabrianza.it":2,"monzaebrianza.it":2,"monzaedellabrianza.it":2,"ms.it":2,"mt.it":2,"na.it":2,"naples.it":2,"napoli.it":2,"no.it":2,"novara.it":2,"nu.it":2,"nuoro.it":2,"og.it":2,"ogliastra.it":2,"olbia-tempio.it":2,"olbiatempio.it":2,"or.it":2,"oristano.it":2,"ot.it":2,"pa.it":2,"padova.it":2,"padua.it":2,"palermo.it":2,"parma.it":2,"pavia.it":2,"pc.it":2,"pd.it":2,"pe.it":2,"perugia.it":2,"pesaro-urbino.it":2,"pesarourbino.it":2,"pescara.it":2,"pg.it":2,"pi.it":2,"piacenza.it":2,"pisa.it":2,"pistoia.it":2,"pn.it":2,"po.it":2,"pordenone.it":2,"potenza.it":2,"pr.it":2,"prato.it":2,"pt.it":2,"pu.it":2,"pv.it":2,"pz.it":2,"ra.it":2,"ragusa.it":2,"ravenna.it":2,"rc.it":2,"re.it":2,"reggio-calabria.it":2,"reggio-emilia.it":2,"reggiocalabria.it":2,"reggioemilia.it":2,"rg.it":2,"ri.it":2,"rieti.it":2,"rimini.it":2,"rm.it":2,"rn.it":2,"ro.it":2,"roma.it":2,"rome.it":2,"rovigo.it":2,"sa.it":2,"salerno.it":2,"sassari.it":2,"savona.it":2,"si.it":2,"siena.it":2,"siracusa.it":2,"so.it":2,"sondrio.it":2,"sp.it":2,"sr.it":2,"ss.it":2,"suedtirol.it":2,"xn--sdtirol-n2a.it":2,"sv.it":2,"ta.it":2,"taranto.it":2,"te.it":2,"tempio-olbia.it":2,"tempioolbia.it":2,"teramo.it":2,"terni.it":2,"tn.it":2,"to.it":2,"torino.it":2,"tp.it":2,"tr.it":2,"trani-andria-barletta.it":2,"trani-barletta-andria.it":2,"traniandriabarletta.it":2,"tranibarlettaandria.it":2,"trapani.it":2,"trento.it":2,"treviso.it":2,"trieste.it":2,"ts.it":2,"turin.it":2,"tv.it":2,"ud.it":2,"udine.it":2,"urbino-pesaro.it":2,"urbinopesaro.it":2,"va.it":2,"varese.it":2,"vb.it":2,"vc.it":2,"ve.it":2,"venezia.it":2,"venice.it":2,"verbania.it":2,"vercelli.it":2,"verona.it":2,"vi.it":2,"vibo-valentia.it":2,"vibovalentia.it":2,"vicenza.it":2,"viterbo.it":2,"vr.it":2,"vs.it":2,"vt.it":2,"vv.it":2,"je":1,"co.je":2,"net.je":2,"org.je":2,"jm":2,"jo":1,"com.jo":2,"org.jo":2,"net.jo":2,"edu.jo":2,"sch.jo":2,"gov.jo":2,"mil.jo":2,"name.jo":2,"jobs":1,"jp":1,"ac.jp":2,"ad.jp":2,"co.jp":2,"ed.jp":2,"go.jp":2,"gr.jp":2,"lg.jp":2,"ne.jp":2,"or.jp":2,"aichi.jp":2,"akita.jp":2,"aomori.jp":2,"chiba.jp":2,"ehime.jp":2,"fukui.jp":2,"fukuoka.jp":2,"fukushima.jp":2,"gifu.jp":2,"gunma.jp":2,"hiroshima.jp":2,"hokkaido.jp":2,"hyogo.jp":2,"ibaraki.jp":2,"ishikawa.jp":2,"iwate.jp":2,"kagawa.jp":2,"kagoshima.jp":2,"kanagawa.jp":2,"kochi.jp":2,"kumamoto.jp":2,"kyoto.jp":2,"mie.jp":2,"miyagi.jp":2,"miyazaki.jp":2,"nagano.jp":2,"nagasaki.jp":2,"nara.jp":2,"niigata.jp":2,"oita.jp":2,"okayama.jp":2,"okinawa.jp":2,"osaka.jp":2,"saga.jp":2,"saitama.jp":2,"shiga.jp":2,"shimane.jp":2,"shizuoka.jp":2,"tochigi.jp":2,"tokushima.jp":2,"tokyo.jp":2,"tottori.jp":2,"toyama.jp":2,"wakayama.jp":2,"yamagata.jp":2,"yamaguchi.jp":2,"yamanashi.jp":2,"xn--4pvxs.jp":2,"xn--vgu402c.jp":2,"xn--c3s14m.jp":2,"xn--f6qx53a.jp":2,"xn--8pvr4u.jp":2,"xn--uist22h.jp":2,"xn--djrs72d6uy.jp":2,"xn--mkru45i.jp":2,"xn--0trq7p7nn.jp":2,"xn--8ltr62k.jp":2,"xn--2m4a15e.jp":2,"xn--efvn9s.jp":2,"xn--32vp30h.jp":2,"xn--4it797k.jp":2,"xn--1lqs71d.jp":2,"xn--5rtp49c.jp":2,"xn--5js045d.jp":2,"xn--ehqz56n.jp":2,"xn--1lqs03n.jp":2,"xn--qqqt11m.jp":2,"xn--kbrq7o.jp":2,"xn--pssu33l.jp":2,"xn--ntsq17g.jp":2,"xn--uisz3g.jp":2,"xn--6btw5a.jp":2,"xn--1ctwo.jp":2,"xn--6orx2r.jp":2,"xn--rht61e.jp":2,"xn--rht27z.jp":2,"xn--djty4k.jp":2,"xn--nit225k.jp":2,"xn--rht3d.jp":2,"xn--klty5x.jp":2,"xn--kltx9a.jp":2,"xn--kltp7d.jp":2,"xn--uuwu58a.jp":2,"xn--zbx025d.jp":2,"xn--ntso0iqx3a.jp":2,"xn--elqq16h.jp":2,"xn--4it168d.jp":2,"xn--klt787d.jp":2,"xn--rny31h.jp":2,"xn--7t0a264c.jp":2,"xn--5rtq34k.jp":2,"xn--k7yn95e.jp":2,"xn--tor131o.jp":2,"xn--d5qv7z876c.jp":2,"kawasaki.jp":3,"kitakyushu.jp":3,"kobe.jp":3,"nagoya.jp":3,"sapporo.jp":3,"sendai.jp":3,"yokohama.jp":3,"city.kawasaki.jp":2,"city.kitakyushu.jp":2,"city.kobe.jp":2,"city.nagoya.jp":2,"city.sapporo.jp":2,"city.sendai.jp":2,"city.yokohama.jp":2,"aisai.aichi.jp":3,"ama.aichi.jp":3,"anjo.aichi.jp":3,"asuke.aichi.jp":3,"chiryu.aichi.jp":3,"chita.aichi.jp":3,"fuso.aichi.jp":3,"gamagori.aichi.jp":3,"handa.aichi.jp":3,"hazu.aichi.jp":3,"hekinan.aichi.jp":3,"higashiura.aichi.jp":3,"ichinomiya.aichi.jp":3,"inazawa.aichi.jp":3,"inuyama.aichi.jp":3,"isshiki.aichi.jp":3,"iwakura.aichi.jp":3,"kanie.aichi.jp":3,"kariya.aichi.jp":3,"kasugai.aichi.jp":3,"kira.aichi.jp":3,"kiyosu.aichi.jp":3,"komaki.aichi.jp":3,"konan.aichi.jp":3,"kota.aichi.jp":3,"mihama.aichi.jp":3,"miyoshi.aichi.jp":3,"nishio.aichi.jp":3,"nisshin.aichi.jp":3,"obu.aichi.jp":3,"oguchi.aichi.jp":3,"oharu.aichi.jp":3,"okazaki.aichi.jp":3,"owariasahi.aichi.jp":3,"seto.aichi.jp":3,"shikatsu.aichi.jp":3,"shinshiro.aichi.jp":3,"shitara.aichi.jp":3,"tahara.aichi.jp":3,"takahama.aichi.jp":3,"tobishima.aichi.jp":3,"toei.aichi.jp":3,"togo.aichi.jp":3,"tokai.aichi.jp":3,"tokoname.aichi.jp":3,"toyoake.aichi.jp":3,"toyohashi.aichi.jp":3,"toyokawa.aichi.jp":3,"toyone.aichi.jp":3,"toyota.aichi.jp":3,"tsushima.aichi.jp":3,"yatomi.aichi.jp":3,"akita.akita.jp":3,"daisen.akita.jp":3,"fujisato.akita.jp":3,"gojome.akita.jp":3,"hachirogata.akita.jp":3,"happou.akita.jp":3,"higashinaruse.akita.jp":3,"honjo.akita.jp":3,"honjyo.akita.jp":3,"ikawa.akita.jp":3,"kamikoani.akita.jp":3,"kamioka.akita.jp":3,"katagami.akita.jp":3,"kazuno.akita.jp":3,"kitaakita.akita.jp":3,"kosaka.akita.jp":3,"kyowa.akita.jp":3,"misato.akita.jp":3,"mitane.akita.jp":3,"moriyoshi.akita.jp":3,"nikaho.akita.jp":3,"noshiro.akita.jp":3,"odate.akita.jp":3,"oga.akita.jp":3,"ogata.akita.jp":3,"semboku.akita.jp":3,"yokote.akita.jp":3,"yurihonjo.akita.jp":3,"aomori.aomori.jp":3,"gonohe.aomori.jp":3,"hachinohe.aomori.jp":3,"hashikami.aomori.jp":3,"hiranai.aomori.jp":3,"hirosaki.aomori.jp":3,"itayanagi.aomori.jp":3,"kuroishi.aomori.jp":3,"misawa.aomori.jp":3,"mutsu.aomori.jp":3,"nakadomari.aomori.jp":3,"noheji.aomori.jp":3,"oirase.aomori.jp":3,"owani.aomori.jp":3,"rokunohe.aomori.jp":3,"sannohe.aomori.jp":3,"shichinohe.aomori.jp":3,"shingo.aomori.jp":3,"takko.aomori.jp":3,"towada.aomori.jp":3,"tsugaru.aomori.jp":3,"tsuruta.aomori.jp":3,"abiko.chiba.jp":3,"asahi.chiba.jp":3,"chonan.chiba.jp":3,"chosei.chiba.jp":3,"choshi.chiba.jp":3,"chuo.chiba.jp":3,"funabashi.chiba.jp":3,"futtsu.chiba.jp":3,"hanamigawa.chiba.jp":3,"ichihara.chiba.jp":3,"ichikawa.chiba.jp":3,"ichinomiya.chiba.jp":3,"inzai.chiba.jp":3,"isumi.chiba.jp":3,"kamagaya.chiba.jp":3,"kamogawa.chiba.jp":3,"kashiwa.chiba.jp":3,"katori.chiba.jp":3,"katsuura.chiba.jp":3,"kimitsu.chiba.jp":3,"kisarazu.chiba.jp":3,"kozaki.chiba.jp":3,"kujukuri.chiba.jp":3,"kyonan.chiba.jp":3,"matsudo.chiba.jp":3,"midori.chiba.jp":3,"mihama.chiba.jp":3,"minamiboso.chiba.jp":3,"mobara.chiba.jp":3,"mutsuzawa.chiba.jp":3,"nagara.chiba.jp":3,"nagareyama.chiba.jp":3,"narashino.chiba.jp":3,"narita.chiba.jp":3,"noda.chiba.jp":3,"oamishirasato.chiba.jp":3,"omigawa.chiba.jp":3,"onjuku.chiba.jp":3,"otaki.chiba.jp":3,"sakae.chiba.jp":3,"sakura.chiba.jp":3,"shimofusa.chiba.jp":3,"shirako.chiba.jp":3,"shiroi.chiba.jp":3,"shisui.chiba.jp":3,"sodegaura.chiba.jp":3,"sosa.chiba.jp":3,"tako.chiba.jp":3,"tateyama.chiba.jp":3,"togane.chiba.jp":3,"tohnosho.chiba.jp":3,"tomisato.chiba.jp":3,"urayasu.chiba.jp":3,"yachimata.chiba.jp":3,"yachiyo.chiba.jp":3,"yokaichiba.chiba.jp":3,"yokoshibahikari.chiba.jp":3,"yotsukaido.chiba.jp":3,"ainan.ehime.jp":3,"honai.ehime.jp":3,"ikata.ehime.jp":3,"imabari.ehime.jp":3,"iyo.ehime.jp":3,"kamijima.ehime.jp":3,"kihoku.ehime.jp":3,"kumakogen.ehime.jp":3,"masaki.ehime.jp":3,"matsuno.ehime.jp":3,"matsuyama.ehime.jp":3,"namikata.ehime.jp":3,"niihama.ehime.jp":3,"ozu.ehime.jp":3,"saijo.ehime.jp":3,"seiyo.ehime.jp":3,"shikokuchuo.ehime.jp":3,"tobe.ehime.jp":3,"toon.ehime.jp":3,"uchiko.ehime.jp":3,"uwajima.ehime.jp":3,"yawatahama.ehime.jp":3,"echizen.fukui.jp":3,"eiheiji.fukui.jp":3,"fukui.fukui.jp":3,"ikeda.fukui.jp":3,"katsuyama.fukui.jp":3,"mihama.fukui.jp":3,"minamiechizen.fukui.jp":3,"obama.fukui.jp":3,"ohi.fukui.jp":3,"ono.fukui.jp":3,"sabae.fukui.jp":3,"sakai.fukui.jp":3,"takahama.fukui.jp":3,"tsuruga.fukui.jp":3,"wakasa.fukui.jp":3,"ashiya.fukuoka.jp":3,"buzen.fukuoka.jp":3,"chikugo.fukuoka.jp":3,"chikuho.fukuoka.jp":3,"chikujo.fukuoka.jp":3,"chikushino.fukuoka.jp":3,"chikuzen.fukuoka.jp":3,"chuo.fukuoka.jp":3,"dazaifu.fukuoka.jp":3,"fukuchi.fukuoka.jp":3,"hakata.fukuoka.jp":3,"higashi.fukuoka.jp":3,"hirokawa.fukuoka.jp":3,"hisayama.fukuoka.jp":3,"iizuka.fukuoka.jp":3,"inatsuki.fukuoka.jp":3,"kaho.fukuoka.jp":3,"kasuga.fukuoka.jp":3,"kasuya.fukuoka.jp":3,"kawara.fukuoka.jp":3,"keisen.fukuoka.jp":3,"koga.fukuoka.jp":3,"kurate.fukuoka.jp":3,"kurogi.fukuoka.jp":3,"kurume.fukuoka.jp":3,"minami.fukuoka.jp":3,"miyako.fukuoka.jp":3,"miyama.fukuoka.jp":3,"miyawaka.fukuoka.jp":3,"mizumaki.fukuoka.jp":3,"munakata.fukuoka.jp":3,"nakagawa.fukuoka.jp":3,"nakama.fukuoka.jp":3,"nishi.fukuoka.jp":3,"nogata.fukuoka.jp":3,"ogori.fukuoka.jp":3,"okagaki.fukuoka.jp":3,"okawa.fukuoka.jp":3,"oki.fukuoka.jp":3,"omuta.fukuoka.jp":3,"onga.fukuoka.jp":3,"onojo.fukuoka.jp":3,"oto.fukuoka.jp":3,"saigawa.fukuoka.jp":3,"sasaguri.fukuoka.jp":3,"shingu.fukuoka.jp":3,"shinyoshitomi.fukuoka.jp":3,"shonai.fukuoka.jp":3,"soeda.fukuoka.jp":3,"sue.fukuoka.jp":3,"tachiarai.fukuoka.jp":3,"tagawa.fukuoka.jp":3,"takata.fukuoka.jp":3,"toho.fukuoka.jp":3,"toyotsu.fukuoka.jp":3,"tsuiki.fukuoka.jp":3,"ukiha.fukuoka.jp":3,"umi.fukuoka.jp":3,"usui.fukuoka.jp":3,"yamada.fukuoka.jp":3,"yame.fukuoka.jp":3,"yanagawa.fukuoka.jp":3,"yukuhashi.fukuoka.jp":3,"aizubange.fukushima.jp":3,"aizumisato.fukushima.jp":3,"aizuwakamatsu.fukushima.jp":3,"asakawa.fukushima.jp":3,"bandai.fukushima.jp":3,"date.fukushima.jp":3,"fukushima.fukushima.jp":3,"furudono.fukushima.jp":3,"futaba.fukushima.jp":3,"hanawa.fukushima.jp":3,"higashi.fukushima.jp":3,"hirata.fukushima.jp":3,"hirono.fukushima.jp":3,"iitate.fukushima.jp":3,"inawashiro.fukushima.jp":3,"ishikawa.fukushima.jp":3,"iwaki.fukushima.jp":3,"izumizaki.fukushima.jp":3,"kagamiishi.fukushima.jp":3,"kaneyama.fukushima.jp":3,"kawamata.fukushima.jp":3,"kitakata.fukushima.jp":3,"kitashiobara.fukushima.jp":3,"koori.fukushima.jp":3,"koriyama.fukushima.jp":3,"kunimi.fukushima.jp":3,"miharu.fukushima.jp":3,"mishima.fukushima.jp":3,"namie.fukushima.jp":3,"nango.fukushima.jp":3,"nishiaizu.fukushima.jp":3,"nishigo.fukushima.jp":3,"okuma.fukushima.jp":3,"omotego.fukushima.jp":3,"ono.fukushima.jp":3,"otama.fukushima.jp":3,"samegawa.fukushima.jp":3,"shimogo.fukushima.jp":3,"shirakawa.fukushima.jp":3,"showa.fukushima.jp":3,"soma.fukushima.jp":3,"sukagawa.fukushima.jp":3,"taishin.fukushima.jp":3,"tamakawa.fukushima.jp":3,"tanagura.fukushima.jp":3,"tenei.fukushima.jp":3,"yabuki.fukushima.jp":3,"yamato.fukushima.jp":3,"yamatsuri.fukushima.jp":3,"yanaizu.fukushima.jp":3,"yugawa.fukushima.jp":3,"anpachi.gifu.jp":3,"ena.gifu.jp":3,"gifu.gifu.jp":3,"ginan.gifu.jp":3,"godo.gifu.jp":3,"gujo.gifu.jp":3,"hashima.gifu.jp":3,"hichiso.gifu.jp":3,"hida.gifu.jp":3,"higashishirakawa.gifu.jp":3,"ibigawa.gifu.jp":3,"ikeda.gifu.jp":3,"kakamigahara.gifu.jp":3,"kani.gifu.jp":3,"kasahara.gifu.jp":3,"kasamatsu.gifu.jp":3,"kawaue.gifu.jp":3,"kitagata.gifu.jp":3,"mino.gifu.jp":3,"minokamo.gifu.jp":3,"mitake.gifu.jp":3,"mizunami.gifu.jp":3,"motosu.gifu.jp":3,"nakatsugawa.gifu.jp":3,"ogaki.gifu.jp":3,"sakahogi.gifu.jp":3,"seki.gifu.jp":3,"sekigahara.gifu.jp":3,"shirakawa.gifu.jp":3,"tajimi.gifu.jp":3,"takayama.gifu.jp":3,"tarui.gifu.jp":3,"toki.gifu.jp":3,"tomika.gifu.jp":3,"wanouchi.gifu.jp":3,"yamagata.gifu.jp":3,"yaotsu.gifu.jp":3,"yoro.gifu.jp":3,"annaka.gunma.jp":3,"chiyoda.gunma.jp":3,"fujioka.gunma.jp":3,"higashiagatsuma.gunma.jp":3,"isesaki.gunma.jp":3,"itakura.gunma.jp":3,"kanna.gunma.jp":3,"kanra.gunma.jp":3,"katashina.gunma.jp":3,"kawaba.gunma.jp":3,"kiryu.gunma.jp":3,"kusatsu.gunma.jp":3,"maebashi.gunma.jp":3,"meiwa.gunma.jp":3,"midori.gunma.jp":3,"minakami.gunma.jp":3,"naganohara.gunma.jp":3,"nakanojo.gunma.jp":3,"nanmoku.gunma.jp":3,"numata.gunma.jp":3,"oizumi.gunma.jp":3,"ora.gunma.jp":3,"ota.gunma.jp":3,"shibukawa.gunma.jp":3,"shimonita.gunma.jp":3,"shinto.gunma.jp":3,"showa.gunma.jp":3,"takasaki.gunma.jp":3,"takayama.gunma.jp":3,"tamamura.gunma.jp":3,"tatebayashi.gunma.jp":3,"tomioka.gunma.jp":3,"tsukiyono.gunma.jp":3,"tsumagoi.gunma.jp":3,"ueno.gunma.jp":3,"yoshioka.gunma.jp":3,"asaminami.hiroshima.jp":3,"daiwa.hiroshima.jp":3,"etajima.hiroshima.jp":3,"fuchu.hiroshima.jp":3,"fukuyama.hiroshima.jp":3,"hatsukaichi.hiroshima.jp":3,"higashihiroshima.hiroshima.jp":3,"hongo.hiroshima.jp":3,"jinsekikogen.hiroshima.jp":3,"kaita.hiroshima.jp":3,"kui.hiroshima.jp":3,"kumano.hiroshima.jp":3,"kure.hiroshima.jp":3,"mihara.hiroshima.jp":3,"miyoshi.hiroshima.jp":3,"naka.hiroshima.jp":3,"onomichi.hiroshima.jp":3,"osakikamijima.hiroshima.jp":3,"otake.hiroshima.jp":3,"saka.hiroshima.jp":3,"sera.hiroshima.jp":3,"seranishi.hiroshima.jp":3,"shinichi.hiroshima.jp":3,"shobara.hiroshima.jp":3,"takehara.hiroshima.jp":3,"abashiri.hokkaido.jp":3,"abira.hokkaido.jp":3,"aibetsu.hokkaido.jp":3,"akabira.hokkaido.jp":3,"akkeshi.hokkaido.jp":3,"asahikawa.hokkaido.jp":3,"ashibetsu.hokkaido.jp":3,"ashoro.hokkaido.jp":3,"assabu.hokkaido.jp":3,"atsuma.hokkaido.jp":3,"bibai.hokkaido.jp":3,"biei.hokkaido.jp":3,"bifuka.hokkaido.jp":3,"bihoro.hokkaido.jp":3,"biratori.hokkaido.jp":3,"chippubetsu.hokkaido.jp":3,"chitose.hokkaido.jp":3,"date.hokkaido.jp":3,"ebetsu.hokkaido.jp":3,"embetsu.hokkaido.jp":3,"eniwa.hokkaido.jp":3,"erimo.hokkaido.jp":3,"esan.hokkaido.jp":3,"esashi.hokkaido.jp":3,"fukagawa.hokkaido.jp":3,"fukushima.hokkaido.jp":3,"furano.hokkaido.jp":3,"furubira.hokkaido.jp":3,"haboro.hokkaido.jp":3,"hakodate.hokkaido.jp":3,"hamatonbetsu.hokkaido.jp":3,"hidaka.hokkaido.jp":3,"higashikagura.hokkaido.jp":3,"higashikawa.hokkaido.jp":3,"hiroo.hokkaido.jp":3,"hokuryu.hokkaido.jp":3,"hokuto.hokkaido.jp":3,"honbetsu.hokkaido.jp":3,"horokanai.hokkaido.jp":3,"horonobe.hokkaido.jp":3,"ikeda.hokkaido.jp":3,"imakane.hokkaido.jp":3,"ishikari.hokkaido.jp":3,"iwamizawa.hokkaido.jp":3,"iwanai.hokkaido.jp":3,"kamifurano.hokkaido.jp":3,"kamikawa.hokkaido.jp":3,"kamishihoro.hokkaido.jp":3,"kamisunagawa.hokkaido.jp":3,"kamoenai.hokkaido.jp":3,"kayabe.hokkaido.jp":3,"kembuchi.hokkaido.jp":3,"kikonai.hokkaido.jp":3,"kimobetsu.hokkaido.jp":3,"kitahiroshima.hokkaido.jp":3,"kitami.hokkaido.jp":3,"kiyosato.hokkaido.jp":3,"koshimizu.hokkaido.jp":3,"kunneppu.hokkaido.jp":3,"kuriyama.hokkaido.jp":3,"kuromatsunai.hokkaido.jp":3,"kushiro.hokkaido.jp":3,"kutchan.hokkaido.jp":3,"kyowa.hokkaido.jp":3,"mashike.hokkaido.jp":3,"matsumae.hokkaido.jp":3,"mikasa.hokkaido.jp":3,"minamifurano.hokkaido.jp":3,"mombetsu.hokkaido.jp":3,"moseushi.hokkaido.jp":3,"mukawa.hokkaido.jp":3,"muroran.hokkaido.jp":3,"naie.hokkaido.jp":3,"nakagawa.hokkaido.jp":3,"nakasatsunai.hokkaido.jp":3,"nakatombetsu.hokkaido.jp":3,"nanae.hokkaido.jp":3,"nanporo.hokkaido.jp":3,"nayoro.hokkaido.jp":3,"nemuro.hokkaido.jp":3,"niikappu.hokkaido.jp":3,"niki.hokkaido.jp":3,"nishiokoppe.hokkaido.jp":3,"noboribetsu.hokkaido.jp":3,"numata.hokkaido.jp":3,"obihiro.hokkaido.jp":3,"obira.hokkaido.jp":3,"oketo.hokkaido.jp":3,"okoppe.hokkaido.jp":3,"otaru.hokkaido.jp":3,"otobe.hokkaido.jp":3,"otofuke.hokkaido.jp":3,"otoineppu.hokkaido.jp":3,"oumu.hokkaido.jp":3,"ozora.hokkaido.jp":3,"pippu.hokkaido.jp":3,"rankoshi.hokkaido.jp":3,"rebun.hokkaido.jp":3,"rikubetsu.hokkaido.jp":3,"rishiri.hokkaido.jp":3,"rishirifuji.hokkaido.jp":3,"saroma.hokkaido.jp":3,"sarufutsu.hokkaido.jp":3,"shakotan.hokkaido.jp":3,"shari.hokkaido.jp":3,"shibecha.hokkaido.jp":3,"shibetsu.hokkaido.jp":3,"shikabe.hokkaido.jp":3,"shikaoi.hokkaido.jp":3,"shimamaki.hokkaido.jp":3,"shimizu.hokkaido.jp":3,"shimokawa.hokkaido.jp":3,"shinshinotsu.hokkaido.jp":3,"shintoku.hokkaido.jp":3,"shiranuka.hokkaido.jp":3,"shiraoi.hokkaido.jp":3,"shiriuchi.hokkaido.jp":3,"sobetsu.hokkaido.jp":3,"sunagawa.hokkaido.jp":3,"taiki.hokkaido.jp":3,"takasu.hokkaido.jp":3,"takikawa.hokkaido.jp":3,"takinoue.hokkaido.jp":3,"teshikaga.hokkaido.jp":3,"tobetsu.hokkaido.jp":3,"tohma.hokkaido.jp":3,"tomakomai.hokkaido.jp":3,"tomari.hokkaido.jp":3,"toya.hokkaido.jp":3,"toyako.hokkaido.jp":3,"toyotomi.hokkaido.jp":3,"toyoura.hokkaido.jp":3,"tsubetsu.hokkaido.jp":3,"tsukigata.hokkaido.jp":3,"urakawa.hokkaido.jp":3,"urausu.hokkaido.jp":3,"uryu.hokkaido.jp":3,"utashinai.hokkaido.jp":3,"wakkanai.hokkaido.jp":3,"wassamu.hokkaido.jp":3,"yakumo.hokkaido.jp":3,"yoichi.hokkaido.jp":3,"aioi.hyogo.jp":3,"akashi.hyogo.jp":3,"ako.hyogo.jp":3,"amagasaki.hyogo.jp":3,"aogaki.hyogo.jp":3,"asago.hyogo.jp":3,"ashiya.hyogo.jp":3,"awaji.hyogo.jp":3,"fukusaki.hyogo.jp":3,"goshiki.hyogo.jp":3,"harima.hyogo.jp":3,"himeji.hyogo.jp":3,"ichikawa.hyogo.jp":3,"inagawa.hyogo.jp":3,"itami.hyogo.jp":3,"kakogawa.hyogo.jp":3,"kamigori.hyogo.jp":3,"kamikawa.hyogo.jp":3,"kasai.hyogo.jp":3,"kasuga.hyogo.jp":3,"kawanishi.hyogo.jp":3,"miki.hyogo.jp":3,"minamiawaji.hyogo.jp":3,"nishinomiya.hyogo.jp":3,"nishiwaki.hyogo.jp":3,"ono.hyogo.jp":3,"sanda.hyogo.jp":3,"sannan.hyogo.jp":3,"sasayama.hyogo.jp":3,"sayo.hyogo.jp":3,"shingu.hyogo.jp":3,"shinonsen.hyogo.jp":3,"shiso.hyogo.jp":3,"sumoto.hyogo.jp":3,"taishi.hyogo.jp":3,"taka.hyogo.jp":3,"takarazuka.hyogo.jp":3,"takasago.hyogo.jp":3,"takino.hyogo.jp":3,"tamba.hyogo.jp":3,"tatsuno.hyogo.jp":3,"toyooka.hyogo.jp":3,"yabu.hyogo.jp":3,"yashiro.hyogo.jp":3,"yoka.hyogo.jp":3,"yokawa.hyogo.jp":3,"ami.ibaraki.jp":3,"asahi.ibaraki.jp":3,"bando.ibaraki.jp":3,"chikusei.ibaraki.jp":3,"daigo.ibaraki.jp":3,"fujishiro.ibaraki.jp":3,"hitachi.ibaraki.jp":3,"hitachinaka.ibaraki.jp":3,"hitachiomiya.ibaraki.jp":3,"hitachiota.ibaraki.jp":3,"ibaraki.ibaraki.jp":3,"ina.ibaraki.jp":3,"inashiki.ibaraki.jp":3,"itako.ibaraki.jp":3,"iwama.ibaraki.jp":3,"joso.ibaraki.jp":3,"kamisu.ibaraki.jp":3,"kasama.ibaraki.jp":3,"kashima.ibaraki.jp":3,"kasumigaura.ibaraki.jp":3,"koga.ibaraki.jp":3,"miho.ibaraki.jp":3,"mito.ibaraki.jp":3,"moriya.ibaraki.jp":3,"naka.ibaraki.jp":3,"namegata.ibaraki.jp":3,"oarai.ibaraki.jp":3,"ogawa.ibaraki.jp":3,"omitama.ibaraki.jp":3,"ryugasaki.ibaraki.jp":3,"sakai.ibaraki.jp":3,"sakuragawa.ibaraki.jp":3,"shimodate.ibaraki.jp":3,"shimotsuma.ibaraki.jp":3,"shirosato.ibaraki.jp":3,"sowa.ibaraki.jp":3,"suifu.ibaraki.jp":3,"takahagi.ibaraki.jp":3,"tamatsukuri.ibaraki.jp":3,"tokai.ibaraki.jp":3,"tomobe.ibaraki.jp":3,"tone.ibaraki.jp":3,"toride.ibaraki.jp":3,"tsuchiura.ibaraki.jp":3,"tsukuba.ibaraki.jp":3,"uchihara.ibaraki.jp":3,"ushiku.ibaraki.jp":3,"yachiyo.ibaraki.jp":3,"yamagata.ibaraki.jp":3,"yawara.ibaraki.jp":3,"yuki.ibaraki.jp":3,"anamizu.ishikawa.jp":3,"hakui.ishikawa.jp":3,"hakusan.ishikawa.jp":3,"kaga.ishikawa.jp":3,"kahoku.ishikawa.jp":3,"kanazawa.ishikawa.jp":3,"kawakita.ishikawa.jp":3,"komatsu.ishikawa.jp":3,"nakanoto.ishikawa.jp":3,"nanao.ishikawa.jp":3,"nomi.ishikawa.jp":3,"nonoichi.ishikawa.jp":3,"noto.ishikawa.jp":3,"shika.ishikawa.jp":3,"suzu.ishikawa.jp":3,"tsubata.ishikawa.jp":3,"tsurugi.ishikawa.jp":3,"uchinada.ishikawa.jp":3,"wajima.ishikawa.jp":3,"fudai.iwate.jp":3,"fujisawa.iwate.jp":3,"hanamaki.iwate.jp":3,"hiraizumi.iwate.jp":3,"hirono.iwate.jp":3,"ichinohe.iwate.jp":3,"ichinoseki.iwate.jp":3,"iwaizumi.iwate.jp":3,"iwate.iwate.jp":3,"joboji.iwate.jp":3,"kamaishi.iwate.jp":3,"kanegasaki.iwate.jp":3,"karumai.iwate.jp":3,"kawai.iwate.jp":3,"kitakami.iwate.jp":3,"kuji.iwate.jp":3,"kunohe.iwate.jp":3,"kuzumaki.iwate.jp":3,"miyako.iwate.jp":3,"mizusawa.iwate.jp":3,"morioka.iwate.jp":3,"ninohe.iwate.jp":3,"noda.iwate.jp":3,"ofunato.iwate.jp":3,"oshu.iwate.jp":3,"otsuchi.iwate.jp":3,"rikuzentakata.iwate.jp":3,"shiwa.iwate.jp":3,"shizukuishi.iwate.jp":3,"sumita.iwate.jp":3,"tanohata.iwate.jp":3,"tono.iwate.jp":3,"yahaba.iwate.jp":3,"yamada.iwate.jp":3,"ayagawa.kagawa.jp":3,"higashikagawa.kagawa.jp":3,"kanonji.kagawa.jp":3,"kotohira.kagawa.jp":3,"manno.kagawa.jp":3,"marugame.kagawa.jp":3,"mitoyo.kagawa.jp":3,"naoshima.kagawa.jp":3,"sanuki.kagawa.jp":3,"tadotsu.kagawa.jp":3,"takamatsu.kagawa.jp":3,"tonosho.kagawa.jp":3,"uchinomi.kagawa.jp":3,"utazu.kagawa.jp":3,"zentsuji.kagawa.jp":3,"akune.kagoshima.jp":3,"amami.kagoshima.jp":3,"hioki.kagoshima.jp":3,"isa.kagoshima.jp":3,"isen.kagoshima.jp":3,"izumi.kagoshima.jp":3,"kagoshima.kagoshima.jp":3,"kanoya.kagoshima.jp":3,"kawanabe.kagoshima.jp":3,"kinko.kagoshima.jp":3,"kouyama.kagoshima.jp":3,"makurazaki.kagoshima.jp":3,"matsumoto.kagoshima.jp":3,"minamitane.kagoshima.jp":3,"nakatane.kagoshima.jp":3,"nishinoomote.kagoshima.jp":3,"satsumasendai.kagoshima.jp":3,"soo.kagoshima.jp":3,"tarumizu.kagoshima.jp":3,"yusui.kagoshima.jp":3,"aikawa.kanagawa.jp":3,"atsugi.kanagawa.jp":3,"ayase.kanagawa.jp":3,"chigasaki.kanagawa.jp":3,"ebina.kanagawa.jp":3,"fujisawa.kanagawa.jp":3,"hadano.kanagawa.jp":3,"hakone.kanagawa.jp":3,"hiratsuka.kanagawa.jp":3,"isehara.kanagawa.jp":3,"kaisei.kanagawa.jp":3,"kamakura.kanagawa.jp":3,"kiyokawa.kanagawa.jp":3,"matsuda.kanagawa.jp":3,"minamiashigara.kanagawa.jp":3,"miura.kanagawa.jp":3,"nakai.kanagawa.jp":3,"ninomiya.kanagawa.jp":3,"odawara.kanagawa.jp":3,"oi.kanagawa.jp":3,"oiso.kanagawa.jp":3,"sagamihara.kanagawa.jp":3,"samukawa.kanagawa.jp":3,"tsukui.kanagawa.jp":3,"yamakita.kanagawa.jp":3,"yamato.kanagawa.jp":3,"yokosuka.kanagawa.jp":3,"yugawara.kanagawa.jp":3,"zama.kanagawa.jp":3,"zushi.kanagawa.jp":3,"aki.kochi.jp":3,"geisei.kochi.jp":3,"hidaka.kochi.jp":3,"higashitsuno.kochi.jp":3,"ino.kochi.jp":3,"kagami.kochi.jp":3,"kami.kochi.jp":3,"kitagawa.kochi.jp":3,"kochi.kochi.jp":3,"mihara.kochi.jp":3,"motoyama.kochi.jp":3,"muroto.kochi.jp":3,"nahari.kochi.jp":3,"nakamura.kochi.jp":3,"nankoku.kochi.jp":3,"nishitosa.kochi.jp":3,"niyodogawa.kochi.jp":3,"ochi.kochi.jp":3,"okawa.kochi.jp":3,"otoyo.kochi.jp":3,"otsuki.kochi.jp":3,"sakawa.kochi.jp":3,"sukumo.kochi.jp":3,"susaki.kochi.jp":3,"tosa.kochi.jp":3,"tosashimizu.kochi.jp":3,"toyo.kochi.jp":3,"tsuno.kochi.jp":3,"umaji.kochi.jp":3,"yasuda.kochi.jp":3,"yusuhara.kochi.jp":3,"amakusa.kumamoto.jp":3,"arao.kumamoto.jp":3,"aso.kumamoto.jp":3,"choyo.kumamoto.jp":3,"gyokuto.kumamoto.jp":3,"kamiamakusa.kumamoto.jp":3,"kikuchi.kumamoto.jp":3,"kumamoto.kumamoto.jp":3,"mashiki.kumamoto.jp":3,"mifune.kumamoto.jp":3,"minamata.kumamoto.jp":3,"minamioguni.kumamoto.jp":3,"nagasu.kumamoto.jp":3,"nishihara.kumamoto.jp":3,"oguni.kumamoto.jp":3,"ozu.kumamoto.jp":3,"sumoto.kumamoto.jp":3,"takamori.kumamoto.jp":3,"uki.kumamoto.jp":3,"uto.kumamoto.jp":3,"yamaga.kumamoto.jp":3,"yamato.kumamoto.jp":3,"yatsushiro.kumamoto.jp":3,"ayabe.kyoto.jp":3,"fukuchiyama.kyoto.jp":3,"higashiyama.kyoto.jp":3,"ide.kyoto.jp":3,"ine.kyoto.jp":3,"joyo.kyoto.jp":3,"kameoka.kyoto.jp":3,"kamo.kyoto.jp":3,"kita.kyoto.jp":3,"kizu.kyoto.jp":3,"kumiyama.kyoto.jp":3,"kyotamba.kyoto.jp":3,"kyotanabe.kyoto.jp":3,"kyotango.kyoto.jp":3,"maizuru.kyoto.jp":3,"minami.kyoto.jp":3,"minamiyamashiro.kyoto.jp":3,"miyazu.kyoto.jp":3,"muko.kyoto.jp":3,"nagaokakyo.kyoto.jp":3,"nakagyo.kyoto.jp":3,"nantan.kyoto.jp":3,"oyamazaki.kyoto.jp":3,"sakyo.kyoto.jp":3,"seika.kyoto.jp":3,"tanabe.kyoto.jp":3,"uji.kyoto.jp":3,"ujitawara.kyoto.jp":3,"wazuka.kyoto.jp":3,"yamashina.kyoto.jp":3,"yawata.kyoto.jp":3,"asahi.mie.jp":3,"inabe.mie.jp":3,"ise.mie.jp":3,"kameyama.mie.jp":3,"kawagoe.mie.jp":3,"kiho.mie.jp":3,"kisosaki.mie.jp":3,"kiwa.mie.jp":3,"komono.mie.jp":3,"kumano.mie.jp":3,"kuwana.mie.jp":3,"matsusaka.mie.jp":3,"meiwa.mie.jp":3,"mihama.mie.jp":3,"minamiise.mie.jp":3,"misugi.mie.jp":3,"miyama.mie.jp":3,"nabari.mie.jp":3,"shima.mie.jp":3,"suzuka.mie.jp":3,"tado.mie.jp":3,"taiki.mie.jp":3,"taki.mie.jp":3,"tamaki.mie.jp":3,"toba.mie.jp":3,"tsu.mie.jp":3,"udono.mie.jp":3,"ureshino.mie.jp":3,"watarai.mie.jp":3,"yokkaichi.mie.jp":3,"furukawa.miyagi.jp":3,"higashimatsushima.miyagi.jp":3,"ishinomaki.miyagi.jp":3,"iwanuma.miyagi.jp":3,"kakuda.miyagi.jp":3,"kami.miyagi.jp":3,"kawasaki.miyagi.jp":3,"marumori.miyagi.jp":3,"matsushima.miyagi.jp":3,"minamisanriku.miyagi.jp":3,"misato.miyagi.jp":3,"murata.miyagi.jp":3,"natori.miyagi.jp":3,"ogawara.miyagi.jp":3,"ohira.miyagi.jp":3,"onagawa.miyagi.jp":3,"osaki.miyagi.jp":3,"rifu.miyagi.jp":3,"semine.miyagi.jp":3,"shibata.miyagi.jp":3,"shichikashuku.miyagi.jp":3,"shikama.miyagi.jp":3,"shiogama.miyagi.jp":3,"shiroishi.miyagi.jp":3,"tagajo.miyagi.jp":3,"taiwa.miyagi.jp":3,"tome.miyagi.jp":3,"tomiya.miyagi.jp":3,"wakuya.miyagi.jp":3,"watari.miyagi.jp":3,"yamamoto.miyagi.jp":3,"zao.miyagi.jp":3,"aya.miyazaki.jp":3,"ebino.miyazaki.jp":3,"gokase.miyazaki.jp":3,"hyuga.miyazaki.jp":3,"kadogawa.miyazaki.jp":3,"kawaminami.miyazaki.jp":3,"kijo.miyazaki.jp":3,"kitagawa.miyazaki.jp":3,"kitakata.miyazaki.jp":3,"kitaura.miyazaki.jp":3,"kobayashi.miyazaki.jp":3,"kunitomi.miyazaki.jp":3,"kushima.miyazaki.jp":3,"mimata.miyazaki.jp":3,"miyakonojo.miyazaki.jp":3,"miyazaki.miyazaki.jp":3,"morotsuka.miyazaki.jp":3,"nichinan.miyazaki.jp":3,"nishimera.miyazaki.jp":3,"nobeoka.miyazaki.jp":3,"saito.miyazaki.jp":3,"shiiba.miyazaki.jp":3,"shintomi.miyazaki.jp":3,"takaharu.miyazaki.jp":3,"takanabe.miyazaki.jp":3,"takazaki.miyazaki.jp":3,"tsuno.miyazaki.jp":3,"achi.nagano.jp":3,"agematsu.nagano.jp":3,"anan.nagano.jp":3,"aoki.nagano.jp":3,"asahi.nagano.jp":3,"azumino.nagano.jp":3,"chikuhoku.nagano.jp":3,"chikuma.nagano.jp":3,"chino.nagano.jp":3,"fujimi.nagano.jp":3,"hakuba.nagano.jp":3,"hara.nagano.jp":3,"hiraya.nagano.jp":3,"iida.nagano.jp":3,"iijima.nagano.jp":3,"iiyama.nagano.jp":3,"iizuna.nagano.jp":3,"ikeda.nagano.jp":3,"ikusaka.nagano.jp":3,"ina.nagano.jp":3,"karuizawa.nagano.jp":3,"kawakami.nagano.jp":3,"kiso.nagano.jp":3,"kisofukushima.nagano.jp":3,"kitaaiki.nagano.jp":3,"komagane.nagano.jp":3,"komoro.nagano.jp":3,"matsukawa.nagano.jp":3,"matsumoto.nagano.jp":3,"miasa.nagano.jp":3,"minamiaiki.nagano.jp":3,"minamimaki.nagano.jp":3,"minamiminowa.nagano.jp":3,"minowa.nagano.jp":3,"miyada.nagano.jp":3,"miyota.nagano.jp":3,"mochizuki.nagano.jp":3,"nagano.nagano.jp":3,"nagawa.nagano.jp":3,"nagiso.nagano.jp":3,"nakagawa.nagano.jp":3,"nakano.nagano.jp":3,"nozawaonsen.nagano.jp":3,"obuse.nagano.jp":3,"ogawa.nagano.jp":3,"okaya.nagano.jp":3,"omachi.nagano.jp":3,"omi.nagano.jp":3,"ookuwa.nagano.jp":3,"ooshika.nagano.jp":3,"otaki.nagano.jp":3,"otari.nagano.jp":3,"sakae.nagano.jp":3,"sakaki.nagano.jp":3,"saku.nagano.jp":3,"sakuho.nagano.jp":3,"shimosuwa.nagano.jp":3,"shinanomachi.nagano.jp":3,"shiojiri.nagano.jp":3,"suwa.nagano.jp":3,"suzaka.nagano.jp":3,"takagi.nagano.jp":3,"takamori.nagano.jp":3,"takayama.nagano.jp":3,"tateshina.nagano.jp":3,"tatsuno.nagano.jp":3,"togakushi.nagano.jp":3,"togura.nagano.jp":3,"tomi.nagano.jp":3,"ueda.nagano.jp":3,"wada.nagano.jp":3,"yamagata.nagano.jp":3,"yamanouchi.nagano.jp":3,"yasaka.nagano.jp":3,"yasuoka.nagano.jp":3,"chijiwa.nagasaki.jp":3,"futsu.nagasaki.jp":3,"goto.nagasaki.jp":3,"hasami.nagasaki.jp":3,"hirado.nagasaki.jp":3,"iki.nagasaki.jp":3,"isahaya.nagasaki.jp":3,"kawatana.nagasaki.jp":3,"kuchinotsu.nagasaki.jp":3,"matsuura.nagasaki.jp":3,"nagasaki.nagasaki.jp":3,"obama.nagasaki.jp":3,"omura.nagasaki.jp":3,"oseto.nagasaki.jp":3,"saikai.nagasaki.jp":3,"sasebo.nagasaki.jp":3,"seihi.nagasaki.jp":3,"shimabara.nagasaki.jp":3,"shinkamigoto.nagasaki.jp":3,"togitsu.nagasaki.jp":3,"tsushima.nagasaki.jp":3,"unzen.nagasaki.jp":3,"ando.nara.jp":3,"gose.nara.jp":3,"heguri.nara.jp":3,"higashiyoshino.nara.jp":3,"ikaruga.nara.jp":3,"ikoma.nara.jp":3,"kamikitayama.nara.jp":3,"kanmaki.nara.jp":3,"kashiba.nara.jp":3,"kashihara.nara.jp":3,"katsuragi.nara.jp":3,"kawai.nara.jp":3,"kawakami.nara.jp":3,"kawanishi.nara.jp":3,"koryo.nara.jp":3,"kurotaki.nara.jp":3,"mitsue.nara.jp":3,"miyake.nara.jp":3,"nara.nara.jp":3,"nosegawa.nara.jp":3,"oji.nara.jp":3,"ouda.nara.jp":3,"oyodo.nara.jp":3,"sakurai.nara.jp":3,"sango.nara.jp":3,"shimoichi.nara.jp":3,"shimokitayama.nara.jp":3,"shinjo.nara.jp":3,"soni.nara.jp":3,"takatori.nara.jp":3,"tawaramoto.nara.jp":3,"tenkawa.nara.jp":3,"tenri.nara.jp":3,"uda.nara.jp":3,"yamatokoriyama.nara.jp":3,"yamatotakada.nara.jp":3,"yamazoe.nara.jp":3,"yoshino.nara.jp":3,"aga.niigata.jp":3,"agano.niigata.jp":3,"gosen.niigata.jp":3,"itoigawa.niigata.jp":3,"izumozaki.niigata.jp":3,"joetsu.niigata.jp":3,"kamo.niigata.jp":3,"kariwa.niigata.jp":3,"kashiwazaki.niigata.jp":3,"minamiuonuma.niigata.jp":3,"mitsuke.niigata.jp":3,"muika.niigata.jp":3,"murakami.niigata.jp":3,"myoko.niigata.jp":3,"nagaoka.niigata.jp":3,"niigata.niigata.jp":3,"ojiya.niigata.jp":3,"omi.niigata.jp":3,"sado.niigata.jp":3,"sanjo.niigata.jp":3,"seiro.niigata.jp":3,"seirou.niigata.jp":3,"sekikawa.niigata.jp":3,"shibata.niigata.jp":3,"tagami.niigata.jp":3,"tainai.niigata.jp":3,"tochio.niigata.jp":3,"tokamachi.niigata.jp":3,"tsubame.niigata.jp":3,"tsunan.niigata.jp":3,"uonuma.niigata.jp":3,"yahiko.niigata.jp":3,"yoita.niigata.jp":3,"yuzawa.niigata.jp":3,"beppu.oita.jp":3,"bungoono.oita.jp":3,"bungotakada.oita.jp":3,"hasama.oita.jp":3,"hiji.oita.jp":3,"himeshima.oita.jp":3,"hita.oita.jp":3,"kamitsue.oita.jp":3,"kokonoe.oita.jp":3,"kuju.oita.jp":3,"kunisaki.oita.jp":3,"kusu.oita.jp":3,"oita.oita.jp":3,"saiki.oita.jp":3,"taketa.oita.jp":3,"tsukumi.oita.jp":3,"usa.oita.jp":3,"usuki.oita.jp":3,"yufu.oita.jp":3,"akaiwa.okayama.jp":3,"asakuchi.okayama.jp":3,"bizen.okayama.jp":3,"hayashima.okayama.jp":3,"ibara.okayama.jp":3,"kagamino.okayama.jp":3,"kasaoka.okayama.jp":3,"kibichuo.okayama.jp":3,"kumenan.okayama.jp":3,"kurashiki.okayama.jp":3,"maniwa.okayama.jp":3,"misaki.okayama.jp":3,"nagi.okayama.jp":3,"niimi.okayama.jp":3,"nishiawakura.okayama.jp":3,"okayama.okayama.jp":3,"satosho.okayama.jp":3,"setouchi.okayama.jp":3,"shinjo.okayama.jp":3,"shoo.okayama.jp":3,"soja.okayama.jp":3,"takahashi.okayama.jp":3,"tamano.okayama.jp":3,"tsuyama.okayama.jp":3,"wake.okayama.jp":3,"yakage.okayama.jp":3,"aguni.okinawa.jp":3,"ginowan.okinawa.jp":3,"ginoza.okinawa.jp":3,"gushikami.okinawa.jp":3,"haebaru.okinawa.jp":3,"higashi.okinawa.jp":3,"hirara.okinawa.jp":3,"iheya.okinawa.jp":3,"ishigaki.okinawa.jp":3,"ishikawa.okinawa.jp":3,"itoman.okinawa.jp":3,"izena.okinawa.jp":3,"kadena.okinawa.jp":3,"kin.okinawa.jp":3,"kitadaito.okinawa.jp":3,"kitanakagusuku.okinawa.jp":3,"kumejima.okinawa.jp":3,"kunigami.okinawa.jp":3,"minamidaito.okinawa.jp":3,"motobu.okinawa.jp":3,"nago.okinawa.jp":3,"naha.okinawa.jp":3,"nakagusuku.okinawa.jp":3,"nakijin.okinawa.jp":3,"nanjo.okinawa.jp":3,"nishihara.okinawa.jp":3,"ogimi.okinawa.jp":3,"okinawa.okinawa.jp":3,"onna.okinawa.jp":3,"shimoji.okinawa.jp":3,"taketomi.okinawa.jp":3,"tarama.okinawa.jp":3,"tokashiki.okinawa.jp":3,"tomigusuku.okinawa.jp":3,"tonaki.okinawa.jp":3,"urasoe.okinawa.jp":3,"uruma.okinawa.jp":3,"yaese.okinawa.jp":3,"yomitan.okinawa.jp":3,"yonabaru.okinawa.jp":3,"yonaguni.okinawa.jp":3,"zamami.okinawa.jp":3,"abeno.osaka.jp":3,"chihayaakasaka.osaka.jp":3,"chuo.osaka.jp":3,"daito.osaka.jp":3,"fujiidera.osaka.jp":3,"habikino.osaka.jp":3,"hannan.osaka.jp":3,"higashiosaka.osaka.jp":3,"higashisumiyoshi.osaka.jp":3,"higashiyodogawa.osaka.jp":3,"hirakata.osaka.jp":3,"ibaraki.osaka.jp":3,"ikeda.osaka.jp":3,"izumi.osaka.jp":3,"izumiotsu.osaka.jp":3,"izumisano.osaka.jp":3,"kadoma.osaka.jp":3,"kaizuka.osaka.jp":3,"kanan.osaka.jp":3,"kashiwara.osaka.jp":3,"katano.osaka.jp":3,"kawachinagano.osaka.jp":3,"kishiwada.osaka.jp":3,"kita.osaka.jp":3,"kumatori.osaka.jp":3,"matsubara.osaka.jp":3,"minato.osaka.jp":3,"minoh.osaka.jp":3,"misaki.osaka.jp":3,"moriguchi.osaka.jp":3,"neyagawa.osaka.jp":3,"nishi.osaka.jp":3,"nose.osaka.jp":3,"osakasayama.osaka.jp":3,"sakai.osaka.jp":3,"sayama.osaka.jp":3,"sennan.osaka.jp":3,"settsu.osaka.jp":3,"shijonawate.osaka.jp":3,"shimamoto.osaka.jp":3,"suita.osaka.jp":3,"tadaoka.osaka.jp":3,"taishi.osaka.jp":3,"tajiri.osaka.jp":3,"takaishi.osaka.jp":3,"takatsuki.osaka.jp":3,"tondabayashi.osaka.jp":3,"toyonaka.osaka.jp":3,"toyono.osaka.jp":3,"yao.osaka.jp":3,"ariake.saga.jp":3,"arita.saga.jp":3,"fukudomi.saga.jp":3,"genkai.saga.jp":3,"hamatama.saga.jp":3,"hizen.saga.jp":3,"imari.saga.jp":3,"kamimine.saga.jp":3,"kanzaki.saga.jp":3,"karatsu.saga.jp":3,"kashima.saga.jp":3,"kitagata.saga.jp":3,"kitahata.saga.jp":3,"kiyama.saga.jp":3,"kouhoku.saga.jp":3,"kyuragi.saga.jp":3,"nishiarita.saga.jp":3,"ogi.saga.jp":3,"omachi.saga.jp":3,"ouchi.saga.jp":3,"saga.saga.jp":3,"shiroishi.saga.jp":3,"taku.saga.jp":3,"tara.saga.jp":3,"tosu.saga.jp":3,"yoshinogari.saga.jp":3,"arakawa.saitama.jp":3,"asaka.saitama.jp":3,"chichibu.saitama.jp":3,"fujimi.saitama.jp":3,"fujimino.saitama.jp":3,"fukaya.saitama.jp":3,"hanno.saitama.jp":3,"hanyu.saitama.jp":3,"hasuda.saitama.jp":3,"hatogaya.saitama.jp":3,"hatoyama.saitama.jp":3,"hidaka.saitama.jp":3,"higashichichibu.saitama.jp":3,"higashimatsuyama.saitama.jp":3,"honjo.saitama.jp":3,"ina.saitama.jp":3,"iruma.saitama.jp":3,"iwatsuki.saitama.jp":3,"kamiizumi.saitama.jp":3,"kamikawa.saitama.jp":3,"kamisato.saitama.jp":3,"kasukabe.saitama.jp":3,"kawagoe.saitama.jp":3,"kawaguchi.saitama.jp":3,"kawajima.saitama.jp":3,"kazo.saitama.jp":3,"kitamoto.saitama.jp":3,"koshigaya.saitama.jp":3,"kounosu.saitama.jp":3,"kuki.saitama.jp":3,"kumagaya.saitama.jp":3,"matsubushi.saitama.jp":3,"minano.saitama.jp":3,"misato.saitama.jp":3,"miyashiro.saitama.jp":3,"miyoshi.saitama.jp":3,"moroyama.saitama.jp":3,"nagatoro.saitama.jp":3,"namegawa.saitama.jp":3,"niiza.saitama.jp":3,"ogano.saitama.jp":3,"ogawa.saitama.jp":3,"ogose.saitama.jp":3,"okegawa.saitama.jp":3,"omiya.saitama.jp":3,"otaki.saitama.jp":3,"ranzan.saitama.jp":3,"ryokami.saitama.jp":3,"saitama.saitama.jp":3,"sakado.saitama.jp":3,"satte.saitama.jp":3,"sayama.saitama.jp":3,"shiki.saitama.jp":3,"shiraoka.saitama.jp":3,"soka.saitama.jp":3,"sugito.saitama.jp":3,"toda.saitama.jp":3,"tokigawa.saitama.jp":3,"tokorozawa.saitama.jp":3,"tsurugashima.saitama.jp":3,"urawa.saitama.jp":3,"warabi.saitama.jp":3,"yashio.saitama.jp":3,"yokoze.saitama.jp":3,"yono.saitama.jp":3,"yorii.saitama.jp":3,"yoshida.saitama.jp":3,"yoshikawa.saitama.jp":3,"yoshimi.saitama.jp":3,"aisho.shiga.jp":3,"gamo.shiga.jp":3,"higashiomi.shiga.jp":3,"hikone.shiga.jp":3,"koka.shiga.jp":3,"konan.shiga.jp":3,"kosei.shiga.jp":3,"koto.shiga.jp":3,"kusatsu.shiga.jp":3,"maibara.shiga.jp":3,"moriyama.shiga.jp":3,"nagahama.shiga.jp":3,"nishiazai.shiga.jp":3,"notogawa.shiga.jp":3,"omihachiman.shiga.jp":3,"otsu.shiga.jp":3,"ritto.shiga.jp":3,"ryuoh.shiga.jp":3,"takashima.shiga.jp":3,"takatsuki.shiga.jp":3,"torahime.shiga.jp":3,"toyosato.shiga.jp":3,"yasu.shiga.jp":3,"akagi.shimane.jp":3,"ama.shimane.jp":3,"gotsu.shimane.jp":3,"hamada.shimane.jp":3,"higashiizumo.shimane.jp":3,"hikawa.shimane.jp":3,"hikimi.shimane.jp":3,"izumo.shimane.jp":3,"kakinoki.shimane.jp":3,"masuda.shimane.jp":3,"matsue.shimane.jp":3,"misato.shimane.jp":3,"nishinoshima.shimane.jp":3,"ohda.shimane.jp":3,"okinoshima.shimane.jp":3,"okuizumo.shimane.jp":3,"shimane.shimane.jp":3,"tamayu.shimane.jp":3,"tsuwano.shimane.jp":3,"unnan.shimane.jp":3,"yakumo.shimane.jp":3,"yasugi.shimane.jp":3,"yatsuka.shimane.jp":3,"arai.shizuoka.jp":3,"atami.shizuoka.jp":3,"fuji.shizuoka.jp":3,"fujieda.shizuoka.jp":3,"fujikawa.shizuoka.jp":3,"fujinomiya.shizuoka.jp":3,"fukuroi.shizuoka.jp":3,"gotemba.shizuoka.jp":3,"haibara.shizuoka.jp":3,"hamamatsu.shizuoka.jp":3,"higashiizu.shizuoka.jp":3,"ito.shizuoka.jp":3,"iwata.shizuoka.jp":3,"izu.shizuoka.jp":3,"izunokuni.shizuoka.jp":3,"kakegawa.shizuoka.jp":3,"kannami.shizuoka.jp":3,"kawanehon.shizuoka.jp":3,"kawazu.shizuoka.jp":3,"kikugawa.shizuoka.jp":3,"kosai.shizuoka.jp":3,"makinohara.shizuoka.jp":3,"matsuzaki.shizuoka.jp":3,"minamiizu.shizuoka.jp":3,"mishima.shizuoka.jp":3,"morimachi.shizuoka.jp":3,"nishiizu.shizuoka.jp":3,"numazu.shizuoka.jp":3,"omaezaki.shizuoka.jp":3,"shimada.shizuoka.jp":3,"shimizu.shizuoka.jp":3,"shimoda.shizuoka.jp":3,"shizuoka.shizuoka.jp":3,"susono.shizuoka.jp":3,"yaizu.shizuoka.jp":3,"yoshida.shizuoka.jp":3,"ashikaga.tochigi.jp":3,"bato.tochigi.jp":3,"haga.tochigi.jp":3,"ichikai.tochigi.jp":3,"iwafune.tochigi.jp":3,"kaminokawa.tochigi.jp":3,"kanuma.tochigi.jp":3,"karasuyama.tochigi.jp":3,"kuroiso.tochigi.jp":3,"mashiko.tochigi.jp":3,"mibu.tochigi.jp":3,"moka.tochigi.jp":3,"motegi.tochigi.jp":3,"nasu.tochigi.jp":3,"nasushiobara.tochigi.jp":3,"nikko.tochigi.jp":3,"nishikata.tochigi.jp":3,"nogi.tochigi.jp":3,"ohira.tochigi.jp":3,"ohtawara.tochigi.jp":3,"oyama.tochigi.jp":3,"sakura.tochigi.jp":3,"sano.tochigi.jp":3,"shimotsuke.tochigi.jp":3,"shioya.tochigi.jp":3,"takanezawa.tochigi.jp":3,"tochigi.tochigi.jp":3,"tsuga.tochigi.jp":3,"ujiie.tochigi.jp":3,"utsunomiya.tochigi.jp":3,"yaita.tochigi.jp":3,"aizumi.tokushima.jp":3,"anan.tokushima.jp":3,"ichiba.tokushima.jp":3,"itano.tokushima.jp":3,"kainan.tokushima.jp":3,"komatsushima.tokushima.jp":3,"matsushige.tokushima.jp":3,"mima.tokushima.jp":3,"minami.tokushima.jp":3,"miyoshi.tokushima.jp":3,"mugi.tokushima.jp":3,"nakagawa.tokushima.jp":3,"naruto.tokushima.jp":3,"sanagochi.tokushima.jp":3,"shishikui.tokushima.jp":3,"tokushima.tokushima.jp":3,"wajiki.tokushima.jp":3,"adachi.tokyo.jp":3,"akiruno.tokyo.jp":3,"akishima.tokyo.jp":3,"aogashima.tokyo.jp":3,"arakawa.tokyo.jp":3,"bunkyo.tokyo.jp":3,"chiyoda.tokyo.jp":3,"chofu.tokyo.jp":3,"chuo.tokyo.jp":3,"edogawa.tokyo.jp":3,"fuchu.tokyo.jp":3,"fussa.tokyo.jp":3,"hachijo.tokyo.jp":3,"hachioji.tokyo.jp":3,"hamura.tokyo.jp":3,"higashikurume.tokyo.jp":3,"higashimurayama.tokyo.jp":3,"higashiyamato.tokyo.jp":3,"hino.tokyo.jp":3,"hinode.tokyo.jp":3,"hinohara.tokyo.jp":3,"inagi.tokyo.jp":3,"itabashi.tokyo.jp":3,"katsushika.tokyo.jp":3,"kita.tokyo.jp":3,"kiyose.tokyo.jp":3,"kodaira.tokyo.jp":3,"koganei.tokyo.jp":3,"kokubunji.tokyo.jp":3,"komae.tokyo.jp":3,"koto.tokyo.jp":3,"kouzushima.tokyo.jp":3,"kunitachi.tokyo.jp":3,"machida.tokyo.jp":3,"meguro.tokyo.jp":3,"minato.tokyo.jp":3,"mitaka.tokyo.jp":3,"mizuho.tokyo.jp":3,"musashimurayama.tokyo.jp":3,"musashino.tokyo.jp":3,"nakano.tokyo.jp":3,"nerima.tokyo.jp":3,"ogasawara.tokyo.jp":3,"okutama.tokyo.jp":3,"ome.tokyo.jp":3,"oshima.tokyo.jp":3,"ota.tokyo.jp":3,"setagaya.tokyo.jp":3,"shibuya.tokyo.jp":3,"shinagawa.tokyo.jp":3,"shinjuku.tokyo.jp":3,"suginami.tokyo.jp":3,"sumida.tokyo.jp":3,"tachikawa.tokyo.jp":3,"taito.tokyo.jp":3,"tama.tokyo.jp":3,"toshima.tokyo.jp":3,"chizu.tottori.jp":3,"hino.tottori.jp":3,"kawahara.tottori.jp":3,"koge.tottori.jp":3,"kotoura.tottori.jp":3,"misasa.tottori.jp":3,"nanbu.tottori.jp":3,"nichinan.tottori.jp":3,"sakaiminato.tottori.jp":3,"tottori.tottori.jp":3,"wakasa.tottori.jp":3,"yazu.tottori.jp":3,"yonago.tottori.jp":3,"asahi.toyama.jp":3,"fuchu.toyama.jp":3,"fukumitsu.toyama.jp":3,"funahashi.toyama.jp":3,"himi.toyama.jp":3,"imizu.toyama.jp":3,"inami.toyama.jp":3,"johana.toyama.jp":3,"kamiichi.toyama.jp":3,"kurobe.toyama.jp":3,"nakaniikawa.toyama.jp":3,"namerikawa.toyama.jp":3,"nanto.toyama.jp":3,"nyuzen.toyama.jp":3,"oyabe.toyama.jp":3,"taira.toyama.jp":3,"takaoka.toyama.jp":3,"tateyama.toyama.jp":3,"toga.toyama.jp":3,"tonami.toyama.jp":3,"toyama.toyama.jp":3,"unazuki.toyama.jp":3,"uozu.toyama.jp":3,"yamada.toyama.jp":3,"arida.wakayama.jp":3,"aridagawa.wakayama.jp":3,"gobo.wakayama.jp":3,"hashimoto.wakayama.jp":3,"hidaka.wakayama.jp":3,"hirogawa.wakayama.jp":3,"inami.wakayama.jp":3,"iwade.wakayama.jp":3,"kainan.wakayama.jp":3,"kamitonda.wakayama.jp":3,"katsuragi.wakayama.jp":3,"kimino.wakayama.jp":3,"kinokawa.wakayama.jp":3,"kitayama.wakayama.jp":3,"koya.wakayama.jp":3,"koza.wakayama.jp":3,"kozagawa.wakayama.jp":3,"kudoyama.wakayama.jp":3,"kushimoto.wakayama.jp":3,"mihama.wakayama.jp":3,"misato.wakayama.jp":3,"nachikatsuura.wakayama.jp":3,"shingu.wakayama.jp":3,"shirahama.wakayama.jp":3,"taiji.wakayama.jp":3,"tanabe.wakayama.jp":3,"wakayama.wakayama.jp":3,"yuasa.wakayama.jp":3,"yura.wakayama.jp":3,"asahi.yamagata.jp":3,"funagata.yamagata.jp":3,"higashine.yamagata.jp":3,"iide.yamagata.jp":3,"kahoku.yamagata.jp":3,"kaminoyama.yamagata.jp":3,"kaneyama.yamagata.jp":3,"kawanishi.yamagata.jp":3,"mamurogawa.yamagata.jp":3,"mikawa.yamagata.jp":3,"murayama.yamagata.jp":3,"nagai.yamagata.jp":3,"nakayama.yamagata.jp":3,"nanyo.yamagata.jp":3,"nishikawa.yamagata.jp":3,"obanazawa.yamagata.jp":3,"oe.yamagata.jp":3,"oguni.yamagata.jp":3,"ohkura.yamagata.jp":3,"oishida.yamagata.jp":3,"sagae.yamagata.jp":3,"sakata.yamagata.jp":3,"sakegawa.yamagata.jp":3,"shinjo.yamagata.jp":3,"shirataka.yamagata.jp":3,"shonai.yamagata.jp":3,"takahata.yamagata.jp":3,"tendo.yamagata.jp":3,"tozawa.yamagata.jp":3,"tsuruoka.yamagata.jp":3,"yamagata.yamagata.jp":3,"yamanobe.yamagata.jp":3,"yonezawa.yamagata.jp":3,"yuza.yamagata.jp":3,"abu.yamaguchi.jp":3,"hagi.yamaguchi.jp":3,"hikari.yamaguchi.jp":3,"hofu.yamaguchi.jp":3,"iwakuni.yamaguchi.jp":3,"kudamatsu.yamaguchi.jp":3,"mitou.yamaguchi.jp":3,"nagato.yamaguchi.jp":3,"oshima.yamaguchi.jp":3,"shimonoseki.yamaguchi.jp":3,"shunan.yamaguchi.jp":3,"tabuse.yamaguchi.jp":3,"tokuyama.yamaguchi.jp":3,"toyota.yamaguchi.jp":3,"ube.yamaguchi.jp":3,"yuu.yamaguchi.jp":3,"chuo.yamanashi.jp":3,"doshi.yamanashi.jp":3,"fuefuki.yamanashi.jp":3,"fujikawa.yamanashi.jp":3,"fujikawaguchiko.yamanashi.jp":3,"fujiyoshida.yamanashi.jp":3,"hayakawa.yamanashi.jp":3,"hokuto.yamanashi.jp":3,"ichikawamisato.yamanashi.jp":3,"kai.yamanashi.jp":3,"kofu.yamanashi.jp":3,"koshu.yamanashi.jp":3,"kosuge.yamanashi.jp":3,"minami-alps.yamanashi.jp":3,"minobu.yamanashi.jp":3,"nakamichi.yamanashi.jp":3,"nanbu.yamanashi.jp":3,"narusawa.yamanashi.jp":3,"nirasaki.yamanashi.jp":3,"nishikatsura.yamanashi.jp":3,"oshino.yamanashi.jp":3,"otsuki.yamanashi.jp":3,"showa.yamanashi.jp":3,"tabayama.yamanashi.jp":3,"tsuru.yamanashi.jp":3,"uenohara.yamanashi.jp":3,"yamanakako.yamanashi.jp":3,"yamanashi.yamanashi.jp":3,"ke":1,"ac.ke":2,"co.ke":2,"go.ke":2,"info.ke":2,"me.ke":2,"mobi.ke":2,"ne.ke":2,"or.ke":2,"sc.ke":2,"kg":1,"org.kg":2,"net.kg":2,"com.kg":2,"edu.kg":2,"gov.kg":2,"mil.kg":2,"kh":2,"ki":1,"edu.ki":2,"biz.ki":2,"net.ki":2,"org.ki":2,"gov.ki":2,"info.ki":2,"com.ki":2,"km":1,"org.km":2,"nom.km":2,"gov.km":2,"prd.km":2,"tm.km":2,"edu.km":2,"mil.km":2,"ass.km":2,"com.km":2,"coop.km":2,"asso.km":2,"presse.km":2,"medecin.km":2,"notaires.km":2,"pharmaciens.km":2,"veterinaire.km":2,"gouv.km":2,"kn":1,"net.kn":2,"org.kn":2,"edu.kn":2,"gov.kn":2,"kp":1,"com.kp":2,"edu.kp":2,"gov.kp":2,"org.kp":2,"rep.kp":2,"tra.kp":2,"kr":1,"ac.kr":2,"co.kr":2,"es.kr":2,"go.kr":2,"hs.kr":2,"kg.kr":2,"mil.kr":2,"ms.kr":2,"ne.kr":2,"or.kr":2,"pe.kr":2,"re.kr":2,"sc.kr":2,"busan.kr":2,"chungbuk.kr":2,"chungnam.kr":2,"daegu.kr":2,"daejeon.kr":2,"gangwon.kr":2,"gwangju.kr":2,"gyeongbuk.kr":2,"gyeonggi.kr":2,"gyeongnam.kr":2,"incheon.kr":2,"jeju.kr":2,"jeonbuk.kr":2,"jeonnam.kr":2,"seoul.kr":2,"ulsan.kr":2,"kw":1,"com.kw":2,"edu.kw":2,"emb.kw":2,"gov.kw":2,"ind.kw":2,"net.kw":2,"org.kw":2,"ky":1,"com.ky":2,"edu.ky":2,"net.ky":2,"org.ky":2,"kz":1,"org.kz":2,"edu.kz":2,"net.kz":2,"gov.kz":2,"mil.kz":2,"com.kz":2,"la":1,"int.la":2,"net.la":2,"info.la":2,"edu.la":2,"gov.la":2,"per.la":2,"com.la":2,"org.la":2,"lb":1,"com.lb":2,"edu.lb":2,"gov.lb":2,"net.lb":2,"org.lb":2,"lc":1,"com.lc":2,"net.lc":2,"co.lc":2,"org.lc":2,"edu.lc":2,"gov.lc":2,"li":1,"lk":1,"gov.lk":2,"sch.lk":2,"net.lk":2,"int.lk":2,"com.lk":2,"org.lk":2,"edu.lk":2,"ngo.lk":2,"soc.lk":2,"web.lk":2,"ltd.lk":2,"assn.lk":2,"grp.lk":2,"hotel.lk":2,"ac.lk":2,"lr":1,"com.lr":2,"edu.lr":2,"gov.lr":2,"org.lr":2,"net.lr":2,"ls":1,"ac.ls":2,"biz.ls":2,"co.ls":2,"edu.ls":2,"gov.ls":2,"info.ls":2,"net.ls":2,"org.ls":2,"sc.ls":2,"lt":1,"gov.lt":2,"lu":1,"lv":1,"com.lv":2,"edu.lv":2,"gov.lv":2,"org.lv":2,"mil.lv":2,"id.lv":2,"net.lv":2,"asn.lv":2,"conf.lv":2,"ly":1,"com.ly":2,"net.ly":2,"gov.ly":2,"plc.ly":2,"edu.ly":2,"sch.ly":2,"med.ly":2,"org.ly":2,"id.ly":2,"ma":1,"co.ma":2,"net.ma":2,"gov.ma":2,"org.ma":2,"ac.ma":2,"press.ma":2,"mc":1,"tm.mc":2,"asso.mc":2,"md":1,"me":1,"co.me":2,"net.me":2,"org.me":2,"edu.me":2,"ac.me":2,"gov.me":2,"its.me":2,"priv.me":2,"mg":1,"org.mg":2,"nom.mg":2,"gov.mg":2,"prd.mg":2,"tm.mg":2,"edu.mg":2,"mil.mg":2,"com.mg":2,"co.mg":2,"mh":1,"mil":1,"mk":1,"com.mk":2,"org.mk":2,"net.mk":2,"edu.mk":2,"gov.mk":2,"inf.mk":2,"name.mk":2,"ml":1,"com.ml":2,"edu.ml":2,"gouv.ml":2,"gov.ml":2,"net.ml":2,"org.ml":2,"presse.ml":2,"mm":2,"mn":1,"gov.mn":2,"edu.mn":2,"org.mn":2,"mo":1,"com.mo":2,"net.mo":2,"org.mo":2,"edu.mo":2,"gov.mo":2,"mobi":1,"mp":1,"mq":1,"mr":1,"gov.mr":2,"ms":1,"com.ms":2,"edu.ms":2,"gov.ms":2,"net.ms":2,"org.ms":2,"mt":1,"com.mt":2,"edu.mt":2,"net.mt":2,"org.mt":2,"mu":1,"com.mu":2,"net.mu":2,"org.mu":2,"gov.mu":2,"ac.mu":2,"co.mu":2,"or.mu":2,"museum":1,"mv":1,"aero.mv":2,"biz.mv":2,"com.mv":2,"coop.mv":2,"edu.mv":2,"gov.mv":2,"info.mv":2,"int.mv":2,"mil.mv":2,"museum.mv":2,"name.mv":2,"net.mv":2,"org.mv":2,"pro.mv":2,"mw":1,"ac.mw":2,"biz.mw":2,"co.mw":2,"com.mw":2,"coop.mw":2,"edu.mw":2,"gov.mw":2,"int.mw":2,"museum.mw":2,"net.mw":2,"org.mw":2,"mx":1,"com.mx":2,"org.mx":2,"gob.mx":2,"edu.mx":2,"net.mx":2,"my":1,"biz.my":2,"com.my":2,"edu.my":2,"gov.my":2,"mil.my":2,"name.my":2,"net.my":2,"org.my":2,"mz":1,"ac.mz":2,"adv.mz":2,"co.mz":2,"edu.mz":2,"gov.mz":2,"mil.mz":2,"net.mz":2,"org.mz":2,"na":1,"info.na":2,"pro.na":2,"name.na":2,"school.na":2,"or.na":2,"dr.na":2,"us.na":2,"mx.na":2,"ca.na":2,"in.na":2,"cc.na":2,"tv.na":2,"ws.na":2,"mobi.na":2,"co.na":2,"com.na":2,"org.na":2,"name":1,"nc":1,"asso.nc":2,"nom.nc":2,"ne":1,"net":1,"nf":1,"com.nf":2,"net.nf":2,"per.nf":2,"rec.nf":2,"web.nf":2,"arts.nf":2,"firm.nf":2,"info.nf":2,"other.nf":2,"store.nf":2,"ng":1,"com.ng":2,"edu.ng":2,"gov.ng":2,"i.ng":2,"mil.ng":2,"mobi.ng":2,"name.ng":2,"net.ng":2,"org.ng":2,"sch.ng":2,"ni":1,"ac.ni":2,"biz.ni":2,"co.ni":2,"com.ni":2,"edu.ni":2,"gob.ni":2,"in.ni":2,"info.ni":2,"int.ni":2,"mil.ni":2,"net.ni":2,"nom.ni":2,"org.ni":2,"web.ni":2,"nl":1,"no":1,"fhs.no":2,"vgs.no":2,"fylkesbibl.no":2,"folkebibl.no":2,"museum.no":2,"idrett.no":2,"priv.no":2,"mil.no":2,"stat.no":2,"dep.no":2,"kommune.no":2,"herad.no":2,"aa.no":2,"ah.no":2,"bu.no":2,"fm.no":2,"hl.no":2,"hm.no":2,"jan-mayen.no":2,"mr.no":2,"nl.no":2,"nt.no":2,"of.no":2,"ol.no":2,"oslo.no":2,"rl.no":2,"sf.no":2,"st.no":2,"svalbard.no":2,"tm.no":2,"tr.no":2,"va.no":2,"vf.no":2,"gs.aa.no":3,"gs.ah.no":3,"gs.bu.no":3,"gs.fm.no":3,"gs.hl.no":3,"gs.hm.no":3,"gs.jan-mayen.no":3,"gs.mr.no":3,"gs.nl.no":3,"gs.nt.no":3,"gs.of.no":3,"gs.ol.no":3,"gs.oslo.no":3,"gs.rl.no":3,"gs.sf.no":3,"gs.st.no":3,"gs.svalbard.no":3,"gs.tm.no":3,"gs.tr.no":3,"gs.va.no":3,"gs.vf.no":3,"akrehamn.no":2,"xn--krehamn-dxa.no":2,"algard.no":2,"xn--lgrd-poac.no":2,"arna.no":2,"brumunddal.no":2,"bryne.no":2,"bronnoysund.no":2,"xn--brnnysund-m8ac.no":2,"drobak.no":2,"xn--drbak-wua.no":2,"egersund.no":2,"fetsund.no":2,"floro.no":2,"xn--flor-jra.no":2,"fredrikstad.no":2,"hokksund.no":2,"honefoss.no":2,"xn--hnefoss-q1a.no":2,"jessheim.no":2,"jorpeland.no":2,"xn--jrpeland-54a.no":2,"kirkenes.no":2,"kopervik.no":2,"krokstadelva.no":2,"langevag.no":2,"xn--langevg-jxa.no":2,"leirvik.no":2,"mjondalen.no":2,"xn--mjndalen-64a.no":2,"mo-i-rana.no":2,"mosjoen.no":2,"xn--mosjen-eya.no":2,"nesoddtangen.no":2,"orkanger.no":2,"osoyro.no":2,"xn--osyro-wua.no":2,"raholt.no":2,"xn--rholt-mra.no":2,"sandnessjoen.no":2,"xn--sandnessjen-ogb.no":2,"skedsmokorset.no":2,"slattum.no":2,"spjelkavik.no":2,"stathelle.no":2,"stavern.no":2,"stjordalshalsen.no":2,"xn--stjrdalshalsen-sqb.no":2,"tananger.no":2,"tranby.no":2,"vossevangen.no":2,"afjord.no":2,"xn--fjord-lra.no":2,"agdenes.no":2,"al.no":2,"xn--l-1fa.no":2,"alesund.no":2,"xn--lesund-hua.no":2,"alstahaug.no":2,"alta.no":2,"xn--lt-liac.no":2,"alaheadju.no":2,"xn--laheadju-7ya.no":2,"alvdal.no":2,"amli.no":2,"xn--mli-tla.no":2,"amot.no":2,"xn--mot-tla.no":2,"andebu.no":2,"andoy.no":2,"xn--andy-ira.no":2,"andasuolo.no":2,"ardal.no":2,"xn--rdal-poa.no":2,"aremark.no":2,"arendal.no":2,"xn--s-1fa.no":2,"aseral.no":2,"xn--seral-lra.no":2,"asker.no":2,"askim.no":2,"askvoll.no":2,"askoy.no":2,"xn--asky-ira.no":2,"asnes.no":2,"xn--snes-poa.no":2,"audnedaln.no":2,"aukra.no":2,"aure.no":2,"aurland.no":2,"aurskog-holand.no":2,"xn--aurskog-hland-jnb.no":2,"austevoll.no":2,"austrheim.no":2,"averoy.no":2,"xn--avery-yua.no":2,"balestrand.no":2,"ballangen.no":2,"balat.no":2,"xn--blt-elab.no":2,"balsfjord.no":2,"bahccavuotna.no":2,"xn--bhccavuotna-k7a.no":2,"bamble.no":2,"bardu.no":2,"beardu.no":2,"beiarn.no":2,"bajddar.no":2,"xn--bjddar-pta.no":2,"baidar.no":2,"xn--bidr-5nac.no":2,"berg.no":2,"bergen.no":2,"berlevag.no":2,"xn--berlevg-jxa.no":2,"bearalvahki.no":2,"xn--bearalvhki-y4a.no":2,"bindal.no":2,"birkenes.no":2,"bjarkoy.no":2,"xn--bjarky-fya.no":2,"bjerkreim.no":2,"bjugn.no":2,"bodo.no":2,"xn--bod-2na.no":2,"badaddja.no":2,"xn--bdddj-mrabd.no":2,"budejju.no":2,"bokn.no":2,"bremanger.no":2,"bronnoy.no":2,"xn--brnny-wuac.no":2,"bygland.no":2,"bykle.no":2,"barum.no":2,"xn--brum-voa.no":2,"bo.telemark.no":3,"xn--b-5ga.telemark.no":3,"bo.nordland.no":3,"xn--b-5ga.nordland.no":3,"bievat.no":2,"xn--bievt-0qa.no":2,"bomlo.no":2,"xn--bmlo-gra.no":2,"batsfjord.no":2,"xn--btsfjord-9za.no":2,"bahcavuotna.no":2,"xn--bhcavuotna-s4a.no":2,"dovre.no":2,"drammen.no":2,"drangedal.no":2,"dyroy.no":2,"xn--dyry-ira.no":2,"donna.no":2,"xn--dnna-gra.no":2,"eid.no":2,"eidfjord.no":2,"eidsberg.no":2,"eidskog.no":2,"eidsvoll.no":2,"eigersund.no":2,"elverum.no":2,"enebakk.no":2,"engerdal.no":2,"etne.no":2,"etnedal.no":2,"evenes.no":2,"evenassi.no":2,"xn--eveni-0qa01ga.no":2,"evje-og-hornnes.no":2,"farsund.no":2,"fauske.no":2,"fuossko.no":2,"fuoisku.no":2,"fedje.no":2,"fet.no":2,"finnoy.no":2,"xn--finny-yua.no":2,"fitjar.no":2,"fjaler.no":2,"fjell.no":2,"flakstad.no":2,"flatanger.no":2,"flekkefjord.no":2,"flesberg.no":2,"flora.no":2,"fla.no":2,"xn--fl-zia.no":2,"folldal.no":2,"forsand.no":2,"fosnes.no":2,"frei.no":2,"frogn.no":2,"froland.no":2,"frosta.no":2,"frana.no":2,"xn--frna-woa.no":2,"froya.no":2,"xn--frya-hra.no":2,"fusa.no":2,"fyresdal.no":2,"forde.no":2,"xn--frde-gra.no":2,"gamvik.no":2,"gangaviika.no":2,"xn--ggaviika-8ya47h.no":2,"gaular.no":2,"gausdal.no":2,"gildeskal.no":2,"xn--gildeskl-g0a.no":2,"giske.no":2,"gjemnes.no":2,"gjerdrum.no":2,"gjerstad.no":2,"gjesdal.no":2,"gjovik.no":2,"xn--gjvik-wua.no":2,"gloppen.no":2,"gol.no":2,"gran.no":2,"grane.no":2,"granvin.no":2,"gratangen.no":2,"grimstad.no":2,"grong.no":2,"kraanghke.no":2,"xn--kranghke-b0a.no":2,"grue.no":2,"gulen.no":2,"hadsel.no":2,"halden.no":2,"halsa.no":2,"hamar.no":2,"hamaroy.no":2,"habmer.no":2,"xn--hbmer-xqa.no":2,"hapmir.no":2,"xn--hpmir-xqa.no":2,"hammerfest.no":2,"hammarfeasta.no":2,"xn--hmmrfeasta-s4ac.no":2,"haram.no":2,"hareid.no":2,"harstad.no":2,"hasvik.no":2,"aknoluokta.no":2,"xn--koluokta-7ya57h.no":2,"hattfjelldal.no":2,"aarborte.no":2,"haugesund.no":2,"hemne.no":2,"hemnes.no":2,"hemsedal.no":2,"heroy.more-og-romsdal.no":3,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":3,"heroy.nordland.no":3,"xn--hery-ira.nordland.no":3,"hitra.no":2,"hjartdal.no":2,"hjelmeland.no":2,"hobol.no":2,"xn--hobl-ira.no":2,"hof.no":2,"hol.no":2,"hole.no":2,"holmestrand.no":2,"holtalen.no":2,"xn--holtlen-hxa.no":2,"hornindal.no":2,"horten.no":2,"hurdal.no":2,"hurum.no":2,"hvaler.no":2,"hyllestad.no":2,"hagebostad.no":2,"xn--hgebostad-g3a.no":2,"hoyanger.no":2,"xn--hyanger-q1a.no":2,"hoylandet.no":2,"xn--hylandet-54a.no":2,"ha.no":2,"xn--h-2fa.no":2,"ibestad.no":2,"inderoy.no":2,"xn--indery-fya.no":2,"iveland.no":2,"jevnaker.no":2,"jondal.no":2,"jolster.no":2,"xn--jlster-bya.no":2,"karasjok.no":2,"karasjohka.no":2,"xn--krjohka-hwab49j.no":2,"karlsoy.no":2,"galsa.no":2,"xn--gls-elac.no":2,"karmoy.no":2,"xn--karmy-yua.no":2,"kautokeino.no":2,"guovdageaidnu.no":2,"klepp.no":2,"klabu.no":2,"xn--klbu-woa.no":2,"kongsberg.no":2,"kongsvinger.no":2,"kragero.no":2,"xn--krager-gya.no":2,"kristiansand.no":2,"kristiansund.no":2,"krodsherad.no":2,"xn--krdsherad-m8a.no":2,"kvalsund.no":2,"rahkkeravju.no":2,"xn--rhkkervju-01af.no":2,"kvam.no":2,"kvinesdal.no":2,"kvinnherad.no":2,"kviteseid.no":2,"kvitsoy.no":2,"xn--kvitsy-fya.no":2,"kvafjord.no":2,"xn--kvfjord-nxa.no":2,"giehtavuoatna.no":2,"kvanangen.no":2,"xn--kvnangen-k0a.no":2,"navuotna.no":2,"xn--nvuotna-hwa.no":2,"kafjord.no":2,"xn--kfjord-iua.no":2,"gaivuotna.no":2,"xn--givuotna-8ya.no":2,"larvik.no":2,"lavangen.no":2,"lavagis.no":2,"loabat.no":2,"xn--loabt-0qa.no":2,"lebesby.no":2,"davvesiida.no":2,"leikanger.no":2,"leirfjord.no":2,"leka.no":2,"leksvik.no":2,"lenvik.no":2,"leangaviika.no":2,"xn--leagaviika-52b.no":2,"lesja.no":2,"levanger.no":2,"lier.no":2,"lierne.no":2,"lillehammer.no":2,"lillesand.no":2,"lindesnes.no":2,"lindas.no":2,"xn--linds-pra.no":2,"lom.no":2,"loppa.no":2,"lahppi.no":2,"xn--lhppi-xqa.no":2,"lund.no":2,"lunner.no":2,"luroy.no":2,"xn--lury-ira.no":2,"luster.no":2,"lyngdal.no":2,"lyngen.no":2,"ivgu.no":2,"lardal.no":2,"lerdal.no":2,"xn--lrdal-sra.no":2,"lodingen.no":2,"xn--ldingen-q1a.no":2,"lorenskog.no":2,"xn--lrenskog-54a.no":2,"loten.no":2,"xn--lten-gra.no":2,"malvik.no":2,"masoy.no":2,"xn--msy-ula0h.no":2,"muosat.no":2,"xn--muost-0qa.no":2,"mandal.no":2,"marker.no":2,"marnardal.no":2,"masfjorden.no":2,"meland.no":2,"meldal.no":2,"melhus.no":2,"meloy.no":2,"xn--mely-ira.no":2,"meraker.no":2,"xn--merker-kua.no":2,"moareke.no":2,"xn--moreke-jua.no":2,"midsund.no":2,"midtre-gauldal.no":2,"modalen.no":2,"modum.no":2,"molde.no":2,"moskenes.no":2,"moss.no":2,"mosvik.no":2,"malselv.no":2,"xn--mlselv-iua.no":2,"malatvuopmi.no":2,"xn--mlatvuopmi-s4a.no":2,"namdalseid.no":2,"aejrie.no":2,"namsos.no":2,"namsskogan.no":2,"naamesjevuemie.no":2,"xn--nmesjevuemie-tcba.no":2,"laakesvuemie.no":2,"nannestad.no":2,"narvik.no":2,"narviika.no":2,"naustdal.no":2,"nedre-eiker.no":2,"nes.akershus.no":3,"nes.buskerud.no":3,"nesna.no":2,"nesodden.no":2,"nesseby.no":2,"unjarga.no":2,"xn--unjrga-rta.no":2,"nesset.no":2,"nissedal.no":2,"nittedal.no":2,"nord-aurdal.no":2,"nord-fron.no":2,"nord-odal.no":2,"norddal.no":2,"nordkapp.no":2,"davvenjarga.no":2,"xn--davvenjrga-y4a.no":2,"nordre-land.no":2,"nordreisa.no":2,"raisa.no":2,"xn--risa-5na.no":2,"nore-og-uvdal.no":2,"notodden.no":2,"naroy.no":2,"xn--nry-yla5g.no":2,"notteroy.no":2,"xn--nttery-byae.no":2,"odda.no":2,"oksnes.no":2,"xn--ksnes-uua.no":2,"oppdal.no":2,"oppegard.no":2,"xn--oppegrd-ixa.no":2,"orkdal.no":2,"orland.no":2,"xn--rland-uua.no":2,"orskog.no":2,"xn--rskog-uua.no":2,"orsta.no":2,"xn--rsta-fra.no":2,"os.hedmark.no":3,"os.hordaland.no":3,"osen.no":2,"osteroy.no":2,"xn--ostery-fya.no":2,"ostre-toten.no":2,"xn--stre-toten-zcb.no":2,"overhalla.no":2,"ovre-eiker.no":2,"xn--vre-eiker-k8a.no":2,"oyer.no":2,"xn--yer-zna.no":2,"oygarden.no":2,"xn--ygarden-p1a.no":2,"oystre-slidre.no":2,"xn--ystre-slidre-ujb.no":2,"porsanger.no":2,"porsangu.no":2,"xn--porsgu-sta26f.no":2,"porsgrunn.no":2,"radoy.no":2,"xn--rady-ira.no":2,"rakkestad.no":2,"rana.no":2,"ruovat.no":2,"randaberg.no":2,"rauma.no":2,"rendalen.no":2,"rennebu.no":2,"rennesoy.no":2,"xn--rennesy-v1a.no":2,"rindal.no":2,"ringebu.no":2,"ringerike.no":2,"ringsaker.no":2,"rissa.no":2,"risor.no":2,"xn--risr-ira.no":2,"roan.no":2,"rollag.no":2,"rygge.no":2,"ralingen.no":2,"xn--rlingen-mxa.no":2,"rodoy.no":2,"xn--rdy-0nab.no":2,"romskog.no":2,"xn--rmskog-bya.no":2,"roros.no":2,"xn--rros-gra.no":2,"rost.no":2,"xn--rst-0na.no":2,"royken.no":2,"xn--ryken-vua.no":2,"royrvik.no":2,"xn--ryrvik-bya.no":2,"rade.no":2,"xn--rde-ula.no":2,"salangen.no":2,"siellak.no":2,"saltdal.no":2,"salat.no":2,"xn--slt-elab.no":2,"xn--slat-5na.no":2,"samnanger.no":2,"sande.more-og-romsdal.no":3,"sande.xn--mre-og-romsdal-qqb.no":3,"sande.vestfold.no":3,"sandefjord.no":2,"sandnes.no":2,"sandoy.no":2,"xn--sandy-yua.no":2,"sarpsborg.no":2,"sauda.no":2,"sauherad.no":2,"sel.no":2,"selbu.no":2,"selje.no":2,"seljord.no":2,"sigdal.no":2,"siljan.no":2,"sirdal.no":2,"skaun.no":2,"skedsmo.no":2,"ski.no":2,"skien.no":2,"skiptvet.no":2,"skjervoy.no":2,"xn--skjervy-v1a.no":2,"skierva.no":2,"xn--skierv-uta.no":2,"skjak.no":2,"xn--skjk-soa.no":2,"skodje.no":2,"skanland.no":2,"xn--sknland-fxa.no":2,"skanit.no":2,"xn--sknit-yqa.no":2,"smola.no":2,"xn--smla-hra.no":2,"snillfjord.no":2,"snasa.no":2,"xn--snsa-roa.no":2,"snoasa.no":2,"snaase.no":2,"xn--snase-nra.no":2,"sogndal.no":2,"sokndal.no":2,"sola.no":2,"solund.no":2,"songdalen.no":2,"sortland.no":2,"spydeberg.no":2,"stange.no":2,"stavanger.no":2,"steigen.no":2,"steinkjer.no":2,"stjordal.no":2,"xn--stjrdal-s1a.no":2,"stokke.no":2,"stor-elvdal.no":2,"stord.no":2,"stordal.no":2,"storfjord.no":2,"omasvuotna.no":2,"strand.no":2,"stranda.no":2,"stryn.no":2,"sula.no":2,"suldal.no":2,"sund.no":2,"sunndal.no":2,"surnadal.no":2,"sveio.no":2,"svelvik.no":2,"sykkylven.no":2,"sogne.no":2,"xn--sgne-gra.no":2,"somna.no":2,"xn--smna-gra.no":2,"sondre-land.no":2,"xn--sndre-land-0cb.no":2,"sor-aurdal.no":2,"xn--sr-aurdal-l8a.no":2,"sor-fron.no":2,"xn--sr-fron-q1a.no":2,"sor-odal.no":2,"xn--sr-odal-q1a.no":2,"sor-varanger.no":2,"xn--sr-varanger-ggb.no":2,"matta-varjjat.no":2,"xn--mtta-vrjjat-k7af.no":2,"sorfold.no":2,"xn--srfold-bya.no":2,"sorreisa.no":2,"xn--srreisa-q1a.no":2,"sorum.no":2,"xn--srum-gra.no":2,"tana.no":2,"deatnu.no":2,"time.no":2,"tingvoll.no":2,"tinn.no":2,"tjeldsund.no":2,"dielddanuorri.no":2,"tjome.no":2,"xn--tjme-hra.no":2,"tokke.no":2,"tolga.no":2,"torsken.no":2,"tranoy.no":2,"xn--trany-yua.no":2,"tromso.no":2,"xn--troms-zua.no":2,"tromsa.no":2,"romsa.no":2,"trondheim.no":2,"troandin.no":2,"trysil.no":2,"trana.no":2,"xn--trna-woa.no":2,"trogstad.no":2,"xn--trgstad-r1a.no":2,"tvedestrand.no":2,"tydal.no":2,"tynset.no":2,"tysfjord.no":2,"divtasvuodna.no":2,"divttasvuotna.no":2,"tysnes.no":2,"tysvar.no":2,"xn--tysvr-vra.no":2,"tonsberg.no":2,"xn--tnsberg-q1a.no":2,"ullensaker.no":2,"ullensvang.no":2,"ulvik.no":2,"utsira.no":2,"vadso.no":2,"xn--vads-jra.no":2,"cahcesuolo.no":2,"xn--hcesuolo-7ya35b.no":2,"vaksdal.no":2,"valle.no":2,"vang.no":2,"vanylven.no":2,"vardo.no":2,"xn--vard-jra.no":2,"varggat.no":2,"xn--vrggt-xqad.no":2,"vefsn.no":2,"vaapste.no":2,"vega.no":2,"vegarshei.no":2,"xn--vegrshei-c0a.no":2,"vennesla.no":2,"verdal.no":2,"verran.no":2,"vestby.no":2,"vestnes.no":2,"vestre-slidre.no":2,"vestre-toten.no":2,"vestvagoy.no":2,"xn--vestvgy-ixa6o.no":2,"vevelstad.no":2,"vik.no":2,"vikna.no":2,"vindafjord.no":2,"volda.no":2,"voss.no":2,"varoy.no":2,"xn--vry-yla5g.no":2,"vagan.no":2,"xn--vgan-qoa.no":2,"voagat.no":2,"vagsoy.no":2,"xn--vgsy-qoa0j.no":2,"vaga.no":2,"xn--vg-yiab.no":2,"valer.ostfold.no":3,"xn--vler-qoa.xn--stfold-9xa.no":3,"valer.hedmark.no":3,"xn--vler-qoa.hedmark.no":3,"np":2,"nr":1,"biz.nr":2,"info.nr":2,"gov.nr":2,"edu.nr":2,"org.nr":2,"net.nr":2,"com.nr":2,"nu":1,"nz":1,"ac.nz":2,"co.nz":2,"cri.nz":2,"geek.nz":2,"gen.nz":2,"govt.nz":2,"health.nz":2,"iwi.nz":2,"kiwi.nz":2,"maori.nz":2,"mil.nz":2,"xn--mori-qsa.nz":2,"net.nz":2,"org.nz":2,"parliament.nz":2,"school.nz":2,"om":1,"co.om":2,"com.om":2,"edu.om":2,"gov.om":2,"med.om":2,"museum.om":2,"net.om":2,"org.om":2,"pro.om":2,"onion":1,"org":1,"pa":1,"ac.pa":2,"gob.pa":2,"com.pa":2,"org.pa":2,"sld.pa":2,"edu.pa":2,"net.pa":2,"ing.pa":2,"abo.pa":2,"med.pa":2,"nom.pa":2,"pe":1,"edu.pe":2,"gob.pe":2,"nom.pe":2,"mil.pe":2,"org.pe":2,"com.pe":2,"net.pe":2,"pf":1,"com.pf":2,"org.pf":2,"edu.pf":2,"pg":2,"ph":1,"com.ph":2,"net.ph":2,"org.ph":2,"gov.ph":2,"edu.ph":2,"ngo.ph":2,"mil.ph":2,"i.ph":2,"pk":1,"com.pk":2,"net.pk":2,"edu.pk":2,"org.pk":2,"fam.pk":2,"biz.pk":2,"web.pk":2,"gov.pk":2,"gob.pk":2,"gok.pk":2,"gon.pk":2,"gop.pk":2,"gos.pk":2,"info.pk":2,"pl":1,"com.pl":2,"net.pl":2,"org.pl":2,"aid.pl":2,"agro.pl":2,"atm.pl":2,"auto.pl":2,"biz.pl":2,"edu.pl":2,"gmina.pl":2,"gsm.pl":2,"info.pl":2,"mail.pl":2,"miasta.pl":2,"media.pl":2,"mil.pl":2,"nieruchomosci.pl":2,"nom.pl":2,"pc.pl":2,"powiat.pl":2,"priv.pl":2,"realestate.pl":2,"rel.pl":2,"sex.pl":2,"shop.pl":2,"sklep.pl":2,"sos.pl":2,"szkola.pl":2,"targi.pl":2,"tm.pl":2,"tourism.pl":2,"travel.pl":2,"turystyka.pl":2,"gov.pl":2,"ap.gov.pl":3,"griw.gov.pl":3,"ic.gov.pl":3,"is.gov.pl":3,"kmpsp.gov.pl":3,"konsulat.gov.pl":3,"kppsp.gov.pl":3,"kwp.gov.pl":3,"kwpsp.gov.pl":3,"mup.gov.pl":3,"mw.gov.pl":3,"oia.gov.pl":3,"oirm.gov.pl":3,"oke.gov.pl":3,"oow.gov.pl":3,"oschr.gov.pl":3,"oum.gov.pl":3,"pa.gov.pl":3,"pinb.gov.pl":3,"piw.gov.pl":3,"po.gov.pl":3,"pr.gov.pl":3,"psp.gov.pl":3,"psse.gov.pl":3,"pup.gov.pl":3,"rzgw.gov.pl":3,"sa.gov.pl":3,"sdn.gov.pl":3,"sko.gov.pl":3,"so.gov.pl":3,"sr.gov.pl":3,"starostwo.gov.pl":3,"ug.gov.pl":3,"ugim.gov.pl":3,"um.gov.pl":3,"umig.gov.pl":3,"upow.gov.pl":3,"uppo.gov.pl":3,"us.gov.pl":3,"uw.gov.pl":3,"uzs.gov.pl":3,"wif.gov.pl":3,"wiih.gov.pl":3,"winb.gov.pl":3,"wios.gov.pl":3,"witd.gov.pl":3,"wiw.gov.pl":3,"wkz.gov.pl":3,"wsa.gov.pl":3,"wskr.gov.pl":3,"wsse.gov.pl":3,"wuoz.gov.pl":3,"wzmiuw.gov.pl":3,"zp.gov.pl":3,"zpisdn.gov.pl":3,"augustow.pl":2,"babia-gora.pl":2,"bedzin.pl":2,"beskidy.pl":2,"bialowieza.pl":2,"bialystok.pl":2,"bielawa.pl":2,"bieszczady.pl":2,"boleslawiec.pl":2,"bydgoszcz.pl":2,"bytom.pl":2,"cieszyn.pl":2,"czeladz.pl":2,"czest.pl":2,"dlugoleka.pl":2,"elblag.pl":2,"elk.pl":2,"glogow.pl":2,"gniezno.pl":2,"gorlice.pl":2,"grajewo.pl":2,"ilawa.pl":2,"jaworzno.pl":2,"jelenia-gora.pl":2,"jgora.pl":2,"kalisz.pl":2,"kazimierz-dolny.pl":2,"karpacz.pl":2,"kartuzy.pl":2,"kaszuby.pl":2,"katowice.pl":2,"kepno.pl":2,"ketrzyn.pl":2,"klodzko.pl":2,"kobierzyce.pl":2,"kolobrzeg.pl":2,"konin.pl":2,"konskowola.pl":2,"kutno.pl":2,"lapy.pl":2,"lebork.pl":2,"legnica.pl":2,"lezajsk.pl":2,"limanowa.pl":2,"lomza.pl":2,"lowicz.pl":2,"lubin.pl":2,"lukow.pl":2,"malbork.pl":2,"malopolska.pl":2,"mazowsze.pl":2,"mazury.pl":2,"mielec.pl":2,"mielno.pl":2,"mragowo.pl":2,"naklo.pl":2,"nowaruda.pl":2,"nysa.pl":2,"olawa.pl":2,"olecko.pl":2,"olkusz.pl":2,"olsztyn.pl":2,"opoczno.pl":2,"opole.pl":2,"ostroda.pl":2,"ostroleka.pl":2,"ostrowiec.pl":2,"ostrowwlkp.pl":2,"pila.pl":2,"pisz.pl":2,"podhale.pl":2,"podlasie.pl":2,"polkowice.pl":2,"pomorze.pl":2,"pomorskie.pl":2,"prochowice.pl":2,"pruszkow.pl":2,"przeworsk.pl":2,"pulawy.pl":2,"radom.pl":2,"rawa-maz.pl":2,"rybnik.pl":2,"rzeszow.pl":2,"sanok.pl":2,"sejny.pl":2,"slask.pl":2,"slupsk.pl":2,"sosnowiec.pl":2,"stalowa-wola.pl":2,"skoczow.pl":2,"starachowice.pl":2,"stargard.pl":2,"suwalki.pl":2,"swidnica.pl":2,"swiebodzin.pl":2,"swinoujscie.pl":2,"szczecin.pl":2,"szczytno.pl":2,"tarnobrzeg.pl":2,"tgory.pl":2,"turek.pl":2,"tychy.pl":2,"ustka.pl":2,"walbrzych.pl":2,"warmia.pl":2,"warszawa.pl":2,"waw.pl":2,"wegrow.pl":2,"wielun.pl":2,"wlocl.pl":2,"wloclawek.pl":2,"wodzislaw.pl":2,"wolomin.pl":2,"wroclaw.pl":2,"zachpomor.pl":2,"zagan.pl":2,"zarow.pl":2,"zgora.pl":2,"zgorzelec.pl":2,"pm":1,"pn":1,"gov.pn":2,"co.pn":2,"org.pn":2,"edu.pn":2,"net.pn":2,"post":1,"pr":1,"com.pr":2,"net.pr":2,"org.pr":2,"gov.pr":2,"edu.pr":2,"isla.pr":2,"pro.pr":2,"biz.pr":2,"info.pr":2,"name.pr":2,"est.pr":2,"prof.pr":2,"ac.pr":2,"pro":1,"aaa.pro":2,"aca.pro":2,"acct.pro":2,"avocat.pro":2,"bar.pro":2,"cpa.pro":2,"eng.pro":2,"jur.pro":2,"law.pro":2,"med.pro":2,"recht.pro":2,"ps":1,"edu.ps":2,"gov.ps":2,"sec.ps":2,"plo.ps":2,"com.ps":2,"org.ps":2,"net.ps":2,"pt":1,"net.pt":2,"gov.pt":2,"org.pt":2,"edu.pt":2,"int.pt":2,"publ.pt":2,"com.pt":2,"nome.pt":2,"pw":1,"co.pw":2,"ne.pw":2,"or.pw":2,"ed.pw":2,"go.pw":2,"belau.pw":2,"py":1,"com.py":2,"coop.py":2,"edu.py":2,"gov.py":2,"mil.py":2,"net.py":2,"org.py":2,"qa":1,"com.qa":2,"edu.qa":2,"gov.qa":2,"mil.qa":2,"name.qa":2,"net.qa":2,"org.qa":2,"sch.qa":2,"re":1,"asso.re":2,"com.re":2,"nom.re":2,"ro":1,"arts.ro":2,"com.ro":2,"firm.ro":2,"info.ro":2,"nom.ro":2,"nt.ro":2,"org.ro":2,"rec.ro":2,"store.ro":2,"tm.ro":2,"www.ro":2,"rs":1,"ac.rs":2,"co.rs":2,"edu.rs":2,"gov.rs":2,"in.rs":2,"org.rs":2,"ru":1,"rw":1,"ac.rw":2,"co.rw":2,"coop.rw":2,"gov.rw":2,"mil.rw":2,"net.rw":2,"org.rw":2,"sa":1,"com.sa":2,"net.sa":2,"org.sa":2,"gov.sa":2,"med.sa":2,"pub.sa":2,"edu.sa":2,"sch.sa":2,"sb":1,"com.sb":2,"edu.sb":2,"gov.sb":2,"net.sb":2,"org.sb":2,"sc":1,"com.sc":2,"gov.sc":2,"net.sc":2,"org.sc":2,"edu.sc":2,"sd":1,"com.sd":2,"net.sd":2,"org.sd":2,"edu.sd":2,"med.sd":2,"tv.sd":2,"gov.sd":2,"info.sd":2,"se":1,"a.se":2,"ac.se":2,"b.se":2,"bd.se":2,"brand.se":2,"c.se":2,"d.se":2,"e.se":2,"f.se":2,"fh.se":2,"fhsk.se":2,"fhv.se":2,"g.se":2,"h.se":2,"i.se":2,"k.se":2,"komforb.se":2,"kommunalforbund.se":2,"komvux.se":2,"l.se":2,"lanbib.se":2,"m.se":2,"n.se":2,"naturbruksgymn.se":2,"o.se":2,"org.se":2,"p.se":2,"parti.se":2,"pp.se":2,"press.se":2,"r.se":2,"s.se":2,"t.se":2,"tm.se":2,"u.se":2,"w.se":2,"x.se":2,"y.se":2,"z.se":2,"sg":1,"com.sg":2,"net.sg":2,"org.sg":2,"gov.sg":2,"edu.sg":2,"per.sg":2,"sh":1,"com.sh":2,"net.sh":2,"gov.sh":2,"org.sh":2,"mil.sh":2,"si":1,"sj":1,"sk":1,"sl":1,"com.sl":2,"net.sl":2,"edu.sl":2,"gov.sl":2,"org.sl":2,"sm":1,"sn":1,"art.sn":2,"com.sn":2,"edu.sn":2,"gouv.sn":2,"org.sn":2,"perso.sn":2,"univ.sn":2,"so":1,"com.so":2,"edu.so":2,"gov.so":2,"me.so":2,"net.so":2,"org.so":2,"sr":1,"ss":1,"biz.ss":2,"com.ss":2,"edu.ss":2,"gov.ss":2,"me.ss":2,"net.ss":2,"org.ss":2,"sch.ss":2,"st":1,"co.st":2,"com.st":2,"consulado.st":2,"edu.st":2,"embaixada.st":2,"mil.st":2,"net.st":2,"org.st":2,"principe.st":2,"saotome.st":2,"store.st":2,"su":1,"sv":1,"com.sv":2,"edu.sv":2,"gob.sv":2,"org.sv":2,"red.sv":2,"sx":1,"gov.sx":2,"sy":1,"edu.sy":2,"gov.sy":2,"net.sy":2,"mil.sy":2,"com.sy":2,"org.sy":2,"sz":1,"co.sz":2,"ac.sz":2,"org.sz":2,"tc":1,"td":1,"tel":1,"tf":1,"tg":1,"th":1,"ac.th":2,"co.th":2,"go.th":2,"in.th":2,"mi.th":2,"net.th":2,"or.th":2,"tj":1,"ac.tj":2,"biz.tj":2,"co.tj":2,"com.tj":2,"edu.tj":2,"go.tj":2,"gov.tj":2,"int.tj":2,"mil.tj":2,"name.tj":2,"net.tj":2,"nic.tj":2,"org.tj":2,"test.tj":2,"web.tj":2,"tk":1,"tl":1,"gov.tl":2,"tm":1,"com.tm":2,"co.tm":2,"org.tm":2,"net.tm":2,"nom.tm":2,"gov.tm":2,"mil.tm":2,"edu.tm":2,"tn":1,"com.tn":2,"ens.tn":2,"fin.tn":2,"gov.tn":2,"ind.tn":2,"info.tn":2,"intl.tn":2,"mincom.tn":2,"nat.tn":2,"net.tn":2,"org.tn":2,"perso.tn":2,"tourism.tn":2,"to":1,"com.to":2,"gov.to":2,"net.to":2,"org.to":2,"edu.to":2,"mil.to":2,"tr":1,"av.tr":2,"bbs.tr":2,"bel.tr":2,"biz.tr":2,"com.tr":2,"dr.tr":2,"edu.tr":2,"gen.tr":2,"gov.tr":2,"info.tr":2,"mil.tr":2,"k12.tr":2,"kep.tr":2,"name.tr":2,"net.tr":2,"org.tr":2,"pol.tr":2,"tel.tr":2,"tsk.tr":2,"tv.tr":2,"web.tr":2,"nc.tr":2,"gov.nc.tr":3,"tt":1,"co.tt":2,"com.tt":2,"org.tt":2,"net.tt":2,"biz.tt":2,"info.tt":2,"pro.tt":2,"int.tt":2,"coop.tt":2,"jobs.tt":2,"mobi.tt":2,"travel.tt":2,"museum.tt":2,"aero.tt":2,"name.tt":2,"gov.tt":2,"edu.tt":2,"tv":1,"tw":1,"edu.tw":2,"gov.tw":2,"mil.tw":2,"com.tw":2,"net.tw":2,"org.tw":2,"idv.tw":2,"game.tw":2,"ebiz.tw":2,"club.tw":2,"xn--zf0ao64a.tw":2,"xn--uc0atv.tw":2,"xn--czrw28b.tw":2,"tz":1,"ac.tz":2,"co.tz":2,"go.tz":2,"hotel.tz":2,"info.tz":2,"me.tz":2,"mil.tz":2,"mobi.tz":2,"ne.tz":2,"or.tz":2,"sc.tz":2,"tv.tz":2,"ua":1,"com.ua":2,"edu.ua":2,"gov.ua":2,"in.ua":2,"net.ua":2,"org.ua":2,"cherkassy.ua":2,"cherkasy.ua":2,"chernigov.ua":2,"chernihiv.ua":2,"chernivtsi.ua":2,"chernovtsy.ua":2,"ck.ua":2,"cn.ua":2,"cr.ua":2,"crimea.ua":2,"cv.ua":2,"dn.ua":2,"dnepropetrovsk.ua":2,"dnipropetrovsk.ua":2,"donetsk.ua":2,"dp.ua":2,"if.ua":2,"ivano-frankivsk.ua":2,"kh.ua":2,"kharkiv.ua":2,"kharkov.ua":2,"kherson.ua":2,"khmelnitskiy.ua":2,"khmelnytskyi.ua":2,"kiev.ua":2,"kirovograd.ua":2,"km.ua":2,"kr.ua":2,"kropyvnytskyi.ua":2,"krym.ua":2,"ks.ua":2,"kv.ua":2,"kyiv.ua":2,"lg.ua":2,"lt.ua":2,"lugansk.ua":2,"lutsk.ua":2,"lv.ua":2,"lviv.ua":2,"mk.ua":2,"mykolaiv.ua":2,"nikolaev.ua":2,"od.ua":2,"odesa.ua":2,"odessa.ua":2,"pl.ua":2,"poltava.ua":2,"rivne.ua":2,"rovno.ua":2,"rv.ua":2,"sb.ua":2,"sebastopol.ua":2,"sevastopol.ua":2,"sm.ua":2,"sumy.ua":2,"te.ua":2,"ternopil.ua":2,"uz.ua":2,"uzhgorod.ua":2,"vinnica.ua":2,"vinnytsia.ua":2,"vn.ua":2,"volyn.ua":2,"yalta.ua":2,"zaporizhzhe.ua":2,"zaporizhzhia.ua":2,"zhitomir.ua":2,"zhytomyr.ua":2,"zp.ua":2,"zt.ua":2,"ug":1,"co.ug":2,"or.ug":2,"ac.ug":2,"sc.ug":2,"go.ug":2,"ne.ug":2,"com.ug":2,"org.ug":2,"uk":1,"ac.uk":2,"co.uk":2,"gov.uk":2,"ltd.uk":2,"me.uk":2,"net.uk":2,"nhs.uk":2,"org.uk":2,"plc.uk":2,"police.uk":2,"sch.uk":3,"us":1,"dni.us":2,"fed.us":2,"isa.us":2,"kids.us":2,"nsn.us":2,"ak.us":2,"al.us":2,"ar.us":2,"as.us":2,"az.us":2,"ca.us":2,"co.us":2,"ct.us":2,"dc.us":2,"de.us":2,"fl.us":2,"ga.us":2,"gu.us":2,"hi.us":2,"ia.us":2,"id.us":2,"il.us":2,"in.us":2,"ks.us":2,"ky.us":2,"la.us":2,"ma.us":2,"md.us":2,"me.us":2,"mi.us":2,"mn.us":2,"mo.us":2,"ms.us":2,"mt.us":2,"nc.us":2,"nd.us":2,"ne.us":2,"nh.us":2,"nj.us":2,"nm.us":2,"nv.us":2,"ny.us":2,"oh.us":2,"ok.us":2,"or.us":2,"pa.us":2,"pr.us":2,"ri.us":2,"sc.us":2,"sd.us":2,"tn.us":2,"tx.us":2,"ut.us":2,"vi.us":2,"vt.us":2,"va.us":2,"wa.us":2,"wi.us":2,"wv.us":2,"wy.us":2,"k12.ak.us":3,"k12.al.us":3,"k12.ar.us":3,"k12.as.us":3,"k12.az.us":3,"k12.ca.us":3,"k12.co.us":3,"k12.ct.us":3,"k12.dc.us":3,"k12.fl.us":3,"k12.ga.us":3,"k12.gu.us":3,"k12.ia.us":3,"k12.id.us":3,"k12.il.us":3,"k12.in.us":3,"k12.ks.us":3,"k12.ky.us":3,"k12.la.us":3,"k12.ma.us":3,"k12.md.us":3,"k12.me.us":3,"k12.mi.us":3,"k12.mn.us":3,"k12.mo.us":3,"k12.ms.us":3,"k12.mt.us":3,"k12.nc.us":3,"k12.ne.us":3,"k12.nh.us":3,"k12.nj.us":3,"k12.nm.us":3,"k12.nv.us":3,"k12.ny.us":3,"k12.oh.us":3,"k12.ok.us":3,"k12.or.us":3,"k12.pa.us":3,"k12.pr.us":3,"k12.sc.us":3,"k12.tn.us":3,"k12.tx.us":3,"k12.ut.us":3,"k12.vi.us":3,"k12.vt.us":3,"k12.va.us":3,"k12.wa.us":3,"k12.wi.us":3,"k12.wy.us":3,"cc.ak.us":3,"cc.al.us":3,"cc.ar.us":3,"cc.as.us":3,"cc.az.us":3,"cc.ca.us":3,"cc.co.us":3,"cc.ct.us":3,"cc.dc.us":3,"cc.de.us":3,"cc.fl.us":3,"cc.ga.us":3,"cc.gu.us":3,"cc.hi.us":3,"cc.ia.us":3,"cc.id.us":3,"cc.il.us":3,"cc.in.us":3,"cc.ks.us":3,"cc.ky.us":3,"cc.la.us":3,"cc.ma.us":3,"cc.md.us":3,"cc.me.us":3,"cc.mi.us":3,"cc.mn.us":3,"cc.mo.us":3,"cc.ms.us":3,"cc.mt.us":3,"cc.nc.us":3,"cc.nd.us":3,"cc.ne.us":3,"cc.nh.us":3,"cc.nj.us":3,"cc.nm.us":3,"cc.nv.us":3,"cc.ny.us":3,"cc.oh.us":3,"cc.ok.us":3,"cc.or.us":3,"cc.pa.us":3,"cc.pr.us":3,"cc.ri.us":3,"cc.sc.us":3,"cc.sd.us":3,"cc.tn.us":3,"cc.tx.us":3,"cc.ut.us":3,"cc.vi.us":3,"cc.vt.us":3,"cc.va.us":3,"cc.wa.us":3,"cc.wi.us":3,"cc.wv.us":3,"cc.wy.us":3,"lib.ak.us":3,"lib.al.us":3,"lib.ar.us":3,"lib.as.us":3,"lib.az.us":3,"lib.ca.us":3,"lib.co.us":3,"lib.ct.us":3,"lib.dc.us":3,"lib.fl.us":3,"lib.ga.us":3,"lib.gu.us":3,"lib.hi.us":3,"lib.ia.us":3,"lib.id.us":3,"lib.il.us":3,"lib.in.us":3,"lib.ks.us":3,"lib.ky.us":3,"lib.la.us":3,"lib.ma.us":3,"lib.md.us":3,"lib.me.us":3,"lib.mi.us":3,"lib.mn.us":3,"lib.mo.us":3,"lib.ms.us":3,"lib.mt.us":3,"lib.nc.us":3,"lib.nd.us":3,"lib.ne.us":3,"lib.nh.us":3,"lib.nj.us":3,"lib.nm.us":3,"lib.nv.us":3,"lib.ny.us":3,"lib.oh.us":3,"lib.ok.us":3,"lib.or.us":3,"lib.pa.us":3,"lib.pr.us":3,"lib.ri.us":3,"lib.sc.us":3,"lib.sd.us":3,"lib.tn.us":3,"lib.tx.us":3,"lib.ut.us":3,"lib.vi.us":3,"lib.vt.us":3,"lib.va.us":3,"lib.wa.us":3,"lib.wi.us":3,"lib.wy.us":3,"pvt.k12.ma.us":4,"chtr.k12.ma.us":4,"paroch.k12.ma.us":4,"ann-arbor.mi.us":3,"cog.mi.us":3,"dst.mi.us":3,"eaton.mi.us":3,"gen.mi.us":3,"mus.mi.us":3,"tec.mi.us":3,"washtenaw.mi.us":3,"uy":1,"com.uy":2,"edu.uy":2,"gub.uy":2,"mil.uy":2,"net.uy":2,"org.uy":2,"uz":1,"co.uz":2,"com.uz":2,"net.uz":2,"org.uz":2,"va":1,"vc":1,"com.vc":2,"net.vc":2,"org.vc":2,"gov.vc":2,"mil.vc":2,"edu.vc":2,"ve":1,"arts.ve":2,"bib.ve":2,"co.ve":2,"com.ve":2,"e12.ve":2,"edu.ve":2,"firm.ve":2,"gob.ve":2,"gov.ve":2,"info.ve":2,"int.ve":2,"mil.ve":2,"net.ve":2,"nom.ve":2,"org.ve":2,"rar.ve":2,"rec.ve":2,"store.ve":2,"tec.ve":2,"web.ve":2,"vg":1,"vi":1,"co.vi":2,"com.vi":2,"k12.vi":2,"net.vi":2,"org.vi":2,"vn":1,"ac.vn":2,"ai.vn":2,"biz.vn":2,"com.vn":2,"edu.vn":2,"gov.vn":2,"health.vn":2,"id.vn":2,"info.vn":2,"int.vn":2,"io.vn":2,"name.vn":2,"net.vn":2,"org.vn":2,"pro.vn":2,"angiang.vn":2,"bacgiang.vn":2,"backan.vn":2,"baclieu.vn":2,"bacninh.vn":2,"baria-vungtau.vn":2,"bentre.vn":2,"binhdinh.vn":2,"binhduong.vn":2,"binhphuoc.vn":2,"binhthuan.vn":2,"camau.vn":2,"cantho.vn":2,"caobang.vn":2,"daklak.vn":2,"daknong.vn":2,"danang.vn":2,"dienbien.vn":2,"dongnai.vn":2,"dongthap.vn":2,"gialai.vn":2,"hagiang.vn":2,"haiduong.vn":2,"haiphong.vn":2,"hanam.vn":2,"hanoi.vn":2,"hatinh.vn":2,"haugiang.vn":2,"hoabinh.vn":2,"hungyen.vn":2,"khanhhoa.vn":2,"kiengiang.vn":2,"kontum.vn":2,"laichau.vn":2,"lamdong.vn":2,"langson.vn":2,"laocai.vn":2,"longan.vn":2,"namdinh.vn":2,"nghean.vn":2,"ninhbinh.vn":2,"ninhthuan.vn":2,"phutho.vn":2,"phuyen.vn":2,"quangbinh.vn":2,"quangnam.vn":2,"quangngai.vn":2,"quangninh.vn":2,"quangtri.vn":2,"soctrang.vn":2,"sonla.vn":2,"tayninh.vn":2,"thaibinh.vn":2,"thainguyen.vn":2,"thanhhoa.vn":2,"thanhphohochiminh.vn":2,"thuathienhue.vn":2,"tiengiang.vn":2,"travinh.vn":2,"tuyenquang.vn":2,"vinhlong.vn":2,"vinhphuc.vn":2,"yenbai.vn":2,"vu":1,"com.vu":2,"edu.vu":2,"net.vu":2,"org.vu":2,"wf":1,"ws":1,"com.ws":2,"net.ws":2,"org.ws":2,"gov.ws":2,"edu.ws":2,"yt":1,"xn--mgbaam7a8h":1,"xn--y9a3aq":1,"xn--54b7fta0cc":1,"xn--90ae":1,"xn--mgbcpq6gpa1a":1,"xn--90ais":1,"xn--fiqs8s":1,"xn--fiqz9s":1,"xn--lgbbat1ad8j":1,"xn--wgbh1c":1,"xn--e1a4c":1,"xn--qxa6a":1,"xn--mgbah1a3hjkrd":1,"xn--node":1,"xn--qxam":1,"xn--j6w193g":1,"xn--55qx5d.xn--j6w193g":2,"xn--wcvs22d.xn--j6w193g":2,"xn--mxtq1m.xn--j6w193g":2,"xn--gmqw5a.xn--j6w193g":2,"xn--od0alg.xn--j6w193g":2,"xn--uc0atv.xn--j6w193g":2,"xn--2scrj9c":1,"xn--3hcrj9c":1,"xn--45br5cyl":1,"xn--h2breg3eve":1,"xn--h2brj9c8c":1,"xn--mgbgu82a":1,"xn--rvc1e0am3e":1,"xn--h2brj9c":1,"xn--mgbbh1a":1,"xn--mgbbh1a71e":1,"xn--fpcrj9c3d":1,"xn--gecrj9c":1,"xn--s9brj9c":1,"xn--45brj9c":1,"xn--xkc2dl3a5ee0h":1,"xn--mgba3a4f16a":1,"xn--mgba3a4fra":1,"xn--mgbtx2b":1,"xn--mgbayh7gpa":1,"xn--3e0b707e":1,"xn--80ao21a":1,"xn--q7ce6a":1,"xn--fzc2c9e2c":1,"xn--xkc2al3hye2a":1,"xn--mgbc0a9azcg":1,"xn--d1alf":1,"xn--l1acc":1,"xn--mix891f":1,"xn--mix082f":1,"xn--mgbx4cd0ab":1,"xn--mgb9awbf":1,"xn--mgbai9azgqp6j":1,"xn--mgbai9a5eva00b":1,"xn--ygbi2ammx":1,"xn--90a3ac":1,"xn--o1ac.xn--90a3ac":2,"xn--c1avg.xn--90a3ac":2,"xn--90azh.xn--90a3ac":2,"xn--d1at.xn--90a3ac":2,"xn--o1ach.xn--90a3ac":2,"xn--80au.xn--90a3ac":2,"xn--p1ai":1,"xn--wgbl6a":1,"xn--mgberp4a5d4ar":1,"xn--mgberp4a5d4a87g":1,"xn--mgbqly7c0a67fbc":1,"xn--mgbqly7cvafr":1,"xn--mgbpl2fh":1,"xn--yfro4i67o":1,"xn--clchc0ea0b2g2a9gcd":1,"xn--ogbpf8fl":1,"xn--mgbtf8fl":1,"xn--o3cw4h":1,"xn--12c1fe0br.xn--o3cw4h":2,"xn--12co0c3b4eva.xn--o3cw4h":2,"xn--h3cuzk1di.xn--o3cw4h":2,"xn--o3cyx2a.xn--o3cw4h":2,"xn--m3ch0j3a.xn--o3cw4h":2,"xn--12cfi8ixb8l.xn--o3cw4h":2,"xn--pgbs0dh":1,"xn--kpry57d":1,"xn--kprw13d":1,"xn--nnx388a":1,"xn--j1amh":1,"xn--mgb2ddes":1,"xxx":1,"ye":1,"com.ye":2,"edu.ye":2,"gov.ye":2,"net.ye":2,"mil.ye":2,"org.ye":2,"ac.za":2,"agric.za":2,"alt.za":2,"co.za":2,"edu.za":2,"gov.za":2,"grondar.za":2,"law.za":2,"mil.za":2,"net.za":2,"ngo.za":2,"nic.za":2,"nis.za":2,"nom.za":2,"org.za":2,"school.za":2,"tm.za":2,"web.za":2,"zm":1,"ac.zm":2,"biz.zm":2,"co.zm":2,"com.zm":2,"edu.zm":2,"gov.zm":2,"info.zm":2,"mil.zm":2,"net.zm":2,"org.zm":2,"sch.zm":2,"zw":1,"ac.zw":2,"co.zw":2,"gov.zw":2,"mil.zw":2,"org.zw":2,"aaa":1,"aarp":1,"abb":1,"abbott":1,"abbvie":1,"abc":1,"able":1,"abogado":1,"abudhabi":1,"academy":1,"accenture":1,"accountant":1,"accountants":1,"aco":1,"actor":1,"ads":1,"adult":1,"aeg":1,"aetna":1,"afl":1,"africa":1,"agakhan":1,"agency":1,"aig":1,"airbus":1,"airforce":1,"airtel":1,"akdn":1,"alibaba":1,"alipay":1,"allfinanz":1,"allstate":1,"ally":1,"alsace":1,"alstom":1,"amazon":1,"americanexpress":1,"americanfamily":1,"amex":1,"amfam":1,"amica":1,"amsterdam":1,"analytics":1,"android":1,"anquan":1,"anz":1,"aol":1,"apartments":1,"app":1,"apple":1,"aquarelle":1,"arab":1,"aramco":1,"archi":1,"army":1,"art":1,"arte":1,"asda":1,"associates":1,"athleta":1,"attorney":1,"auction":1,"audi":1,"audible":1,"audio":1,"auspost":1,"author":1,"auto":1,"autos":1,"avianca":1,"aws":1,"axa":1,"azure":1,"baby":1,"baidu":1,"banamex":1,"bananarepublic":1,"band":1,"bank":1,"bar":1,"barcelona":1,"barclaycard":1,"barclays":1,"barefoot":1,"bargains":1,"baseball":1,"basketball":1,"bauhaus":1,"bayern":1,"bbc":1,"bbt":1,"bbva":1,"bcg":1,"bcn":1,"beats":1,"beauty":1,"beer":1,"bentley":1,"berlin":1,"best":1,"bestbuy":1,"bet":1,"bharti":1,"bible":1,"bid":1,"bike":1,"bing":1,"bingo":1,"bio":1,"black":1,"blackfriday":1,"blockbuster":1,"blog":1,"bloomberg":1,"blue":1,"bms":1,"bmw":1,"bnpparibas":1,"boats":1,"boehringer":1,"bofa":1,"bom":1,"bond":1,"boo":1,"book":1,"booking":1,"bosch":1,"bostik":1,"boston":1,"bot":1,"boutique":1,"box":1,"bradesco":1,"bridgestone":1,"broadway":1,"broker":1,"brother":1,"brussels":1,"build":1,"builders":1,"business":1,"buy":1,"buzz":1,"bzh":1,"cab":1,"cafe":1,"cal":1,"call":1,"calvinklein":1,"cam":1,"camera":1,"camp":1,"canon":1,"capetown":1,"capital":1,"capitalone":1,"car":1,"caravan":1,"cards":1,"care":1,"career":1,"careers":1,"cars":1,"casa":1,"case":1,"cash":1,"casino":1,"catering":1,"catholic":1,"cba":1,"cbn":1,"cbre":1,"cbs":1,"center":1,"ceo":1,"cern":1,"cfa":1,"cfd":1,"chanel":1,"channel":1,"charity":1,"chase":1,"chat":1,"cheap":1,"chintai":1,"christmas":1,"chrome":1,"church":1,"cipriani":1,"circle":1,"cisco":1,"citadel":1,"citi":1,"citic":1,"city":1,"cityeats":1,"claims":1,"cleaning":1,"click":1,"clinic":1,"clinique":1,"clothing":1,"cloud":1,"club":1,"clubmed":1,"coach":1,"codes":1,"coffee":1,"college":1,"cologne":1,"comcast":1,"commbank":1,"community":1,"company":1,"compare":1,"computer":1,"comsec":1,"condos":1,"construction":1,"consulting":1,"contact":1,"contractors":1,"cooking":1,"cool":1,"corsica":1,"country":1,"coupon":1,"coupons":1,"courses":1,"cpa":1,"credit":1,"creditcard":1,"creditunion":1,"cricket":1,"crown":1,"crs":1,"cruise":1,"cruises":1,"cuisinella":1,"cymru":1,"cyou":1,"dabur":1,"dad":1,"dance":1,"data":1,"date":1,"dating":1,"datsun":1,"day":1,"dclk":1,"dds":1,"deal":1,"dealer":1,"deals":1,"degree":1,"delivery":1,"dell":1,"deloitte":1,"delta":1,"democrat":1,"dental":1,"dentist":1,"desi":1,"design":1,"dev":1,"dhl":1,"diamonds":1,"diet":1,"digital":1,"direct":1,"directory":1,"discount":1,"discover":1,"dish":1,"diy":1,"dnp":1,"docs":1,"doctor":1,"dog":1,"domains":1,"dot":1,"download":1,"drive":1,"dtv":1,"dubai":1,"dunlop":1,"dupont":1,"durban":1,"dvag":1,"dvr":1,"earth":1,"eat":1,"eco":1,"edeka":1,"education":1,"email":1,"emerck":1,"energy":1,"engineer":1,"engineering":1,"enterprises":1,"epson":1,"equipment":1,"ericsson":1,"erni":1,"esq":1,"estate":1,"etisalat":1,"eurovision":1,"eus":1,"events":1,"exchange":1,"expert":1,"exposed":1,"express":1,"extraspace":1,"fage":1,"fail":1,"fairwinds":1,"faith":1,"family":1,"fan":1,"fans":1,"farm":1,"farmers":1,"fashion":1,"fast":1,"fedex":1,"feedback":1,"ferrari":1,"ferrero":1,"fidelity":1,"fido":1,"film":1,"final":1,"finance":1,"financial":1,"fire":1,"firestone":1,"firmdale":1,"fish":1,"fishing":1,"fit":1,"fitness":1,"flickr":1,"flights":1,"flir":1,"florist":1,"flowers":1,"fly":1,"foo":1,"food":1,"football":1,"ford":1,"forex":1,"forsale":1,"forum":1,"foundation":1,"fox":1,"free":1,"fresenius":1,"frl":1,"frogans":1,"frontdoor":1,"frontier":1,"ftr":1,"fujitsu":1,"fun":1,"fund":1,"furniture":1,"futbol":1,"fyi":1,"gal":1,"gallery":1,"gallo":1,"gallup":1,"game":1,"games":1,"gap":1,"garden":1,"gay":1,"gbiz":1,"gdn":1,"gea":1,"gent":1,"genting":1,"george":1,"ggee":1,"gift":1,"gifts":1,"gives":1,"giving":1,"glass":1,"gle":1,"global":1,"globo":1,"gmail":1,"gmbh":1,"gmo":1,"gmx":1,"godaddy":1,"gold":1,"goldpoint":1,"golf":1,"goo":1,"goodyear":1,"goog":1,"google":1,"gop":1,"got":1,"grainger":1,"graphics":1,"gratis":1,"green":1,"gripe":1,"grocery":1,"group":1,"guardian":1,"gucci":1,"guge":1,"guide":1,"guitars":1,"guru":1,"hair":1,"hamburg":1,"hangout":1,"haus":1,"hbo":1,"hdfc":1,"hdfcbank":1,"health":1,"healthcare":1,"help":1,"helsinki":1,"here":1,"hermes":1,"hiphop":1,"hisamitsu":1,"hitachi":1,"hiv":1,"hkt":1,"hockey":1,"holdings":1,"holiday":1,"homedepot":1,"homegoods":1,"homes":1,"homesense":1,"honda":1,"horse":1,"hospital":1,"host":1,"hosting":1,"hot":1,"hotels":1,"hotmail":1,"house":1,"how":1,"hsbc":1,"hughes":1,"hyatt":1,"hyundai":1,"ibm":1,"icbc":1,"ice":1,"icu":1,"ieee":1,"ifm":1,"ikano":1,"imamat":1,"imdb":1,"immo":1,"immobilien":1,"inc":1,"industries":1,"infiniti":1,"ing":1,"ink":1,"institute":1,"insurance":1,"insure":1,"international":1,"intuit":1,"investments":1,"ipiranga":1,"irish":1,"ismaili":1,"ist":1,"istanbul":1,"itau":1,"itv":1,"jaguar":1,"java":1,"jcb":1,"jeep":1,"jetzt":1,"jewelry":1,"jio":1,"jll":1,"jmp":1,"jnj":1,"joburg":1,"jot":1,"joy":1,"jpmorgan":1,"jprs":1,"juegos":1,"juniper":1,"kaufen":1,"kddi":1,"kerryhotels":1,"kerrylogistics":1,"kerryproperties":1,"kfh":1,"kia":1,"kids":1,"kim":1,"kinder":1,"kindle":1,"kitchen":1,"kiwi":1,"koeln":1,"komatsu":1,"kosher":1,"kpmg":1,"kpn":1,"krd":1,"kred":1,"kuokgroup":1,"kyoto":1,"lacaixa":1,"lamborghini":1,"lamer":1,"lancaster":1,"land":1,"landrover":1,"lanxess":1,"lasalle":1,"lat":1,"latino":1,"latrobe":1,"law":1,"lawyer":1,"lds":1,"lease":1,"leclerc":1,"lefrak":1,"legal":1,"lego":1,"lexus":1,"lgbt":1,"lidl":1,"life":1,"lifeinsurance":1,"lifestyle":1,"lighting":1,"like":1,"lilly":1,"limited":1,"limo":1,"lincoln":1,"link":1,"lipsy":1,"live":1,"living":1,"llc":1,"llp":1,"loan":1,"loans":1,"locker":1,"locus":1,"lol":1,"london":1,"lotte":1,"lotto":1,"love":1,"lpl":1,"lplfinancial":1,"ltd":1,"ltda":1,"lundbeck":1,"luxe":1,"luxury":1,"madrid":1,"maif":1,"maison":1,"makeup":1,"man":1,"management":1,"mango":1,"map":1,"market":1,"marketing":1,"markets":1,"marriott":1,"marshalls":1,"mattel":1,"mba":1,"mckinsey":1,"med":1,"media":1,"meet":1,"melbourne":1,"meme":1,"memorial":1,"men":1,"menu":1,"merckmsd":1,"miami":1,"microsoft":1,"mini":1,"mint":1,"mit":1,"mitsubishi":1,"mlb":1,"mls":1,"mma":1,"mobile":1,"moda":1,"moe":1,"moi":1,"mom":1,"monash":1,"money":1,"monster":1,"mormon":1,"mortgage":1,"moscow":1,"moto":1,"motorcycles":1,"mov":1,"movie":1,"msd":1,"mtn":1,"mtr":1,"music":1,"nab":1,"nagoya":1,"natura":1,"navy":1,"nba":1,"nec":1,"netbank":1,"netflix":1,"network":1,"neustar":1,"new":1,"news":1,"next":1,"nextdirect":1,"nexus":1,"nfl":1,"ngo":1,"nhk":1,"nico":1,"nike":1,"nikon":1,"ninja":1,"nissan":1,"nissay":1,"nokia":1,"norton":1,"now":1,"nowruz":1,"nowtv":1,"nra":1,"nrw":1,"ntt":1,"nyc":1,"obi":1,"observer":1,"office":1,"okinawa":1,"olayan":1,"olayangroup":1,"oldnavy":1,"ollo":1,"omega":1,"one":1,"ong":1,"onl":1,"online":1,"ooo":1,"open":1,"oracle":1,"orange":1,"organic":1,"origins":1,"osaka":1,"otsuka":1,"ott":1,"ovh":1,"page":1,"panasonic":1,"paris":1,"pars":1,"partners":1,"parts":1,"party":1,"pay":1,"pccw":1,"pet":1,"pfizer":1,"pharmacy":1,"phd":1,"philips":1,"phone":1,"photo":1,"photography":1,"photos":1,"physio":1,"pics":1,"pictet":1,"pictures":1,"pid":1,"pin":1,"ping":1,"pink":1,"pioneer":1,"pizza":1,"place":1,"play":1,"playstation":1,"plumbing":1,"plus":1,"pnc":1,"pohl":1,"poker":1,"politie":1,"porn":1,"pramerica":1,"praxi":1,"press":1,"prime":1,"prod":1,"productions":1,"prof":1,"progressive":1,"promo":1,"properties":1,"property":1,"protection":1,"pru":1,"prudential":1,"pub":1,"pwc":1,"qpon":1,"quebec":1,"quest":1,"racing":1,"radio":1,"read":1,"realestate":1,"realtor":1,"realty":1,"recipes":1,"red":1,"redstone":1,"redumbrella":1,"rehab":1,"reise":1,"reisen":1,"reit":1,"reliance":1,"ren":1,"rent":1,"rentals":1,"repair":1,"report":1,"republican":1,"rest":1,"restaurant":1,"review":1,"reviews":1,"rexroth":1,"rich":1,"richardli":1,"ricoh":1,"ril":1,"rio":1,"rip":1,"rocher":1,"rocks":1,"rodeo":1,"rogers":1,"room":1,"rsvp":1,"rugby":1,"ruhr":1,"run":1,"rwe":1,"ryukyu":1,"saarland":1,"safe":1,"safety":1,"sakura":1,"sale":1,"salon":1,"samsclub":1,"samsung":1,"sandvik":1,"sandvikcoromant":1,"sanofi":1,"sap":1,"sarl":1,"sas":1,"save":1,"saxo":1,"sbi":1,"sbs":1,"sca":1,"scb":1,"schaeffler":1,"schmidt":1,"scholarships":1,"school":1,"schule":1,"schwarz":1,"science":1,"scot":1,"search":1,"seat":1,"secure":1,"security":1,"seek":1,"select":1,"sener":1,"services":1,"seven":1,"sew":1,"sex":1,"sexy":1,"sfr":1,"shangrila":1,"sharp":1,"shaw":1,"shell":1,"shia":1,"shiksha":1,"shoes":1,"shop":1,"shopping":1,"shouji":1,"show":1,"showtime":1,"silk":1,"sina":1,"singles":1,"site":1,"ski":1,"skin":1,"sky":1,"skype":1,"sling":1,"smart":1,"smile":1,"sncf":1,"soccer":1,"social":1,"softbank":1,"software":1,"sohu":1,"solar":1,"solutions":1,"song":1,"sony":1,"soy":1,"spa":1,"space":1,"sport":1,"spot":1,"srl":1,"stada":1,"staples":1,"star":1,"statebank":1,"statefarm":1,"stc":1,"stcgroup":1,"stockholm":1,"storage":1,"store":1,"stream":1,"studio":1,"study":1,"style":1,"sucks":1,"supplies":1,"supply":1,"support":1,"surf":1,"surgery":1,"suzuki":1,"swatch":1,"swiss":1,"sydney":1,"systems":1,"tab":1,"taipei":1,"talk":1,"taobao":1,"target":1,"tatamotors":1,"tatar":1,"tattoo":1,"tax":1,"taxi":1,"tci":1,"tdk":1,"team":1,"tech":1,"technology":1,"temasek":1,"tennis":1,"teva":1,"thd":1,"theater":1,"theatre":1,"tiaa":1,"tickets":1,"tienda":1,"tips":1,"tires":1,"tirol":1,"tjmaxx":1,"tjx":1,"tkmaxx":1,"tmall":1,"today":1,"tokyo":1,"tools":1,"top":1,"toray":1,"toshiba":1,"total":1,"tours":1,"town":1,"toyota":1,"toys":1,"trade":1,"trading":1,"training":1,"travel":1,"travelers":1,"travelersinsurance":1,"trust":1,"trv":1,"tube":1,"tui":1,"tunes":1,"tushu":1,"tvs":1,"ubank":1,"ubs":1,"unicom":1,"university":1,"uno":1,"uol":1,"ups":1,"vacations":1,"vana":1,"vanguard":1,"vegas":1,"ventures":1,"verisign":1,"versicherung":1,"vet":1,"viajes":1,"video":1,"vig":1,"viking":1,"villas":1,"vin":1,"vip":1,"virgin":1,"visa":1,"vision":1,"viva":1,"vivo":1,"vlaanderen":1,"vodka":1,"volkswagen":1,"volvo":1,"vote":1,"voting":1,"voto":1,"voyage":1,"wales":1,"walmart":1,"walter":1,"wang":1,"wanggou":1,"watch":1,"watches":1,"weather":1,"weatherchannel":1,"webcam":1,"weber":1,"website":1,"wedding":1,"weibo":1,"weir":1,"whoswho":1,"wien":1,"wiki":1,"williamhill":1,"win":1,"windows":1,"wine":1,"winners":1,"wme":1,"wolterskluwer":1,"woodside":1,"work":1,"works":1,"world":1,"wow":1,"wtc":1,"wtf":1,"xbox":1,"xerox":1,"xfinity":1,"xihuan":1,"xin":1,"xn--11b4c3d":1,"xn--1ck2e1b":1,"xn--1qqw23a":1,"xn--30rr7y":1,"xn--3bst00m":1,"xn--3ds443g":1,"xn--3pxu8k":1,"xn--42c2d9a":1,"xn--45q11c":1,"xn--4gbrim":1,"xn--55qw42g":1,"xn--55qx5d":1,"xn--5su34j936bgsg":1,"xn--5tzm5g":1,"xn--6frz82g":1,"xn--6qq986b3xl":1,"xn--80adxhks":1,"xn--80aqecdr1a":1,"xn--80asehdb":1,"xn--80aswg":1,"xn--8y0a063a":1,"xn--9dbq2a":1,"xn--9et52u":1,"xn--9krt00a":1,"xn--b4w605ferd":1,"xn--bck1b9a5dre4c":1,"xn--c1avg":1,"xn--c2br7g":1,"xn--cck2b3b":1,"xn--cckwcxetd":1,"xn--cg4bki":1,"xn--czr694b":1,"xn--czrs0t":1,"xn--czru2d":1,"xn--d1acj3b":1,"xn--eckvdtc9d":1,"xn--efvy88h":1,"xn--fct429k":1,"xn--fhbei":1,"xn--fiq228c5hs":1,"xn--fiq64b":1,"xn--fjq720a":1,"xn--flw351e":1,"xn--fzys8d69uvgm":1,"xn--g2xx48c":1,"xn--gckr3f0f":1,"xn--gk3at1e":1,"xn--hxt814e":1,"xn--i1b6b1a6a2e":1,"xn--imr513n":1,"xn--io0a7i":1,"xn--j1aef":1,"xn--jlq480n2rg":1,"xn--jvr189m":1,"xn--kcrx77d1x4a":1,"xn--kput3i":1,"xn--mgba3a3ejt":1,"xn--mgba7c0bbn0a":1,"xn--mgbaakc7dvf":1,"xn--mgbab2bd":1,"xn--mgbca7dzdo":1,"xn--mgbi4ecexp":1,"xn--mgbt3dhd":1,"xn--mk1bu44c":1,"xn--mxtq1m":1,"xn--ngbc5azd":1,"xn--ngbe9e0a":1,"xn--ngbrx":1,"xn--nqv7f":1,"xn--nqv7fs00ema":1,"xn--nyqy26a":1,"xn--otu796d":1,"xn--p1acf":1,"xn--pssy2u":1,"xn--q9jyb4c":1,"xn--qcka1pmc":1,"xn--rhqv96g":1,"xn--rovu88b":1,"xn--ses554g":1,"xn--t60b56a":1,"xn--tckwe":1,"xn--tiq49xqyj":1,"xn--unup4y":1,"xn--vermgensberater-ctb":1,"xn--vermgensberatung-pwb":1,"xn--vhquv":1,"xn--vuq861b":1,"xn--w4r85el8fhu5dnra":1,"xn--w4rs40l":1,"xn--xhq521b":1,"xn--zfr164b":1,"xyz":1,"yachts":1,"yahoo":1,"yamaxun":1,"yandex":1,"yodobashi":1,"yoga":1,"yokohama":1,"you":1,"youtube":1,"yun":1,"zappos":1,"zara":1,"zero":1,"zip":1,"zone":1,"zuerich":1},"private":{"cc.ua":2,"inf.ua":2,"ltd.ua":2,"611.to":2,"graphox.us":2,"devcdnaccesso.com":3,"on-acorn.io":3,"activetrail.biz":2,"adobeaemcloud.com":2,"dev.adobeaemcloud.com":4,"hlx.live":2,"adobeaemcloud.net":2,"hlx.page":2,"hlx3.page":2,"adobeio-static.net":2,"adobeioruntime.net":2,"beep.pl":2,"airkitapps.com":2,"airkitapps-au.com":2,"airkitapps.eu":2,"aivencloud.com":2,"akadns.net":2,"akamai.net":2,"akamai-staging.net":2,"akamaiedge.net":2,"akamaiedge-staging.net":2,"akamaihd.net":2,"akamaihd-staging.net":2,"akamaiorigin.net":2,"akamaiorigin-staging.net":2,"akamaized.net":2,"akamaized-staging.net":2,"edgekey.net":2,"edgekey-staging.net":2,"edgesuite.net":2,"edgesuite-staging.net":2,"barsy.ca":2,"compute.estate":3,"alces.network":3,"kasserver.com":2,"altervista.org":2,"alwaysdata.net":2,"myamaze.net":2,"cloudfront.net":2,"compute.amazonaws.com":4,"compute-1.amazonaws.com":4,"compute.amazonaws.com.cn":5,"us-east-1.amazonaws.com":3,"s3.cn-north-1.amazonaws.com.cn":5,"s3.dualstack.ap-northeast-1.amazonaws.com":5,"s3.dualstack.ap-northeast-2.amazonaws.com":5,"s3.ap-northeast-2.amazonaws.com":4,"s3-website.ap-northeast-2.amazonaws.com":4,"s3.dualstack.ap-south-1.amazonaws.com":5,"s3.ap-south-1.amazonaws.com":4,"s3-website.ap-south-1.amazonaws.com":4,"s3.dualstack.ap-southeast-1.amazonaws.com":5,"s3.dualstack.ap-southeast-2.amazonaws.com":5,"s3.dualstack.ca-central-1.amazonaws.com":5,"s3.ca-central-1.amazonaws.com":4,"s3-website.ca-central-1.amazonaws.com":4,"s3.dualstack.eu-central-1.amazonaws.com":5,"s3.eu-central-1.amazonaws.com":4,"s3-website.eu-central-1.amazonaws.com":4,"s3.dualstack.eu-west-1.amazonaws.com":5,"s3.dualstack.eu-west-2.amazonaws.com":5,"s3.eu-west-2.amazonaws.com":4,"s3-website.eu-west-2.amazonaws.com":4,"s3.dualstack.eu-west-3.amazonaws.com":5,"s3.eu-west-3.amazonaws.com":4,"s3-website.eu-west-3.amazonaws.com":4,"s3.amazonaws.com":3,"s3-ap-northeast-1.amazonaws.com":3,"s3-ap-northeast-2.amazonaws.com":3,"s3-ap-south-1.amazonaws.com":3,"s3-ap-southeast-1.amazonaws.com":3,"s3-ap-southeast-2.amazonaws.com":3,"s3-ca-central-1.amazonaws.com":3,"s3-eu-central-1.amazonaws.com":3,"s3-eu-west-1.amazonaws.com":3,"s3-eu-west-2.amazonaws.com":3,"s3-eu-west-3.amazonaws.com":3,"s3-external-1.amazonaws.com":3,"s3-fips-us-gov-west-1.amazonaws.com":3,"s3-sa-east-1.amazonaws.com":3,"s3-us-east-2.amazonaws.com":3,"s3-us-gov-west-1.amazonaws.com":3,"s3-us-west-1.amazonaws.com":3,"s3-us-west-2.amazonaws.com":3,"s3-website-ap-northeast-1.amazonaws.com":3,"s3-website-ap-southeast-1.amazonaws.com":3,"s3-website-ap-southeast-2.amazonaws.com":3,"s3-website-eu-west-1.amazonaws.com":3,"s3-website-sa-east-1.amazonaws.com":3,"s3-website-us-east-1.amazonaws.com":3,"s3-website-us-west-1.amazonaws.com":3,"s3-website-us-west-2.amazonaws.com":3,"s3.dualstack.sa-east-1.amazonaws.com":5,"s3.dualstack.us-east-1.amazonaws.com":5,"s3.dualstack.us-east-2.amazonaws.com":5,"s3.us-east-2.amazonaws.com":4,"s3-website.us-east-2.amazonaws.com":4,"analytics-gateway.ap-northeast-1.amazonaws.com":4,"analytics-gateway.eu-west-1.amazonaws.com":4,"analytics-gateway.us-east-1.amazonaws.com":4,"analytics-gateway.us-east-2.amazonaws.com":4,"analytics-gateway.us-west-2.amazonaws.com":4,"webview-assets.aws-cloud9.af-south-1.amazonaws.com":5,"vfs.cloud9.af-south-1.amazonaws.com":5,"webview-assets.cloud9.af-south-1.amazonaws.com":5,"webview-assets.aws-cloud9.ap-east-1.amazonaws.com":5,"vfs.cloud9.ap-east-1.amazonaws.com":5,"webview-assets.cloud9.ap-east-1.amazonaws.com":5,"webview-assets.aws-cloud9.ap-northeast-1.amazonaws.com":5,"vfs.cloud9.ap-northeast-1.amazonaws.com":5,"webview-assets.cloud9.ap-northeast-1.amazonaws.com":5,"webview-assets.aws-cloud9.ap-northeast-2.amazonaws.com":5,"vfs.cloud9.ap-northeast-2.amazonaws.com":5,"webview-assets.cloud9.ap-northeast-2.amazonaws.com":5,"webview-assets.aws-cloud9.ap-northeast-3.amazonaws.com":5,"vfs.cloud9.ap-northeast-3.amazonaws.com":5,"webview-assets.cloud9.ap-northeast-3.amazonaws.com":5,"webview-assets.aws-cloud9.ap-south-1.amazonaws.com":5,"vfs.cloud9.ap-south-1.amazonaws.com":5,"webview-assets.cloud9.ap-south-1.amazonaws.com":5,"webview-assets.aws-cloud9.ap-southeast-1.amazonaws.com":5,"vfs.cloud9.ap-southeast-1.amazonaws.com":5,"webview-assets.cloud9.ap-southeast-1.amazonaws.com":5,"webview-assets.aws-cloud9.ap-southeast-2.amazonaws.com":5,"vfs.cloud9.ap-southeast-2.amazonaws.com":5,"webview-assets.cloud9.ap-southeast-2.amazonaws.com":5,"webview-assets.aws-cloud9.ca-central-1.amazonaws.com":5,"vfs.cloud9.ca-central-1.amazonaws.com":5,"webview-assets.cloud9.ca-central-1.amazonaws.com":5,"webview-assets.aws-cloud9.eu-central-1.amazonaws.com":5,"vfs.cloud9.eu-central-1.amazonaws.com":5,"webview-assets.cloud9.eu-central-1.amazonaws.com":5,"webview-assets.aws-cloud9.eu-north-1.amazonaws.com":5,"vfs.cloud9.eu-north-1.amazonaws.com":5,"webview-assets.cloud9.eu-north-1.amazonaws.com":5,"webview-assets.aws-cloud9.eu-south-1.amazonaws.com":5,"vfs.cloud9.eu-south-1.amazonaws.com":5,"webview-assets.cloud9.eu-south-1.amazonaws.com":5,"webview-assets.aws-cloud9.eu-west-1.amazonaws.com":5,"vfs.cloud9.eu-west-1.amazonaws.com":5,"webview-assets.cloud9.eu-west-1.amazonaws.com":5,"webview-assets.aws-cloud9.eu-west-2.amazonaws.com":5,"vfs.cloud9.eu-west-2.amazonaws.com":5,"webview-assets.cloud9.eu-west-2.amazonaws.com":5,"webview-assets.aws-cloud9.eu-west-3.amazonaws.com":5,"vfs.cloud9.eu-west-3.amazonaws.com":5,"webview-assets.cloud9.eu-west-3.amazonaws.com":5,"webview-assets.aws-cloud9.me-south-1.amazonaws.com":5,"vfs.cloud9.me-south-1.amazonaws.com":5,"webview-assets.cloud9.me-south-1.amazonaws.com":5,"webview-assets.aws-cloud9.sa-east-1.amazonaws.com":5,"vfs.cloud9.sa-east-1.amazonaws.com":5,"webview-assets.cloud9.sa-east-1.amazonaws.com":5,"webview-assets.aws-cloud9.us-east-1.amazonaws.com":5,"vfs.cloud9.us-east-1.amazonaws.com":5,"webview-assets.cloud9.us-east-1.amazonaws.com":5,"webview-assets.aws-cloud9.us-east-2.amazonaws.com":5,"vfs.cloud9.us-east-2.amazonaws.com":5,"webview-assets.cloud9.us-east-2.amazonaws.com":5,"webview-assets.aws-cloud9.us-west-1.amazonaws.com":5,"vfs.cloud9.us-west-1.amazonaws.com":5,"webview-assets.cloud9.us-west-1.amazonaws.com":5,"webview-assets.aws-cloud9.us-west-2.amazonaws.com":5,"vfs.cloud9.us-west-2.amazonaws.com":5,"webview-assets.cloud9.us-west-2.amazonaws.com":5,"cn-north-1.eb.amazonaws.com.cn":5,"cn-northwest-1.eb.amazonaws.com.cn":5,"elasticbeanstalk.com":2,"ap-northeast-1.elasticbeanstalk.com":3,"ap-northeast-2.elasticbeanstalk.com":3,"ap-northeast-3.elasticbeanstalk.com":3,"ap-south-1.elasticbeanstalk.com":3,"ap-southeast-1.elasticbeanstalk.com":3,"ap-southeast-2.elasticbeanstalk.com":3,"ca-central-1.elasticbeanstalk.com":3,"eu-central-1.elasticbeanstalk.com":3,"eu-west-1.elasticbeanstalk.com":3,"eu-west-2.elasticbeanstalk.com":3,"eu-west-3.elasticbeanstalk.com":3,"sa-east-1.elasticbeanstalk.com":3,"us-east-1.elasticbeanstalk.com":3,"us-east-2.elasticbeanstalk.com":3,"us-gov-west-1.elasticbeanstalk.com":3,"us-west-1.elasticbeanstalk.com":3,"us-west-2.elasticbeanstalk.com":3,"elb.amazonaws.com.cn":5,"elb.amazonaws.com":4,"awsglobalaccelerator.com":2,"eero.online":2,"eero-stage.online":2,"t3l3p0rt.net":2,"tele.amune.org":3,"apigee.io":2,"siiites.com":2,"appspacehosted.com":2,"appspaceusercontent.com":2,"appudo.net":2,"on-aptible.com":2,"user.aseinet.ne.jp":4,"gv.vc":2,"d.gv.vc":3,"user.party.eus":3,"pimienta.org":2,"poivron.org":2,"potager.org":2,"sweetpepper.org":2,"myasustor.com":2,"cdn.prod.atlassian-dev.net":4,"translated.page":2,"autocode.dev":2,"myfritz.net":2,"onavstack.net":2,"awdev.ca":3,"advisor.ws":3,"ecommerce-shop.pl":2,"b-data.io":2,"backplaneapp.io":2,"balena-devices.com":2,"rs.ba":2,"banzai.cloud":3,"app.banzaicloud.io":3,"backyards.banzaicloud.io":4,"base.ec":2,"official.ec":2,"buyshop.jp":2,"fashionstore.jp":2,"handcrafted.jp":2,"kawaiishop.jp":2,"supersale.jp":2,"theshop.jp":2,"shopselect.net":2,"base.shop":2,"beagleboard.io":2,"beget.app":3,"betainabox.com":2,"bnr.la":2,"bitbucket.io":2,"blackbaudcdn.net":2,"of.je":2,"bluebite.io":2,"boomla.net":2,"boutir.com":2,"boxfuse.io":2,"square7.ch":2,"bplaced.com":2,"bplaced.de":2,"square7.de":2,"bplaced.net":2,"square7.net":2,"shop.brendly.rs":3,"browsersafetymark.io":2,"uk0.bigv.io":3,"dh.bytemark.co.uk":4,"vm.bytemark.co.uk":4,"cafjs.com":2,"mycd.eu":2,"canva-apps.cn":2,"canva-apps.com":2,"drr.ac":2,"uwu.ai":2,"carrd.co":2,"crd.co":2,"ju.mp":2,"ae.org":2,"br.com":2,"cn.com":2,"com.de":2,"com.se":2,"de.com":2,"eu.com":2,"gb.net":2,"hu.net":2,"jp.net":2,"jpn.com":2,"mex.com":2,"ru.com":2,"sa.com":2,"se.net":2,"uk.com":2,"uk.net":2,"us.com":2,"za.bz":2,"za.com":2,"ar.com":2,"hu.com":2,"kr.com":2,"no.com":2,"qc.com":2,"uy.com":2,"africa.com":2,"gr.com":2,"in.net":2,"web.in":2,"us.org":2,"co.com":2,"aus.basketball":2,"nz.basketball":2,"radio.am":2,"radio.fm":2,"c.la":2,"certmgr.org":2,"cx.ua":2,"discourse.group":2,"discourse.team":2,"cleverapps.io":2,"clerk.app":2,"clerkstage.app":2,"lcl.dev":3,"lclstage.dev":3,"stg.dev":3,"stgstage.dev":3,"clickrising.net":2,"c66.me":2,"cloud66.ws":2,"cloud66.zone":2,"jdevcloud.com":2,"wpdevcloud.com":2,"cloudaccess.host":2,"freesite.host":2,"cloudaccess.net":2,"cloudcontrolled.com":2,"cloudcontrolapp.com":2,"cloudera.site":3,"cf-ipfs.com":2,"cloudflare-ipfs.com":2,"trycloudflare.com":2,"pages.dev":2,"r2.dev":2,"workers.dev":2,"wnext.app":2,"co.ca":2,"otap.co":3,"co.cz":2,"c.cdn77.org":3,"cdn77-ssl.net":2,"r.cdn77.net":3,"rsc.cdn77.org":3,"ssl.origin.cdn77-secure.org":4,"cloudns.asia":2,"cloudns.biz":2,"cloudns.club":2,"cloudns.cc":2,"cloudns.eu":2,"cloudns.in":2,"cloudns.info":2,"cloudns.org":2,"cloudns.pro":2,"cloudns.pw":2,"cloudns.us":2,"cnpy.gdn":2,"codeberg.page":2,"co.nl":2,"co.no":2,"webhosting.be":2,"hosting-cluster.nl":2,"ac.ru":2,"edu.ru":2,"gov.ru":2,"int.ru":2,"mil.ru":2,"test.ru":2,"dyn.cosidns.de":3,"dynamisches-dns.de":2,"dnsupdater.de":2,"internet-dns.de":2,"l-o-g-i-n.de":2,"dynamic-dns.info":2,"feste-ip.net":2,"knx-server.net":2,"static-access.net":2,"realm.cz":2,"cryptonomic.net":3,"cupcake.is":2,"curv.dev":2,"customer-oci.com":3,"oci.customer-oci.com":4,"ocp.customer-oci.com":4,"ocs.customer-oci.com":4,"cyon.link":2,"cyon.site":2,"fnwk.site":2,"folionetwork.site":2,"platform0.app":2,"daplie.me":2,"localhost.daplie.me":3,"dattolocal.com":2,"dattorelay.com":2,"dattoweb.com":2,"mydatto.com":2,"dattolocal.net":2,"mydatto.net":2,"biz.dk":2,"co.dk":2,"firm.dk":2,"reg.dk":2,"store.dk":2,"dyndns.dappnode.io":3,"dapps.earth":3,"bzz.dapps.earth":4,"builtwithdark.com":2,"demo.datadetect.com":3,"instance.datadetect.com":3,"edgestack.me":2,"ddns5.com":2,"debian.net":2,"deno.dev":2,"deno-staging.dev":2,"dedyn.io":2,"deta.app":2,"deta.dev":2,"rss.my.id":4,"diher.solutions":3,"discordsays.com":2,"discordsez.com":2,"jozi.biz":2,"dnshome.de":2,"online.th":2,"shop.th":2,"drayddns.com":2,"shoparena.pl":2,"dreamhosters.com":2,"mydrobo.com":2,"drud.io":2,"drud.us":2,"duckdns.org":2,"bip.sh":2,"bitbridge.net":2,"dy.fi":2,"tunk.org":2,"dyndns-at-home.com":2,"dyndns-at-work.com":2,"dyndns-blog.com":2,"dyndns-free.com":2,"dyndns-home.com":2,"dyndns-ip.com":2,"dyndns-mail.com":2,"dyndns-office.com":2,"dyndns-pics.com":2,"dyndns-remote.com":2,"dyndns-server.com":2,"dyndns-web.com":2,"dyndns-wiki.com":2,"dyndns-work.com":2,"dyndns.biz":2,"dyndns.info":2,"dyndns.org":2,"dyndns.tv":2,"at-band-camp.net":2,"ath.cx":2,"barrel-of-knowledge.info":2,"barrell-of-knowledge.info":2,"better-than.tv":2,"blogdns.com":2,"blogdns.net":2,"blogdns.org":2,"blogsite.org":2,"boldlygoingnowhere.org":2,"broke-it.net":2,"buyshouses.net":2,"cechire.com":2,"dnsalias.com":2,"dnsalias.net":2,"dnsalias.org":2,"dnsdojo.com":2,"dnsdojo.net":2,"dnsdojo.org":2,"does-it.net":2,"doesntexist.com":2,"doesntexist.org":2,"dontexist.com":2,"dontexist.net":2,"dontexist.org":2,"doomdns.com":2,"doomdns.org":2,"dvrdns.org":2,"dyn-o-saur.com":2,"dynalias.com":2,"dynalias.net":2,"dynalias.org":2,"dynathome.net":2,"dyndns.ws":2,"endofinternet.net":2,"endofinternet.org":2,"endoftheinternet.org":2,"est-a-la-maison.com":2,"est-a-la-masion.com":2,"est-le-patron.com":2,"est-mon-blogueur.com":2,"for-better.biz":2,"for-more.biz":2,"for-our.info":2,"for-some.biz":2,"for-the.biz":2,"forgot.her.name":3,"forgot.his.name":3,"from-ak.com":2,"from-al.com":2,"from-ar.com":2,"from-az.net":2,"from-ca.com":2,"from-co.net":2,"from-ct.com":2,"from-dc.com":2,"from-de.com":2,"from-fl.com":2,"from-ga.com":2,"from-hi.com":2,"from-ia.com":2,"from-id.com":2,"from-il.com":2,"from-in.com":2,"from-ks.com":2,"from-ky.com":2,"from-la.net":2,"from-ma.com":2,"from-md.com":2,"from-me.org":2,"from-mi.com":2,"from-mn.com":2,"from-mo.com":2,"from-ms.com":2,"from-mt.com":2,"from-nc.com":2,"from-nd.com":2,"from-ne.com":2,"from-nh.com":2,"from-nj.com":2,"from-nm.com":2,"from-nv.com":2,"from-ny.net":2,"from-oh.com":2,"from-ok.com":2,"from-or.com":2,"from-pa.com":2,"from-pr.com":2,"from-ri.com":2,"from-sc.com":2,"from-sd.com":2,"from-tn.com":2,"from-tx.com":2,"from-ut.com":2,"from-va.com":2,"from-vt.com":2,"from-wa.com":2,"from-wi.com":2,"from-wv.com":2,"from-wy.com":2,"ftpaccess.cc":2,"fuettertdasnetz.de":2,"game-host.org":2,"game-server.cc":2,"getmyip.com":2,"gets-it.net":2,"go.dyndns.org":3,"gotdns.com":2,"gotdns.org":2,"groks-the.info":2,"groks-this.info":2,"ham-radio-op.net":2,"here-for-more.info":2,"hobby-site.com":2,"hobby-site.org":2,"home.dyndns.org":3,"homedns.org":2,"homeftp.net":2,"homeftp.org":2,"homeip.net":2,"homelinux.com":2,"homelinux.net":2,"homelinux.org":2,"homeunix.com":2,"homeunix.net":2,"homeunix.org":2,"iamallama.com":2,"in-the-band.net":2,"is-a-anarchist.com":2,"is-a-blogger.com":2,"is-a-bookkeeper.com":2,"is-a-bruinsfan.org":2,"is-a-bulls-fan.com":2,"is-a-candidate.org":2,"is-a-caterer.com":2,"is-a-celticsfan.org":2,"is-a-chef.com":2,"is-a-chef.net":2,"is-a-chef.org":2,"is-a-conservative.com":2,"is-a-cpa.com":2,"is-a-cubicle-slave.com":2,"is-a-democrat.com":2,"is-a-designer.com":2,"is-a-doctor.com":2,"is-a-financialadvisor.com":2,"is-a-geek.com":2,"is-a-geek.net":2,"is-a-geek.org":2,"is-a-green.com":2,"is-a-guru.com":2,"is-a-hard-worker.com":2,"is-a-hunter.com":2,"is-a-knight.org":2,"is-a-landscaper.com":2,"is-a-lawyer.com":2,"is-a-liberal.com":2,"is-a-libertarian.com":2,"is-a-linux-user.org":2,"is-a-llama.com":2,"is-a-musician.com":2,"is-a-nascarfan.com":2,"is-a-nurse.com":2,"is-a-painter.com":2,"is-a-patsfan.org":2,"is-a-personaltrainer.com":2,"is-a-photographer.com":2,"is-a-player.com":2,"is-a-republican.com":2,"is-a-rockstar.com":2,"is-a-socialist.com":2,"is-a-soxfan.org":2,"is-a-student.com":2,"is-a-teacher.com":2,"is-a-techie.com":2,"is-a-therapist.com":2,"is-an-accountant.com":2,"is-an-actor.com":2,"is-an-actress.com":2,"is-an-anarchist.com":2,"is-an-artist.com":2,"is-an-engineer.com":2,"is-an-entertainer.com":2,"is-by.us":2,"is-certified.com":2,"is-found.org":2,"is-gone.com":2,"is-into-anime.com":2,"is-into-cars.com":2,"is-into-cartoons.com":2,"is-into-games.com":2,"is-leet.com":2,"is-lost.org":2,"is-not-certified.com":2,"is-saved.org":2,"is-slick.com":2,"is-uberleet.com":2,"is-very-bad.org":2,"is-very-evil.org":2,"is-very-good.org":2,"is-very-nice.org":2,"is-very-sweet.org":2,"is-with-theband.com":2,"isa-geek.com":2,"isa-geek.net":2,"isa-geek.org":2,"isa-hockeynut.com":2,"issmarterthanyou.com":2,"isteingeek.de":2,"istmein.de":2,"kicks-ass.net":2,"kicks-ass.org":2,"knowsitall.info":2,"land-4-sale.us":2,"lebtimnetz.de":2,"leitungsen.de":2,"likes-pie.com":2,"likescandy.com":2,"merseine.nu":2,"mine.nu":2,"misconfused.org":2,"mypets.ws":2,"myphotos.cc":2,"neat-url.com":2,"office-on-the.net":2,"on-the-web.tv":2,"podzone.net":2,"podzone.org":2,"readmyblog.org":2,"saves-the-whales.com":2,"scrapper-site.net":2,"scrapping.cc":2,"selfip.biz":2,"selfip.com":2,"selfip.info":2,"selfip.net":2,"selfip.org":2,"sells-for-less.com":2,"sells-for-u.com":2,"sells-it.net":2,"sellsyourhome.org":2,"servebbs.com":2,"servebbs.net":2,"servebbs.org":2,"serveftp.net":2,"serveftp.org":2,"servegame.org":2,"shacknet.nu":2,"simple-url.com":2,"space-to-rent.com":2,"stuff-4-sale.org":2,"stuff-4-sale.us":2,"teaches-yoga.com":2,"thruhere.net":2,"traeumtgerade.de":2,"webhop.biz":2,"webhop.info":2,"webhop.net":2,"webhop.org":2,"worse-than.tv":2,"writesthisblog.com":2,"ddnss.de":2,"dyn.ddnss.de":3,"dyndns.ddnss.de":3,"dyndns1.de":2,"dyn-ip24.de":2,"home-webserver.de":2,"dyn.home-webserver.de":3,"myhome-server.de":2,"ddnss.org":2,"definima.net":2,"definima.io":2,"ondigitalocean.app":2,"digitaloceanspaces.com":3,"bci.dnstrace.pro":3,"ddnsfree.com":2,"ddnsgeek.com":2,"giize.com":2,"gleeze.com":2,"kozow.com":2,"loseyourip.com":2,"ooguy.com":2,"theworkpc.com":2,"casacam.net":2,"dynu.net":2,"accesscam.org":2,"camdvr.org":2,"freeddns.org":2,"mywire.org":2,"webredirect.org":2,"myddns.rocks":2,"blogsite.xyz":2,"dynv6.net":2,"e4.cz":2,"easypanel.app":2,"easypanel.host":2,"elementor.cloud":2,"elementor.cool":2,"en-root.fr":2,"mytuleap.com":2,"tuleap-partners.com":2,"encr.app":2,"encoreapi.com":2,"onred.one":2,"staging.onred.one":3,"eu.encoway.cloud":3,"eu.org":2,"al.eu.org":3,"asso.eu.org":3,"at.eu.org":3,"au.eu.org":3,"be.eu.org":3,"bg.eu.org":3,"ca.eu.org":3,"cd.eu.org":3,"ch.eu.org":3,"cn.eu.org":3,"cy.eu.org":3,"cz.eu.org":3,"de.eu.org":3,"dk.eu.org":3,"edu.eu.org":3,"ee.eu.org":3,"es.eu.org":3,"fi.eu.org":3,"fr.eu.org":3,"gr.eu.org":3,"hr.eu.org":3,"hu.eu.org":3,"ie.eu.org":3,"il.eu.org":3,"in.eu.org":3,"int.eu.org":3,"is.eu.org":3,"it.eu.org":3,"jp.eu.org":3,"kr.eu.org":3,"lt.eu.org":3,"lu.eu.org":3,"lv.eu.org":3,"mc.eu.org":3,"me.eu.org":3,"mk.eu.org":3,"mt.eu.org":3,"my.eu.org":3,"net.eu.org":3,"ng.eu.org":3,"nl.eu.org":3,"no.eu.org":3,"nz.eu.org":3,"paris.eu.org":3,"pl.eu.org":3,"pt.eu.org":3,"q-a.eu.org":3,"ro.eu.org":3,"ru.eu.org":3,"se.eu.org":3,"si.eu.org":3,"sk.eu.org":3,"tr.eu.org":3,"uk.eu.org":3,"us.eu.org":3,"eurodir.ru":2,"eu-1.evennode.com":3,"eu-2.evennode.com":3,"eu-3.evennode.com":3,"eu-4.evennode.com":3,"us-1.evennode.com":3,"us-2.evennode.com":3,"us-3.evennode.com":3,"us-4.evennode.com":3,"twmail.cc":2,"twmail.net":2,"twmail.org":2,"mymailer.com.tw":3,"url.tw":2,"onfabrica.com":2,"apps.fbsbx.com":3,"ru.net":2,"adygeya.ru":2,"bashkiria.ru":2,"bir.ru":2,"cbg.ru":2,"com.ru":2,"dagestan.ru":2,"grozny.ru":2,"kalmykia.ru":2,"kustanai.ru":2,"marine.ru":2,"mordovia.ru":2,"msk.ru":2,"mytis.ru":2,"nalchik.ru":2,"nov.ru":2,"pyatigorsk.ru":2,"spb.ru":2,"vladikavkaz.ru":2,"vladimir.ru":2,"abkhazia.su":2,"adygeya.su":2,"aktyubinsk.su":2,"arkhangelsk.su":2,"armenia.su":2,"ashgabad.su":2,"azerbaijan.su":2,"balashov.su":2,"bashkiria.su":2,"bryansk.su":2,"bukhara.su":2,"chimkent.su":2,"dagestan.su":2,"east-kazakhstan.su":2,"exnet.su":2,"georgia.su":2,"grozny.su":2,"ivanovo.su":2,"jambyl.su":2,"kalmykia.su":2,"kaluga.su":2,"karacol.su":2,"karaganda.su":2,"karelia.su":2,"khakassia.su":2,"krasnodar.su":2,"kurgan.su":2,"kustanai.su":2,"lenug.su":2,"mangyshlak.su":2,"mordovia.su":2,"msk.su":2,"murmansk.su":2,"nalchik.su":2,"navoi.su":2,"north-kazakhstan.su":2,"nov.su":2,"obninsk.su":2,"penza.su":2,"pokrovsk.su":2,"sochi.su":2,"spb.su":2,"tashkent.su":2,"termez.su":2,"togliatti.su":2,"troitsk.su":2,"tselinograd.su":2,"tula.su":2,"tuva.su":2,"vladikavkaz.su":2,"vladimir.su":2,"vologda.su":2,"channelsdvr.net":2,"u.channelsdvr.net":3,"edgecompute.app":2,"fastly-edge.com":2,"fastly-terrarium.com":2,"fastlylb.net":2,"map.fastlylb.net":3,"freetls.fastly.net":3,"map.fastly.net":3,"a.prod.fastly.net":4,"global.prod.fastly.net":4,"a.ssl.fastly.net":4,"b.ssl.fastly.net":4,"global.ssl.fastly.net":4,"user.fm":3,"fastvps-server.com":2,"fastvps.host":2,"myfast.host":2,"fastvps.site":2,"myfast.space":2,"fedorainfracloud.org":2,"fedorapeople.org":2,"cloud.fedoraproject.org":3,"app.os.fedoraproject.org":4,"app.os.stg.fedoraproject.org":5,"conn.uk":2,"copro.uk":2,"hosp.uk":2,"mydobiss.com":2,"fh-muenster.io":2,"filegear.me":2,"filegear-au.me":2,"filegear-de.me":2,"filegear-gb.me":2,"filegear-ie.me":2,"filegear-jp.me":2,"filegear-sg.me":2,"firebaseapp.com":2,"fireweb.app":2,"flap.id":2,"onflashdrive.app":2,"fldrv.com":2,"fly.dev":2,"edgeapp.net":2,"shw.io":2,"flynnhosting.net":2,"forgeblocks.com":2,"id.forgerock.io":3,"framer.app":2,"framercanvas.com":2,"framer.media":2,"framer.photos":2,"framer.website":2,"framer.wiki":2,"frusky.de":3,"ravpage.co.il":3,"0e.vc":2,"freebox-os.com":2,"freeboxos.com":2,"fbx-os.fr":2,"fbxos.fr":2,"freebox-os.fr":2,"freeboxos.fr":2,"freedesktop.org":2,"freemyip.com":2,"wien.funkfeuer.at":3,"futurecms.at":3,"ex.futurecms.at":4,"in.futurecms.at":4,"futurehosting.at":2,"futuremailing.at":2,"ex.ortsinfo.at":4,"kunden.ortsinfo.at":4,"statics.cloud":3,"independent-commission.uk":2,"independent-inquest.uk":2,"independent-inquiry.uk":2,"independent-panel.uk":2,"independent-review.uk":2,"public-inquiry.uk":2,"royal-commission.uk":2,"campaign.gov.uk":3,"service.gov.uk":3,"api.gov.uk":3,"gehirn.ne.jp":3,"usercontent.jp":2,"gentapps.com":2,"gentlentapis.com":2,"lab.ms":2,"cdn-edges.net":2,"ghost.io":2,"gsj.bz":2,"githubusercontent.com":2,"githubpreview.dev":2,"github.io":2,"gitlab.io":2,"gitapp.si":2,"gitpage.si":2,"glitch.me":2,"nog.community":2,"co.ro":2,"shop.ro":2,"lolipop.io":2,"angry.jp":2,"babyblue.jp":2,"babymilk.jp":2,"backdrop.jp":2,"bambina.jp":2,"bitter.jp":2,"blush.jp":2,"boo.jp":2,"boy.jp":2,"boyfriend.jp":2,"but.jp":2,"candypop.jp":2,"capoo.jp":2,"catfood.jp":2,"cheap.jp":2,"chicappa.jp":2,"chillout.jp":2,"chips.jp":2,"chowder.jp":2,"chu.jp":2,"ciao.jp":2,"cocotte.jp":2,"coolblog.jp":2,"cranky.jp":2,"cutegirl.jp":2,"daa.jp":2,"deca.jp":2,"deci.jp":2,"digick.jp":2,"egoism.jp":2,"fakefur.jp":2,"fem.jp":2,"flier.jp":2,"floppy.jp":2,"fool.jp":2,"frenchkiss.jp":2,"girlfriend.jp":2,"girly.jp":2,"gloomy.jp":2,"gonna.jp":2,"greater.jp":2,"hacca.jp":2,"heavy.jp":2,"her.jp":2,"hiho.jp":2,"hippy.jp":2,"holy.jp":2,"hungry.jp":2,"icurus.jp":2,"itigo.jp":2,"jellybean.jp":2,"kikirara.jp":2,"kill.jp":2,"kilo.jp":2,"kuron.jp":2,"littlestar.jp":2,"lolipopmc.jp":2,"lolitapunk.jp":2,"lomo.jp":2,"lovepop.jp":2,"lovesick.jp":2,"main.jp":2,"mods.jp":2,"mond.jp":2,"mongolian.jp":2,"moo.jp":2,"namaste.jp":2,"nikita.jp":2,"nobushi.jp":2,"noor.jp":2,"oops.jp":2,"parallel.jp":2,"parasite.jp":2,"pecori.jp":2,"peewee.jp":2,"penne.jp":2,"pepper.jp":2,"perma.jp":2,"pigboat.jp":2,"pinoko.jp":2,"punyu.jp":2,"pupu.jp":2,"pussycat.jp":2,"pya.jp":2,"raindrop.jp":2,"readymade.jp":2,"sadist.jp":2,"schoolbus.jp":2,"secret.jp":2,"staba.jp":2,"stripper.jp":2,"sub.jp":2,"sunnyday.jp":2,"thick.jp":2,"tonkotsu.jp":2,"under.jp":2,"upper.jp":2,"velvet.jp":2,"verse.jp":2,"versus.jp":2,"vivian.jp":2,"watson.jp":2,"weblike.jp":2,"whitesnow.jp":2,"zombie.jp":2,"heteml.net":2,"cloudapps.digital":2,"london.cloudapps.digital":3,"pymnt.uk":2,"homeoffice.gov.uk":3,"ro.im":2,"goip.de":2,"run.app":2,"a.run.app":3,"web.app":2,"0emm.com":3,"appspot.com":2,"r.appspot.com":4,"codespot.com":2,"googleapis.com":2,"googlecode.com":2,"pagespeedmobilizer.com":2,"publishproxy.com":2,"withgoogle.com":2,"withyoutube.com":2,"gateway.dev":3,"cloud.goog":2,"translate.goog":2,"usercontent.goog":3,"cloudfunctions.net":2,"blogspot.ae":2,"blogspot.al":2,"blogspot.am":2,"blogspot.ba":2,"blogspot.be":2,"blogspot.bg":2,"blogspot.bj":2,"blogspot.ca":2,"blogspot.cf":2,"blogspot.ch":2,"blogspot.cl":2,"blogspot.co.at":3,"blogspot.co.id":3,"blogspot.co.il":3,"blogspot.co.ke":3,"blogspot.co.nz":3,"blogspot.co.uk":3,"blogspot.co.za":3,"blogspot.com":2,"blogspot.com.ar":3,"blogspot.com.au":3,"blogspot.com.br":3,"blogspot.com.by":3,"blogspot.com.co":3,"blogspot.com.cy":3,"blogspot.com.ee":3,"blogspot.com.eg":3,"blogspot.com.es":3,"blogspot.com.mt":3,"blogspot.com.ng":3,"blogspot.com.tr":3,"blogspot.com.uy":3,"blogspot.cv":2,"blogspot.cz":2,"blogspot.de":2,"blogspot.dk":2,"blogspot.fi":2,"blogspot.fr":2,"blogspot.gr":2,"blogspot.hk":2,"blogspot.hr":2,"blogspot.hu":2,"blogspot.ie":2,"blogspot.in":2,"blogspot.is":2,"blogspot.it":2,"blogspot.jp":2,"blogspot.kr":2,"blogspot.li":2,"blogspot.lt":2,"blogspot.lu":2,"blogspot.md":2,"blogspot.mk":2,"blogspot.mr":2,"blogspot.mx":2,"blogspot.my":2,"blogspot.nl":2,"blogspot.no":2,"blogspot.pe":2,"blogspot.pt":2,"blogspot.qa":2,"blogspot.re":2,"blogspot.ro":2,"blogspot.rs":2,"blogspot.ru":2,"blogspot.se":2,"blogspot.sg":2,"blogspot.si":2,"blogspot.sk":2,"blogspot.sn":2,"blogspot.td":2,"blogspot.tw":2,"blogspot.ug":2,"blogspot.vn":2,"goupile.fr":2,"gov.nl":2,"awsmppl.com":2,"xn--gnstigbestellen-zvb.de":2,"xn--gnstigliefern-wob.de":2,"fin.ci":2,"free.hr":2,"caa.li":2,"ua.rs":2,"conf.se":2,"hs.zone":2,"hs.run":2,"hashbang.sh":2,"hasura.app":2,"hasura-app.io":2,"pages.it.hs-heilbronn.de":4,"hepforge.org":2,"herokuapp.com":2,"herokussl.com":2,"ravendb.cloud":2,"ravendb.community":2,"ravendb.me":2,"development.run":2,"ravendb.run":2,"homesklep.pl":2,"secaas.hk":2,"hoplix.shop":2,"orx.biz":2,"biz.gl":2,"col.ng":2,"firm.ng":2,"gen.ng":2,"ltd.ng":2,"ngo.ng":2,"edu.scot":2,"sch.so":2,"ie.ua":2,"hostyhosting.io":2,"xn--hkkinen-5wa.fi":2,"moonscale.io":3,"moonscale.net":2,"iki.fi":2,"ibxos.it":2,"iliadboxos.it":2,"impertrixcdn.com":2,"impertrix.com":2,"smushcdn.com":2,"wphostedmail.com":2,"wpmucdn.com":2,"tempurl.host":2,"wpmudev.host":2,"dyn-berlin.de":2,"in-berlin.de":2,"in-brb.de":2,"in-butter.de":2,"in-dsl.de":2,"in-dsl.net":2,"in-dsl.org":2,"in-vpn.de":2,"in-vpn.net":2,"in-vpn.org":2,"biz.at":2,"info.at":2,"info.cx":2,"ac.leg.br":3,"al.leg.br":3,"am.leg.br":3,"ap.leg.br":3,"ba.leg.br":3,"ce.leg.br":3,"df.leg.br":3,"es.leg.br":3,"go.leg.br":3,"ma.leg.br":3,"mg.leg.br":3,"ms.leg.br":3,"mt.leg.br":3,"pa.leg.br":3,"pb.leg.br":3,"pe.leg.br":3,"pi.leg.br":3,"pr.leg.br":3,"rj.leg.br":3,"rn.leg.br":3,"ro.leg.br":3,"rr.leg.br":3,"rs.leg.br":3,"sc.leg.br":3,"se.leg.br":3,"sp.leg.br":3,"to.leg.br":3,"pixolino.com":2,"na4u.ru":2,"iopsys.se":2,"ipifony.net":2,"iservschule.de":2,"mein-iserv.de":2,"schulplattform.de":2,"schulserver.de":2,"test-iserv.de":2,"iserv.dev":2,"iobb.net":2,"mel.cloudlets.com.au":4,"cloud.interhostsolutions.be":3,"mycloud.by":2,"alp1.ae.flow.ch":4,"appengine.flow.ch":3,"es-1.axarnet.cloud":3,"diadem.cloud":2,"vip.jelastic.cloud":3,"jele.cloud":2,"it1.eur.aruba.jenv-aruba.cloud":5,"it1.jenv-aruba.cloud":3,"keliweb.cloud":2,"cs.keliweb.cloud":3,"oxa.cloud":2,"tn.oxa.cloud":3,"uk.oxa.cloud":3,"primetel.cloud":2,"uk.primetel.cloud":3,"ca.reclaim.cloud":3,"uk.reclaim.cloud":3,"us.reclaim.cloud":3,"ch.trendhosting.cloud":3,"de.trendhosting.cloud":3,"jele.club":2,"amscompute.com":2,"dopaas.com":2,"paas.hosted-by-previder.com":3,"rag-cloud.hosteur.com":3,"rag-cloud-ch.hosteur.com":3,"jcloud.ik-server.com":3,"jcloud-ver-jpc.ik-server.com":3,"demo.jelastic.com":3,"kilatiron.com":2,"paas.massivegrid.com":3,"jed.wafaicloud.com":3,"lon.wafaicloud.com":3,"ryd.wafaicloud.com":3,"j.scaleforce.com.cy":4,"jelastic.dogado.eu":3,"fi.cloudplatform.fi":3,"demo.datacenter.fi":3,"paas.datacenter.fi":3,"jele.host":2,"mircloud.host":2,"paas.beebyte.io":3,"sekd1.beebyteapp.io":3,"jele.io":2,"cloud-fr1.unispace.io":3,"jc.neen.it":3,"cloud.jelastic.open.tim.it":5,"jcloud.kz":2,"upaas.kazteleport.kz":3,"cloudjiffy.net":2,"fra1-de.cloudjiffy.net":3,"west1-us.cloudjiffy.net":3,"jls-sto1.elastx.net":3,"jls-sto2.elastx.net":3,"jls-sto3.elastx.net":3,"faststacks.net":2,"fr-1.paas.massivegrid.net":4,"lon-1.paas.massivegrid.net":4,"lon-2.paas.massivegrid.net":4,"ny-1.paas.massivegrid.net":4,"ny-2.paas.massivegrid.net":4,"sg-1.paas.massivegrid.net":4,"jelastic.saveincloud.net":3,"nordeste-idc.saveincloud.net":3,"j.scaleforce.net":3,"jelastic.tsukaeru.net":3,"sdscloud.pl":2,"unicloud.pl":2,"mircloud.ru":2,"jelastic.regruhosting.ru":3,"enscaled.sg":2,"jele.site":2,"jelastic.team":2,"orangecloud.tn":2,"j.layershift.co.uk":4,"phx.enscaled.us":3,"mircloud.us":2,"myjino.ru":2,"hosting.myjino.ru":4,"landing.myjino.ru":4,"spectrum.myjino.ru":4,"vps.myjino.ru":4,"jotelulu.cloud":2,"triton.zone":3,"cns.joyent.com":4,"js.org":2,"kaas.gg":2,"khplay.nl":2,"ktistory.com":2,"kapsi.fi":2,"keymachine.de":2,"kinghost.net":2,"uni5.net":2,"knightpoint.systems":2,"koobin.events":2,"oya.to":2,"kuleuven.cloud":2,"ezproxy.kuleuven.be":3,"co.krd":2,"edu.krd":2,"krellian.net":2,"webthings.io":2,"git-repos.de":2,"lcube-server.de":2,"svn-repos.de":2,"leadpages.co":2,"lpages.co":2,"lpusercontent.com":2,"lelux.site":2,"co.business":2,"co.education":2,"co.events":2,"co.financial":2,"co.network":2,"co.place":2,"co.technology":2,"app.lmpm.com":3,"linkyard.cloud":2,"linkyard-cloud.ch":2,"members.linode.com":3,"nodebalancer.linode.com":4,"linodeobjects.com":3,"ip.linodeusercontent.com":3,"we.bs":2,"user.localcert.dev":4,"localzone.xyz":2,"loginline.app":2,"loginline.dev":2,"loginline.io":2,"loginline.services":2,"loginline.site":2,"servers.run":2,"lohmus.me":2,"krasnik.pl":2,"leczna.pl":2,"lubartow.pl":2,"lublin.pl":2,"poniatowa.pl":2,"swidnik.pl":2,"glug.org.uk":3,"lug.org.uk":3,"lugs.org.uk":3,"barsy.bg":2,"barsy.co.uk":3,"barsyonline.co.uk":3,"barsycenter.com":2,"barsyonline.com":2,"barsy.club":2,"barsy.de":2,"barsy.eu":2,"barsy.in":2,"barsy.info":2,"barsy.io":2,"barsy.me":2,"barsy.menu":2,"barsy.mobi":2,"barsy.net":2,"barsy.online":2,"barsy.org":2,"barsy.pro":2,"barsy.pub":2,"barsy.ro":2,"barsy.shop":2,"barsy.site":2,"barsy.support":2,"barsy.uk":2,"magentosite.cloud":3,"mayfirst.info":2,"mayfirst.org":2,"hb.cldmail.ru":3,"cn.vu":2,"mazeplay.com":2,"mcpe.me":2,"mcdir.me":2,"mcdir.ru":2,"mcpre.ru":2,"vps.mcdir.ru":3,"mediatech.by":2,"mediatech.dev":2,"hra.health":2,"miniserver.com":2,"memset.net":2,"messerli.app":2,"cloud.metacentrum.cz":4,"custom.metacentrum.cz":3,"flt.cloud.muni.cz":4,"usr.cloud.muni.cz":4,"meteorapp.com":2,"eu.meteorapp.com":3,"co.pl":2,"azurecontainer.io":3,"azurewebsites.net":2,"azure-mobile.net":2,"cloudapp.net":2,"azurestaticapps.net":2,"1.azurestaticapps.net":3,"2.azurestaticapps.net":3,"3.azurestaticapps.net":3,"centralus.azurestaticapps.net":3,"eastasia.azurestaticapps.net":3,"eastus2.azurestaticapps.net":3,"westeurope.azurestaticapps.net":3,"westus2.azurestaticapps.net":3,"csx.cc":2,"mintere.site":2,"forte.id":2,"mozilla-iot.org":2,"bmoattachments.org":2,"net.ru":2,"org.ru":2,"pp.ru":2,"hostedpi.com":2,"customer.mythic-beasts.com":3,"caracal.mythic-beasts.com":3,"fentiger.mythic-beasts.com":3,"lynx.mythic-beasts.com":3,"ocelot.mythic-beasts.com":3,"oncilla.mythic-beasts.com":3,"onza.mythic-beasts.com":3,"sphinx.mythic-beasts.com":3,"vs.mythic-beasts.com":3,"x.mythic-beasts.com":3,"yali.mythic-beasts.com":3,"cust.retrosnub.co.uk":4,"ui.nabu.casa":3,"cloud.nospamproxy.com":3,"netlify.app":2,"4u.com":2,"ngrok.app":2,"ngrok-free.app":2,"ngrok.dev":2,"ngrok-free.dev":2,"ngrok.io":2,"ap.ngrok.io":3,"au.ngrok.io":3,"eu.ngrok.io":3,"in.ngrok.io":3,"jp.ngrok.io":3,"sa.ngrok.io":3,"us.ngrok.io":3,"ngrok.pizza":2,"nh-serv.co.uk":3,"nfshost.com":2,"developer.app":3,"noop.app":2,"northflank.app":3,"build.run":3,"code.run":3,"database.run":3,"migration.run":3,"noticeable.news":2,"dnsking.ch":2,"mypi.co":2,"n4t.co":2,"001www.com":2,"ddnslive.com":2,"myiphost.com":2,"forumz.info":2,"16-b.it":2,"32-b.it":2,"64-b.it":2,"soundcast.me":2,"tcp4.me":2,"dnsup.net":2,"hicam.net":2,"now-dns.net":2,"ownip.net":2,"vpndns.net":2,"dynserv.org":2,"now-dns.org":2,"x443.pw":2,"now-dns.top":2,"ntdll.top":2,"freeddns.us":2,"crafting.xyz":2,"zapto.xyz":2,"nsupdate.info":2,"nerdpol.ovh":2,"blogsyte.com":2,"brasilia.me":2,"cable-modem.org":2,"ciscofreak.com":2,"collegefan.org":2,"couchpotatofries.org":2,"damnserver.com":2,"ddns.me":2,"ditchyourip.com":2,"dnsfor.me":2,"dnsiskinky.com":2,"dvrcam.info":2,"dynns.com":2,"eating-organic.net":2,"fantasyleague.cc":2,"geekgalaxy.com":2,"golffan.us":2,"health-carereform.com":2,"homesecuritymac.com":2,"homesecuritypc.com":2,"hopto.me":2,"ilovecollege.info":2,"loginto.me":2,"mlbfan.org":2,"mmafan.biz":2,"myactivedirectory.com":2,"mydissent.net":2,"myeffect.net":2,"mymediapc.net":2,"mypsx.net":2,"mysecuritycamera.com":2,"mysecuritycamera.net":2,"mysecuritycamera.org":2,"net-freaks.com":2,"nflfan.org":2,"nhlfan.net":2,"no-ip.ca":2,"no-ip.co.uk":3,"no-ip.net":2,"noip.us":2,"onthewifi.com":2,"pgafan.net":2,"point2this.com":2,"pointto.us":2,"privatizehealthinsurance.net":2,"quicksytes.com":2,"read-books.org":2,"securitytactics.com":2,"serveexchange.com":2,"servehumour.com":2,"servep2p.com":2,"servesarcasm.com":2,"stufftoread.com":2,"ufcfan.org":2,"unusualperson.com":2,"workisboring.com":2,"3utilities.com":2,"bounceme.net":2,"ddns.net":2,"ddnsking.com":2,"gotdns.ch":2,"hopto.org":2,"myftp.biz":2,"myftp.org":2,"myvnc.com":2,"no-ip.biz":2,"no-ip.info":2,"no-ip.org":2,"noip.me":2,"redirectme.net":2,"servebeer.com":2,"serveblog.net":2,"servecounterstrike.com":2,"serveftp.com":2,"servegame.com":2,"servehalflife.com":2,"servehttp.com":2,"serveirc.com":2,"serveminecraft.net":2,"servemp3.com":2,"servepics.com":2,"servequake.com":2,"sytes.net":2,"webhop.me":2,"zapto.org":2,"stage.nodeart.io":3,"pcloud.host":2,"nyc.mn":2,"static.observableusercontent.com":3,"cya.gg":2,"omg.lol":2,"cloudycluster.net":2,"omniwe.site":2,"123hjemmeside.dk":2,"123hjemmeside.no":2,"123homepage.it":2,"123kotisivu.fi":2,"123minsida.se":2,"123miweb.es":2,"123paginaweb.pt":2,"123sait.ru":2,"123siteweb.fr":2,"123webseite.at":2,"123webseite.de":2,"123website.be":2,"123website.ch":2,"123website.lu":2,"123website.nl":2,"service.one":2,"simplesite.com":2,"simplesite.com.br":3,"simplesite.gr":2,"simplesite.pl":2,"nid.io":2,"opensocial.site":2,"opencraft.hosting":2,"orsites.com":2,"operaunite.com":2,"tech.orange":2,"authgear-staging.com":2,"authgearapps.com":2,"skygearapp.com":2,"outsystemscloud.com":2,"webpaas.ovh.net":4,"hosting.ovh.net":4,"ownprovider.com":2,"own.pm":2,"owo.codes":3,"ox.rs":2,"oy.lc":2,"pgfog.com":2,"pagefrontapp.com":2,"pagexl.com":2,"paywhirl.com":3,"bar0.net":2,"bar1.net":2,"bar2.net":2,"rdv.to":2,"art.pl":2,"gliwice.pl":2,"krakow.pl":2,"poznan.pl":2,"wroc.pl":2,"zakopane.pl":2,"pantheonsite.io":2,"gotpantheon.com":2,"mypep.link":2,"perspecta.cloud":2,"lk3.ru":2,"on-web.fr":2,"bc.platform.sh":3,"ent.platform.sh":3,"eu.platform.sh":3,"us.platform.sh":3,"platformsh.site":3,"tst.site":3,"platter-app.com":2,"platter-app.dev":2,"platterp.us":2,"pdns.page":2,"plesk.page":2,"pleskns.com":2,"dyn53.io":2,"onporter.run":2,"co.bn":2,"postman-echo.com":2,"pstmn.io":2,"mock.pstmn.io":3,"httpbin.org":2,"prequalifyme.today":2,"xen.prgmr.com":3,"priv.at":2,"prvcy.page":2,"dweb.link":3,"protonet.io":2,"chirurgiens-dentistes-en-france.fr":2,"byen.site":2,"pubtls.org":2,"pythonanywhere.com":2,"eu.pythonanywhere.com":3,"qoto.io":2,"qualifioapp.com":2,"ladesk.com":2,"qbuser.com":2,"cloudsite.builders":2,"instances.spawn.cc":3,"instantcloud.cn":2,"ras.ru":2,"qa2.com":2,"qcx.io":2,"sys.qcx.io":4,"dev-myqnapcloud.com":2,"alpha-myqnapcloud.com":2,"myqnapcloud.com":2,"quipelements.com":3,"vapor.cloud":2,"vaporcloud.io":2,"rackmaze.com":2,"rackmaze.net":2,"g.vbrplsbx.io":3,"on-k3s.io":3,"on-rancher.cloud":3,"on-rio.io":3,"readthedocs.io":2,"rhcloud.com":2,"app.render.com":3,"onrender.com":2,"firewalledreplit.co":2,"id.firewalledreplit.co":3,"repl.co":2,"id.repl.co":3,"repl.run":2,"resindevice.io":2,"devices.resinstaging.io":3,"hzc.io":2,"wellbeingzone.eu":2,"wellbeingzone.co.uk":3,"adimo.co.uk":3,"itcouldbewor.se":2,"git-pages.rit.edu":3,"rocky.page":2,"xn--90amc.xn--p1acf":2,"xn--j1aef.xn--p1acf":2,"xn--j1ael8b.xn--p1acf":2,"xn--h1ahn.xn--p1acf":2,"xn--j1adp.xn--p1acf":2,"xn--c1avg.xn--p1acf":2,"xn--80aaa0cvac.xn--p1acf":2,"xn--h1aliz.xn--p1acf":2,"xn--90a1af.xn--p1acf":2,"xn--41a.xn--p1acf":2,"180r.com":2,"dojin.com":2,"sakuratan.com":2,"sakuraweb.com":2,"x0.com":2,"2-d.jp":2,"bona.jp":2,"crap.jp":2,"daynight.jp":2,"eek.jp":2,"flop.jp":2,"halfmoon.jp":2,"jeez.jp":2,"matrix.jp":2,"mimoza.jp":2,"ivory.ne.jp":3,"mail-box.ne.jp":3,"mints.ne.jp":3,"mokuren.ne.jp":3,"opal.ne.jp":3,"sakura.ne.jp":3,"sumomo.ne.jp":3,"topaz.ne.jp":3,"netgamers.jp":2,"nyanta.jp":2,"o0o0.jp":2,"rdy.jp":2,"rgr.jp":2,"rulez.jp":2,"s3.isk01.sakurastorage.jp":4,"s3.isk02.sakurastorage.jp":4,"saloon.jp":2,"sblo.jp":2,"skr.jp":2,"tank.jp":2,"uh-oh.jp":2,"undo.jp":2,"rs.webaccel.jp":3,"user.webaccel.jp":3,"websozai.jp":2,"xii.jp":2,"squares.net":2,"jpn.org":2,"kirara.st":2,"x0.to":2,"from.tv":2,"sakura.tv":2,"builder.code.com":4,"dev-builder.code.com":4,"stg-builder.code.com":4,"sandcats.io":2,"logoip.de":2,"logoip.com":2,"fr-par-1.baremetal.scw.cloud":4,"fr-par-2.baremetal.scw.cloud":4,"nl-ams-1.baremetal.scw.cloud":4,"fnc.fr-par.scw.cloud":4,"functions.fnc.fr-par.scw.cloud":5,"k8s.fr-par.scw.cloud":4,"nodes.k8s.fr-par.scw.cloud":5,"s3.fr-par.scw.cloud":4,"s3-website.fr-par.scw.cloud":4,"whm.fr-par.scw.cloud":4,"priv.instances.scw.cloud":4,"pub.instances.scw.cloud":4,"k8s.scw.cloud":3,"k8s.nl-ams.scw.cloud":4,"nodes.k8s.nl-ams.scw.cloud":5,"s3.nl-ams.scw.cloud":4,"s3-website.nl-ams.scw.cloud":4,"whm.nl-ams.scw.cloud":4,"k8s.pl-waw.scw.cloud":4,"nodes.k8s.pl-waw.scw.cloud":5,"s3.pl-waw.scw.cloud":4,"s3-website.pl-waw.scw.cloud":4,"scalebook.scw.cloud":3,"smartlabeling.scw.cloud":3,"dedibox.fr":2,"schokokeks.net":2,"gov.scot":2,"service.gov.scot":3,"scrysec.com":2,"firewall-gateway.com":2,"firewall-gateway.de":2,"my-gateway.de":2,"my-router.de":2,"spdns.de":2,"spdns.eu":2,"firewall-gateway.net":2,"my-firewall.org":2,"myfirewall.org":2,"spdns.org":2,"seidat.net":2,"sellfy.store":2,"senseering.net":2,"minisite.ms":2}};
return tld;
})();
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js b/data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js
index bc8aecc..4d403d7 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/common/uuid.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js b/data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js
index f1485f9..047e686 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/content/patchWindow.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
@@ -205,15 +205,36 @@ function patchWindow(patchingCallback, env = {}) {
env.port = new Port("page", "extension");
- function getSafeMethod(obj, method) {
- return isDeadTarget(obj, method) ? xray.wrap(obj)[method] : obj[method];
- }
+ const {xrayEnabled} = patchWindow;
+ const zombieDanger = xrayEnabled && document.readyState === "complete";
+ const isZombieException = e => e.message.includes("dead object");
+
+ const getSafeMethod = zombieDanger
+ ? (obj, method, wrappedObj) => {
+ let actualTarget = obj[method];
+ return XPCNativeWrapper.unwrap(new window.Proxy(actualTarget, cloneInto({
+ apply(targetFunc, thisArg, args) {
+ try {
+ return actualTarget.apply(thisArg, args);
+ } catch (e) {
+ if (isZombieException(e)) {
+ return (actualTarget = (wrappedObj || XPCNativeWrapper(obj))[method]).apply(thisArg, args);
+ }
+ throw e;
+ }
+ },
+ }, window, {cloneFunctions: true, wrapReflectors: true}
+ )));
- function getSafeDescriptor(proto, prop, accessor) {
- let des = Object.getOwnPropertyDescriptor(proto, prop);
- return isDeadTarget(des, accessor) ?
- Object.getOwnPropertyDescriptor(xray.wrap(proto), prop)
- : des;
+ } : (obj, method) => obj[method];
+
+ const getSafeDescriptor = (proto, prop, accessor) => {
+ const des = Reflect.getOwnPropertyDescriptor(proto, prop);
+ if (zombieDanger) {
+ const wrappedDescriptor = Reflect.getOwnPropertyDescriptor(xray.wrap(proto), prop);
+ des[accessor] = getSafeMethod(des, accessor, wrappedDescriptor);
+ }
+ return des;
}
let xrayMake = (enabled, wrap, unwrap = wrap, forPage = wrap) => ({
@@ -221,26 +242,13 @@ function patchWindow(patchingCallback, env = {}) {
getSafeMethod, getSafeDescriptor
});
- let xray = typeof XPCNativeWrapper === "undefined"
+ let xray = !xrayEnabled
? xrayMake(false, o => o)
: xrayMake(true, o => XPCNativeWrapper(o), o => XPCNativeWrapper.unwrap(o),
function(obj, win = this.window || window) {
return cloneInto(obj, win, {cloneFunctions: true, wrapReflectors: true});
});
- var isDeadTarget = xray.enabled && document.readyState === "complete" ?
- (obj, method) => {
- // We may be repatching this already loaded window during an extension update:
- // beware of dead object from killed obsolete content script!
- try {
- obj[method].apply(null);
- } catch (e) {
- return e.message.includes("dead object");
- }
- return false;
- }
- : () => false;
-
const patchedWindows = new WeakSet(); // track them to avoid indirect recursion
// win: window object to modify.
@@ -282,6 +290,7 @@ function patchWindow(patchingCallback, env = {}) {
}
// auto-trigger window patching whenever new elements are added to the DOM
let patchAll = () => {
+ const win = xray.unwrap(window);
for (let j = 0; j in win; j++) {
try {
modifyWindow(win[j]);
@@ -341,8 +350,8 @@ function patchWindow(patchingCallback, env = {}) {
}
}
let des = getSafeDescriptor(proto, method, accessor);
- des[accessor] = new Proxy(des[accessor], patchHandler);
- win.Object.defineProperty(proto, method, xray.forPage(des, win));
+ des[accessor] = exportFunction(new Proxy(des[accessor], patchHandler), proto, {defineAs: `${accessor} ${method}`});;
+ Reflect.defineProperty(xray.unwrap(proto), method, des);
}
for (let [obj, methods] of Object.entries(domChangers)) {
@@ -371,14 +380,15 @@ function patchWindow(patchingCallback, env = {}) {
};
descriptor.get = exportFunction(replacements[property], proto, {defineAs: `get ${property}`});
- Object.defineProperty(proto, property, descriptor);
+ Reflect.defineProperty(proto, property, descriptor);
}
modifyWindow(window);
return port;
}
-if (typeof XPCNativeWrapper !== "undefined") {
+patchWindow.xrayEnabled = typeof XPCNativeWrapper !== "undefined";
+if (patchWindow.xrayEnabled) {
// make up for object element initialization inconsistencies on Firefox
let callbacks = new Set();
patchWindow.onObject = {
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js b/data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js
index aae8e38..1b78604 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/service/DocStartInjection.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
@@ -18,7 +18,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>.
*/
-// depends on /nscl/lib/sha256.js
+// depends on /nscl/common/sha256.js
// depends on /nscl/common/uuid.js
"use strict";
@@ -69,7 +69,7 @@ var DocStartInjection = (() => {
if (repeating) {
let scriptsBlock = [...scripts].join("\n");
- let injectionId = `injection:${uuid()}:${sha256(scriptsBlock)}`;
+ let injectionId = `injection:${uuid()}:${await sha256(scriptsBlock)}`;
let args = {
code: `(() => {
let injectionId = ${JSON.stringify(injectionId)};
@@ -215,7 +215,7 @@ var DocStartInjection = (() => {
},
unregister(scriptBuilder) {
scriptBuilders.delete(scriptBuilder);
- if (scriptBuilders.size() === 0) listen(false);
+ if (scriptBuilders.size === 0) listen(false);
}
};
})(); \ No newline at end of file
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js b/data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js
index 43ee91c..0e603fd 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/service/NavCache.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
diff --git a/data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js b/data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js
index 79a01ea..bac095e 100644
--- a/data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js
+++ b/data/extensions/jsr@javascriptrestrictor/nscl/service/TabCache.js
@@ -1,7 +1,7 @@
/*
* NoScript Commons Library
* Reusable building blocks for cross-browser security/privacy WebExtensions.
- * Copyright (C) 2020-2021 Giorgio Maone <https://maone.net>
+ * Copyright (C) 2020-2023 Giorgio Maone <https://maone.net>
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
diff --git a/data/extensions/jsr@javascriptrestrictor/options.css b/data/extensions/jsr@javascriptrestrictor/options.css
index 646eb7c..f02d5ef 100644
--- a/data/extensions/jsr@javascriptrestrictor/options.css
+++ b/data/extensions/jsr@javascriptrestrictor/options.css
@@ -51,9 +51,9 @@ footer {
/* Redefine the grid into a three column layout with empty space on the left and right. */
grid-template-columns: 1fr 10em 1000px 10% 1fr;
grid-template-areas:
- "left-empty menu content logo right-empty"
- "left-empty menu content versions right-empty"
- "left-empty menu footer footer right-empty"
+ "left-empty logo content right-empty"
+ "left-empty menu content right-empty"
+ "left-empty menu footer right-empty"
}
section.logo {
padding-top: 3em;
@@ -93,7 +93,7 @@ nav.menu ul ul {
}
nav.menu ul p:after {
- content: " »";
+ content: "__MSG_ExternalLinksSeparator__";
}
nav.menu ul a:visited, nav.menu ul a, nav.menu ul p {
@@ -118,6 +118,10 @@ section.content {
text-align: justify;
}
+section.content section#configuration_area #tweaks div.more, section.content div.tweakgrid div.more {
+ text-align: left;
+}
+
.main-section {
padding: 0.5em;
}
@@ -131,7 +135,7 @@ section.content {
#levels-list li, #domain-level-list li {
list-style-type: none;
margin: 0px;
- padding: 0.5em;
+ padding-top: 0.5em;
}
.level {
@@ -145,6 +149,10 @@ section.content {
font-weight: bold;
}
+.undo a, .alert a {
+ color: var(--attention-color);
+}
+
.alert{
padding: 1em;
}
@@ -201,6 +209,15 @@ section#sect-devel {
display: none;
}
+button.level {
+ min-width: 80%;
+ max-width: 80%;
+}
+label.level_button_descr {
+ display: inline-block;
+ width: 80%;
+}
+
#levels-storage-text {
width: 100%;
height: 50ex;
@@ -214,7 +231,7 @@ fieldset {
display: none;
}
-#levels-config #levels-list input[type=range] {
+#current-level-tweaks input[type=range] {
pointer-events:none; /* https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events */
}
@@ -226,3 +243,19 @@ fieldset {
.protection-title > .shield-onoff-label {
padding-right: 10px;
}
+
+#jss-shield-settings {
+ display: flex;
+}
+
+.jss-shield-settings-item {
+ flex: 1;
+}
+
+#current-level-tweaks-detail {
+ flex: 2;
+}
+
+form {
+ margin: 2em;
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/options.html b/data/extensions/jsr@javascriptrestrictor/options.html
index b16c860..3e4cf74 100644
--- a/data/extensions/jsr@javascriptrestrictor/options.html
+++ b/data/extensions/jsr@javascriptrestrictor/options.html
@@ -15,10 +15,14 @@ SPDX-License-Identifier: GPL-3.0-or-later
<script src="/nscl/lib/browser-polyfill.js" type="text/javascript"></script>
<script src="levels_browser.js" type="text/javascript"></script>
<script src="levels.js" type="text/javascript"></script>
+ <script src="options_init.js" type="text/javascript" defer></script>
<script src="helpers.js" type="text/javascript" defer></script>
<script src="tweaks_gui.js" type="text/javascript" defer></script>
<script src="options.js" type="text/javascript" defer></script>
- <title>JShelter options</title>
+ <script src="i18n_translate_dom.js" type="text/javascript" defer></script>
+ <script src="options_nbs.js" type="text/javascript" defer></script> <!-- This file appends text to
+ the div translated by i18n_translate_dom.js, keep this script after i18n_translate_dom.js -->
+ <title data-localize="JShelterOptions">JShelter options</title>
</head>
<body>
<section class="logo">
@@ -26,19 +30,19 @@ SPDX-License-Identifier: GPL-3.0-or-later
</section>
<nav class="menu">
<ul>
- <li><a href="options.html">Main settings</a></li>
- <li><a href="options_domains.html">JS Shield details</a></li>
- <li><a href="options_advanced.html">Advanced options</a></li>
+ <li><a href="options.html" data-localize="MainSettings">Main settings</a></li>
+ <li><a href="options_domains.html" data-localize="JSSShieldDetails">JS Shield details</a></li>
+ <li><a href="options_advanced.html" data-localize="AdvancedOptions">Advanced options</a></li>
<li>
- <p>External links</p>
+ <p data-localize="ExternalLinks">External links</p>
<ul>
- <li><a href="https://JShelter.org/threatmodel/">Threat model</a></li>
- <li><a href="https://JShelter.org/faq/">FAQ</a></li>
- <li><a href="https://polcak.github.io/jsrestrictor/test/test.html">Test page</a></li>
- <li><a href="https://JShelter.org/permissions/">Permissions</a></li>
- <li><a href="https://pagure.io/JShelter/webextension/">Source code</a></li>
- <li><a href="https://pagure.io/JShelter/webextension/issues">Issue tracker</a></li>
- <li><a href="https://JShelter.org/credits/">Credits</a></li>
+ <li><a href="https://JShelter.org/threatmodel/" data-localize="ThreatModel">Threat model</a></li>
+ <li><a href="https://JShelter.org/faq/" data-localize="FAQ">FAQ</a></li>
+ <li><a href="https://polcak.github.io/jsrestrictor/test/test.html" data-localize="TestPage">Test page</a></li>
+ <li><a href="https://JShelter.org/permissions/" data-localize="Permissions">Permissions</a></li>
+ <li><a href="https://pagure.io/JShelter/webextension/" data-localize="SourceCode">Source code</a></li>
+ <li><a href="https://pagure.io/JShelter/webextension/issues" data-localize="IssueTracker">Issue tracker</a></li>
+ <li><a href="https://JShelter.org/credits/" data-localize="Credits">Credits</a></li>
</ul>
</li>
</ul>
@@ -51,95 +55,60 @@ SPDX-License-Identifier: GPL-3.0-or-later
<section id="configuration_area">
<div id="levels-config">
- <h2 id="set-default-level">JavaScript Shield</h2>
- <p class="jss_description">
- JavaScript Shield modifies the behaviour of the JavaScript environment availble for the visited
- webpage. JShelter provides fake information to confuse fingerprinters or make webpage triggered
- attacks impossible or harder.
- </p>
- <p class="jss_description">
- JavaScript Shield internally consists of wrappers, small pieces of code that modify the
- original behaviour of a JavaScript API (a function or a property) defined by standards. The
- behaviour of the most of the wrappers can be divided into several categories:
- </p>
- <ul class="jss_description">
- <li><p>
- Precision reduction: The original value is too precise and it is not necessary for most use
- cases. JavaScript Shield modifies the values so that typical and benign use cases are not
- affected.
- </p></li>
- <li><p>
- Provide fake information: Some wrappers provide fake information mostly to confuse
- fingerprinters. For example, canvas wrappers modifify the image so that the same instructions
- produce different result in each session and for each domain.
- </p></li>
- <li><p>
- Hide information: Some APIs provide information that is not generally needed and can be hidden
- from most of the pages. Depending on the API, JavaScript Shield might return an error, an empty
- value, or block the API completely.
- </p></li>
- </ul>
- <p class="jss_description">
- See our blog post for more information on <a href="https://jshelter.org/fingerprinting/">browser
- fingerprinting counter-measures</a> and <a href="https://jshelter.org/farbling/">farbling</a>.
- </p>
- <ul id="levels-list">
- </ul>
- <fieldset>
- <button id="new_level" class="jsr-button">Add custom level</button>
- </fieldset>
+ <h2 id="set-default-level" data-localize="JavascriptShield">JavaScript Shield</h2>
+ <div class="jss_description" data-localize="JavascriptShieldDescription" htmltranslation></div>
+
+ <h3 data-localize="JavascriptShieldLevelsMainLevelOptionHeading">Create custom levels and set the default level</h3>
+ <p class="alert" data-localize="newLevelsNotRecommended" htmltranslation>We do not recommend creating own levels and
+ changing configuration if you are concerned about browser fingerprinting. Please read
+ <a href="https://jshelter.org/faq/">FAQ</a> and our <a
+ href="https://arxiv.org/abs/2204.01392">paper</a>. By diverging from the configuration of
+ other users, you make your re-identification easier.</p>
+ <div id="jss-shield-settings">
+ <div class="jss-shield-settings-item">
+ <ul id="levels-list">
+ </ul>
+ <fieldset>
+ <button id="new_level" class="jsr-button" data-localize="AddCustomLevel">Add custom level</button>
+ </fieldset>
+ </div>
+ <div id="current-level-tweaks-detail" class="jss-shield-settings-item">
+ <h3 id="current-level-tweaks-heading"></h3>
+ <div id="current-level-tweaks" class="tweakgrid">
+ </div>
+ </div>
+ </div>
</div>
- <div id="proxy-protection-config">
+ <div id="proxy-protection-config">
<div class="protection-title">
- <label class="shield-onoff-label" for="nbs-switch"><h2>Network Boundary Shield</h2></label>
+ <h2 class="shield-onoff-label" for="nbs-switch" data-localize="NetworkBoundaryShield">Network Boundary Shield</h2>
<label class="switch">
<input id="nbs-switch" type="checkbox" checked>
<span class="slider"></span>
</label>
</div>
- <p class="nbs_description">
- Network Boundary Shield prevents web pages to use the browser as a proxy between local network
- and the public Internet. See our <a
- href="https://jshelter.org/localportscanning/">
- blog post</a> and
- <a
- href="https://www.forcepoint.com/sites/default/files/resources/files/report-attacking-internal-network-en_0.pdf">Force
- Point report</a> for examples of attacks handled by the Network Boundary Shield.
- The protection encapsulates the WebRequest API, so it captures all outgoing requests.
- </p>
- <p class="nbs_description">
- Generally, you want Network Boundary Shield to block all suspicious requests. However, some pages can be
- broken, because they require interaction between public Internet and local network, for example,
- some Intranet information systems might be broken by the Network Boundary Shield. JShelter users
- also reported increased number of false positives when using DNS-based filtering programs. If
- you use one, make sure that DNS returns 0.0.0.0 for the blocked domains.
- </p>
- <p class="nbs_description">
- Network Boundary Shield default behavior can be globally adjusted by the settings below. Network Boundary Shield can also be completely
- disabled on a per-domain basis using the whitelist. Domains can be whitelisted via <i>Network Boundary Shield switch</i> in the popup window
- or manually via <i>Manage whitelist</i> option. Keep in mind that whitelisting a domain will also whitelist its subdomains. To selectively
- deactivate the Network Boundary Shield, insert the domains to the whitelist (excluding "www", but including all other domains e.g. ".com").
- </p>
+ <div class="nbs_description" data-localize="NBSDescription" htmltranslation></div>
<fieldset>
<div class="tweakgrid" id="nbs-settings">
</div>
</fieldset>
<fieldset>
- <button id="nbs-whitelist-show" class="jsr-button">Manage whitelist ⤵</button>
+ <button id="nbs-whitelist-show" class="jsr-button" data-localize="ManageWhitelist">Manage whitelist ⤵</button>
+ <button id="nbs-whitelist-hide" class="jsr-button hidden" data-localize="HideWhitelist">Hide whitelist ⤵</button>
</fieldset>
<fieldset id="nbs-whitelist-container" class="hidden">
<div>
<input id="nbs-whitelist-input" type="text" name="nbs-whitelist-hostname" placeholder="example.com">
- <button id="nbs-whitelist-add-button" class="jsr-button"><strong>Disable</strong> for the domain</button>
+ <button id="nbs-whitelist-add-button" class="jsr-button" data-localize="ButtonDisableForDomain" htmltranslation>Disable for the domain</button>
</div>
<select id="nbs-whitelist-select" name="sometext" size="10" multiple>
</select>
<div>
- <button id="nbs-whitelist-remove-button" class="jsr-button"><strong>Enable</strong> for the selected domains</button>
- <p>
+ <button id="nbs-whitelist-remove-button" class="jsr-button" data-localize="ButtonEnableForSelectedDomains" htmltranslation>Enable for the selected domains</button>
+ <p data-localize="ManageWhitelistDescription" htmltranslation>
Please note, that these domain names are checked with domain hierarchy, so whitelisting
<strong>example.com</strong> does also whitelist <strong>news.example.com</strong>.
</p>
@@ -149,50 +118,33 @@ SPDX-License-Identifier: GPL-3.0-or-later
<div id="fingerprinting-protection-config">
<div class="protection-title">
- <label class="shield-onoff-label" for="fpd-switch"><h2>Fingerprint Detector</h2></label>
+ <h2 class="shield-onoff-label" for="fpd-switch" data-localize="FingerprintDetector">Fingerprint Detector</h2>
<label class="switch">
<input id="fpd-switch" type="checkbox" checked>
<span class="slider"></span>
</label>
</div>
- <p class="fpd_description">
- Fingerprint Detector provides a mechanism that informs users about fingerprinting activity on visited web pages. The detector also prevents
- web pages from extracting browser fingerprint, if a user chooses to do so. See our <a
- href="https://jshelter.org/fpdetection/">
- blog post</a> or
- <a
- href="https://arxiv.org/pdf/1905.01051.pdf">Browser Fingerprinting: A survey</a> for a closer description of browser fingerprinting.
- <p class="fpd_description">
- By enabling the detector, you will be notified whenever it detects fingerprinting behavior on a visited web page. The detector measure severity of
- potential fingerprint with each page visit. Then, it assigns a likelihood of fingerprinting to the page according to our heuristic system. The likelihood is
- presented to you by badge color of JShelter icon and also in popup window. If a high likelihood of fingerprinting occurs, you will be notified by a separate notification.
- It's possible to show details about the fingerprint by generating a fingerprint report. You can access it via popup window or by clicking directly on the notification.
- </p>
- <p class="fpd_description">
- The default behavior of Fingerprint Detector can be adjusted to your liking. You can choose "blocking" behavior, which works as a countermeasure against leaking your fingerprint
- to unwanted parties. In this case, every positive detection is followed by blocking all subsequent HTTP requests and cleaning browser storage. Take into account that <strong>this action
- will probably result in a broken web page</strong> and we strongly recommend to use a whitelist for trusted domains. Switching off the detector for a domain in the popup window will add
- the domain to the whitelist. This domain won't be evaluated or blocked in the future. You can manage all the whitelisted domains below.
- </p>
+ <div class="fpd_description" data-localize="FPDDescription" htmltranslation></div>
<fieldset>
<div class="tweakgrid" id="fpd-settings">
</div>
</fieldset>
<fieldset>
- <button id="fpd-whitelist-show" class="jsr-button">Manage whitelist ⤵</button>
+ <button id="fpd-whitelist-show" class="jsr-button" data-localize="ManageWhitelist">Manage whitelist ⤵</button>
+ <button id="fpd-whitelist-hide" class="jsr-button hidden" data-localize="HideWhitelist">Hide whitelist ⤵</button>
</fieldset>
<fieldset id="fpd-whitelist-container" class="hidden">
<div>
<input id="fpd-whitelist-input" type="text" name="fpd-whitelist-hostname" placeholder="example.com">
- <button id="fpd-whitelist-add-button" class="jsr-button"><strong>Disable</strong> for the domain</button>
+ <button id="fpd-whitelist-add-button" class="jsr-button" data-localize="ButtonDisableForDomain" htmltranslation>Disable for the domain</button>
</div>
<select id="fpd-whitelist-select" name="sometext" size="10" multiple>
</select>
<div>
- <button id="fpd-whitelist-remove-button" class="jsr-button"><strong>Enable</strong> for the selected domains</button>
- <p>
+ <button id="fpd-whitelist-remove-button" class="jsr-button" data-localize="ButtonEnableForSelectedDomains" htmltranslation>Enable for the selected domains</button>
+ <p data-localize="ManageWhitelistDescription" htmltranslation>
Please note, that these domain names are checked with domain hierarchy, so whitelisting
<strong>example.com</strong> does also whitelist <strong>news.example.com</strong>.
</p>
@@ -215,11 +167,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
<button class="help">⤵</button>
<div class="tweakfill"></div>
<div class="explainer hidden_descr">
- <div class="status"></div>
+ <span class="description"></span>
<p>
- <span class="description"></span>
<div class="more"></div>
</p>
+ <div class="status"></div>
</div>
</template>
diff --git a/data/extensions/jsr@javascriptrestrictor/options.js b/data/extensions/jsr@javascriptrestrictor/options.js
index bac9237..2fe31c7 100644
--- a/data/extensions/jsr@javascriptrestrictor/options.js
+++ b/data/extensions/jsr@javascriptrestrictor/options.js
@@ -40,32 +40,35 @@ function prepare_level_config(action_descr, params) {
var unsupported_apis = wrapping_groups.groups.reduce((acc, group) =>
group.wrappers.reduce(find_unsupported_apis, acc), "");
if (unsupported_apis !== "") {
- unsupported_apis = `<div class="unsupported_api"><p>Your browser does not support:</p>${unsupported_apis}</div>`;
+ unsupported_apis = `<div class="unsupported_api">${browser.i18n.getMessage("omittedAPIsHeading")} ${unsupported_apis}</div>`;
}
var fragment = document.createRange().createContextualFragment(`
<div>
- <p>Note that for fingerprintability prevention, JShelter does not wrap objects that are not defined.</p>
- ${unsupported_apis}
<div>
<h2>${action_descr}</h2>
</div>
+ <p class="alert">
+ ${browser.i18n.getMessage("newLevelsNotRecommended")}
+ </p>
<form>
<!-- Metadata -->
<div class="main-section">
- <label for="level_text">Name:</label>
+ <label for="level_text">${browser.i18n.getMessage("formlabelName")}</label>
<input id="level_text" value="${escape(params.level_text)}"></input>
<input type="hidden" id="level_id" ${params.level_id != "" ? "disabled" : ""} value="${escape(params.level_id)}"></input>
</div>
<div class="main-section">
- <label for="level_description">Description:</label>
+ <label for="level_description">${browser.i18n.getMessage("formlabelDescription")}</label>
<input id="level_description" value="${escape(params.level_description)}"></input>
</div>
<div id="tweaks"></div>
- <button id="save" class="jsr-button">Save custom level</button>
+ <button id="cancel" class="jsr-button">${browser.i18n.getMessage("ButtonCancel")}</button>
+ <button id="save" class="jsr-button">${browser.i18n.getMessage("ButtonSaveCustomLevel")}</button>
</form>
+ ${unsupported_apis}
</div>`);
configuration_area_el.appendChild(fragment);
@@ -98,7 +101,7 @@ function prepare_level_config(action_descr, params) {
custom_levels = stored_levels.custom_levels;
let ok = false;
if (new_level.level_id in custom_levels) {
- ok = window.confirm("Custom level " + new_level.level_id + " already exists. It will be overriden.");
+ ok = window.confirm(browser.i18n.getMessage("customLevelAlreadyExistsItWillBeOverridden", new_level.level_id));
}
else {
ok = true;
@@ -110,20 +113,23 @@ function prepare_level_config(action_descr, params) {
location = "";
}
catch (err) {
- alert("Custom level were not updated, please try again later.");
+ alert(browser.i18n.getMessage("customLevelWereNotUpdated"));
}
}
}
browser.storage.sync.get("custom_levels").then(updateLevels.bind(null, new_level));
}
else {
- alert("Please provide all required fields: ID, Name, and Decription");
+ alert(browser.i18n.getMessage("NewLevelMissingNameOrDescription"));
}
});
+ document.getElementById("cancel").addEventListener("click", function(e) {
+ document.location = "options.html";
+ });
}
function edit_level(id) {
- prepare_level_config("Edit level " + escape(id), levels[id]);
+ prepare_level_config(browser.i18n.getMessage("JSSeditLevelHeading", escape(levels[id].level_text)), levels[id]);
}
function restore_level(id, level_params) {
@@ -146,46 +152,23 @@ function show_existing_level(levelsEl, level) {
var fragment = document.createRange().createContextualFragment(`<li id="li-${escape(level)}">
<button class="level" id="${escape(currentId)}" title="${escape(levels[level].level_description)}">
${escape(levels[level].level_text)}
- </button>
- <span class="help_ovisible">${escape(create_short_text(levels[level].level_description, 50))}</span>
- <span></span>
- <p class="hidden_help_text"><label for="${escape(currentId)}">${escape(levels[level].level_description)}</label></p>
+ </button><span></span>
+ <p class="hidden_help_text"><label class="level_button_descr" for="${escape(currentId)}">${escape(levels[level].level_description)}</label></p>
</li>`);
levelsEl.appendChild(fragment);
var lielem = document.getElementById(`li-${level}`); // Note that FF here requires unescaped ID
- if (levels[level].builtin === true) {
- var view = document.createElement("button");
- view.id = `show-tweaks-${escape(level)}`;
- view.classList.add("help");
- view.appendChild(document.createTextNode("⤵"));
- var tweaksEl = document.createElement("div");
- tweaksEl.classList.add("tweakgrid");
- tweaksEl.classList.add("hidden_descr");
- tweaksEl.id = `tweaks-${escape(level)}`;
- lielem.getElementsByTagName('button')[0].insertAdjacentElement("afterend", view);
- lielem.appendChild(tweaksEl);
- let tweaksBusiness = Object.create(tweaks_gui);
- tweaksBusiness.get_current_tweaks = function() {
- return getTweaksForLevel(level, {});
- };
- tweaksBusiness.create_tweaks_html(tweaksEl);
- view.addEventListener("click", function(ev) {
- tweaksEl.classList.toggle("hidden_descr");
- ev.preventDefault();
- });
- }
- else {
+ if (levels[level].builtin !== true) {
var existPref = document.createElement("span");
existPref.setAttribute("id", `li-exist-group-${escape(level)}`);
lielem.appendChild(existPref);
var edit = document.createElement("button");
existPref.appendChild(edit);
edit.addEventListener("click", edit_level.bind(edit, level));
- edit.appendChild(document.createTextNode("Edit"));
+ edit.appendChild(document.createTextNode(browser.i18n.getMessage("ButtonEdit")));
var remove = document.createElement("button");
existPref.appendChild(remove);
remove.addEventListener("click", remove_level.bind(remove, level));
- remove.appendChild(document.createTextNode("Remove"));
+ remove.appendChild(document.createTextNode(browser.i18n.getMessage("ButtonRemove")));
var removedPref = document.createElement("span");
removedPref.setAttribute("id", `li-removed-group-${escape(level)}`);
removedPref.classList.add("hidden");
@@ -193,10 +176,10 @@ function show_existing_level(levelsEl, level) {
var restore = document.createElement("button");
removedPref.appendChild(restore);
restore.addEventListener("click", restore_level.bind(restore, level, levels[level]));
- restore.appendChild(document.createTextNode("Restore"));
+ restore.appendChild(document.createTextNode(browser.i18n.getMessage("ButtonRestore")));
}
- prepareHiddenHelpText(lielem.getElementsByClassName('hidden_help_text'), lielem.getElementsByClassName('help_ovisible'));
- var current = document.getElementById(currentId)
+ prepareHiddenHelpText(lielem.getElementsByClassName('hidden_help_text'), []);
+ var current = document.getElementById(escape(currentId))
current.addEventListener("click", function() {
for (let child of levelsEl.children) {
child.children[0].classList.remove("active");
@@ -204,6 +187,13 @@ function show_existing_level(levelsEl, level) {
this.classList.add("active");
setDefaultLevel(level);
});
+ current.addEventListener("mouseenter", function() {
+ if (level !== default_level.level_id) {
+ lev = levels[level];
+ update_level_details(lev.level_text + " level (currently not applied by default), details:", lev);
+ }
+ });
+ current.addEventListener("mouseout", update_level_details_default);
}
function remove_level(id) {
@@ -222,6 +212,20 @@ function remove_level(id) {
browser.storage.sync.get("custom_levels").then(remove_level);
}
+function update_level_details(heading, level) {
+ document.getElementById("current-level-tweaks-heading").textContent = heading;
+ var currentTweaksEl = document.getElementById("current-level-tweaks");
+ let tweaksBusiness = Object.create(tweaks_gui);
+ tweaksBusiness.get_current_tweaks = function() {
+ return getTweaksForLevel(level.level_id, {});
+ };
+ tweaksBusiness.create_tweaks_html(currentTweaksEl);
+}
+
+function update_level_details_default() {
+ update_level_details(default_level.level_text + " level (currently applied by default), details:", default_level);
+}
+
function insert_levels() {
// Insert all known levels to GUI
var allLevelsElement = document.getElementById("levels-list");
@@ -230,6 +234,7 @@ function insert_levels() {
}
// Select default level
document.getElementById("level-" + default_level.level_id).classList.add("active");
+ update_level_details_default();
}
window.addEventListener("load", async function() {
@@ -258,10 +263,11 @@ document.getElementById("new_level").addEventListener("click", function() {
seq++;
} while (levels[new_id] !== undefined)
new_level.level_id = new_id;
- prepare_level_config("Add new level", new_level)
+ prepare_level_config(browser.i18n.getMessage("JSSaddLevelHeading"), new_level)
});
document.getElementById("nbs-whitelist-show").addEventListener("click", () => show_whitelist("nbs"));
+document.getElementById("nbs-whitelist-hide").addEventListener("click", () => hide_whitelist("nbs"));
document.getElementById("nbs-whitelist-add-button").addEventListener("click", () => add_to_whitelist("nbs"));
document.getElementById("nbs-whitelist-input").addEventListener('keydown', (e) => {if (e.key === 'Enter') add_to_whitelist("nbs")});
document.getElementById("nbs-whitelist-remove-button").addEventListener("click", () => remove_from_whitelist("nbs"));
@@ -269,6 +275,7 @@ document.getElementById("nbs-whitelist-select").addEventListener('keydown', (e)
document.getElementsByClassName("slider")[0].addEventListener("click", () => {setTimeout(control_slider, 200, "nbs")});
document.getElementById("fpd-whitelist-show").addEventListener("click", () => show_whitelist("fpd"));
+document.getElementById("fpd-whitelist-hide").addEventListener("click", () => hide_whitelist("fpd"));
document.getElementById("fpd-whitelist-add-button").addEventListener("click", () => add_to_whitelist("fpd"));
document.getElementById("fpd-whitelist-input").addEventListener('keydown', (e) => {if (e.key === 'Enter') add_to_whitelist("fpd")});
document.getElementById("fpd-whitelist-remove-button").addEventListener("click", () => remove_from_whitelist("fpd"));
@@ -307,6 +314,15 @@ function show_whitelist(prefix) {
loadWhitelist(prefix);
var whitelist = document.getElementById(prefix + "-whitelist-container");
whitelist.classList.toggle("hidden");
+ document.getElementById(prefix + "-whitelist-show").classList.add("hidden");
+ document.getElementById(prefix + "-whitelist-hide").classList.remove("hidden");
+}
+
+function hide_whitelist(prefix) {
+ var whitelist = document.getElementById(prefix + "-whitelist-container");
+ whitelist.classList.toggle("hidden");
+ document.getElementById(prefix + "-whitelist-show").classList.remove("hidden");
+ document.getElementById(prefix + "-whitelist-hide").classList.add("hidden");
}
function add_to_whitelist(prefix)
@@ -397,9 +413,7 @@ function loadWhitelist(prefix)
var listbox = document.getElementById(prefix + "-whitelist-select");
listbox.options.length = 0;
- var whitelistName;
- if (prefix == "nbs") whitelistName = "nbsWhitelist";
- if (prefix == "fpd") whitelistName = "fpdWhitelist";
+ var whitelistName = prefix + "Whitelist";
//Get the whitelist
browser.storage.sync.get([whitelistName]).then(function(result)
diff --git a/data/extensions/jsr@javascriptrestrictor/options_advanced.html b/data/extensions/jsr@javascriptrestrictor/options_advanced.html
index af153e3..d0af545 100644
--- a/data/extensions/jsr@javascriptrestrictor/options_advanced.html
+++ b/data/extensions/jsr@javascriptrestrictor/options_advanced.html
@@ -14,9 +14,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
<script src="/nscl/lib/browser-polyfill.js" type="text/javascript"></script>
<script src="levels_browser.js" type="text/javascript" defer></script>
<script src="levels.js" type="text/javascript" defer></script>
+ <script src="options_init.js" type="text/javascript" defer></script>
<script src="update.js" type="text/javascript" defer></script>
<script src="options_advanced.js" type="text/javascript" defer></script>
- <title>JShelter advanced options</title>
+ <script src="i18n_translate_dom.js" type="text/javascript" defer></script>
+ <title data-localize="JShelterOptionsAdvanced">JShelter advanced options</title>
</head>
<body>
<section class="logo">
@@ -24,19 +26,19 @@ SPDX-License-Identifier: GPL-3.0-or-later
</section>
<nav class="menu">
<ul>
- <li><a href="options.html">Main settings</a></li>
- <li><a href="options_domains.html">JS Shield details</a></li>
- <li><a href="options_advanced.html">Advanced options</a></li>
+ <li><a href="options.html" data-localize="MainSettings">Main settings</a></li>
+ <li><a href="options_domains.html" data-localize="JSSShieldDetails">JS Shield details</a></li>
+ <li><a href="options_advanced.html" data-localize="AdvancedOptions">Advanced options</a></li>
<li>
- <p>External links</p>
+ <p data-localize="ExternalLinks">External links</p>
<ul>
- <li><a href="https://JShelter.org/threatmodel/">Threat model</a></li>
- <li><a href="https://JShelter.org/faq/">FAQ</a></li>
- <li><a href="https://polcak.github.io/jsrestrictor/test/test.html">Test page</a></li>
- <li><a href="https://JShelter.org/permissions/">Permissions</a></li>
- <li><a href="https://pagure.io/JShelter/webextension/">Source code</a></li>
- <li><a href="https://pagure.io/JShelter/webextension/issues">Issue tracker</a></li>
- <li><a href="https://JShelter.org/credits/">Credits</a></li>
+ <li><a href="https://JShelter.org/threatmodel/" data-localize="ThreatModel">Threat model</a></li>
+ <li><a href="https://JShelter.org/faq/" data-localize="FAQ">FAQ</a></li>
+ <li><a href="https://polcak.github.io/jsrestrictor/test/test.html" data-localize="TestPage">Test page</a></li>
+ <li><a href="https://JShelter.org/permissions/" data-localize="Permissions">Permissions</a></li>
+ <li><a href="https://pagure.io/JShelter/webextension/" data-localize="SourceCode">Source code</a></li>
+ <li><a href="https://pagure.io/JShelter/webextension/issues" data-localize="IssueTracker">Issue tracker</a></li>
+ <li><a href="https://JShelter.org/credits/" data-localize="Credits">Credits</a></li>
</ul>
</li>
</ul>
@@ -45,19 +47,21 @@ SPDX-License-Identifier: GPL-3.0-or-later
<section class="content">
- <h1>Advanced options</h1>
+ <h1 data-localize="AdvancedOptions">Advanced options</h1>
- <p class="alert">
+ <p class="alert" data-localize="DoNotModifyThisConfiguration">
BEWARE! Do not modify this configuration unless you know what you are doing.
</p>
<section id="configuration_area">
- <h3>Extension configuration</h3>
+ <h3 data-localize="JShelterFullConfiguration">Extension configuration</h3>
<textarea id="levels-storage-text">
</textarea>
- <button id="levels-storage-load" class="jsr-button">Load currently stored configuration</button>
- <button id="levels-storage-save" class="jsr-button">Overwrite configuration</button>
+ <button id="levels-storage-load" class="jsr-button" data-localize="ExpertLoadCurrentlyStoredConfiguration">Load currently stored configuration</button>
+ <button id="levels-storage-save" class="jsr-button" data-localize="ExpertOverwriteConfiguration">Overwrite configuration</button>
+ <button id="levels-storage-reset" class="jsr-button" data-localize="ExpertResetConfiguration">Reset the configuration (remove all custom changes)</button>
+ <button id="levels-storage-undo" class="jsr-button" data-localize="ExpertUndoConfiguration">Undo (discard last configuration override)</button>
<div id="result-save"></div>
diff --git a/data/extensions/jsr@javascriptrestrictor/options_advanced.js b/data/extensions/jsr@javascriptrestrictor/options_advanced.js
index ad36623..cf327d4 100644
--- a/data/extensions/jsr@javascriptrestrictor/options_advanced.js
+++ b/data/extensions/jsr@javascriptrestrictor/options_advanced.js
@@ -20,27 +20,54 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
-function load_config_to_text() {
+let original_config = undefined;
+document.getElementById("levels-storage-undo").classList.add("hidden");
+
+function load_config_to_text(keep_config = false) {
browser.storage.sync.get(null).then(function (item) {
document.getElementById("levels-storage-text").value = JSON.stringify(item, null, '\t');
+ if (keep_config) {
+ original_config = item;
+ }
});
}
window.addEventListener("DOMContentLoaded", function() {
- load_config_to_text();
+ load_config_to_text(true);
});
document.getElementById("levels-storage-load").addEventListener("click", function() {
load_config_to_text();
});
-document.getElementById("levels-storage-save").addEventListener("click", function() {
+document.getElementById("levels-storage-save").addEventListener("click", async function() {
try {
- checkAndSaveConfig(JSON.parse(document.getElementById("levels-storage-text").value));
+ await checkAndSaveConfig(JSON.parse(document.getElementById("levels-storage-text").value));
}
catch (e) {
alert("The configuration is not valid.");
return;
}
load_config_to_text();
+ document.getElementById("levels-storage-undo").classList.remove("hidden");
+});
+
+document.getElementById("levels-storage-reset").addEventListener("click", async function() {
+ await checkAndSaveConfig({});
+ load_config_to_text();
+ document.getElementById("levels-storage-undo").classList.remove("hidden");
+});
+
+document.getElementById("levels-storage-undo").addEventListener("click", async function() {
+ if (original_config !== undefined) {
+ try {
+ let current_config = await browser.storage.sync.get(null);
+ await checkAndSaveConfig(original_config);
+ load_config_to_text();
+ original_config = current_config;
+ }
+ catch (e) {
+ alert("An unexpected error during configuration restore. Please check and fix the configuration manually.");
+ }
+ }
});
diff --git a/data/extensions/jsr@javascriptrestrictor/options_domains.html b/data/extensions/jsr@javascriptrestrictor/options_domains.html
index 1267352..bc880a7 100644
--- a/data/extensions/jsr@javascriptrestrictor/options_domains.html
+++ b/data/extensions/jsr@javascriptrestrictor/options_domains.html
@@ -14,10 +14,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
<script src="/nscl/lib/browser-polyfill.js" type="text/javascript"></script>
<script src="levels_browser.js" type="text/javascript"></script>
<script src="levels.js" type="text/javascript"></script>
+ <script src="options_init.js" type="text/javascript" defer></script>
<script src="helpers.js" type="text/javascript" defer></script>
<script src="tweaks_gui.js" type="text/javascript" defer></script>
<script src="options_domains.js" type="text/javascript" defer></script>
- <title>JShelter options - per domain protection</title>
+ <script src="i18n_translate_dom.js" type="text/javascript" defer></script>
+ <title data-localize="JShelterOptionsJSSFineTune">JShelter options - per domain protection</title>
</head>
<body>
<section class="logo">
@@ -25,19 +27,19 @@ SPDX-License-Identifier: GPL-3.0-or-later
</section>
<nav class="menu">
<ul>
- <li><a href="options.html">Main settings</a></li>
- <li><a href="options_domains.html">JS Shield details</a></li>
- <li><a href="options_advanced.html">Advanced options</a></li>
+ <li><a href="options.html" data-localize="MainSettings">Main settings</a></li>
+ <li><a href="options_domains.html" data-localize="JSSShieldDetails">JS Shield details</a></li>
+ <li><a href="options_advanced.html" data-localize="AdvancedOptions">Advanced options</a></li>
<li>
- <p>External links</p>
+ <p data-localize="ExternalLinks">External links</p>
<ul>
- <li><a href="https://JShelter.org/threatmodel/">Threat model</a></li>
- <li><a href="https://JShelter.org/faq/">FAQ</a></li>
- <li><a href="https://polcak.github.io/jsrestrictor/test/test.html">Test page</a></li>
- <li><a href="https://JShelter.org/permissions/">Permissions</a></li>
- <li><a href="https://pagure.io/JShelter/webextension/">Source code</a></li>
- <li><a href="https://pagure.io/JShelter/webextension/issues">Issue tracker</a></li>
- <li><a href="https://JShelter.org/credits/">Credits</a></li>
+ <li><a href="https://JShelter.org/threatmodel/" data-localize="ThreatModel">Threat model</a></li>
+ <li><a href="https://JShelter.org/faq/" data-localize="FAQ">FAQ</a></li>
+ <li><a href="https://polcak.github.io/jsrestrictor/test/test.html" data-localize="TestPage">Test page</a></li>
+ <li><a href="https://JShelter.org/permissions/" data-localize="Permissions">Permissions</a></li>
+ <li><a href="https://pagure.io/JShelter/webextension/" data-localize="SourceCode">Source code</a></li>
+ <li><a href="https://pagure.io/JShelter/webextension/issues" data-localize="IssueTracker">Issue tracker</a></li>
+ <li><a href="https://JShelter.org/credits/" data-localize="Credits">Credits</a></li>
</ul>
</li>
</ul>
@@ -46,12 +48,12 @@ SPDX-License-Identifier: GPL-3.0-or-later
<section class="content">
- <h1>JShelter JavaScript shield per-website configuration</h1>
+ <h1 data-localize="JavaScriptShieldPerWebsiteConfiguration">JavaScript Shield per-website configuration</h1>
<section id="configuration_area">
<div id="second-row">
- <h2 id="set-domain-level">Set JavaScript shield for website:</h2>
+ <h2 id="set-domain-level" data-localize="SetJavaScriptShieldForWebsite">Set JavaScript Shield for website:</h2>
<form id="domain-form">
<input id="domain-text" type="text" placeholder="example.com or en.example.com">
<select id="domain-level">
@@ -60,13 +62,13 @@ SPDX-License-Identifier: GPL-3.0-or-later
<option value="2">level 2</option>
<option value="3">level 3</option>
</select>
- <button id="add_domain" type="submit" class="jsr-button">Add to list</button>
+ <button id="add_domain" type="submit" class="jsr-button" data-localize="AddToList">Add to list</button>
</form>
- <h2>A list of website with redefined JavaScript Shield:</h2>
+ <h2 data-localize="AListOfWebsiteWithRedefinedJavaScriptShield">A list of website with redefined JavaScript Shield:</h2>
<ul id="domain-level-list">
</ul>
- <button id="save-all-domain-levels">Save all</button>
- <button id="delete-all-domain-levels">Delete all</button>
+ <button id="save-all-domain-levels" data-localize="SaveAll">Save all</button>
+ <button id="delete-all-domain-levels" data-localize="DeleteAll">Delete all</button>
</div>
</section>
@@ -84,11 +86,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
<button class="help">⤵</button>
<div class="tweakfill"></div>
<div class="explainer hidden_descr">
- <div class="status"></div>
+ <span class="description"></span>
<p>
- <span class="description"></span>
<div class="more"></div>
</p>
+ <div class="status"></div>
</div>
</template>
diff --git a/data/extensions/jsr@javascriptrestrictor/options_domains.js b/data/extensions/jsr@javascriptrestrictor/options_domains.js
index 55726d4..09a81fe 100644
--- a/data/extensions/jsr@javascriptrestrictor/options_domains.js
+++ b/data/extensions/jsr@javascriptrestrictor/options_domains.js
@@ -58,7 +58,7 @@ function show_restore_domain_level(levelLiEl, domain) {
${escape(domain)}
</span>
<span>JavaScript shield disabled</span>
- <button id="enable-jss-${escape(domain)}">Restore level ${escape(level.level_id)}</button>`);
+ <button id="enable-jss-${escape(domain)}">${browser.i18n.getMessage("ButtonRestoreLevel", escape(level.level_id))}</button>`);
levelLiEl.appendChild(fragment);
document.getElementById(`enable-jss-${escape(domain)}`).addEventListener("click", function(e) {
e.preventDefault();
@@ -99,13 +99,13 @@ function show_domain_level_custom_level(levelLiEl, domain) {
</span>
<select id="dl-change-${escape(domain)}"></select>
<span id="tweaks-text-${escape(domain)}">tweaked</span>
- <button id="show-tweaks-${escape(domain)}" class="help">⤵</button>
+ <button id="show-tweaks-${escape(domain)}" class="help">${browser.i18n.getMessage("ButtonSignExpandOneCharacterDown")}</button>
<span id="li-exist-group-${escape(domain)}">
- <button id="overwrite-dl-${escape(domain)}">Save</button>
- <button id="delete-dl-${escape(domain)}">Remove</button>
+ <button id="overwrite-dl-${escape(domain)}">${browser.i18n.getMessage("ButtonSave")}</button>
+ <button id="delete-dl-${escape(domain)}">${browser.i18n.getMessage("ButtonRemove")}</button>
</span>
<span id="li-removed-group-${escape(domain)}" class="hidden">
- <button id="restore-dl-${escape(domain)}">Restore</button>
+ <button id="restore-dl-${escape(domain)}">${browser.i18n.getMessage("ButtonRestore")}</button>
</span>
<div class="tweakgrid" id="tweaks-${escape(domain)}"></div>`);
levelLiEl.appendChild(fragment);
@@ -202,7 +202,7 @@ document.getElementById("add_domain").addEventListener("click", function (e) {
}
let domainLevel = document.getElementById("domain-level");
if (domain in domains) {
- let ok = confirm(`Settings for domain ${domain} already exists and will be overriden.`);
+ let ok = confirm(browser.i18n.getMessage("JSSAdvancedConfirmOverwrite", domain));
if (!ok) {
return;
}
@@ -221,7 +221,7 @@ function update_domain_level(dlel, set_value) {
dlel.textContent = "";
for (let levelid in levels) {
let descr = levels[levelid].level_description;
- dlel.appendChild(document.createRange().createContextualFragment(`<option value="${escape(levelid)}">${escape(levels[levelid].level_text)}: ${escape(create_short_text(descr, 50))}</option>`));
+ dlel.appendChild(document.createRange().createContextualFragment(`<option value="${escape(levelid)}">${browser.i18n.getMessage("LevelAndDescription", [escape(levels[levelid].level_text), escape(create_short_text(descr, 50))])}</option>`));
};
dlel.value = finalValue;
}
@@ -241,3 +241,7 @@ document.getElementById("delete-all-domain-levels").addEventListener("click", fu
saveDomainLevels();
Array.from(document.getElementsByClassName("custom_domain_level")).forEach((el) => el.remove());
});
+
+window.addEventListener("DOMContentLoaded", function() {
+ document.getElementById("domain-text").attributes.placeholder.nodeValue = browser.i18n.getMessage("ExampleDomainsText")
+});
diff --git a/data/extensions/jsr@javascriptrestrictor/options_init.js b/data/extensions/jsr@javascriptrestrictor/options_init.js
new file mode 100644
index 0000000..fcb455b
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/options_init.js
@@ -0,0 +1,27 @@
+/** \file
+ * \brief Code that handles initialization in the options pages
+ *
+ * \author Copyright (C) 2023 Libor Polcak
+ *
+ * \license SPDX-License-Identifier: GPL-3.0-or-later
+ */
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+//
+
+// Make sure that updateLevels() is called while fp_levels_initialised is set to true
+// Note that the options pages do not initialize real FPD. This is needed to call
+// callbacks directly
+fp_levels_initialised = true;
+browser.storage.sync.get(null).then(updateLevels);
diff --git a/data/extensions/jsr@javascriptrestrictor/options_nbs.js b/data/extensions/jsr@javascriptrestrictor/options_nbs.js
new file mode 100644
index 0000000..1febf1b
--- /dev/null
+++ b/data/extensions/jsr@javascriptrestrictor/options_nbs.js
@@ -0,0 +1,27 @@
+/** \file
+ * \brief Code that handles NBS options specific to Firefox
+ *
+ * \author Copyright (C) 2023 Libor Polcak
+ *
+ * \license SPDX-License-Identifier: GPL-3.0-or-later
+ */
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <https://www.gnu.org/licenses/>.
+//
+
+var fragment = document.createRange().createContextualFragment(`
+ <p>${browser.i18n.getMessage("NBSHttpProxyDNSAPINote")}</p>
+ `);
+var nbs_description_div = document.querySelector("#proxy-protection-config .nbs_description:last-of-type");
+nbs_description_div.appendChild(fragment);
diff --git a/data/extensions/jsr@javascriptrestrictor/popup.css b/data/extensions/jsr@javascriptrestrictor/popup.css
index c57b4f7..6a4b90a 100644
--- a/data/extensions/jsr@javascriptrestrictor/popup.css
+++ b/data/extensions/jsr@javascriptrestrictor/popup.css
@@ -201,4 +201,8 @@ label.js-toggle:after {
#level_controls, #nbs_whitelist, #fpd_whitelist {
margin: 6px 0;
-} \ No newline at end of file
+}
+
+label[for=severity_value], #severity_value {
+ display: inline !important;
+}
diff --git a/data/extensions/jsr@javascriptrestrictor/popup.html b/data/extensions/jsr@javascriptrestrictor/popup.html
index 7d3b873..19030dc 100644
--- a/data/extensions/jsr@javascriptrestrictor/popup.html
+++ b/data/extensions/jsr@javascriptrestrictor/popup.html
@@ -19,6 +19,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<script src="helpers.js" type="text/javascript" defer></script>
<script src="tweaks_gui.js" type="text/javascript" defer></script>
<script src="popup.js" type="text/javascript" defer></script>
+ <script src="i18n_translate_dom.js" type="text/javascript" defer></script>
</head>
<body>
@@ -27,21 +28,21 @@ SPDX-License-Identifier: GPL-3.0-or-later
<div><img class="logo" id="logo" src="../img/icon-128.png" alt="JShelter logo" /></div>
<div><h3 id="titletext">JShelter</h3></div>
</div>
- <button id="global-settings" title="Open global settings">Global settings</button>
+ <button id="global-settings" title="Open global settings" data-localize="globalSettings">Global settings</button>
</header>
<content id="site-settings">
<div class="flex align-items-center justify-content-between">
- <label class="text-large">Settings for domain</label>
+ <label class="text-large" data-localize="settingsForDomain">Settings for domain</label>
<h3 id="current-site"></h3>
- <button id="refresh-page" disabled>Refresh page</button>
+ <button id="refresh-page" data-localize="refreshPage" disabled>Refresh page</button>
</div>
<section id="level_controls">
<div class="section-header toggle">
- <label for="jss-switch">JavaScript Shield</label>
+ <label for="jss-switch" data-localize="javascriptShield">JavaScript Shield</label>
<input type="checkbox" id="js-toggle" name="js-toggle" title="Edit JavaScript Shield settings" />
- <label for="js-toggle" id="js-toggle-btn" class="js-toggle">Modify</label>
+ <label for="js-toggle" id="js-toggle-btn" class="js-toggle" data-localize="modifyJSSPopup">Modify</label>
<label class="switch">
<input id="jss-switch" type="checkbox" checked>
<label for="jss-switch" class="slider"></label>
@@ -53,18 +54,20 @@ SPDX-License-Identifier: GPL-3.0-or-later
</div>
<p id="current-level">
<strong id="level-text"></strong><span id="level-description"></span>
- <a class="more hidden_descr" href="#">(more...)</a>
- <a class="less hidden_descr" href="#">(less...)</a>
+ <a class="more hidden_descr" href="#" data-localize="descriptionMore">(more...)</a>
+ <a class="less hidden_descr" href="#" data-localize="descriptionLess">(less...)</a>
</p>
</div>
- <div class="buttons"><button id="btn-tweak">Detail tweaks of JS shield for this site</button></div>
+ <div class="buttons"><button id="btn-tweak" data-localize="detailTweaksOfJSShieldForThisSite">Detail tweaks of JS shield for this site</button></div>
<div id="tweaks"></div>
</div>
</section>
<template id="tweak-head">
- <span class="head">Wrappers</span><span></span><span></span><span class="head">Number of calls</span>
+ <span class="head" data-localize="wrappers">Group of APIs</span>
+ <span class="head" data-localize="levelOfDefense">Level of defense</span></span><span></span>
+ <span class="head" data-localize="numberOfCalls">Number of calls</span>
</template>
<template id="tweak-row">
<label>Wrapper group name</label>
@@ -74,19 +77,19 @@ SPDX-License-Identifier: GPL-3.0-or-later
<button class="help">⤵</button>
<div class="hits"></div>
<div class="explainer hidden_descr">
- <div class="status"></div>
+ <span class="description"></span>
<p>
- <span class="description"></span>
<div class="more"></div>
</p>
+ <div class="status"></div>
</div>
</template>
<section id="nbs_whitelist">
- <p class="off_message">Network Boundary Shield is globally off.</p>
+ <p class="off_message" data-localize="NBSgloballyOff">Network Boundary Shield is globally off.</p>
<div class="switch_wrapper">
- <label for="nbs-switch">Network Boundary Shield</label>
+ <label for="nbs-switch" data-localize="networkBoundaryShield">Network Boundary Shield</label>
<label class="switch">
<input id="nbs-switch" type="checkbox" checked>
<label for="nbs-switch" class="slider"></label>
@@ -96,9 +99,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
</section>
<section id="fpd_whitelist">
- <p class="off_message">Fingerprint Detector is globally off.</p>
+ <p class="off_message" data-localize="FPDgloballyOff">Fingerprint Detector is globally off.</p>
<div class="switch_wrapper">
- <label for="fpd-switch">Fingerprint Detector</label>
+ <label for="fpd-switch" data-localize="fingerprintDetector">Fingerprint Detector</label>
<label class="switch">
<input id="fpd-switch" type="checkbox" checked>
<label for="fpd-switch" class="slider"></label>
@@ -106,7 +109,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
</div>
</section>
- <span id="severity_container" class="hidden">⤷ Likelihood that the page fingerprinted you: <button id="severity_value"></button></span>
+ <div id="severity_container" class="hidden">
+ <label for="severity_value" data-localize="FingerprintQualityLabel">⤷
+ Likelihood that the page fingerprinted you: </label>
+ <button id="severity_value"></button>
+ </div>
</content>
</body>
diff --git a/data/extensions/jsr@javascriptrestrictor/popup.js b/data/extensions/jsr@javascriptrestrictor/popup.js
index cbda3e0..272afc4 100644
--- a/data/extensions/jsr@javascriptrestrictor/popup.js
+++ b/data/extensions/jsr@javascriptrestrictor/popup.js
@@ -49,6 +49,12 @@ popup_tweaks.assign_custom_params = function(group) {
group.groupHits = hits[group.name] || 0;
};
popup_tweaks.customize_tweak_row = function (tweakRow, group) {
+ // Don't show hits for WASM optimization group tweak
+ if (group.name === "wasm") {
+ tweakRow.querySelector(".hits").textContent = "-";
+ return;
+ }
+
let groupHits = group.groupHits;
if (groupHits >= 999) {
groupHits = "1000 or more";
@@ -198,7 +204,7 @@ function add_level_buttons() {
return selectEl.appendChild(b);
}
// Add default level button
- default_lev_button = addButton({level_id: "DEFAULT", level_description: "You can set of of the levels as the global default level. Use this level for this page.", level_text: `Default level (${default_level.level_text})`});
+ default_lev_button = addButton({level_id: "DEFAULT", level_description: browser.i18n.getMessage("popupDefaultLevelHelpText"), level_text: browser.i18n.getMessage("defaultLevelSelection", default_level.level_text)});
default_lev_button.addEventListener("click", ev => {
delete domains[site];
modify_level(default_level, ev.target);
@@ -260,7 +266,7 @@ function update_tweaks() {
popup_tweaks.create_tweaks_html(tweaksContainer);
tweakBtn.disabled = true;
}
- else if (parseInt(current_level.level_id)) {
+ else if (current_level.level_id !== "0") {
tweakBtn.disabled = false;
tweakBtn.onclick = function() {
popup_tweaks.create_tweaks_html(tweaksContainer);
@@ -421,4 +427,3 @@ addEventListener("DOMContentLoaded", async () => {
load_on_off_switch("nbs");
load_on_off_switch("fpd");
});
-
diff --git a/data/extensions/jsr@javascriptrestrictor/tweaks_gui.js b/data/extensions/jsr@javascriptrestrictor/tweaks_gui.js
index 7f26dbc..99aaa21 100644
--- a/data/extensions/jsr@javascriptrestrictor/tweaks_gui.js
+++ b/data/extensions/jsr@javascriptrestrictor/tweaks_gui.js
@@ -78,7 +78,7 @@ let tweaks_gui = {
showStatus(group.params[desired_tweak - 1]);
}
else {
- showStatus({short:"Unprotected", description:"Unprotected"});
+ showStatus({short:browser.i18n.getMessage("jssgroupUnprotected"), description:browser.i18n.getMessage("jssgroupUnprotected")});
}
}
if (changed) {
@@ -88,6 +88,9 @@ let tweaks_gui = {
updateLevelInfo();
tlevUI.addEventListener("input", updateLevelInfo.bind(this, false));
tlevUI.addEventListener("change", updateLevelInfo.bind(this, true));
+ tlevUI.addEventListener("input", function() { // See https://pagure.io/JShelter/webextension/issue/95
+ explainer.classList.remove("hidden_descr");
+ });
help.addEventListener("click", function(ev) {
explainer.classList.toggle("hidden_descr");
@@ -103,7 +106,7 @@ let tweaks_gui = {
let tweakEntries = this.sort_group_descriptors(this.create_group_descriptors(group_map));
for (let { group_id, tlev_id, label, group} of tweakEntries) {
- this.add_tweak_row(tweaksContainer, group_map, group_id, tlev_id, label, group);
+ this.add_tweak_row(tweaksContainer, group_map, group_id, tlev_id, label, group, group_id === "wasm");
}
document.body.classList.add("tweaking");
},
diff --git a/data/extensions/jsr@javascriptrestrictor/update.js b/data/extensions/jsr@javascriptrestrictor/update.js
index 0a0d1d0..df19c28 100644
--- a/data/extensions/jsr@javascriptrestrictor/update.js
+++ b/data/extensions/jsr@javascriptrestrictor/update.js
@@ -21,7 +21,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
-function installUpdate() {
+async function installUpdate() {
/**
* 0.3+ storage
* {
@@ -44,7 +44,7 @@ function installUpdate() {
*
*
*/
- browser.storage.sync.get(null).then(function (item) {
+ let item = await browser.storage.sync.get(null);
if (!item.hasOwnProperty("version") || (item.version < 2.1)) {
browser.storage.sync.clear();
console.log("All JavaScript Restrictor data cleared! Unfortunately, we do not migrate settings from versions bellow 0.3.");
@@ -434,33 +434,77 @@ function installUpdate() {
}
item.version = 6.6;
}
+ if (item.version < 6.7) {
+ await browser.storage.sync.remove("whitelistedHosts"); // Renamed in 6.2 but not removed
+ item.version = 6.7;
+ }
+ if (item.version < 6.8) {
+ for (level in item["custom_levels"]) {
+ let l = item["custom_levels"][level];
+ if (l.webworker === 2) {
+ let score = 0;
+ for (group of ["time_precision", "net", "geolocation", "physical_environment", "useridle", "coopschedule", "gamepads", "vr", "analytics", "nfc"]) {
+ if (l[group] !== undefined) {
+ score++;
+ }
+ }
+ for (group of ["htmlcanvaselement", "audiobuffer", "webgl", "hardware"]) {
+ if (l[group] === 1) {
+ score--;
+ }
+ else if (l[group] > 1) {
+ score++;
+ }
+ }
+ for (group of ["enumerateDevices", "plugins"]) {
+ if (l[group] === 1 || l[group] === 2) {
+ score--;
+ }
+ else if (l[group] > 2) {
+ score++;
+ }
+ }
+ if (score > 8) { // L0: 0, L1: 10, L2: 4, L3: 16
+ l.webworker = 3;
+ }
+ }
+ }
+ item.version = 6.8;
+ }
+ if (item.version < 7) {
+ for (level in item["custom_levels"]) {
+ let l = item["custom_levels"][level];
+ if (l.audiobuffer === 1 || l.htmlcanvaselement === 1) {
+ l.wasm = 1;
+ }
+ }
+ item.version = 7;
+ }
- browser.storage.sync.set(item).then(() => {
- // origin of update.js must be recognized (background script vs. options page)
- if (typeof fpdLoadConfiguration === "function") {
- fpdLoadConfiguration();
- }
- else {
- browser.runtime.sendMessage({purpose: "fpd-load-config"});
- }
- if (typeof nbsLoadConfiguration === "function") {
- nbsLoadConfiguration();
- }
- else {
- browser.runtime.sendMessage({purpose: "nbs-load-config"})
- }
- });
- });
+ await browser.storage.sync.set(item);
+ // origin of update.js must be recognized (background script vs. options page)
+ if (typeof fpdLoadConfiguration === "function") {
+ fpdLoadConfiguration();
+ }
+ else {
+ browser.runtime.sendMessage({purpose: "fpd-load-config"});
+ }
+ if (typeof nbsLoadConfiguration === "function") {
+ nbsLoadConfiguration();
+ }
+ else {
+ browser.runtime.sendMessage({purpose: "nbs-load-config"})
+ }
}
browser.runtime.onInstalled.addListener(installUpdate);
// fallback - populate storage with valid data (if onInstalled won't fire)
browser.storage.sync.get(null).then((item) => {
- checkAndSaveConfig(item);
+ checkAndSaveConfig(item, false); // level might not be loaded by this time
});
-async function checkAndSaveConfig(conf) {
+async function checkAndSaveConfig(conf, check_default = true) {
let checkSettingRange = (module, setting, range, defValue) => {
if (!(conf[module][setting] in range)) {
conf[module][setting] = defValue;
@@ -476,9 +520,10 @@ async function checkAndSaveConfig(conf) {
checkExistAndType("fpDetectionOn", "boolean", false);
checkExistAndType("custom_levels", "object", {});
if (!("__default__" in conf) || typeof(conf.__default__) !== "string" ||
- (!(conf.__default__ in [0,1,2,3]) && !(conf.__default__ in conf.custom_levels))) {
+ (!(conf.__default__ in levels) && check_default)) {
conf.__default__ = "2";
}
+ checkExistAndType("domains", "object", {});
checkExistAndType("nbsWhitelist", "object", {});
checkExistAndType("nbsSettings", "object", {});
checkSettingRange("nbsSettings", "blocking", [0,1], 1);
@@ -489,5 +534,5 @@ async function checkAndSaveConfig(conf) {
checkSettingRange("fpdSettings", "notifications", [0,1], 1);
checkSettingRange("fpdSettings", "detection", [0,1], 0);
await browser.storage.sync.set(conf);
- installUpdate();
+ await installUpdate();
}
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingL-CANVAS.js b/data/extensions/jsr@javascriptrestrictor/wrappingL-CANVAS.js
index 0521893..e7e843a 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingL-CANVAS.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingL-CANVAS.js
@@ -46,11 +46,11 @@ function farbleCanvasDataBrave(rowIterator, width) {
crc.next(row);
}
var thiscanvas_prng = alea(domainHash, "CanvasFarbling", crc.crc);
- var data_count = BigInt(BigInt(width) * 4n);
+ var data_count = width * 4;
for (row of rowIterator()) {
- for (let i = 0n; i < data_count; i++) {
- if ((i % 4n) === 3n) {
+ for (let i = 0; i < data_count; i++) {
+ if ((i % 4) === 3) {
// Do not modify alpha
continue;
}
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js
index 4519c87..f641d4b 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-H-C.js
@@ -7,6 +7,7 @@
*
* \author Copyright (C) 2019 Libor Polcak
* \author Copyright (C) 2021 Matus Svancar
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
* \license SPDX-License-Identifier: MPL-2.0
@@ -133,7 +134,7 @@
original_name: "CanvasRenderingContext2D.prototype.getImageData",
wrapped_name: "origGetImageData",
}],
- helping_code: helping_code + strToUint + farbleCanvasDataBrave.toString() + `
+ helping_code: helping_code + farbleCanvasDataBrave.toString() + `
var farble = function(context, fake) {
if(approach === 1){
fake.fillStyle = "white";
@@ -143,20 +144,46 @@
else if(approach === 0){
const width = context.canvas.width;
const height = context.canvas.height;
- var imageData = origGetImageData.call(context, 0, 0, width, height);
- const BYTES_PER_ROW = width * 4;
- farbleCanvasDataBrave(function*() {
- let data = imageData.data;
- let offset = 0;
- while (offset < data.length) {
- yield imageData.data.subarray(offset, offset + BYTES_PER_ROW);
- offset += BYTES_PER_ROW;
+ const imageData = origGetImageData.call(context, 0, 0, width, height);
+ const len = imageData.data.length;
+ if (wasm.ready && wasm.grow(len)) {
+ try {
+ farblePixelsWASM();
+ } catch (e) {
+ console.error("WebAssembly optimized farbling failed, falling back to JavaScript implementation", e);
+ farblePixelsJS();
}
- }, width);
+ } else {
+ farblePixelsJS();
+ }
// Do not modify the original canvas, always modify the fake canvas.
// Always farble the whole image so that the farbled data do not depend
// on the page-specified extraction data rectangle.
fake.putImageData(imageData, 0, 0);
+
+ function farblePixelsWASM() {
+ wasm.set(imageData.data);
+ const crc = wasm.crc16(len);
+ const mash = new Mash();
+ mash.addData(' ');
+ mash.addData(domainHash);
+ mash.addData("CanvasFarbling");
+ mash.addData(crc);
+ wasm.farbleBytes(len, mash.n | 0, true);
+ imageData.data.set(wasm.get(len));
+ }
+
+ function farblePixelsJS() {
+ const BYTES_PER_ROW = width * 4;
+ farbleCanvasDataBrave(function*() {
+ let data = imageData.data;
+ let offset = 0;
+ while (offset < len) {
+ yield data.subarray(offset, offset + BYTES_PER_ROW);
+ offset += BYTES_PER_ROW;
+ }
+ }, width);
+ }
}
};`,
wrapping_code_function_name: "wrapping",
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js
index 97dbc05..52920c9 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-HTML-LS.js
@@ -1,7 +1,7 @@
/** \file
* \brief Wrappers for Workers
*
- * \author Copyright (C) 2019 Libor Polcak
+ * \author Copyright (C) 2019-2022 Libor Polcak
* \author Copyright (C) 2020 Peter Hornak
* \author Copyright (C) 2021 Matus Svancar
*
@@ -49,183 +49,13 @@ ISBN 978-3-319-66398-2.
* Create private namespace
*/
(function() {
- var polyfillBody = `
- /// This polyfill was adopted from https://github.com/nolanlawson/pseudo-worker under Apache License 2.0 and modified.
- function doEval(self, __pseudoworker_script) {
- /* jshint unused:false */
- (function () {
- /* jshint evil:true */
- eval(__pseudoworker_script);
- }).call(window);
- }
-
- var messageListeners = [];
- var errorListeners = [];
- var workerMessageListeners = [];
- var workerErrorListeners = [];
- var postMessageListeners = [];
- var terminated = false;
- var script;
- var workerSelf;
-
- var api = this;
-
- // custom each loop is for IE8 support
- function executeEach(arr, fun) {
- var i = -1;
- while (++i < arr.length) {
- if (arr[i]) {
- fun(arr[i]);
- }
- }
- }
-
- function callErrorListener(err) {
- return function (listener) {
- listener({
- type: 'error',
- error: err,
- message: err.message
- });
- };
- }
-
- function addEventListener(type, fun) {
- /* istanbul ignore else */
- if (type === 'message') {
- messageListeners.push(fun);
- } else if (type === 'error') {
- errorListeners.push(fun);
- }
- }
-
- function removeEventListener(type, fun) {
- var listeners;
- /* istanbul ignore else */
- if (type === 'message') {
- listeners = messageListeners;
- } else if (type === 'error') {
- listeners = errorListeners;
- } else {
- return;
- }
- var i = -1;
- while (++i < listeners.length) {
- var listener = listeners[i];
- if (listener === fun) {
- delete listeners[i];
- break;
- }
- }
- }
-
- function postError(err) {
- var callFun = callErrorListener(err);
- if (typeof api.onerror === 'function') {
- callFun(api.onerror);
- }
- if (workerSelf && typeof workerSelf.onerror === 'function') {
- callFun(workerSelf.onerror);
- }
- executeEach(errorListeners, callFun);
- executeEach(workerErrorListeners, callFun);
- }
-
- function runPostMessage(msg, transfer) {
- function callFun(listener) {
- try {
- listener({data: msg, ports: transfer});
- } catch (err) {
- postError(err);
- }
- }
-
- if (workerSelf && typeof workerSelf.onmessage === 'function') {
- callFun(workerSelf.onmessage);
- }
- executeEach(workerMessageListeners, callFun);
- }
-
- function postMessage(msg, transfer) {
- if (typeof msg === 'undefined') {
- throw new Error('postMessage() requires an argument');
- }
- if (terminated) {
- return;
- }
- if (!script) {
- postMessageListeners.push({msg: msg, transfer: (transfer ? transfer : undefined)});
- return;
- }
- runPostMessage(msg, transfer);
- }
-
- function terminate() {
- terminated = true;
- }
-
- function workerPostMessage(msg) {
- if (terminated) {
- return;
- }
-
- function callFun(listener) {
- listener({
- data: msg
- });
- }
-
- if (typeof api.onmessage === 'function') {
- callFun(api.onmessage);
- }
- executeEach(messageListeners, callFun);
- }
-
- function workerAddEventListener(type, fun) {
- /* istanbul ignore else */
- if (type === 'message') {
- workerMessageListeners.push(fun);
- } else if (type === 'error') {
- workerErrorListeners.push(fun);
- }
- }
-
- var xhr = new XMLHttpRequest();
-
- xhr.open('GET', path);
- xhr.onreadystatechange = function () {
- if (xhr.readyState === 4) {
- if (xhr.status >= 200 && xhr.status < 400) {
- script = xhr.responseText;
- workerSelf = {
- postMessage: workerPostMessage,
- addEventListener: workerAddEventListener,
- close: terminate
- };
- doEval(workerSelf, script);
- var currentListeners = postMessageListeners;
- postMessageListeners = [];
- for (var i = 0; i < currentListeners.length; i++) {
- runPostMessage(currentListeners[i].msg, currentListeners[i].transfer);
- }
- } else {
- postError(new Error('cannot find script ' + path));
- }
- }
- };
-
- xhr.send();
-
- api.postMessage = postMessage;
- api.addEventListener = addEventListener;
- api.removeEventListener = removeEventListener;
- api.terminate = terminate;
-
- return api;
+ var strictWorkerWrapperBody = `
+ // We create a Worker to limit fingerprinting but we intentionally use a non-existing URL.
+ return new originalF("https://[ff00::]/worker.js");
`;
var slowBody = `
- let _data = new originalF(path);
+ let _data = new originalF(path, ...args);
let _old = _data.postMessage;
_data.postMessage = function(message) {
let delay = Math.floor(Math.random() * 10**9)
@@ -287,16 +117,25 @@ ISBN 978-3-319-66398-2.
original_function: "window.Worker",
wrapped_objects: [],
helping_code: `
- let doPolyfill = args[0];
+ let strictWrappers = args[0];
+ let removeWorkers = args[1];
`,
- wrapping_function_args: `path`,
+ wrapping_function_args: `path, ...args`,
wrapping_function_body: `
- if (doPolyfill) {
- ${polyfillBody}
+ if (!removeWorkers && strictWrappers) {
+ ${strictWorkerWrapperBody}
} else {
${slowBody}
}
`,
+ post_wrapping_code: [
+ {
+ code_type: "delete_properties",
+ parent_object: "window",
+ apply_if: "removeWorkers",
+ delete_properties: ["Worker"],
+ }
+ ],
}
]
add_wrappers(wrappers);
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-MCS.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-MCS.js
index bba9bd0..a475221 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingS-MCS.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-MCS.js
@@ -40,13 +40,12 @@
*
* This wrapper operates with three levels of protection:
*
- * * (0) - return promise with suffled array
+ * * (0) - return promise with shuffled array
* * (1) - return promise with shuffled array with additional 0-4 fake devices
* * (2) - return empty promise
*
* The shuffling approach is inspired by the algorithms created by [Brave Software](https://brave.com)
* available [here](https://github.com/brave/brave-core/blob/master/chromium_src/third_party/blink/renderer/modules/mediastream/media_devices.cc).
- *
*/
/*
@@ -71,10 +70,12 @@
/**
* \brief create and return MediaDeviceInfo object by overlaying a native one with fake properties
*
- * \param browserEnum enum specifying browser 0 - Chrome 1 - Firefox
+ * \param device Device is any native MediaInfoDevice object (https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo)
+ * \param fd_prng Initialized PRNG to be deterministically used by the function
*/
function fakeDevice(device, fd_prng){
var kinds = ["videoinput", "audioinput", "audiooutput"];
+ // browserEnum specifies the browser: 0 - Chrome 1 - Firefox
let browserEnum = device.groupId.length == 44 ? 1 : 0;
var deviceId = browserEnum == 1 ? randomString(43, browserEnum, fd_prng)+ "=" : "";
let fakeData = {
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-NP.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-NP.js
index 018eaee..4bcd333 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingS-NP.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-NP.js
@@ -47,6 +47,19 @@
* These approaches are inspired by the algorithms created by [Brave Software](https://brave.com)
* available [here](https://github.com/brave/brave-core/blob/master/chromium_src/third_party/blink/renderer/modules/plugins/dom_plugin_array.cc).
*
+ * The purpose of the wrappers is solely to prevent fingerprinting. However,
+ * browsers modyfing the array stand out of the crowd, which makes them more
+ * fingerprintable. Consequently, JShelter does not modify an empty list. So
+ * no matter the configuration, an empty list is not populated by the wrappers.
+ *
+ * If PDF inline viewing is supported, Firefox returns 5 plugins:
+ * * "PDF Viewer"
+ * * "Chrome PDF Viewer"
+ * * "Chromium PDF Viewer"
+ * * "Microsoft Edge PDF Viewer"
+ * * "WebKit built-in PDF"
+ *
+ * A list containing exactly these plugins is treated as the empty list and it is not modified.
*/
/*
@@ -269,36 +282,54 @@
{
parent_object: "Navigator.prototype",
parent_object_property: "plugins",
- apply_if: "navigator.plugins.length > 0",
+ apply_if: "applyWrapper",
wrapped_objects: [],
helping_code:
methods + farbles + fakes +`
- var fp_prng = alea(domainHash, "S-NP");
- var plugins = navigator.plugins;
- var buffer = [];
- if(args[0]==0){
- for(var i = 0;i<plugins.length;i++){
- buffer.push(farblePlugin(plugins[i]), fp_prng);
- }
+ var applyWrapper = true; // Possibly overridden below
+ if (navigator.plugins.length === 0) {
+ applyWrapper = false;
}
- if(args[0]==1){
- for(var i = 0;i<plugins.length;i++){
- buffer.push(plugins[i]);
+ if (navigator.plugins.length === 5) {
+ let plugins = Array.prototype.reduce.call(
+ navigator.plugins,
+ function (acc, o) {acc.push(o.name); return acc;}, []);
+ if (plugins.includes("PDF Viewer") &&
+ plugins.includes("Chrome PDF Viewer") &&
+ plugins.includes("Chromium PDF Viewer") &&
+ plugins.includes("Microsoft Edge PDF Viewer") &&
+ plugins.includes( "WebKit built-in PDF")) {
+ applyWrapper = false; // See https://developer.mozilla.org/en-US/docs/Web/API/Navigator/plugins
}
- shuffleArray(buffer);
- }
- if(args[0]==0 || args[0]==1){
- var fakePlugin1 = fakePlugin(32, 16, 8);
- var fakePlugin2 = fakePlugin(31, 15, 7);
- buffer.push(fakePlugin1, fakePlugin2);
- shuffleArray(buffer);
- }
- var fakePluginArray = fakePluginArrayF(buffer);
- if(args[0]==1 || args[0]==2){
- var fakeMimeTypeArray = fakeMimeTypeArrayF([]);
}
- else {
- var fakeMimeTypeArray = fakeMimeTypeArrayF(fakePluginArray);
+ if (applyWrapper) {
+ var fp_prng = alea(domainHash, "S-NP");
+ var plugins = navigator.plugins;
+ var buffer = [];
+ if(args[0]==0){
+ for(var i = 0;i<plugins.length;i++){
+ buffer.push(farblePlugin(plugins[i], fp_prng));
+ }
+ }
+ if(args[0]==1){
+ for(var i = 0;i<plugins.length;i++){
+ buffer.push(plugins[i]);
+ }
+ shuffleArray(buffer);
+ }
+ if(args[0]==0 || args[0]==1){
+ var fakePlugin1 = fakePlugin(32, 16, 8);
+ var fakePlugin2 = fakePlugin(31, 15, 7);
+ buffer.push(fakePlugin1, fakePlugin2);
+ shuffleArray(buffer);
+ }
+ var fakePluginArray = fakePluginArrayF(buffer);
+ if(args[0]==1 || args[0]==2){
+ var fakeMimeTypeArray = fakeMimeTypeArrayF([]);
+ }
+ else {
+ var fakeMimeTypeArray = fakeMimeTypeArrayF(fakePluginArray);
+ }
}
`,
post_wrapping_code: [
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBA.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBA.js
index 9f7282a..8bd7041 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBA.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBA.js
@@ -4,6 +4,7 @@
* \see https://webaudio.github.io/web-audio-api
*
* \author Copyright (C) 2021 Matus Svancar
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
* \license SPDX-License-Identifier: MPL-2.0
@@ -70,51 +71,106 @@
* * (1) - replace values by white noise based on domain key
*/
function audioFarble(array){
- // PRNG function needs to depend on the original audio, so that the same
- // audio is farbled the same way but different audio is farbled differently
- // See https://pagure.io/JShelter/webextension/issue/23
- const MAXUINT32 = 4294967295;
- let crc = new CRC16();
- for (value of array) {
- crc.single(value * MAXUINT32);
+ if (wasm.ready && wasm.grow(array.byteLength)) {
+ try {
+ farbleAudioWASM();
+ } catch (e) {
+ console.error("WebAssembly optimized farbling failed, falling back to JavaScript implementation", e);
+ farbleAudioJS();
+ }
+ } else {
+ farbleAudioJS();
+ }
+
+ function farbleAudioWASM() {
+ const ARRAY_BYTE_LEN = array.byteLength;
+ wasm.set(array, 0, true);
+ const crc = wasm.crc16Float(ARRAY_BYTE_LEN);
+ const mash = new Mash();
+ mash.addData(' ');
+ mash.addData(domainHash);
+ mash.addData("AudioFarbling");
+ mash.addData(crc);
+ wasm.farbleFloats(ARRAY_BYTE_LEN, mash.n | 0);
+ array.set(wasm.get(array.length, 0, true));
}
- var thisaudio_prng = alea(domainHash, "AudioFarbling", crc.crc);
- for (i in array) {
- // Possible improvements:
- // Copy a neighbor data (possibly with modifications
- // Make bigger canges than xoring with 1
- array[i] *= 0.99 + thisaudio_prng() / 100;
+ function farbleAudioJS() {
+ // PRNG function needs to depend on the original audio, so that the same
+ // audio is farbled the same way but different audio is farbled differently
+ // See https://pagure.io/JShelter/webextension/issue/23
+ const ARRAY_LEN = array.length;
+ const MAXUINT32 = 4294967295;
+ let crc = new CRC16();
+ for (let i = 0; i < ARRAY_LEN; i++) {
+ crc.single(array[i] * MAXUINT32);
+ }
+ var thisaudio_prng = alea(domainHash, "AudioFarbling", crc.crc);
+
+ for (let i = 0; i < ARRAY_LEN; i++) {
+ // Possible improvements:
+ // Copy neighbor data (possibly with modifications)
+ array[i] *= 0.99 + thisaudio_prng() / 100;
+ }
}
};
+
function audioFarbleInt(array) {
- // PRNG function needs to depend on the original audio, so that the same
- // audio is farbled the same way but different audio is farbled differently
- // See https://pagure.io/JShelter/webextension/issue/23
- let crc = new CRC16();
- for (value of array) {
- crc.single(value);
+ const ARRAY_LEN = array.byteLength;
+ if (wasm.ready && wasm.grow(ARRAY_LEN)) {
+ try {
+ farbleAudioIntWASM();
+ } catch (e) {
+ console.error("WebAssembly optimized farbling failed, falling back to JavaScript implementation", e);
+ farbleAudioIntJS();
+ }
+ } else {
+ farbleAudioIntJS();
}
- var thisaudio_prng = alea(domainHash, "AudioFarbling", crc.crc);
- for (i in array) {
- if (thisaudio_prng.get_bits(1)) { // Modify data with probability of 0.5
- // Possible improvements:
- // Copy a neighbor data (possibly with modifications
- // Make bigger canges than xoring with 1
- array[i] ^= 1;
+ function farbleAudioIntWASM() {
+ wasm.set(array);
+ const crc = wasm.crc16(ARRAY_LEN);
+ const mash = new Mash();
+ mash.addData(' ');
+ mash.addData(domainHash);
+ mash.addData("AudioFarbling");
+ mash.addData(crc);
+ wasm.farbleBytes(ARRAY_LEN, mash.n | 0, false);
+ array.set(wasm.get(ARRAY_LEN));
+ }
+
+ function farbleAudioIntJS() {
+ // PRNG function needs to depend on the original audio, so that the same
+ // audio is farbled the same way but different audio is farbled differently
+ // See https://pagure.io/JShelter/webextension/issue/23
+ let crc = new CRC16();
+ for (let i = 0; i < ARRAY_LEN; i++) {
+ crc.single(array[i]);
+ }
+ var thisaudio_prng = alea(domainHash, "AudioFarbling", crc.crc);
+
+ for (let i = 0; i < ARRAY_LEN; i++) {
+ if (thisaudio_prng.get_bits(1)) { // Modify data with probability of 0.5
+ // Possible improvements:
+ // Copy neighbor data (possibly with modifications)
+ // Make bigger changes than xoring with 1
+ array[i] ^= 1;
+ }
}
}
}
function whiteNoiseInt(array) {
noise_prng = alea(Date.now(), prng());
- for (i in array) {
+ const ARRAY_LEN = array.length;
+ for (let i = 0; i < ARRAY_LEN; i++) {
array[i] = (noise_prng() * 256) | 0;
}
}
function whiteNoiseFloat(array) {
+ const ARRAY_LEN = array.length;
noise_prng = alea(Date.now(), prng());
- for (i in array) {
+ for (let i = 0; i < ARRAY_LEN; i++) {
array[i] = (noise_prng() * 2) -1;
}
}
@@ -124,7 +180,7 @@
* (0) - replace by white noise (range <0,0.1>) based on domain key
* (1) - multiply array by fudge factor based on domain key
*/
- var audioFarbleBody = strToUint + audioFarble;
+ var audioFarbleBody = audioFarble;
var wrappers = [
{
parent_object: "AudioBuffer.prototype",
@@ -135,7 +191,7 @@
wrapped_name: "origGetChannelData",
}
],
- helping_code: "var behaviour = args[0]; var modified = new Set();" + audioFarbleBody + whiteNoiseFloat,
+ helping_code: "var behaviour = args[0]; WrapHelper.shared['WEBA_gcd_pool'] = new Set(); WrapHelper.shared['WEBA_origGetChannelData'] = origGetChannelData;" + audioFarbleBody + whiteNoiseFloat,
original_function: "parent.AudioBuffer.prototype.getChannelData",
wrapping_function_args: "channel",
/** \fn fake AudioBuffer.prototype.getChannelData
@@ -146,7 +202,7 @@
*/
wrapping_function_body: `
var floatArr = origGetChannelData.call(this, channel);
- if (modified.has(floatArr)) {
+ if (WrapHelper.shared['WEBA_gcd_pool'].has(floatArr)) {
return floatArr;
}
if (behaviour == 0) {
@@ -155,9 +211,9 @@
else if (behaviour == 1) {
whiteNoiseFloat(floatArr);
}
- modified.add(floatArr);
+ WrapHelper.shared['WEBA_gcd_pool'].add(floatArr);
setTimeout(function() {
- modified.delete(floatArr);
+ WrapHelper.shared['WEBA_gcd_pool'].delete(floatArr);
}, 300000); // Remove the information after 5 minutes, this might need tweaking
return floatArr;
`,
@@ -171,7 +227,7 @@
wrapped_name: "origCopyFromChannel",
}
],
- helping_code: "var behaviour = args[0];" + audioFarbleBody + whiteNoiseFloat,
+ helping_code: "var behaviour = args[0]; WrapHelper.shared['WEBA_gcd_pool'] = new Set();" + audioFarbleBody + whiteNoiseFloat,
original_function: "parent.AudioBuffer.prototype.copyFromChannel",
wrapping_function_args: "destination, channel, start",
/** \fn fake AudioBuffer.prototype.copyFromChannel
@@ -181,13 +237,19 @@
* audioFarble with destination array as argument - which changes array values according to chosen level.
*/
wrapping_function_body: `
- if (behaviour == 0) {
- origCopyFromChannel.call(this, destination, channel, start);
- audioFarble(destination);
- }
- else if (behaviour == 1) {
+ if (behaviour == 1) {
whiteNoiseFloat(destination);
}
+ else if (behaviour == 0) {
+ var floatArr = WrapHelper.shared['WEBA_origGetChannelData'].call(this, channel);
+ origCopyFromChannel.call(this, destination, channel, start);
+ if (WrapHelper.shared['WEBA_gcd_pool'].has(floatArr)) {
+ // Already farbled, no additional farbling
+ }
+ else {
+ audioFarble(destination);
+ }
+ }
`,
},
{
diff --git a/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBGL.js b/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBGL.js
index 3825b8d..73e0dbd 100644
--- a/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBGL.js
+++ b/data/extensions/jsr@javascriptrestrictor/wrappingS-WEBGL.js
@@ -5,6 +5,7 @@
* \see https://www.khronos.org/registry/webgl/specs/latest/2.0/
*
* \author Copyright (C) 2021 Matus Svancar
+ * \author Copyright (C) 2023 Martin Zmitko
*
* \license SPDX-License-Identifier: GPL-3.0-or-later
* \license SPDX-License-Identifier: MPL-2.0
@@ -587,55 +588,90 @@
}
else if(args[0]===0) {
// Read and modify pixels of the whole canvas to produce the same results no matter the view
- let pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4);
- origReadPixels.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
- const BYTES_PER_ROW = gl.drawingBufferWidth * 4;
- farbleCanvasDataBrave(function* () {
+ const GL_WIDTH = gl.drawingBufferWidth;
+ const GL_HEIGHT = gl.drawingBufferHeight;
+ const BYTES_PER_ROW = GL_WIDTH * 4;
+ const BYTES_CANVAS = BYTES_PER_ROW * GL_HEIGHT;
+ const DESIRED_WIDTH = width * 4;
+ const BYTES_OUT = DESIRED_WIDTH * height;
+ const pixels = new Uint8Array(BYTES_CANVAS);
+ origReadPixels.call(gl, 0, 0, GL_WIDTH, GL_HEIGHT, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
+ if (wasm.ready && wasm.grow(BYTES_CANVAS + BYTES_OUT + DESIRED_WIDTH)) {
+ try {
+ farblePixelsWASM();
+ } catch (e) {
+ console.error("WebAssembly optimized farbling failed, falling back to JavaScript implementation", e);
+ farblePixelsJS();
+ }
+ } else {
+ farblePixelsJS();
+ }
+
+ function farblePixelsWASM() {
// We need to flip the canvas
- let offset = pixels.length - BYTES_PER_ROW;
- while (offset >= 0) {
- yield pixels.subarray(offset, offset + BYTES_PER_ROW);
- offset -= BYTES_PER_ROW;
+ for (let i = 0; i < BYTES_CANVAS; i += BYTES_PER_ROW) {
+ wasm.set(pixels.subarray(i, i + BYTES_PER_ROW), BYTES_CANVAS - i - BYTES_PER_ROW);
}
- }, gl.drawingBufferWidth);
- // And modify data according to the original parameters
- const DESIRED_WIDTH = width * 4;
- const XXMAX = x + width;
- function insertEmpty(pos) {
- outpixels[pos ] = 0;
- outpixels[pos+1] = 0;
- outpixels[pos+2] = 0;
- outpixels[pos+3] = 255;
+ const crc = wasm.crc16(BYTES_CANVAS);
+ const mash = new Mash();
+ mash.addData(' ');
+ mash.addData(domainHash);
+ mash.addData("CanvasFarbling");
+ mash.addData(crc);
+ wasm.farbleBytes(BYTES_CANVAS, mash.n | 0, true);
+ // Modify data according to original selection and flip the canvas back
+ wasm.adjustWebGL(x, y, width, height, GL_WIDTH, GL_HEIGHT);
+ // Save farbled pixels, limit size by size of outpixels
+ outpixels.set(wasm.get(Math.min(outpixels.length, BYTES_OUT), BYTES_CANVAS));
}
- for (let i = 0; i < height; i++) {
- // Go through the number of desired rows
- let xx = x;
- let yy = y + i;
- if (yy < 0 || yy >= gl.drawingBufferHeight) {
- for (let j = 0; j < DESIRED_WIDTH; j += 4) {
- insertEmpty(i*DESIRED_WIDTH+j);
+
+ function farblePixelsJS() {
+ farbleCanvasDataBrave(function* () {
+ // We need to flip the canvas
+ let offset = BYTES_CANVAS - BYTES_PER_ROW;
+ while (offset >= 0) {
+ yield pixels.subarray(offset, offset + BYTES_PER_ROW);
+ offset -= BYTES_PER_ROW;
}
+ }, GL_WIDTH);
+ // And modify data according to the original parameters
+ const XXMAX = x + width;
+ function insertEmpty(pos) {
+ outpixels[pos ] = 0;
+ outpixels[pos+1] = 0;
+ outpixels[pos+2] = 0;
+ outpixels[pos+3] = 255;
}
- else {
- let j = i*DESIRED_WIDTH;
- while (xx < 0 && xx < XXMAX) {
- insertEmpty(j);
- j += 4;
- xx++;
- }
- while (xx < XXMAX && xx < gl.drawingBufferWidth) {
- let offset_orig = (yy * gl.drawingBufferWidth + xx) * 4;
- outpixels[j ] = pixels[offset_orig];
- outpixels[j+1] = pixels[offset_orig+1];
- outpixels[j+2] = pixels[offset_orig+2];
- outpixels[j+3] = pixels[offset_orig+3];
- j += 4;
- xx++;
+ for (let i = 0; i < height; i++) {
+ // Go through the number of desired rows
+ let xx = x;
+ let yy = y + i;
+ if (yy < 0 || yy >= GL_HEIGHT) {
+ for (let j = 0; j < DESIRED_WIDTH; j += 4) {
+ insertEmpty(i*DESIRED_WIDTH+j);
+ }
}
- while (xx < XXMAX) {
- insertEmpty(j);
- j += 4;
- xx++;
+ else {
+ let j = i*DESIRED_WIDTH;
+ while (xx < 0 && xx < XXMAX) {
+ insertEmpty(j);
+ j += 4;
+ xx++;
+ }
+ while (xx < XXMAX && xx < GL_WIDTH) {
+ let offset_orig = (yy * GL_WIDTH + xx) * 4;
+ outpixels[j ] = pixels[offset_orig];
+ outpixels[j+1] = pixels[offset_orig+1];
+ outpixels[j+2] = pixels[offset_orig+2];
+ outpixels[j+3] = pixels[offset_orig+3];
+ j += 4;
+ xx++;
+ }
+ while (xx < XXMAX) {
+ insertEmpty(j);
+ j += 4;
+ xx++;
+ }
}
}
}
@@ -1021,7 +1057,7 @@
wrapped_name: "origReadPixels",
}
],
- helping_code: strToUint + farbleCanvasDataBrave.toString() + farblePixels,
+ helping_code: farbleCanvasDataBrave.toString() + farblePixels,
original_function: "parent.WebGLRenderingContext.prototype.readPixels",
wrapping_function_args: "x, y, width, height, format, type, pixels, offset",
/** \fn fake WebGLRenderingContext.prototype.readPixels
@@ -1044,7 +1080,7 @@
wrapped_name: "origReadPixels",
}
],
- helping_code: strToUint + farbleCanvasDataBrave.toString() + farblePixels,
+ helping_code: farbleCanvasDataBrave.toString() + farblePixels,
original_function: "parent.WebGL2RenderingContext.prototype.readPixels",
wrapping_function_args: "x, y, width, height, format, type, pixels, offset",
/** \fn fake WebGL2RenderingContext.prototype.readPixels