tbb-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 18685 discussions

[tor-browser/tor-browser-45.5.0esr-6.5-1] Revert "Work around Mozilla's 1305396"
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit f5f56f6947c1dfa2dc9d8c639fcb88375dde0879
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 21:33:26 2016 +0000
Revert "Work around Mozilla's 1305396"
This reverts commit 446e0442ef9c5173a4a1595873cf26d0eb337438.
Was needed for GCC 6.2.0 which we don't use.
---
security/pkix/lib/pkixnames.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/security/pkix/lib/pkixnames.cpp b/security/pkix/lib/pkixnames.cpp
index 2cec4f0..37c6c79 100644
--- a/security/pkix/lib/pkixnames.cpp
+++ b/security/pkix/lib/pkixnames.cpp
@@ -37,8 +37,6 @@
#include "pkixcheck.h"
#include "pkixutil.h"
-#include <cstring>
-
namespace mozilla { namespace pkix {
namespace {
1
0

10 Nov '16
commit 5a2086b3a722f0f66080d4ef6ac5d14930f7c74a
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 21:13:50 2016 +0000
Release preparations for 6.5a4
Versions bumps, Changelog update, and config.yml update
---
Bundle-Data/Docs/ChangeLog.txt | 56 +++++++++++++++++++++++++++++++++++++++
gitian/versions.alpha | 16 +++++------
tools/update-responses/config.yml | 10 +++----
3 files changed, 69 insertions(+), 13 deletions(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index 100ac48..6d5d66b 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,59 @@
+Tor Browser 6.5a4 -- November 16 2016
+ * All Platforms
+ * Update Firefox to 45.5.0esr
+ * Update Tor to 0.2.9.5-alpha
+ * Update OpenSSL to 1.0.2j
+ * Update Torbutton to 1.9.6.5
+ * Bug 20414: Add donation banner on about:tor for 2016 campaign
+ * Bug 20111: use Unix domain sockets for SOCKS port by default
+ * Bug 19459: Move resizing code to tor-browser.git
+ * Bug 20264: Change security slider to 3 options
+ * Bug 20347: Enhance security slider's custom mode
+ * Bug 20123: Disable remote jar on all security levels
+ * Bug 20244: Move privacy checkboxes to about:preferences#privacy
+ * Bug 17546: Add tooltips to explain our privacy checkboxes
+ * Bug 17904: Allow security settings dialog to resize
+ * Bug 18093: Remove 'Restore Defaults' button
+ * Bug 20373: Prevent redundant dialogs opening
+ * Bug 20388+20399+20394: Code clean-up
+ * Translation updates
+ * Update Tor Launcher to 0.2.10.2
+ * Bug 20111: use Unix domain sockets for SOCKS port by default
+ * Bug 20185: Avoid using Unix domain socket paths that are too long
+ * Bug 20429: Do not open progress window if tor doesn't get started
+ * Bug 19646: Wrong location for meek browser profile on OS X
+ * Translation updates
+ * Update HTTPS-Everywhere to 5.2.7
+ * Update meek to 0.25
+ * Bug 19646: Wrong location for meek browser profile on OS X
+ * Bug 20030: Shut down meek-http-helper cleanly if built with Go > 1.5.4
+ * Bug 20304: Support spaces and other special characters for SOCKS socket
+ * Bug 20490: Fix assertion failure due to fix for #20304
+ * Bug 19459: Size new windows to 1000x1000 or nearest 200x100 (Firefox patch)
+ * Bug 20442: Backport fix for local path disclosure after drag and drop
+ * Bug 20160: Backport fix for broken MP3-playback
+ * Bug 20043: Isolate SharedWorker script requests to first party
+ * Bug 20123: Always block remote jar files
+ * Bug 20244: Move privacy checkboxes to about:preferences#privacy
+ * Bug 19838: Add dgoulet's bridge and add another one commented out
+ * Bug 19481: Point the update URL to aus1.torproject.org
+ * Bug 20296: Rotate ports again for default obfs4 bridges
+ * Bug 20399+15852: Code clean-up
+ * Windows
+ * Bug 20342: Add tor-gencert.exe to expert bundle
+ * OS X
+ * Bug 20204: Windows don't drag on macOS Sierra anymore
+ * Bug 20250: Meek fails on macOS Sierra if built with Go < 1.7
+ * Bug 20439: Make the build PIE on OSX
+ * Build system
+ * All platforms
+ * Bug 20023: Upgrade Go to 1.7.3
+ * Bug 20583: Make the downloads.json file reproducible
+ * OS X
+ * Bug 20258: Make OS X Tor archive reproducible again
+ * Bug 20184: Make OS X builds reproducible again
+ * Bug 20210: In dmg2mar, extract old mar file to copy permissions to the new one
+
Tor Browser 6.5a3-hardened -- September 20 2016
* All Platforms
* Update Firefox to 45.4.0esr
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 5dd5488..60a17f5 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -10,15 +10,15 @@ DATA_OUTSIDE_APP_DIR=1
VERIFY_TAGS=1
-FIREFOX_VERSION=45.4.0esr
+FIREFOX_VERSION=45.5.0esr
TORBROWSER_UPDATE_CHANNEL=alpha
-TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-6.5-1-build2
-TOR_TAG=tor-0.2.9.2-alpha
-TORLAUNCHER_TAG=0.2.10.1
-TORBUTTON_TAG=1.9.6.4
-HTTPSE_TAG=5.2.4
+TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-6.5-1-build1
+TOR_TAG=tor-0.2.9.5-alpha
+TORLAUNCHER_TAG=0.2.10.2
+TORBUTTON_TAG=1.9.6.5
+HTTPSE_TAG=5.2.7
NSIS_TAG=v0.3.1
ZLIB_TAG=v1.2.8
LIBEVENT_TAG=release-2.0.22-stable
@@ -44,7 +44,7 @@ NOTOFONTS_TAG=720e34851382ee3c1ef024d8dffb68ffbfb234c2
GITIAN_TAG=tor-browser-builder-4-1
-OPENSSL_VER=1.0.2h
+OPENSSL_VER=1.0.2j
GMP_VER=5.1.3
FIREFOX_LANG_VER=$FIREFOX_VERSION
FIREFOX_LANG_BUILD=build1
@@ -97,7 +97,7 @@ NOTOSCFONT_PACKAGE=NotoSansSC-Regular.otf
NOTOTCFONT_PACKAGE=NotoSansTC-Regular.otf
# Hashes for packages with weak sigs or no sigs
-OPENSSL_HASH=1d4007e53aad94a5b2002fe045ee7bb0b3d98f1a47f8b2bc851dcd1c74332919
+OPENSSL_HASH=e7aff292be21c259c6af26469c7a9b3ba26e9abaaffd325e3dccc9785256c431
GMP_HASH=752079520b4690531171d0f4532e40f08600215feefede70b24fabdc6f1ab160
OSXSDK_HASH=da77bb0003fcca5ea8c4e8cb2da8828ded750c54afdcac29ec6f3b46ad5e3adf
OSXSDK_OLD_HASH=6602d8d5ddb371fbc02e2a5967d9bd0cd7358d46f9417753c8234b923f2ea6fc
diff --git a/tools/update-responses/config.yml b/tools/update-responses/config.yml
index 0305733..786030d 100644
--- a/tools/update-responses/config.yml
+++ b/tools/update-responses/config.yml
@@ -20,7 +20,7 @@ build_targets:
osx32: Darwin_x86-gcc3
osx64: Darwin_x86_64-gcc3
channels:
- alpha: 6.5a3
+ alpha: 6.5a4
release: 6.0.1
versions:
6.0.1:
@@ -34,11 +34,11 @@ versions:
osx32:
minSupportedOSVersion: 10.8
detailsURL: https://blog.torproject.org/blog/end-life-plan-tor-browser-32-bit-macs#upda…
- 6.5a3:
- platformVersion: 45.4.0
- detailsURL: https://blog.torproject.org/blog/tor-browser-65a3-released
+ 6.5a4:
+ platformVersion: 45.5.0
+ detailsURL: https://blog.torproject.org/blog/tor-browser-65a4-released
incremental_from:
- - 6.5a2
+ - 6.5a3
migrate_archs:
osx32: osx64
osx32:
1
0
commit 3bfdd11148bde363ce5528a72406674933e1e2b2
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 21:04:42 2016 +0000
Version bump
---
src/install.rdf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/install.rdf b/src/install.rdf
index 06c3413..5664b03 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -7,7 +7,7 @@
<em:creator>The Tor Project, Inc.</em:creator>
<em:contributor>Pearl Crescent, LLC</em:contributor>
<em:id>tor-launcher(a)torproject.org</em:id>
- <em:version>0.2.10.1</em:version>
+ <em:version>0.2.10.2</em:version>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html</em:homepageURL>
<em:updateURL>data:text/plain,</em:updateURL>
<em:updateKey>-</em:updateKey>
1
0
commit 51d6b3718660a445931838ee26807211b0f1945e
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 21:02:22 2016 +0000
Translations update
---
src/chrome/locale/ar/network-settings.dtd | 2 +-
src/chrome/locale/ar/torlauncher.properties | 4 +-
src/chrome/locale/de/network-settings.dtd | 4 +-
src/chrome/locale/fa/torlauncher.properties | 6 +--
src/chrome/locale/id/network-settings.dtd | 2 +-
src/chrome/locale/id/torlauncher.properties | 2 +-
src/chrome/locale/lo/progress.dtd | 6 +--
src/chrome/locale/lo/torlauncher.properties | 2 +-
src/chrome/locale/nl/network-settings.dtd | 6 +--
src/chrome/locale/th/network-settings.dtd | 6 +--
src/chrome/locale/th/progress.dtd | 2 +-
src/chrome/locale/vi/network-settings.dtd | 68 ++++++++++++++--------------
src/chrome/locale/vi/progress.dtd | 4 +-
src/chrome/locale/vi/torlauncher.properties | 32 ++++++-------
src/chrome/locale/zh-CN/network-settings.dtd | 2 +-
15 files changed, 74 insertions(+), 74 deletions(-)
diff --git a/src/chrome/locale/ar/network-settings.dtd b/src/chrome/locale/ar/network-settings.dtd
index 76641ed..73be5a2 100644
--- a/src/chrome/locale/ar/network-settings.dtd
+++ b/src/chrome/locale/ar/network-settings.dtd
@@ -65,7 +65,7 @@
<!ENTITY torsettings.copyLog "نسخ سجل تور إلي الحافظة">
<!ENTITY torsettings.bridgeHelpTitle "المساعدة الخاصة بالجسور المُرحلة">
<!ENTITY torsettings.bridgeHelp1 "قد يكون السبب في عدم قدرتك علي الاتصال بشبكة تورهو ان مزود خدمة الإنترنت الخاص بك (ISP) أو منظمة اخري يمنع محاولات الاتصال بشبكة تور. وغالباً، تستطيع تخطي هذا المنع عن طريق استخدام جسور تور و الجسور عبارة عن مُرحلات مخفية صعب منعها.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
+<!ENTITY torsettings.bridgeHelp1B "تستطيع استخدام مجموعة من عناوين الجسور المتوفرة، والمكونة مسبقا، أو يمكنك الحصول على مجموعة من عناوين مخصصة باستخدام أحد هذه الأساليب:">
<!ENTITY torsettings.bridgeHelp2Heading "من خلال الويب">
<!ENTITY torsettings.bridgeHelp2 "استخدم متصفح ويب لزيارة https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "من خلال المستجيب التلقائي للبريد الإلكتروني">
diff --git a/src/chrome/locale/ar/torlauncher.properties b/src/chrome/locale/ar/torlauncher.properties
index 27ae3e6..4c73702 100644
--- a/src/chrome/locale/ar/torlauncher.properties
+++ b/src/chrome/locale/ar/torlauncher.properties
@@ -14,8 +14,8 @@ torlauncher.tor_bootstrap_failed_details=%1$S فشل(%2$S).
torlauncher.unable_to_start_tor=غير قادر علي بدء تشغيل تور.\n\n%S
torlauncher.tor_missing=الملف التنفيذي لتور مفقود.
-torlauncher.torrc_missing=The torrc file is missing and could not be created.
-torlauncher.datadir_missing=The Tor data directory does not exist and could not be created.
+torlauncher.torrc_missing=الملف torrc مفقود ولم يتم إنشاؤه.
+torlauncher.datadir_missing=دليل البيانات تور غير موجود ولا يمكن أن ينشأ.
torlauncher.password_hash_missing=فشل في الحصول على كلمة المرور المجزأة.
torlauncher.failed_to_get_settings=غير قادر علي جلب إعدادات تور.\n\n%S
diff --git a/src/chrome/locale/de/network-settings.dtd b/src/chrome/locale/de/network-settings.dtd
index 493f40d..2124fff 100644
--- a/src/chrome/locale/de/network-settings.dtd
+++ b/src/chrome/locale/de/network-settings.dtd
@@ -1,8 +1,8 @@
<!ENTITY torsettings.dialog.title "Tor-Netzwerkeinstellungen">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Sprache">
-<!ENTITY torlauncher.localePicker.prompt "Bitte wählen Sie eine Sprache.">
+<!ENTITY torlauncher.localePicker.title "Tor-Browser-Sprache">
+<!ENTITY torlauncher.localePicker.prompt "Bitte eine Sprache auswählen.">
<!-- For "first run" wizard: -->
diff --git a/src/chrome/locale/fa/torlauncher.properties b/src/chrome/locale/fa/torlauncher.properties
index b433fb0..ad5ef5e 100644
--- a/src/chrome/locale/fa/torlauncher.properties
+++ b/src/chrome/locale/fa/torlauncher.properties
@@ -4,15 +4,15 @@
torlauncher.error_title=اجرا کننده تور
torlauncher.tor_exited_during_startup=تُر در هنگام شروع بسته شد. ممکن است این بعلت خطایی در فایل torrc شما، خطایی در برنامه تُر تا برنامه دیگری روی کامپیوتر شما، و یا ایراد سخت افزاری باشد. تا زمانی که شما خطای رخ داده را بررسی رفع کنید و تُر را دوباره اجرا کنید، مرورگر تُر شروع نخواهد شد.
-torlauncher.tor_exited=Tor به طور غیر منتظره خارج شد. ممکن است به علت یک اشکال در Tor و یا یک برنامه دیگر بر روی سیستم شما و یا یک سخت افزار معیوب اتفاق افتاده باشد، تا زمانی که دوباره Tor را اجرا نمائید. مرورگر Tor قادر است به هر سایتی دسترسی داشته باشد. اگر این مشکل ادامه داشت، لطفا یک کپی از Log Tor خود را به تیم پشتیبانی ارسال کنید.
+torlauncher.tor_exited=Tor به طور غیر منتظره خارج شد که این ممکن است به علت یک اشکال در Tor و یا یک برنامه دیگر بر روی سیستم شما و یا یک سخت افزار معیوب اتفاق افتاده باشد، تا زمانی که دوباره Tor را اجرا نمائید مرورگر Tor قادر نخواهد بود به هیچ سایتی دسترسی داشته باشد. اگر این مشکل ادامه داشت، لطفا یک کپی از Log Tor خود را به تیم پشتیبانی ارسال کنید.
torlauncher.tor_exited2=شروع مجدد، Tor نمی تواند زبانه های مرورگر را ببندد.
torlauncher.tor_controlconn_failed=اتصال به پورت کنترل تور امکان پذیر نمیباشد.
torlauncher.tor_failed_to_start=خطا در راه اندازی.
torlauncher.tor_control_failed=بهدست گرفتن کنترل تور ناموفق بود.
-torlauncher.tor_bootstrap_failed=تور در برقراری یک ارتباط شبکهای توری ناموفق بود.
+torlauncher.tor_bootstrap_failed=تور در برقراری یک ارتباط با شبکه خود ناموفق بود.
torlauncher.tor_bootstrap_failed_details=%1$S ناموفق بود (%2$S).
-torlauncher.unable_to_start_tor=راه اندازی تور امکان پذیر نمی باشد.\n\n%S
+torlauncher.unable_to_start_tor=تور قادر به اجرا شدن نیست\n\n%S
torlauncher.tor_missing=فایل اجرایی تور یافت نشد.
torlauncher.torrc_missing=فایل torrc پیدا نشد و ساخت فایل جدید ناموفق بود.
torlauncher.datadir_missing=دایرکتوری اطلاعات تٌر وجود ندارد و ساخت آن نیز ناموفق بود.
diff --git a/src/chrome/locale/id/network-settings.dtd b/src/chrome/locale/id/network-settings.dtd
index ec6e8d4..c5815c6 100644
--- a/src/chrome/locale/id/network-settings.dtd
+++ b/src/chrome/locale/id/network-settings.dtd
@@ -65,7 +65,7 @@
<!ENTITY torsettings.copyLog "Salin Log Tor Ke Clipboard">
<!ENTITY torsettings.bridgeHelpTitle "Bantuan Bridge Relay">
<!ENTITY torsettings.bridgeHelp1 "Jika Anda tidak dapat terhubung ke jaringan Tor, bisa jadi Provider Layanan Internet (ISP) atau lembaga lain yang menghalangi Tor.   Sering kali, Anda dapat mengatasi masalah ini dengan menggunakan Tor Bridges, yang relai terdaftar yang lebih sulit untuk memblokir.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
+<!ENTITY torsettings.bridgeHelp1B "Anda dapat menggunakan prakonfigurasi, disediakan alamat-alamat jembatan atau anda dapat mendapat barisan khusus dari alamat-alamat dengan menggunakan satu dari metode berikut:">
<!ENTITY torsettings.bridgeHelp2Heading "Lewat web">
<!ENTITY torsettings.bridgeHelp2 "Menggunakan applikasi penjelajah interet untuk mengunjungi https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "Melalui Email Autoresponder">
diff --git a/src/chrome/locale/id/torlauncher.properties b/src/chrome/locale/id/torlauncher.properties
index f18c2dd..00c65ec 100644
--- a/src/chrome/locale/id/torlauncher.properties
+++ b/src/chrome/locale/id/torlauncher.properties
@@ -3,7 +3,7 @@
torlauncher.error_title=Tor Launcher
-torlauncher.tor_exited_during_startup=Tor exited during startup. This might be due to an error in your torrc file, a bug in Tor or another program on your system, or faulty hardware. Until you fix the underlying problem and restart Tor, Tor Browser will not start.
+torlauncher.tor_exited_during_startup=Tor keluar ketika startup. Hal ini mungkin karena suatu kesalahan pada berkas torrc anda, bug pada Tor atau program lain pada sistem anda, atau kerusakan pada perangkat keras. Hingga anda memperbaiki masalah tersebut dan mulai ulang Tor, Tor Browser tidak akan dijalankan.
torlauncher.tor_exited=Tor keluar mendadak. Ini dapat terjadi karena bug dalam Tor, atau program lain di sistem Anda, atau kerusakan perangkat keras. Sampai anda memuat ulang Tor, Browser Tor tidak dapat mencapai situs web apapun. Jika masalah ini terus bertahan, mohon mengirimkan salinan dari log Tor Anda kepada tim pendukung.
torlauncher.tor_exited2=Memuat ulang Tor tidak akan menutup tab browser Anda.
torlauncher.tor_controlconn_failed=Tidak dapat tersambung pada port kontrol Tor.
diff --git a/src/chrome/locale/lo/progress.dtd b/src/chrome/locale/lo/progress.dtd
index fb3aeb4..14b98fe 100644
--- a/src/chrome/locale/lo/progress.dtd
+++ b/src/chrome/locale/lo/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "ສະຖານະ Tor">
-<!ENTITY torprogress.openSettings "Open Settings">
-<!ENTITY torprogress.heading "Connecting to the Tor network">
-<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.  This may take several minutes.">
+<!ENTITY torprogress.openSettings "ໄຂການຕັ້ງຄ່າ">
+<!ENTITY torprogress.heading "ກຳລັງເຊື່ອມຕໍ່ເຂົ້າກັບເຄືອຂ່າຍ Tor">
+<!ENTITY torprogress.pleaseWait "ກະລຸນາລໍຖ້າໃນຂະນະທີ່ພວກເຮົາຈັດແຈງການເຊື່ອມຕໍ່ເຂົ້າເຄືອຂ່າຍ Tor.  ອາດຈະໃຊ້ເວລາຫລາຍນາທີ.">
diff --git a/src/chrome/locale/lo/torlauncher.properties b/src/chrome/locale/lo/torlauncher.properties
index bdbcf16..9959bfb 100644
--- a/src/chrome/locale/lo/torlauncher.properties
+++ b/src/chrome/locale/lo/torlauncher.properties
@@ -48,7 +48,7 @@ torlauncher.bootstrapStatus.loading_status=Loading network status
torlauncher.bootstrapStatus.loading_keys=Loading authority certificates
torlauncher.bootstrapStatus.requesting_descriptors=Requesting relay information
torlauncher.bootstrapStatus.loading_descriptors=Loading relay information
-torlauncher.bootstrapStatus.conn_or=Connecting to the Tor network
+torlauncher.bootstrapStatus.conn_or=ກຳລັງເຊື່ອມຕໍ່ເຂົ້າກັບເຄືອຂ່າຍ Tor
torlauncher.bootstrapStatus.handshake_or=Establishing a Tor circuit
torlauncher.bootstrapStatus.done=Connected to the Tor network!
diff --git a/src/chrome/locale/nl/network-settings.dtd b/src/chrome/locale/nl/network-settings.dtd
index beabc95..d7fa414 100644
--- a/src/chrome/locale/nl/network-settings.dtd
+++ b/src/chrome/locale/nl/network-settings.dtd
@@ -1,7 +1,7 @@
<!ENTITY torsettings.dialog.title "Tor netwerkinstellingen">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Taal">
+<!ENTITY torlauncher.localePicker.title "Tor-browsertaal">
<!ENTITY torlauncher.localePicker.prompt "Selecteer een taal.">
<!-- For "first run" wizard: -->
@@ -38,9 +38,9 @@
<!ENTITY torsettings.reconfigTor "Herconfigureer">
<!ENTITY torsettings.discardSettings.prompt "Je hebt Tor bridges geconfigureerd of je hebt lokale proxy-instellingen ingevuld.  Om een directe verbinding tot het Tor netwerk te kunnen maken, moet je deze instellingen verwijderen.">
-<!ENTITY torsettings.discardSettings.proceed "Instellingen Verwijderen en Verbinden">
+<!ENTITY torsettings.discardSettings.proceed "Instellingen verwijderen en verbinden">
-<!ENTITY torsettings.optional "Facultatief">
+<!ENTITY torsettings.optional "Optioneel">
<!ENTITY torsettings.useProxy.checkbox "Deze computer heeft een lokale proxy nodig om toegang te krijgen tot het internet">
<!ENTITY torsettings.useProxy.type "Proxytype:">
diff --git a/src/chrome/locale/th/network-settings.dtd b/src/chrome/locale/th/network-settings.dtd
index d4a20d8..0a4b839 100644
--- a/src/chrome/locale/th/network-settings.dtd
+++ b/src/chrome/locale/th/network-settings.dtd
@@ -2,19 +2,19 @@
<!-- For locale picker: -->
<!ENTITY torlauncher.localePicker.title "Tor Browser Language">
-<!ENTITY torlauncher.localePicker.prompt "Please select a language.">
+<!ENTITY torlauncher.localePicker.prompt "โปรดเลือกภาษา">
<!-- For "first run" wizard: -->
<!ENTITY torsettings.prompt "Before you connect to the Tor network, you need to provide information about this computer's Internet connection.">
<!ENTITY torSettings.yes "ใช่">
-<!ENTITY torSettings.no "ไม่ใช่">
+<!ENTITY torSettings.no "ไม่">
<!ENTITY torSettings.firstQuestion "สิ่งต่อไปนี้อันไหนบ้างที่บรรยายลักษณะสถานการณ์ของคุณ">
<!ENTITY torSettings.configurePrompt1 "การเชื่อมต่ออินเตอร์เน็ตของคอมพิวเตอร์เครื่องนี้ถูกตรวจสอบหรือมีการใช้พร็อกซี่">
<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings before I connect to the Tor network.">
-<!ENTITY torSettings.configure "ปรับแต่ง">
+<!ENTITY torSettings.configure "กำหนดค่า">
<!ENTITY torSettings.connectPrompt2 "I would like to make a direct connection to the Tor network.">
<!ENTITY torSettings.connectPrompt3 "นี่จะทำงานในสถานการณ์ส่วนใหญ่">
<!ENTITY torSettings.connect "เชื่อมต่อ">
diff --git a/src/chrome/locale/th/progress.dtd b/src/chrome/locale/th/progress.dtd
index 002e38f..9a6d686 100644
--- a/src/chrome/locale/th/progress.dtd
+++ b/src/chrome/locale/th/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "สถานะ Tor">
-<!ENTITY torprogress.openSettings "การตั้งค่า">
+<!ENTITY torprogress.openSettings "เปิดการตั้งค่า">
<!ENTITY torprogress.heading "กำลังเชื่อมต่อสู่เครือข่าย Tor">
<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.  This may take several minutes.">
diff --git a/src/chrome/locale/vi/network-settings.dtd b/src/chrome/locale/vi/network-settings.dtd
index 914f8f6..e5d368a 100644
--- a/src/chrome/locale/vi/network-settings.dtd
+++ b/src/chrome/locale/vi/network-settings.dtd
@@ -1,48 +1,48 @@
-<!ENTITY torsettings.dialog.title "Cài đặt mạng Tor">
+<!ENTITY torsettings.dialog.title "Những cài đặt của mạng Tor">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Language">
-<!ENTITY torlauncher.localePicker.prompt "Please select a language.">
+<!ENTITY torlauncher.localePicker.title "Ngôn ngữ Trình duyệt Tor">
+<!ENTITY torlauncher.localePicker.prompt "Vui lòng chọn một ngôn ngữ.">
<!-- For "first run" wizard: -->
-<!ENTITY torsettings.prompt "Trước khi kết nối đến mạng lưới Tor, bạn cần phải cung cấp thông tin về kết nối Internet của máy tính này.">
+<!ENTITY torsettings.prompt "Trước khi bạn kết nối với mạng lưới Tor, bạn cần phải cung cấp thông tin về kết nối Internet của máy tính này.">
<!ENTITY torSettings.yes "Có">
<!ENTITY torSettings.no "Không">
-<!ENTITY torSettings.firstQuestion "Những mục này có miêu tả đúng vị trí của bạn không?">
-<!ENTITY torSettings.configurePrompt1 "This computer's Internet connection is censored or proxied.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings before I connect to the Tor network.">
+<!ENTITY torSettings.firstQuestion "Những thứ nào dưới đây mô tả đúng nhất về tình huống của bạn?">
+<!ENTITY torSettings.configurePrompt1 "Việc kết nối Internet của máy tính này bị kiểm duyệt và được đại diện.">
+<!ENTITY torSettings.configurePrompt2 "Tôi cần cấu hình cầu nối hoặc những cài đặt đại diện nội bộ trước khi tôi kết nối tới Tor network.">
<!ENTITY torSettings.configure "Cấu hình">
-<!ENTITY torSettings.connectPrompt2 "I would like to make a direct connection to the Tor network.">
-<!ENTITY torSettings.connectPrompt3 "This will work in most situations.">
+<!ENTITY torSettings.connectPrompt2 "Tôi muốn tạo kết nối trực tiếp với mạng lưới Tor.">
+<!ENTITY torSettings.connectPrompt3 "Việc này sẽ hoạt động trong hầu hết các tình huống.">
<!ENTITY torSettings.connect "Kết nối">
-<!ENTITY torSettings.proxyPageTitle "Local Proxy Configuration">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyPageTitle "Cấu hình ủy quyền nội bộ">
+<!ENTITY torSettings.proxyQuestion "Máy tính này có cần sử dụng ủy quyền nội bộ để kết nối Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyExplanation1 "In most cases a local proxy is not needed, but it may be required when connecting through a company, school, or university network.">
-<!ENTITY torSettings.proxyExplanation2 "If you are not sure how to answer this question, look at the Internet settings in another browser or check your system's network settings to see whether a local proxy is needed.">
-<!ENTITY torSettings.enterProxy "Enter the proxy settings.">
-<!ENTITY torSettings.bridgePageTitle "Tor Bridges Configuration">
+<!ENTITY torSettings.proxyExplanation1 "Trong hầu hết các tình huống, một sự ủy quyền nội bộ là không cần thiết, nhưng nó có thể cần thiết khi kết nối thông qua một công ty, trường học, hoặc mạng lưới trường đại học.">
+<!ENTITY torSettings.proxyExplanation2 "Nếu bạn không chắc cách trả lời câu hỏi này, xem cài đặt Internet trong một trình duyệt khác hoặc kiểm tra cài đặt mạng lưới của hệ thống của bạn để xem sự ủy quyền nội bộ có cần thiết không.">
+<!ENTITY torSettings.enterProxy "Nhập những cài đặt ủy quyền.">
+<!ENTITY torSettings.bridgePageTitle "Cấu hình cầu nối Tor">
<!ENTITY torSettings.bridgeQuestion "Nhà cung cấp dịch vụ (ISP) của bạn có ngăn chặn hoặc kiểm duyệt kết nối đến mạng Tor không?">
-<!ENTITY torSettings.bridgeExplanation1 "If you are not sure how to answer this question, choose No (if you are unable to connect to the Tor network without a bridge, you can add one later).">
-<!ENTITY torSettings.bridgeExplanation2 "If you choose Yes, you will be asked to configure Tor Bridges, which are unlisted relays that make it more difficult to block connections to the Tor Network.">
-<!ENTITY torSettings.bridgeSettingsPrompt "You may use the provided set of bridges or you may obtain and enter a custom set of bridges.">
+<!ENTITY torSettings.bridgeExplanation1 "Nếu bạn không chắc cách trả lời câu hỏi này, chọn Không (nếu bạn không thể kết nối mạng lưới Tor mà không có cầu nối, bạn có thể thêm một cái sau đó).">
+<!ENTITY torSettings.bridgeExplanation2 "Nếu bạn chọn Có, bạn sẽ được hỏi để cấu hình Cầu nối Tor, những sự lặp không được liệt kê mà làm cho khó khăn khi chặn kết nối tới Mạng lưới Tor.">
+<!ENTITY torSettings.bridgeSettingsPrompt "Bạn có thể sử dụng bộ cầu nối đã được cung cấp hoặc bạn có thể lấy và nhập một bộ cầu nối riêng.">
<!-- Other: -->
<!ENTITY torsettings.startingTor "Chờ đợi để Tor khởi động..">
-<!ENTITY torsettings.restartTor "Restart Tor">
-<!ENTITY torsettings.reconfigTor "Reconfigure">
+<!ENTITY torsettings.restartTor "Khởi động lại Tor">
+<!ENTITY torsettings.reconfigTor "Cấu hình lại">
-<!ENTITY torsettings.discardSettings.prompt "You have configured Tor bridges or you have entered local proxy settings.  To make a direct connection to the Tor network, these settings must be removed.">
-<!ENTITY torsettings.discardSettings.proceed "Remove Settings and Connect">
+<!ENTITY torsettings.discardSettings.prompt "Bạn phải cấu hình cầu nối Tor hoặc bạn phải nhập cài đặt ủy quyền nội bộ.  Để tạo một kết nối trực tiếp tới mạng lưới Tor, những cài đặt này phải được loại bỏ.">
+<!ENTITY torsettings.discardSettings.proceed "Loại bỏ những cài đặt và kết nối">
<!ENTITY torsettings.optional "Tuỳ chọn">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Máy tính này cần sử dụng một ủy quyền nội bộ để truy cập Internet">
<!ENTITY torsettings.useProxy.type "Dạng proxy:">
<!ENTITY torsettings.useProxy.address "Địa chỉ:">
<!ENTITY torsettings.useProxy.address.placeholder "Địa chỉ IP hoặc hostname">
@@ -52,24 +52,24 @@
<!ENTITY torsettings.useProxy.type.socks4 "SOCK 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCK 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
-<!ENTITY torsettings.firewall.checkbox "This computer goes through a firewall that only allows connections to certain ports">
+<!ENTITY torsettings.firewall.checkbox "Máy tính này đi qua một tường lửa mà chỉ cho phép tới một vài cổng">
<!ENTITY torsettings.firewall.allowedPorts "Những Cổng Được phép:">
<!ENTITY torsettings.useBridges.checkbox "Nhà cung cấp dịch vụ của tôi (ISP) đã chặn kết nối đến mạng Tor">
<!ENTITY torsettings.useBridges.default "Kết nối với những cầu được cung cấp">
-<!ENTITY torsettings.useBridges.note "Each type of bridge uses a different method to avoid censorship.  If one bridge does not work, try again using a different one.">
+<!ENTITY torsettings.useBridges.note "Mỗi loại cầu nối sử dụng một phương pháp khác nhau để tránh việc kiểm duyệt.  Nếu một cầu nối không hoạt động, thử lại bằng một cái khác.">
<!ENTITY torsettings.useBridges.type "Loại hình vận chuyển:">
<!ENTITY torsettings.useBridges.custom "Nhập những cầu quen thuộc">
-<!ENTITY torsettings.useBridges.label "Enter one or more bridge relays (one per line).">
-<!ENTITY torsettings.useBridges.placeholder "type address:port">
+<!ENTITY torsettings.useBridges.label "Nhập một hoăc nhiều hơn những tiếp sức cầu nối (một cái trên mỗi dòng).">
+<!ENTITY torsettings.useBridges.placeholder "nhập address:port">
-<!ENTITY torsettings.copyLog "Copy Tor Log To Clipboard">
-<!ENTITY torsettings.bridgeHelpTitle "Bridge Relay Help">
+<!ENTITY torsettings.copyLog "Chép nhật ký của Tor vào Clipboard">
+<!ENTITY torsettings.bridgeHelpTitle "Giúp đỡ về Tiếp sức cầu nối">
<!ENTITY torsettings.bridgeHelp1 "Nếu như bạn không thể kết nối đến mạng Tor, có thể là nhà cung cấp dịch vụ của bạn (ISP) hoặc cơ quan khác đã chặn kết nối đến Tor. Thông thường, bạn có thể giải quyết vấn này bằng cách sử dụng Tor Bridges, các Tor Bridges này sẽ không được liệt kê để làm cho việc ngăn chặn khó khăn hơn.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
+<!ENTITY torsettings.bridgeHelp1B "Bạn có thể sử dụng bộ cầu nối đã được cấu hình trước, được cung cấp hoặc bạn có thể lấy một bộ địa chỉ riêng bằng cách sử dụng một trong những phương pháp:">
<!ENTITY torsettings.bridgeHelp2Heading "Đi qua Web">
<!ENTITY torsettings.bridgeHelp2 "Sử dụng trình duyệt web truy cập vào https://bridges.torproject.org">
-<!ENTITY torsettings.bridgeHelp3Heading "Through the Email Autoresponder">
-<!ENTITY torsettings.bridgeHelp3.emailDesc "Send email to bridges(a)torproject.org with the line 'get bridges' by itself in the body of the message.  However, to make it harder for an attacker to learn a lot of bridge addresses, you must send this request from one of the following email providers (listed in order of preference):">
+<!ENTITY torsettings.bridgeHelp3Heading "Thông qua Hệ thống tự động trả lời email">
+<!ENTITY torsettings.bridgeHelp3.emailDesc "Gửi email tới bridges(a)torproject.org với dòng 'get bridges' bởi bản thân nó trong phần thân thông điệp.  Tuy nhiên, để làm khó hơn cho một kẻ tấn công có thể hiểu nhiều về địa chỉ cầu nối, bạn phải gửi yêu cầu này từ một trong những nhà cung cấp email dưới đây (được liệt kê theo sự ưa thích):">
<!ENTITY torsettings.bridgeHelp3.emailList "https://www.riseup.net, https://mail.google.com, or https://mail.yahoo.com">
-<!ENTITY torsettings.bridgeHelp4Heading "Through the Help Desk">
-<!ENTITY torsettings.bridgeHelp4 "As a last resort, you can request bridge addresses by sending a polite email message to help(a)rt.torproject.org.  Please note that a person will need to respond to each request.">
+<!ENTITY torsettings.bridgeHelp4Heading "Thông qua Help Desk">
+<!ENTITY torsettings.bridgeHelp4 "Như là phương thức cuối cùng, bạn có thể yêu cầu địa chỉ cầu nối bằng cách gửi một email lịch sự tới help(a)rt.torproject.org.  Vui lòng lưu ý rằng một người cần phải phản hồi tới từng yêu cầu.">
diff --git a/src/chrome/locale/vi/progress.dtd b/src/chrome/locale/vi/progress.dtd
index 15cd66b..fdf5f7d 100644
--- a/src/chrome/locale/vi/progress.dtd
+++ b/src/chrome/locale/vi/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "Trạng thái Tor">
<!ENTITY torprogress.openSettings "Những cài đặt mở">
-<!ENTITY torprogress.heading "Kết nối với mạng Tor">
-<!ENTITY torprogress.pleaseWait "Vui lòng chờ trong khi chúng tôi thiết lập kết nối tới mạng lưới Tor.  Việc này có thể tốn một vài phút.">
+<!ENTITY torprogress.heading "Đang kết nối với mạng Tor">
+<!ENTITY torprogress.pleaseWait "Vui lòng chờ trong khi chúng tôi thiết lập kết nối tới mạng lưới Tor.  Việc này có thể mất một vài phút.">
diff --git a/src/chrome/locale/vi/torlauncher.properties b/src/chrome/locale/vi/torlauncher.properties
index 12de864..0ef4db5 100644
--- a/src/chrome/locale/vi/torlauncher.properties
+++ b/src/chrome/locale/vi/torlauncher.properties
@@ -1,22 +1,22 @@
### Copyright (c) 2016, The Tor Project, Inc.
### See LICENSE for licensing information.
-torlauncher.error_title=Tor Launcher
+torlauncher.error_title=Trình khởi chạy Tor
torlauncher.tor_exited_during_startup=Tor đã thoát trong khi khởi động. Điều này có lẽ là do một lỗi trong tệp tin torrc của bạn, một khiếm khuyết của Tor hay của một chương trình khác trong hệ thống của bạn, hoặc lỗi phần cứng. Cho đến khi bạn sửa chữa lại vấn đề bên dưới đó và khởi động lại Tor, trình duyệt Tor sẽ không khởi động.
-torlauncher.tor_exited=Tor unexpectedly exited. This might be due to a bug in Tor itself, another program on your system, or faulty hardware. Until you restart Tor, the Tor Browser will not able to reach any websites. If the problem persists, please send a copy of your Tor Log to the support team.
-torlauncher.tor_exited2=Restarting Tor will not close your browser tabs.
-torlauncher.tor_controlconn_failed=Could not connect to Tor control port.
+torlauncher.tor_exited=Tor đã tắt một cách không mong muốn. Việc này có thể do lỗi trong bản thân Tor, một chương trình khác trong hệ thống của bản, hoặc lỗi phần cứng. Cho tới khi bạn khởi động lại Tor, Trình duyệt Tor sẽ không thể truy cập tới bất kỳ trang nào. Nếu vấn đề vẫn tồn tại, vui lòng gửi một bản sao nhật ký của Tor tới nhóm hỗ trợ.
+torlauncher.tor_exited2=Khởi động lại Tor sẽ không đóng hết những thẻ trình duyệt của bạn.
+torlauncher.tor_controlconn_failed=Không thể kết nối với cổng kiểm soát của Tor.
torlauncher.tor_failed_to_start=Chạy Tor thất bại.
-torlauncher.tor_control_failed=Failed to take control of Tor.
+torlauncher.tor_control_failed=Thất bại khi kiểm soát Tor.
torlauncher.tor_bootstrap_failed=Tor đã thất bại khi thiết lập kết nối đến mạng Tor
-torlauncher.tor_bootstrap_failed_details=%1$S failed (%2$S).
+torlauncher.tor_bootstrap_failed_details=%1$S đã thất bại (%2$S).
-torlauncher.unable_to_start_tor=Unable to start Tor.\n\n%S
+torlauncher.unable_to_start_tor=Không thể khởi động Tor.\n\n%S
torlauncher.tor_missing=Tập tin thực thi của Tor bị thiếu.
-torlauncher.torrc_missing=The torrc file is missing and could not be created.
-torlauncher.datadir_missing=The Tor data directory does not exist and could not be created.
-torlauncher.password_hash_missing=Failed to get hashed password.
+torlauncher.torrc_missing=Tập tin torrc đang bị thiếu hoặc không thể tạo.
+torlauncher.datadir_missing=Thư mục dữ liệu của Tor không tồn tại và không thể tạo.
+torlauncher.password_hash_missing=Thất bại khi lấy mật khẩu đã được băm.
torlauncher.failed_to_get_settings=Không thể nhận được cài đặt Tor.
torlauncher.failed_to_save_settings=Không thể lưu lại các cài đặt của Tor.
@@ -25,21 +25,21 @@ torlauncher.ensure_tor_is_running=Hãy chắc chắn rằng Tor đang chạy.
torlauncher.error_proxy_addr_missing=Bạn phải xác định cả hai một địa chỉ IP hay tên máy và số cổng để cấu hình Tor để sử dụng một proxy ủy quyền truy cập vào Liên mạng
torlauncher.error_proxy_type_missing=Bạn phải chọn kiểu proxy.
torlauncher.error_bridges_missing=Bạn phải chỉ dẫn một hoặc nhiều cầu nối.
-torlauncher.error_default_bridges_type_missing=You must select a transport type for the provided bridges.
-torlauncher.error_bridge_bad_default_type=No provided bridges that have the transport type %S are available. Please adjust your settings.
+torlauncher.error_default_bridges_type_missing=Bạn phải chọn một loại vận chuyển cho cầu nối đã được cung cấp.
+torlauncher.error_bridge_bad_default_type=Không cầu nối đã được cung cấp nào có loại vận chuyển %S có sẵn. Vui lòng điều chỉnh cài đặt của bạn.
torlauncher.recommended_bridge=(khuyên dùng)
torlauncher.connect=Kết nối
-torlauncher.restart_tor=Restart Tor
+torlauncher.restart_tor=Khởi động lại Tor
torlauncher.quit=Thoát
torlauncher.quit_win=Thoát
torlauncher.done=Hoàn thành
torlauncher.forAssistance=Để được trợ giúp, liên hệ %S
-torlauncher.forAssistance2=For assistance, visit %S
+torlauncher.forAssistance2=Nếu cần sự giúp đỡ, ghé qua %S
-torlauncher.copiedNLogMessages=Copy complete. %S Tor log messages are ready to be pasted into a text editor or an email message.
+torlauncher.copiedNLogMessages=Sao chép hoàn tất. %S thông điệp nhật ký của Tor đã sẵn sàng để dán vào một chương trình sửa văn bản hoặc một thông điệp email.
torlauncher.bootstrapStatus.conn_dir=Kết nối vào một thư mục chuyển tiếp
torlauncher.bootstrapStatus.handshake_dir=Thành lập một kết nối thư mục được mã hóa
@@ -56,7 +56,7 @@ torlauncher.bootstrapWarning.done=làm xong
torlauncher.bootstrapWarning.connectrefused=kết nối từ chối
torlauncher.bootstrapWarning.misc=hỗn hợp
torlauncher.bootstrapWarning.resourcelimit=không đủ nguồn lực
-torlauncher.bootstrapWarning.identity=nhận dạng không phù hợp
+torlauncher.bootstrapWarning.identity=danh tính không khớp
torlauncher.bootstrapWarning.timeout=kết nối timeout
torlauncher.bootstrapWarning.noroute=không có lộ trình để lưu trữ
torlauncher.bootstrapWarning.ioerror=lỗi đọc / ghi
diff --git a/src/chrome/locale/zh-CN/network-settings.dtd b/src/chrome/locale/zh-CN/network-settings.dtd
index 5997966..167a597 100644
--- a/src/chrome/locale/zh-CN/network-settings.dtd
+++ b/src/chrome/locale/zh-CN/network-settings.dtd
@@ -27,7 +27,7 @@
<!ENTITY torSettings.enterProxy "输入代理设置。">
<!ENTITY torSettings.bridgePageTitle "Tor 网桥配置">
<!ENTITY torSettings.bridgeQuestion "互联网服务提供商 (ISP) 是否对 Tor 网络连接进行了封锁或审查?">
-<!ENTITY torSettings.bridgeExplanation1 "如果你不确定此问题的答案,请选择否,(如果你在不使用网桥时无法连接到 Tor 网络,你可以稍后添加)。">
+<!ENTITY torSettings.bridgeExplanation1 "如果不确定,可选择否,之后不用网桥则无法连接时,可再尝试使用网桥。">
<!ENTITY torSettings.bridgeExplanation2 "如果您选择“是”,那么需要对 Tor 网桥进行配置。网桥指用于连接 Tor 网络的非公开网络中继,更难被封锁。">
<!ENTITY torSettings.bridgeSettingsPrompt "可以使用集成的网桥,也可以获取网桥,以自定义方式手动输入。">
1
0
commit 9b70509e0920725c706c2ae1f47cf1924a3f08e3
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 21:02:22 2016 +0000
Translations update
---
src/chrome/locale/ar/network-settings.dtd | 2 +-
src/chrome/locale/ar/torlauncher.properties | 4 +-
src/chrome/locale/de/network-settings.dtd | 4 +-
src/chrome/locale/fa/torlauncher.properties | 6 +--
src/chrome/locale/id/network-settings.dtd | 2 +-
src/chrome/locale/id/torlauncher.properties | 2 +-
src/chrome/locale/lo/progress.dtd | 6 +--
src/chrome/locale/lo/torlauncher.properties | 2 +-
src/chrome/locale/nl/network-settings.dtd | 6 +--
src/chrome/locale/th/network-settings.dtd | 6 +--
src/chrome/locale/th/progress.dtd | 2 +-
src/chrome/locale/vi/network-settings.dtd | 68 ++++++++++++++--------------
src/chrome/locale/vi/progress.dtd | 4 +-
src/chrome/locale/vi/torlauncher.properties | 32 ++++++-------
src/chrome/locale/zh-CN/network-settings.dtd | 2 +-
15 files changed, 74 insertions(+), 74 deletions(-)
diff --git a/src/chrome/locale/ar/network-settings.dtd b/src/chrome/locale/ar/network-settings.dtd
index 76641ed..73be5a2 100644
--- a/src/chrome/locale/ar/network-settings.dtd
+++ b/src/chrome/locale/ar/network-settings.dtd
@@ -65,7 +65,7 @@
<!ENTITY torsettings.copyLog "نسخ سجل تور إلي الحافظة">
<!ENTITY torsettings.bridgeHelpTitle "المساعدة الخاصة بالجسور المُرحلة">
<!ENTITY torsettings.bridgeHelp1 "قد يكون السبب في عدم قدرتك علي الاتصال بشبكة تورهو ان مزود خدمة الإنترنت الخاص بك (ISP) أو منظمة اخري يمنع محاولات الاتصال بشبكة تور. وغالباً، تستطيع تخطي هذا المنع عن طريق استخدام جسور تور و الجسور عبارة عن مُرحلات مخفية صعب منعها.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
+<!ENTITY torsettings.bridgeHelp1B "تستطيع استخدام مجموعة من عناوين الجسور المتوفرة، والمكونة مسبقا، أو يمكنك الحصول على مجموعة من عناوين مخصصة باستخدام أحد هذه الأساليب:">
<!ENTITY torsettings.bridgeHelp2Heading "من خلال الويب">
<!ENTITY torsettings.bridgeHelp2 "استخدم متصفح ويب لزيارة https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "من خلال المستجيب التلقائي للبريد الإلكتروني">
diff --git a/src/chrome/locale/ar/torlauncher.properties b/src/chrome/locale/ar/torlauncher.properties
index 27ae3e6..4c73702 100644
--- a/src/chrome/locale/ar/torlauncher.properties
+++ b/src/chrome/locale/ar/torlauncher.properties
@@ -14,8 +14,8 @@ torlauncher.tor_bootstrap_failed_details=%1$S فشل(%2$S).
torlauncher.unable_to_start_tor=غير قادر علي بدء تشغيل تور.\n\n%S
torlauncher.tor_missing=الملف التنفيذي لتور مفقود.
-torlauncher.torrc_missing=The torrc file is missing and could not be created.
-torlauncher.datadir_missing=The Tor data directory does not exist and could not be created.
+torlauncher.torrc_missing=الملف torrc مفقود ولم يتم إنشاؤه.
+torlauncher.datadir_missing=دليل البيانات تور غير موجود ولا يمكن أن ينشأ.
torlauncher.password_hash_missing=فشل في الحصول على كلمة المرور المجزأة.
torlauncher.failed_to_get_settings=غير قادر علي جلب إعدادات تور.\n\n%S
diff --git a/src/chrome/locale/de/network-settings.dtd b/src/chrome/locale/de/network-settings.dtd
index 493f40d..2124fff 100644
--- a/src/chrome/locale/de/network-settings.dtd
+++ b/src/chrome/locale/de/network-settings.dtd
@@ -1,8 +1,8 @@
<!ENTITY torsettings.dialog.title "Tor-Netzwerkeinstellungen">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Sprache">
-<!ENTITY torlauncher.localePicker.prompt "Bitte wählen Sie eine Sprache.">
+<!ENTITY torlauncher.localePicker.title "Tor-Browser-Sprache">
+<!ENTITY torlauncher.localePicker.prompt "Bitte eine Sprache auswählen.">
<!-- For "first run" wizard: -->
diff --git a/src/chrome/locale/fa/torlauncher.properties b/src/chrome/locale/fa/torlauncher.properties
index b433fb0..ad5ef5e 100644
--- a/src/chrome/locale/fa/torlauncher.properties
+++ b/src/chrome/locale/fa/torlauncher.properties
@@ -4,15 +4,15 @@
torlauncher.error_title=اجرا کننده تور
torlauncher.tor_exited_during_startup=تُر در هنگام شروع بسته شد. ممکن است این بعلت خطایی در فایل torrc شما، خطایی در برنامه تُر تا برنامه دیگری روی کامپیوتر شما، و یا ایراد سخت افزاری باشد. تا زمانی که شما خطای رخ داده را بررسی رفع کنید و تُر را دوباره اجرا کنید، مرورگر تُر شروع نخواهد شد.
-torlauncher.tor_exited=Tor به طور غیر منتظره خارج شد. ممکن است به علت یک اشکال در Tor و یا یک برنامه دیگر بر روی سیستم شما و یا یک سخت افزار معیوب اتفاق افتاده باشد، تا زمانی که دوباره Tor را اجرا نمائید. مرورگر Tor قادر است به هر سایتی دسترسی داشته باشد. اگر این مشکل ادامه داشت، لطفا یک کپی از Log Tor خود را به تیم پشتیبانی ارسال کنید.
+torlauncher.tor_exited=Tor به طور غیر منتظره خارج شد که این ممکن است به علت یک اشکال در Tor و یا یک برنامه دیگر بر روی سیستم شما و یا یک سخت افزار معیوب اتفاق افتاده باشد، تا زمانی که دوباره Tor را اجرا نمائید مرورگر Tor قادر نخواهد بود به هیچ سایتی دسترسی داشته باشد. اگر این مشکل ادامه داشت، لطفا یک کپی از Log Tor خود را به تیم پشتیبانی ارسال کنید.
torlauncher.tor_exited2=شروع مجدد، Tor نمی تواند زبانه های مرورگر را ببندد.
torlauncher.tor_controlconn_failed=اتصال به پورت کنترل تور امکان پذیر نمیباشد.
torlauncher.tor_failed_to_start=خطا در راه اندازی.
torlauncher.tor_control_failed=بهدست گرفتن کنترل تور ناموفق بود.
-torlauncher.tor_bootstrap_failed=تور در برقراری یک ارتباط شبکهای توری ناموفق بود.
+torlauncher.tor_bootstrap_failed=تور در برقراری یک ارتباط با شبکه خود ناموفق بود.
torlauncher.tor_bootstrap_failed_details=%1$S ناموفق بود (%2$S).
-torlauncher.unable_to_start_tor=راه اندازی تور امکان پذیر نمی باشد.\n\n%S
+torlauncher.unable_to_start_tor=تور قادر به اجرا شدن نیست\n\n%S
torlauncher.tor_missing=فایل اجرایی تور یافت نشد.
torlauncher.torrc_missing=فایل torrc پیدا نشد و ساخت فایل جدید ناموفق بود.
torlauncher.datadir_missing=دایرکتوری اطلاعات تٌر وجود ندارد و ساخت آن نیز ناموفق بود.
diff --git a/src/chrome/locale/id/network-settings.dtd b/src/chrome/locale/id/network-settings.dtd
index ec6e8d4..c5815c6 100644
--- a/src/chrome/locale/id/network-settings.dtd
+++ b/src/chrome/locale/id/network-settings.dtd
@@ -65,7 +65,7 @@
<!ENTITY torsettings.copyLog "Salin Log Tor Ke Clipboard">
<!ENTITY torsettings.bridgeHelpTitle "Bantuan Bridge Relay">
<!ENTITY torsettings.bridgeHelp1 "Jika Anda tidak dapat terhubung ke jaringan Tor, bisa jadi Provider Layanan Internet (ISP) atau lembaga lain yang menghalangi Tor.   Sering kali, Anda dapat mengatasi masalah ini dengan menggunakan Tor Bridges, yang relai terdaftar yang lebih sulit untuk memblokir.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
+<!ENTITY torsettings.bridgeHelp1B "Anda dapat menggunakan prakonfigurasi, disediakan alamat-alamat jembatan atau anda dapat mendapat barisan khusus dari alamat-alamat dengan menggunakan satu dari metode berikut:">
<!ENTITY torsettings.bridgeHelp2Heading "Lewat web">
<!ENTITY torsettings.bridgeHelp2 "Menggunakan applikasi penjelajah interet untuk mengunjungi https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "Melalui Email Autoresponder">
diff --git a/src/chrome/locale/id/torlauncher.properties b/src/chrome/locale/id/torlauncher.properties
index f18c2dd..00c65ec 100644
--- a/src/chrome/locale/id/torlauncher.properties
+++ b/src/chrome/locale/id/torlauncher.properties
@@ -3,7 +3,7 @@
torlauncher.error_title=Tor Launcher
-torlauncher.tor_exited_during_startup=Tor exited during startup. This might be due to an error in your torrc file, a bug in Tor or another program on your system, or faulty hardware. Until you fix the underlying problem and restart Tor, Tor Browser will not start.
+torlauncher.tor_exited_during_startup=Tor keluar ketika startup. Hal ini mungkin karena suatu kesalahan pada berkas torrc anda, bug pada Tor atau program lain pada sistem anda, atau kerusakan pada perangkat keras. Hingga anda memperbaiki masalah tersebut dan mulai ulang Tor, Tor Browser tidak akan dijalankan.
torlauncher.tor_exited=Tor keluar mendadak. Ini dapat terjadi karena bug dalam Tor, atau program lain di sistem Anda, atau kerusakan perangkat keras. Sampai anda memuat ulang Tor, Browser Tor tidak dapat mencapai situs web apapun. Jika masalah ini terus bertahan, mohon mengirimkan salinan dari log Tor Anda kepada tim pendukung.
torlauncher.tor_exited2=Memuat ulang Tor tidak akan menutup tab browser Anda.
torlauncher.tor_controlconn_failed=Tidak dapat tersambung pada port kontrol Tor.
diff --git a/src/chrome/locale/lo/progress.dtd b/src/chrome/locale/lo/progress.dtd
index fb3aeb4..14b98fe 100644
--- a/src/chrome/locale/lo/progress.dtd
+++ b/src/chrome/locale/lo/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "ສະຖານະ Tor">
-<!ENTITY torprogress.openSettings "Open Settings">
-<!ENTITY torprogress.heading "Connecting to the Tor network">
-<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.  This may take several minutes.">
+<!ENTITY torprogress.openSettings "ໄຂການຕັ້ງຄ່າ">
+<!ENTITY torprogress.heading "ກຳລັງເຊື່ອມຕໍ່ເຂົ້າກັບເຄືອຂ່າຍ Tor">
+<!ENTITY torprogress.pleaseWait "ກະລຸນາລໍຖ້າໃນຂະນະທີ່ພວກເຮົາຈັດແຈງການເຊື່ອມຕໍ່ເຂົ້າເຄືອຂ່າຍ Tor.  ອາດຈະໃຊ້ເວລາຫລາຍນາທີ.">
diff --git a/src/chrome/locale/lo/torlauncher.properties b/src/chrome/locale/lo/torlauncher.properties
index bdbcf16..9959bfb 100644
--- a/src/chrome/locale/lo/torlauncher.properties
+++ b/src/chrome/locale/lo/torlauncher.properties
@@ -48,7 +48,7 @@ torlauncher.bootstrapStatus.loading_status=Loading network status
torlauncher.bootstrapStatus.loading_keys=Loading authority certificates
torlauncher.bootstrapStatus.requesting_descriptors=Requesting relay information
torlauncher.bootstrapStatus.loading_descriptors=Loading relay information
-torlauncher.bootstrapStatus.conn_or=Connecting to the Tor network
+torlauncher.bootstrapStatus.conn_or=ກຳລັງເຊື່ອມຕໍ່ເຂົ້າກັບເຄືອຂ່າຍ Tor
torlauncher.bootstrapStatus.handshake_or=Establishing a Tor circuit
torlauncher.bootstrapStatus.done=Connected to the Tor network!
diff --git a/src/chrome/locale/nl/network-settings.dtd b/src/chrome/locale/nl/network-settings.dtd
index beabc95..d7fa414 100644
--- a/src/chrome/locale/nl/network-settings.dtd
+++ b/src/chrome/locale/nl/network-settings.dtd
@@ -1,7 +1,7 @@
<!ENTITY torsettings.dialog.title "Tor netwerkinstellingen">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Taal">
+<!ENTITY torlauncher.localePicker.title "Tor-browsertaal">
<!ENTITY torlauncher.localePicker.prompt "Selecteer een taal.">
<!-- For "first run" wizard: -->
@@ -38,9 +38,9 @@
<!ENTITY torsettings.reconfigTor "Herconfigureer">
<!ENTITY torsettings.discardSettings.prompt "Je hebt Tor bridges geconfigureerd of je hebt lokale proxy-instellingen ingevuld.  Om een directe verbinding tot het Tor netwerk te kunnen maken, moet je deze instellingen verwijderen.">
-<!ENTITY torsettings.discardSettings.proceed "Instellingen Verwijderen en Verbinden">
+<!ENTITY torsettings.discardSettings.proceed "Instellingen verwijderen en verbinden">
-<!ENTITY torsettings.optional "Facultatief">
+<!ENTITY torsettings.optional "Optioneel">
<!ENTITY torsettings.useProxy.checkbox "Deze computer heeft een lokale proxy nodig om toegang te krijgen tot het internet">
<!ENTITY torsettings.useProxy.type "Proxytype:">
diff --git a/src/chrome/locale/th/network-settings.dtd b/src/chrome/locale/th/network-settings.dtd
index d4a20d8..0a4b839 100644
--- a/src/chrome/locale/th/network-settings.dtd
+++ b/src/chrome/locale/th/network-settings.dtd
@@ -2,19 +2,19 @@
<!-- For locale picker: -->
<!ENTITY torlauncher.localePicker.title "Tor Browser Language">
-<!ENTITY torlauncher.localePicker.prompt "Please select a language.">
+<!ENTITY torlauncher.localePicker.prompt "โปรดเลือกภาษา">
<!-- For "first run" wizard: -->
<!ENTITY torsettings.prompt "Before you connect to the Tor network, you need to provide information about this computer's Internet connection.">
<!ENTITY torSettings.yes "ใช่">
-<!ENTITY torSettings.no "ไม่ใช่">
+<!ENTITY torSettings.no "ไม่">
<!ENTITY torSettings.firstQuestion "สิ่งต่อไปนี้อันไหนบ้างที่บรรยายลักษณะสถานการณ์ของคุณ">
<!ENTITY torSettings.configurePrompt1 "การเชื่อมต่ออินเตอร์เน็ตของคอมพิวเตอร์เครื่องนี้ถูกตรวจสอบหรือมีการใช้พร็อกซี่">
<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings before I connect to the Tor network.">
-<!ENTITY torSettings.configure "ปรับแต่ง">
+<!ENTITY torSettings.configure "กำหนดค่า">
<!ENTITY torSettings.connectPrompt2 "I would like to make a direct connection to the Tor network.">
<!ENTITY torSettings.connectPrompt3 "นี่จะทำงานในสถานการณ์ส่วนใหญ่">
<!ENTITY torSettings.connect "เชื่อมต่อ">
diff --git a/src/chrome/locale/th/progress.dtd b/src/chrome/locale/th/progress.dtd
index 002e38f..9a6d686 100644
--- a/src/chrome/locale/th/progress.dtd
+++ b/src/chrome/locale/th/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "สถานะ Tor">
-<!ENTITY torprogress.openSettings "การตั้งค่า">
+<!ENTITY torprogress.openSettings "เปิดการตั้งค่า">
<!ENTITY torprogress.heading "กำลังเชื่อมต่อสู่เครือข่าย Tor">
<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.  This may take several minutes.">
diff --git a/src/chrome/locale/vi/network-settings.dtd b/src/chrome/locale/vi/network-settings.dtd
index 914f8f6..e5d368a 100644
--- a/src/chrome/locale/vi/network-settings.dtd
+++ b/src/chrome/locale/vi/network-settings.dtd
@@ -1,48 +1,48 @@
-<!ENTITY torsettings.dialog.title "Cài đặt mạng Tor">
+<!ENTITY torsettings.dialog.title "Những cài đặt của mạng Tor">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Language">
-<!ENTITY torlauncher.localePicker.prompt "Please select a language.">
+<!ENTITY torlauncher.localePicker.title "Ngôn ngữ Trình duyệt Tor">
+<!ENTITY torlauncher.localePicker.prompt "Vui lòng chọn một ngôn ngữ.">
<!-- For "first run" wizard: -->
-<!ENTITY torsettings.prompt "Trước khi kết nối đến mạng lưới Tor, bạn cần phải cung cấp thông tin về kết nối Internet của máy tính này.">
+<!ENTITY torsettings.prompt "Trước khi bạn kết nối với mạng lưới Tor, bạn cần phải cung cấp thông tin về kết nối Internet của máy tính này.">
<!ENTITY torSettings.yes "Có">
<!ENTITY torSettings.no "Không">
-<!ENTITY torSettings.firstQuestion "Những mục này có miêu tả đúng vị trí của bạn không?">
-<!ENTITY torSettings.configurePrompt1 "This computer's Internet connection is censored or proxied.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings before I connect to the Tor network.">
+<!ENTITY torSettings.firstQuestion "Những thứ nào dưới đây mô tả đúng nhất về tình huống của bạn?">
+<!ENTITY torSettings.configurePrompt1 "Việc kết nối Internet của máy tính này bị kiểm duyệt và được đại diện.">
+<!ENTITY torSettings.configurePrompt2 "Tôi cần cấu hình cầu nối hoặc những cài đặt đại diện nội bộ trước khi tôi kết nối tới Tor network.">
<!ENTITY torSettings.configure "Cấu hình">
-<!ENTITY torSettings.connectPrompt2 "I would like to make a direct connection to the Tor network.">
-<!ENTITY torSettings.connectPrompt3 "This will work in most situations.">
+<!ENTITY torSettings.connectPrompt2 "Tôi muốn tạo kết nối trực tiếp với mạng lưới Tor.">
+<!ENTITY torSettings.connectPrompt3 "Việc này sẽ hoạt động trong hầu hết các tình huống.">
<!ENTITY torSettings.connect "Kết nối">
-<!ENTITY torSettings.proxyPageTitle "Local Proxy Configuration">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyPageTitle "Cấu hình ủy quyền nội bộ">
+<!ENTITY torSettings.proxyQuestion "Máy tính này có cần sử dụng ủy quyền nội bộ để kết nối Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyExplanation1 "In most cases a local proxy is not needed, but it may be required when connecting through a company, school, or university network.">
-<!ENTITY torSettings.proxyExplanation2 "If you are not sure how to answer this question, look at the Internet settings in another browser or check your system's network settings to see whether a local proxy is needed.">
-<!ENTITY torSettings.enterProxy "Enter the proxy settings.">
-<!ENTITY torSettings.bridgePageTitle "Tor Bridges Configuration">
+<!ENTITY torSettings.proxyExplanation1 "Trong hầu hết các tình huống, một sự ủy quyền nội bộ là không cần thiết, nhưng nó có thể cần thiết khi kết nối thông qua một công ty, trường học, hoặc mạng lưới trường đại học.">
+<!ENTITY torSettings.proxyExplanation2 "Nếu bạn không chắc cách trả lời câu hỏi này, xem cài đặt Internet trong một trình duyệt khác hoặc kiểm tra cài đặt mạng lưới của hệ thống của bạn để xem sự ủy quyền nội bộ có cần thiết không.">
+<!ENTITY torSettings.enterProxy "Nhập những cài đặt ủy quyền.">
+<!ENTITY torSettings.bridgePageTitle "Cấu hình cầu nối Tor">
<!ENTITY torSettings.bridgeQuestion "Nhà cung cấp dịch vụ (ISP) của bạn có ngăn chặn hoặc kiểm duyệt kết nối đến mạng Tor không?">
-<!ENTITY torSettings.bridgeExplanation1 "If you are not sure how to answer this question, choose No (if you are unable to connect to the Tor network without a bridge, you can add one later).">
-<!ENTITY torSettings.bridgeExplanation2 "If you choose Yes, you will be asked to configure Tor Bridges, which are unlisted relays that make it more difficult to block connections to the Tor Network.">
-<!ENTITY torSettings.bridgeSettingsPrompt "You may use the provided set of bridges or you may obtain and enter a custom set of bridges.">
+<!ENTITY torSettings.bridgeExplanation1 "Nếu bạn không chắc cách trả lời câu hỏi này, chọn Không (nếu bạn không thể kết nối mạng lưới Tor mà không có cầu nối, bạn có thể thêm một cái sau đó).">
+<!ENTITY torSettings.bridgeExplanation2 "Nếu bạn chọn Có, bạn sẽ được hỏi để cấu hình Cầu nối Tor, những sự lặp không được liệt kê mà làm cho khó khăn khi chặn kết nối tới Mạng lưới Tor.">
+<!ENTITY torSettings.bridgeSettingsPrompt "Bạn có thể sử dụng bộ cầu nối đã được cung cấp hoặc bạn có thể lấy và nhập một bộ cầu nối riêng.">
<!-- Other: -->
<!ENTITY torsettings.startingTor "Chờ đợi để Tor khởi động..">
-<!ENTITY torsettings.restartTor "Restart Tor">
-<!ENTITY torsettings.reconfigTor "Reconfigure">
+<!ENTITY torsettings.restartTor "Khởi động lại Tor">
+<!ENTITY torsettings.reconfigTor "Cấu hình lại">
-<!ENTITY torsettings.discardSettings.prompt "You have configured Tor bridges or you have entered local proxy settings.  To make a direct connection to the Tor network, these settings must be removed.">
-<!ENTITY torsettings.discardSettings.proceed "Remove Settings and Connect">
+<!ENTITY torsettings.discardSettings.prompt "Bạn phải cấu hình cầu nối Tor hoặc bạn phải nhập cài đặt ủy quyền nội bộ.  Để tạo một kết nối trực tiếp tới mạng lưới Tor, những cài đặt này phải được loại bỏ.">
+<!ENTITY torsettings.discardSettings.proceed "Loại bỏ những cài đặt và kết nối">
<!ENTITY torsettings.optional "Tuỳ chọn">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Máy tính này cần sử dụng một ủy quyền nội bộ để truy cập Internet">
<!ENTITY torsettings.useProxy.type "Dạng proxy:">
<!ENTITY torsettings.useProxy.address "Địa chỉ:">
<!ENTITY torsettings.useProxy.address.placeholder "Địa chỉ IP hoặc hostname">
@@ -52,24 +52,24 @@
<!ENTITY torsettings.useProxy.type.socks4 "SOCK 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCK 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
-<!ENTITY torsettings.firewall.checkbox "This computer goes through a firewall that only allows connections to certain ports">
+<!ENTITY torsettings.firewall.checkbox "Máy tính này đi qua một tường lửa mà chỉ cho phép tới một vài cổng">
<!ENTITY torsettings.firewall.allowedPorts "Những Cổng Được phép:">
<!ENTITY torsettings.useBridges.checkbox "Nhà cung cấp dịch vụ của tôi (ISP) đã chặn kết nối đến mạng Tor">
<!ENTITY torsettings.useBridges.default "Kết nối với những cầu được cung cấp">
-<!ENTITY torsettings.useBridges.note "Each type of bridge uses a different method to avoid censorship.  If one bridge does not work, try again using a different one.">
+<!ENTITY torsettings.useBridges.note "Mỗi loại cầu nối sử dụng một phương pháp khác nhau để tránh việc kiểm duyệt.  Nếu một cầu nối không hoạt động, thử lại bằng một cái khác.">
<!ENTITY torsettings.useBridges.type "Loại hình vận chuyển:">
<!ENTITY torsettings.useBridges.custom "Nhập những cầu quen thuộc">
-<!ENTITY torsettings.useBridges.label "Enter one or more bridge relays (one per line).">
-<!ENTITY torsettings.useBridges.placeholder "type address:port">
+<!ENTITY torsettings.useBridges.label "Nhập một hoăc nhiều hơn những tiếp sức cầu nối (một cái trên mỗi dòng).">
+<!ENTITY torsettings.useBridges.placeholder "nhập address:port">
-<!ENTITY torsettings.copyLog "Copy Tor Log To Clipboard">
-<!ENTITY torsettings.bridgeHelpTitle "Bridge Relay Help">
+<!ENTITY torsettings.copyLog "Chép nhật ký của Tor vào Clipboard">
+<!ENTITY torsettings.bridgeHelpTitle "Giúp đỡ về Tiếp sức cầu nối">
<!ENTITY torsettings.bridgeHelp1 "Nếu như bạn không thể kết nối đến mạng Tor, có thể là nhà cung cấp dịch vụ của bạn (ISP) hoặc cơ quan khác đã chặn kết nối đến Tor. Thông thường, bạn có thể giải quyết vấn này bằng cách sử dụng Tor Bridges, các Tor Bridges này sẽ không được liệt kê để làm cho việc ngăn chặn khó khăn hơn.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
+<!ENTITY torsettings.bridgeHelp1B "Bạn có thể sử dụng bộ cầu nối đã được cấu hình trước, được cung cấp hoặc bạn có thể lấy một bộ địa chỉ riêng bằng cách sử dụng một trong những phương pháp:">
<!ENTITY torsettings.bridgeHelp2Heading "Đi qua Web">
<!ENTITY torsettings.bridgeHelp2 "Sử dụng trình duyệt web truy cập vào https://bridges.torproject.org">
-<!ENTITY torsettings.bridgeHelp3Heading "Through the Email Autoresponder">
-<!ENTITY torsettings.bridgeHelp3.emailDesc "Send email to bridges(a)torproject.org with the line 'get bridges' by itself in the body of the message.  However, to make it harder for an attacker to learn a lot of bridge addresses, you must send this request from one of the following email providers (listed in order of preference):">
+<!ENTITY torsettings.bridgeHelp3Heading "Thông qua Hệ thống tự động trả lời email">
+<!ENTITY torsettings.bridgeHelp3.emailDesc "Gửi email tới bridges(a)torproject.org với dòng 'get bridges' bởi bản thân nó trong phần thân thông điệp.  Tuy nhiên, để làm khó hơn cho một kẻ tấn công có thể hiểu nhiều về địa chỉ cầu nối, bạn phải gửi yêu cầu này từ một trong những nhà cung cấp email dưới đây (được liệt kê theo sự ưa thích):">
<!ENTITY torsettings.bridgeHelp3.emailList "https://www.riseup.net, https://mail.google.com, or https://mail.yahoo.com">
-<!ENTITY torsettings.bridgeHelp4Heading "Through the Help Desk">
-<!ENTITY torsettings.bridgeHelp4 "As a last resort, you can request bridge addresses by sending a polite email message to help(a)rt.torproject.org.  Please note that a person will need to respond to each request.">
+<!ENTITY torsettings.bridgeHelp4Heading "Thông qua Help Desk">
+<!ENTITY torsettings.bridgeHelp4 "Như là phương thức cuối cùng, bạn có thể yêu cầu địa chỉ cầu nối bằng cách gửi một email lịch sự tới help(a)rt.torproject.org.  Vui lòng lưu ý rằng một người cần phải phản hồi tới từng yêu cầu.">
diff --git a/src/chrome/locale/vi/progress.dtd b/src/chrome/locale/vi/progress.dtd
index 15cd66b..fdf5f7d 100644
--- a/src/chrome/locale/vi/progress.dtd
+++ b/src/chrome/locale/vi/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "Trạng thái Tor">
<!ENTITY torprogress.openSettings "Những cài đặt mở">
-<!ENTITY torprogress.heading "Kết nối với mạng Tor">
-<!ENTITY torprogress.pleaseWait "Vui lòng chờ trong khi chúng tôi thiết lập kết nối tới mạng lưới Tor.  Việc này có thể tốn một vài phút.">
+<!ENTITY torprogress.heading "Đang kết nối với mạng Tor">
+<!ENTITY torprogress.pleaseWait "Vui lòng chờ trong khi chúng tôi thiết lập kết nối tới mạng lưới Tor.  Việc này có thể mất một vài phút.">
diff --git a/src/chrome/locale/vi/torlauncher.properties b/src/chrome/locale/vi/torlauncher.properties
index 12de864..0ef4db5 100644
--- a/src/chrome/locale/vi/torlauncher.properties
+++ b/src/chrome/locale/vi/torlauncher.properties
@@ -1,22 +1,22 @@
### Copyright (c) 2016, The Tor Project, Inc.
### See LICENSE for licensing information.
-torlauncher.error_title=Tor Launcher
+torlauncher.error_title=Trình khởi chạy Tor
torlauncher.tor_exited_during_startup=Tor đã thoát trong khi khởi động. Điều này có lẽ là do một lỗi trong tệp tin torrc của bạn, một khiếm khuyết của Tor hay của một chương trình khác trong hệ thống của bạn, hoặc lỗi phần cứng. Cho đến khi bạn sửa chữa lại vấn đề bên dưới đó và khởi động lại Tor, trình duyệt Tor sẽ không khởi động.
-torlauncher.tor_exited=Tor unexpectedly exited. This might be due to a bug in Tor itself, another program on your system, or faulty hardware. Until you restart Tor, the Tor Browser will not able to reach any websites. If the problem persists, please send a copy of your Tor Log to the support team.
-torlauncher.tor_exited2=Restarting Tor will not close your browser tabs.
-torlauncher.tor_controlconn_failed=Could not connect to Tor control port.
+torlauncher.tor_exited=Tor đã tắt một cách không mong muốn. Việc này có thể do lỗi trong bản thân Tor, một chương trình khác trong hệ thống của bản, hoặc lỗi phần cứng. Cho tới khi bạn khởi động lại Tor, Trình duyệt Tor sẽ không thể truy cập tới bất kỳ trang nào. Nếu vấn đề vẫn tồn tại, vui lòng gửi một bản sao nhật ký của Tor tới nhóm hỗ trợ.
+torlauncher.tor_exited2=Khởi động lại Tor sẽ không đóng hết những thẻ trình duyệt của bạn.
+torlauncher.tor_controlconn_failed=Không thể kết nối với cổng kiểm soát của Tor.
torlauncher.tor_failed_to_start=Chạy Tor thất bại.
-torlauncher.tor_control_failed=Failed to take control of Tor.
+torlauncher.tor_control_failed=Thất bại khi kiểm soát Tor.
torlauncher.tor_bootstrap_failed=Tor đã thất bại khi thiết lập kết nối đến mạng Tor
-torlauncher.tor_bootstrap_failed_details=%1$S failed (%2$S).
+torlauncher.tor_bootstrap_failed_details=%1$S đã thất bại (%2$S).
-torlauncher.unable_to_start_tor=Unable to start Tor.\n\n%S
+torlauncher.unable_to_start_tor=Không thể khởi động Tor.\n\n%S
torlauncher.tor_missing=Tập tin thực thi của Tor bị thiếu.
-torlauncher.torrc_missing=The torrc file is missing and could not be created.
-torlauncher.datadir_missing=The Tor data directory does not exist and could not be created.
-torlauncher.password_hash_missing=Failed to get hashed password.
+torlauncher.torrc_missing=Tập tin torrc đang bị thiếu hoặc không thể tạo.
+torlauncher.datadir_missing=Thư mục dữ liệu của Tor không tồn tại và không thể tạo.
+torlauncher.password_hash_missing=Thất bại khi lấy mật khẩu đã được băm.
torlauncher.failed_to_get_settings=Không thể nhận được cài đặt Tor.
torlauncher.failed_to_save_settings=Không thể lưu lại các cài đặt của Tor.
@@ -25,21 +25,21 @@ torlauncher.ensure_tor_is_running=Hãy chắc chắn rằng Tor đang chạy.
torlauncher.error_proxy_addr_missing=Bạn phải xác định cả hai một địa chỉ IP hay tên máy và số cổng để cấu hình Tor để sử dụng một proxy ủy quyền truy cập vào Liên mạng
torlauncher.error_proxy_type_missing=Bạn phải chọn kiểu proxy.
torlauncher.error_bridges_missing=Bạn phải chỉ dẫn một hoặc nhiều cầu nối.
-torlauncher.error_default_bridges_type_missing=You must select a transport type for the provided bridges.
-torlauncher.error_bridge_bad_default_type=No provided bridges that have the transport type %S are available. Please adjust your settings.
+torlauncher.error_default_bridges_type_missing=Bạn phải chọn một loại vận chuyển cho cầu nối đã được cung cấp.
+torlauncher.error_bridge_bad_default_type=Không cầu nối đã được cung cấp nào có loại vận chuyển %S có sẵn. Vui lòng điều chỉnh cài đặt của bạn.
torlauncher.recommended_bridge=(khuyên dùng)
torlauncher.connect=Kết nối
-torlauncher.restart_tor=Restart Tor
+torlauncher.restart_tor=Khởi động lại Tor
torlauncher.quit=Thoát
torlauncher.quit_win=Thoát
torlauncher.done=Hoàn thành
torlauncher.forAssistance=Để được trợ giúp, liên hệ %S
-torlauncher.forAssistance2=For assistance, visit %S
+torlauncher.forAssistance2=Nếu cần sự giúp đỡ, ghé qua %S
-torlauncher.copiedNLogMessages=Copy complete. %S Tor log messages are ready to be pasted into a text editor or an email message.
+torlauncher.copiedNLogMessages=Sao chép hoàn tất. %S thông điệp nhật ký của Tor đã sẵn sàng để dán vào một chương trình sửa văn bản hoặc một thông điệp email.
torlauncher.bootstrapStatus.conn_dir=Kết nối vào một thư mục chuyển tiếp
torlauncher.bootstrapStatus.handshake_dir=Thành lập một kết nối thư mục được mã hóa
@@ -56,7 +56,7 @@ torlauncher.bootstrapWarning.done=làm xong
torlauncher.bootstrapWarning.connectrefused=kết nối từ chối
torlauncher.bootstrapWarning.misc=hỗn hợp
torlauncher.bootstrapWarning.resourcelimit=không đủ nguồn lực
-torlauncher.bootstrapWarning.identity=nhận dạng không phù hợp
+torlauncher.bootstrapWarning.identity=danh tính không khớp
torlauncher.bootstrapWarning.timeout=kết nối timeout
torlauncher.bootstrapWarning.noroute=không có lộ trình để lưu trữ
torlauncher.bootstrapWarning.ioerror=lỗi đọc / ghi
diff --git a/src/chrome/locale/zh-CN/network-settings.dtd b/src/chrome/locale/zh-CN/network-settings.dtd
index 5997966..167a597 100644
--- a/src/chrome/locale/zh-CN/network-settings.dtd
+++ b/src/chrome/locale/zh-CN/network-settings.dtd
@@ -27,7 +27,7 @@
<!ENTITY torSettings.enterProxy "输入代理设置。">
<!ENTITY torSettings.bridgePageTitle "Tor 网桥配置">
<!ENTITY torSettings.bridgeQuestion "互联网服务提供商 (ISP) 是否对 Tor 网络连接进行了封锁或审查?">
-<!ENTITY torSettings.bridgeExplanation1 "如果你不确定此问题的答案,请选择否,(如果你在不使用网桥时无法连接到 Tor 网络,你可以稍后添加)。">
+<!ENTITY torSettings.bridgeExplanation1 "如果不确定,可选择否,之后不用网桥则无法连接时,可再尝试使用网桥。">
<!ENTITY torSettings.bridgeExplanation2 "如果您选择“是”,那么需要对 Tor 网桥进行配置。网桥指用于连接 Tor 网络的非公开网络中继,更难被封锁。">
<!ENTITY torSettings.bridgeSettingsPrompt "可以使用集成的网桥,也可以获取网桥,以自定义方式手动输入。">
1
0
commit 6706fa3781ccfeba4afb0d2ceca84025fdeb378d
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 20:54:27 2016 +0000
Version bump and CHANGELOG update
---
src/CHANGELOG | 16 +++++++++++++++-
src/install.rdf | 2 +-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index 6d68055..0f0b103 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -1,5 +1,19 @@
+1.9.6.5
+ * Bug 20414: Add donation banner on about:tor for 2016 campaign
+ * Bug 20111: use Unix domain sockets for SOCKS port by default
+ * Bug 19459: Move resizing code to tor-browser.git
+ * Bug 20264: Change security slider to 3 options
+ * Bug 20347: Enhance security slider's custom mode
+ * Bug 20123: Disable remote jar on all security levels
+ * Bug 20244: Move privacy checkboxes to about:preferences#privacy
+ * Bug 17546: Add tooltips to explain our privacy checkboxes
+ * Bug 17904: Allow security settings dialog to resize
+ * Bug 18093: Remove 'Restore Defaults' button
+ * Bug 20373: Prevent redundant dialogs opening
+ * Bug 20388+20399+20394: Code clean-up
+ * Translation updates
+
1.9.6.4
-1.9.6.3
* Bug 17334: Move referrer spoofing for .onion domains into tor-browser.git
* Bug 17767: Make "JavaScript disabled" more visible in Security Slider
diff --git a/src/install.rdf b/src/install.rdf
index 7243571..2d3bde6 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry</em:creator>
<em:id>torbutton(a)torproject.org</em:id>
- <em:version>1.9.6.4</em:version>
+ <em:version>1.9.6.5</em:version>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html.en</em:homepageURL>
<em:optionsURL>chrome://torbutton/content/preferences.xul</em:optionsURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0
commit f16685f01bac747805ef9cac596b733d7f83f2b5
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 20:52:04 2016 +0000
Translation updates
---
src/chrome/locale/ar/torbutton.dtd | 3 +--
src/chrome/locale/de/torbutton.dtd | 3 +--
src/chrome/locale/es/torbutton.dtd | 3 +--
src/chrome/locale/eu/torbutton.dtd | 3 +--
src/chrome/locale/fa/torbutton.dtd | 11 +++++------
src/chrome/locale/fr/torbutton.dtd | 3 +--
src/chrome/locale/it/torbutton.dtd | 3 +--
src/chrome/locale/ja/torbutton.dtd | 3 +--
src/chrome/locale/ko/torbutton.dtd | 3 +--
src/chrome/locale/nl/torbutton.dtd | 3 +--
src/chrome/locale/pl/torbutton.dtd | 3 +--
src/chrome/locale/pt/torbutton.dtd | 3 +--
src/chrome/locale/ru/torbutton.dtd | 3 +--
src/chrome/locale/sv/torbutton.dtd | 3 +--
src/chrome/locale/tr/torbutton.dtd | 3 +--
src/chrome/locale/vi/torbutton.dtd | 3 +--
src/chrome/locale/zh-CN/torbutton.dtd | 3 +--
17 files changed, 21 insertions(+), 38 deletions(-)
diff --git a/src/chrome/locale/ar/torbutton.dtd b/src/chrome/locale/ar/torbutton.dtd
index feb367b..b0a1d30 100644
--- a/src/chrome/locale/ar/torbutton.dtd
+++ b/src/chrome/locale/ar/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "هذا يوفر أفضل خبرة للإستخدام">
<!ENTITY torbutton.prefs.sec_low_desc "طبقاً لهذا المستوى من إعدادات الأمان سوف يتم تفعيل كل صفات المتصفح">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "آلية تجسيد الخط SVG OpenType معطلة.">
-<!ENTITY torbutton.prefs.sec_med_low "شبه منخفض">
<!ENTITY torbutton.prefs.sec_gen_desc "طبقاً لهذا المستوى من إعدادات الأمان سوف يتم تفعيل هذه التغيرات ( لمزيد من التفاصيل مرر الفأرة فوق)">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video and audio media become click-to-play via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "في بعض المواقع من الممكن أن تحتاج لإستخدام زر تعطيل السكريبتات في شرط الأدوات لتفعل المحتويات المرئية.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "سكربت في بعض المواقع قد تعمل بشكل بطيئ">
<!ENTITY torbutton.prefs.sec_mathml_desc "بعض الآليات لعرض معادلات رياضية معطلة.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML is disabled.">
-<!ENTITY torbutton.prefs.sec_med_high "شبه عالٍ">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "في المواقع التي تشغل جافا سكريبت، يكون تطوير الأداء معطل.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "بعض ميزات إظهار الخطوط معطلة ">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "آلية تجسيد الخط Graphite معطلة.">
diff --git a/src/chrome/locale/de/torbutton.dtd b/src/chrome/locale/de/torbutton.dtd
index 4cc42e9..ee52349 100644
--- a/src/chrome/locale/de/torbutton.dtd
+++ b/src/chrome/locale/de/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Dies liefert die am meisten nutzbaren Erfahrungen.">
<!ENTITY torbutton.prefs.sec_low_desc "Auf dieser Sicherheitsstufe sind alle Browserfunktionen aktiviert.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Der SVG-OpenType-Schriftdarstellungsvorgang ist deaktiviert.">
-<!ENTITY torbutton.prefs.sec_med_low "Unteres Mittel">
<!ENTITY torbutton.prefs.sec_gen_desc "Auf dieser Sicherheitsstufe gelten die folgenden Änderungen (für weitere Details mit der Maus überfahren):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5-Video- und Audiomedien werden per Click-to-Play über NoScript abspielbar.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Auf manchen Webseiten müssen Sie möglicherweise die NoScript-Schaltfläche in der Werkzeugleiste verwenden, um diese Medienobjekte zu aktivieren.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts können auf manchen Seiten langsamer laufen.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Manche Vorgänge zur Anzeige von mathematischen Gleichungen sind deaktiviert.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML ist deaktiviert.">
-<!ENTITY torbutton.prefs.sec_med_high "Oberes Mittel">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "Auf Seiten wo JavaScript aktiviert ist, sind Leistungsoptimierungen deaktiviert.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Einige Schriftabbildungseigenschaften sind deaktiviert.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Der Graphite-Schriftdarstellungsvorgang ist deaktiviert.">
diff --git a/src/chrome/locale/es/torbutton.dtd b/src/chrome/locale/es/torbutton.dtd
index fad96e0..74b9e2e 100644
--- a/src/chrome/locale/es/torbutton.dtd
+++ b/src/chrome/locale/es/torbutton.dtd
@@ -39,7 +39,6 @@ Mantenga marcada esta casilla para ocultar a los sitios web detalles que pudiera
<!ENTITY torbutton.prefs.sec_low_usable_desc "Esto proporciona la mejor experiencia de usabilidad.">
<!ENTITY torbutton.prefs.sec_low_desc "En este nivel de seguridad, todas las funciones del navegador están habilitadas.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "El mecanismo de representación de fuentes SVG OpenType está deshabilitado.">
-<!ENTITY torbutton.prefs.sec_med_low "Medio-Bajo">
<!ENTITY torbutton.prefs.sec_gen_desc "En este nivel de seguridad, se aplican los siguientes cambios (ratón encima para detalles):">
<!ENTITY torbutton.prefs.sec_html5_desc "Los medios de vídeo y audio HTML5 se vuelven tipo clic-para-reproducir mediante NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "En algunos sitios, podría necesitar usar el botón NoScript de barra de herramientas para habilitar estos objetos de medios.">
@@ -49,7 +48,7 @@ Mantenga marcada esta casilla para ocultar a los sitios web detalles que pudiera
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Los scripts en algunos sitios puede que se ejecuten más lentamente.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Algunos mecanismos de representación de ecuaciones matemáticas están deshabilitados.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML está deshabilitado.">
-<!ENTITY torbutton.prefs.sec_med_high "Medio-Alto">
+<!ENTITY torbutton.prefs.sec_medium "Medio">
<!ENTITY torbutton.prefs.sec_all_jit_desc "En sitios donde JavaScript esté habilitado, las optimizaciones de rendimiento están deshabilitadas.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Algunas características de representación de fuentes están deshabilitadas.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "El mecanismo de representación de fuentes Graphite está deshabilitado.">
diff --git a/src/chrome/locale/eu/torbutton.dtd b/src/chrome/locale/eu/torbutton.dtd
index 3a73531..9ef6b04 100644
--- a/src/chrome/locale/eu/torbutton.dtd
+++ b/src/chrome/locale/eu/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "This provides the most usable experience.">
<!ENTITY torbutton.prefs.sec_low_desc "At this security level, all browser features are enabled.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "The SVG OpenType font rendering mechanism is disabled.">
-<!ENTITY torbutton.prefs.sec_med_low "Ertaina-baxua">
<!ENTITY torbutton.prefs.sec_gen_desc "At this security level, the following changes apply (mouseover for details):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video and audio media become click-to-play via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "On some sites, you might need to use the NoScript toolbar button to enable these media objects.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts on some sites may run slower.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML ezgaituta dago.">
-<!ENTITY torbutton.prefs.sec_med_high "Ertaina-altua">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Some font rendering features are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
diff --git a/src/chrome/locale/fa/torbutton.dtd b/src/chrome/locale/fa/torbutton.dtd
index b7edae6..ad234cb 100644
--- a/src/chrome/locale/fa/torbutton.dtd
+++ b/src/chrome/locale/fa/torbutton.dtd
@@ -6,14 +6,14 @@
<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "تنظیمات شبکه تور">
<!ENTITY torbutton.context_menu.networksettings.key "N">
-<!ENTITY torbutton.context_menu.downloadUpdate "بررسی بروز رسانی Tor Browser ...">
+<!ENTITY torbutton.context_menu.downloadUpdate "بررسی بروز رسانی مرورگر تور">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "حفاظت کوکی ها...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "جهت شروع دكمه تُرکليک کنيد">
-<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
-<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
-<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
+<!ENTITY torbutton.prefs.security_settings "تنظیمات امنیتی مرورگر تور">
+<!ENTITY torbutton.prefs.restore_defaults "بازگردانی تنظیمات اولیه">
+<!ENTITY torbutton.prefs.custom_warning "تنظیمات سفارشی شما در مرورگر منجر به تغییرات غیر معمول در تنظیمات امنیتی شده است.برای امن نگه داشتن حریم خصوصی خود ما پیشنهاد میکنیم یکی از تنظیمات پیشفرض امنیتی را انتخاب کنید. ">
<!ENTITY torbutton.cookiedialog.title "مديريت حفاظت کلوچکها">
<!ENTITY torbutton.cookiedialog.lockCol "حفاظت شده">
<!ENTITY torbutton.cookiedialog.domainCol "ميزبان">
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "این فراهم می کند بیشترین تجربه قابل استفاده.">
<!ENTITY torbutton.prefs.sec_low_desc "در این سطح امنیتی، تمام ویژگی های مرورگر ها فعال است.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "مکانیسم رندر فونت SVG اپن تایپ غیر فعال است.">
-<!ENTITY torbutton.prefs.sec_med_low "متوسط - کم">
<!ENTITY torbutton.prefs.sec_gen_desc "در این سطح امنیتی، تغییرات زیر اعمال می شود (خلاصه شده برای جزئیات بیشتر):">
<!ENTITY torbutton.prefs.sec_html5_desc "صدا و تصویر HTML5 از طریق دکمه NoScript نوار ابزار به حالت -کلیک برای پخش- در می آید">
<!ENTITY torbutton.prefs.sec_html5_tooltip "در برخی سایت ها، ممکن است شما نیاز به استفاده از دکمه NoScript نوار ابزار برای فعال کردن این اشیاء رسانه داشته باشید.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "اسکریپت هل در برخی از سایت ها ممکن است آهسته تر اجرا شود.">
<!ENTITY torbutton.prefs.sec_mathml_desc "برخی مکانیسم ها نمایش معادلات ریاضی غیر فعال می باشد.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML غیر فعال است.">
-<!ENTITY torbutton.prefs.sec_med_high "متوسط - بالا">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "برخی از ویژگی های رندر فونت غیر فعال می باشد.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "مکانیسم گرافیت رندر فونت غیر فعال است.">
diff --git a/src/chrome/locale/fr/torbutton.dtd b/src/chrome/locale/fr/torbutton.dtd
index 26c9eb1..cf67f43 100644
--- a/src/chrome/locale/fr/torbutton.dtd
+++ b/src/chrome/locale/fr/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Ceci offre l'expérience la plus conviviale.">
<!ENTITY torbutton.prefs.sec_low_desc "À ce niveau de sécurité, toutes les fonctions du navigateur sont activées.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Le mécanisme de rendu de police SVG OpenType est désactivé.">
-<!ENTITY torbutton.prefs.sec_med_low "Moyen-bas">
<!ENTITY torbutton.prefs.sec_gen_desc "À ce niveau de sécurité, les changements suivants sont applicables (survolez avec la souris pour plus de détails ) :">
<!ENTITY torbutton.prefs.sec_html5_desc "Le contenu HTML5 vidéo et audio devient « cliquer pour lire » avec NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Pour certains sites, vous aurez peut-être à utiliser le bouton NoScript de la barre d'outils pour activer ces objets multimédias.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Les scripts pourraient être exécutés plus lentement sur certains sites.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Certains mécanismes d'affichage des équations mathématiques sont désactivés.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML est désactivé.">
-<!ENTITY torbutton.prefs.sec_med_high "Moyen-haut">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "Sur les sites où JavaScript est activé, les optimisations des performances sont désactivées.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Certaines fonctions de rendu de police sont désactivées.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Le mécanisme de rendu de police Graphite est désactivé.">
diff --git a/src/chrome/locale/it/torbutton.dtd b/src/chrome/locale/it/torbutton.dtd
index eb1090a..414cf11 100644
--- a/src/chrome/locale/it/torbutton.dtd
+++ b/src/chrome/locale/it/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Questo permette la migliore esperienza di usablità.">
<!ENTITY torbutton.prefs.sec_low_desc "A questo livello di sicurezza, tutte le features del browser sono abilitate.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Il meccanismo di rendering SVG OpenType è disabilitato.">
-<!ENTITY torbutton.prefs.sec_med_low "Medio-Basso">
<!ENTITY torbutton.prefs.sec_gen_desc "A questo livello di sicurezza, i seguenti cambiamenti si applicano a (passa sopra con il mouse per i dettagli):">
<!ENTITY torbutton.prefs.sec_html5_desc "I video e audio in HTML5 diventano click-to-play grazie a NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Su alcuni siti, potresti dover usare il pulsante toolbar di NoScript per attivare quei media.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Gli scripts su alcuni siti possono girare più lenti.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Alcuni meccanismi di visualizzazione di equazioni matematiche sono disabilitati.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML è disabilitato.">
-<!ENTITY torbutton.prefs.sec_med_high "Medio-Alto">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "Nei siti dove è attivato JavaScript le ottimizzazioni sono disabilitate">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Alcuni rendering dei font sono disabilitati.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Il meccanismo di rendering font Graphite è disabilitato.">
diff --git a/src/chrome/locale/ja/torbutton.dtd b/src/chrome/locale/ja/torbutton.dtd
index 6a82835..9a7704a 100644
--- a/src/chrome/locale/ja/torbutton.dtd
+++ b/src/chrome/locale/ja/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "最大の利便性を提供します。">
<!ENTITY torbutton.prefs.sec_low_desc "このレベルでは、全てのブラウザーの機能が有効化されます。">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "SVG OpenType フォントレンダリング機能は無効化されます。">
-<!ENTITY torbutton.prefs.sec_med_low "低中">
<!ENTITY torbutton.prefs.sec_gen_desc "このレベルでは、以下の変更が適用されます。(マウスを重ねると詳細を表示)">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 の映像と音楽は No-Script によりクリックするまで再生されません。">
<!ENTITY torbutton.prefs.sec_html5_tooltip "いくつかのサイトでは、メディアを有効にするために No-Script ツールバーを使う必要があります。">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "サイトによってはスクリプトの動作が遅くなります。">
<!ENTITY torbutton.prefs.sec_mathml_desc "数式を表示するためのいくつかの機能が無効化されます。">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML が無効化されます。">
-<!ENTITY torbutton.prefs.sec_med_high "高中">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "JavaScriptが有効になっているサイトで、パフォーマンスの最適化が無効になります。">
<!ENTITY torbutton.prefs.sec_font_rend_desc "いくつかのフォントレンダリング機能が無効化されます。">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Graphite フォントレンダリング機能は無効化されます。">
diff --git a/src/chrome/locale/ko/torbutton.dtd b/src/chrome/locale/ko/torbutton.dtd
index df64398..aa86374 100644
--- a/src/chrome/locale/ko/torbutton.dtd
+++ b/src/chrome/locale/ko/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "This provides the most usable experience.">
<!ENTITY torbutton.prefs.sec_low_desc "At this security level, all browser features are enabled.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "SVG 폰트 렌터링 체계가 비활성화되었습니다.">
-<!ENTITY torbutton.prefs.sec_med_low "중간 낮음">
<!ENTITY torbutton.prefs.sec_gen_desc "At this security level, the following changes apply (mouseover for details):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video and audio media become click-to-play via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "On some sites, you might need to use the NoScript toolbar button to enable these media objects.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "일부 사이트의 스크립트 동작이 느려질 수 있습니다.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML가 비활성화 되었습니다.">
-<!ENTITY torbutton.prefs.sec_med_high "중간 높음">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "일부 폰트의 렌터링이 비활성화되었습니다.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
diff --git a/src/chrome/locale/nl/torbutton.dtd b/src/chrome/locale/nl/torbutton.dtd
index 79d0113..3b819a7 100644
--- a/src/chrome/locale/nl/torbutton.dtd
+++ b/src/chrome/locale/nl/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Dit biedt de meest bruikbare ervaring.">
<!ENTITY torbutton.prefs.sec_low_desc "Op dit beveiligingsniveau worden alle browserfuncties ingeschakeld.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Het SVG OpenType-mechanisme voor weergave van lettertypen is uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_med_low "Medium-laag">
<!ENTITY torbutton.prefs.sec_gen_desc "Op dit beveiligingsniveau gelden de volgende wijzigingen (beweeg de muis over de items voor meer informatie):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5-video en -audio worden klik-om-af-te-spelen via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Op sommige sites moet je de NoScript-werkbalkknop gebruiken om deze media-objecten in te schakelen.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts kunnen op sommige websites trager zijn.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Sommige mechanismen voor het weergeven van wiskundige vergelijkingen zijn uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML is uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_med_high "Medium-hoog">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "Op sites die JavaScript toestaan zijn de prestatieverbeteringen uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Sommige functies voor weergave van lettertypen zijn uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Het Graphite-weergavemechanisme voor lettertypen is uitgeschakeld.">
diff --git a/src/chrome/locale/pl/torbutton.dtd b/src/chrome/locale/pl/torbutton.dtd
index fff7438..d1a76fd 100644
--- a/src/chrome/locale/pl/torbutton.dtd
+++ b/src/chrome/locale/pl/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "To zapewnia najbardziej przyjazdne dla użytkownika ustawienia.">
<!ENTITY torbutton.prefs.sec_low_desc "Na tym poziomie zabezpieczeń, wszystkie funkcje przeglądarki są włączone.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Mechanizm SVG OpenType renderowania czcionek jest wyłączony.">
-<!ENTITY torbutton.prefs.sec_med_low "Średni-Niski">
<!ENTITY torbutton.prefs.sec_gen_desc "Na tym poziomie bezpieczeństwa, stosuje się następujące zmiany (najedź kursorem po więcej szczegółów): ">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video oraz audio będą dostępne jako 'kliknij-aby-otworzyć' przez NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Na niektórych stronach internetowych będziesz musiał użyć przycisku NoScript znajdującym się w pasku narzędzi, aby włączyć dane obiekty medialne.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Skrypty na niektórych stronach mogą działać wolniej.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Niektóre mechanizmy wyświetlania równań matematycznych są wyłączone.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML jest wyłączony.">
-<!ENTITY torbutton.prefs.sec_med_high "Średni-Wysoki">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "Na stronach, na których włączony jest JavaScript optymalizacje wydajności są wyłączone.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Niektóre funkcje renderingu czcionki są wyłączone.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Mechanizm Graphite do renderowania czcionki jest wyłączony.">
diff --git a/src/chrome/locale/pt/torbutton.dtd b/src/chrome/locale/pt/torbutton.dtd
index f0bd467..582164d 100644
--- a/src/chrome/locale/pt/torbutton.dtd
+++ b/src/chrome/locale/pt/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Isto proporciona a melhor experiência usável.">
<!ENTITY torbutton.prefs.sec_low_desc "Neste nível de segurança, as funções do navegador estão ativadas.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "O mecanismo de renderização do tipo de letra OpenType SVG está desativado.">
-<!ENTITY torbutton.prefs.sec_med_low "Médio-Baixo">
<!ENTITY torbutton.prefs.sec_gen_desc "Neste nível de segurança, aplicam-se as seguintes alterações ('rato sobre' para os detalhes).">
<!ENTITY torbutton.prefs.sec_html5_desc "A multimédia de áudio e vídeo HTML5 torna-se clique-par-reproduzir via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Em alguns sites, poderá precisar de utilizar o botão da barra de ferramentas NoScript para ativar estes objetos de multimédia.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Os scripts em alguns sites poderão funcionar muito lentamente.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Alguns mecanismos de visualização de equações matemáticas estão desativados.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML está desativado.">
-<!ENTITY torbutton.prefs.sec_med_high "Médio-Alto">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Algumas funções de renderização do tipo de letra estão desativadas.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "O mecanismo de renderização do tipo de letra Graphite está desativado.">
diff --git a/src/chrome/locale/ru/torbutton.dtd b/src/chrome/locale/ru/torbutton.dtd
index c5c989a..17b9cef 100644
--- a/src/chrome/locale/ru/torbutton.dtd
+++ b/src/chrome/locale/ru/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Наиболее простой вариант использования.">
<!ENTITY torbutton.prefs.sec_low_desc "На этом уровне безопасности, все функции браузера включены.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Механизм визуализации шрифта SVG OpenType отключен.">
-<!ENTITY torbutton.prefs.sec_med_low "Средний">
<!ENTITY torbutton.prefs.sec_gen_desc "На этом уровне безопасности, следующие изменения применяются (при наведении курсора мыши):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 видео и аудио воспроизводятся только после щелчка благодаря NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "На некоторых сайтах, вам может потребоваться использовать кнопку NoScript панели инструментов, чтобы включить эти мультимедийные объекты.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Сценарии на некоторых сайтах могут работать медленнее.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Некоторые механизмы отображения математических уравнений отключены.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML отключен.">
-<!ENTITY torbutton.prefs.sec_med_high "Умеренно высокий">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "На сайтах с применением JavaScript оптимизация отключена.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Некоторые функции отрисовки шрифтов отключены.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Механизм визуализации шрифта Graphite отключен.">
diff --git a/src/chrome/locale/sv/torbutton.dtd b/src/chrome/locale/sv/torbutton.dtd
index 7452ae3..4560ccc 100644
--- a/src/chrome/locale/sv/torbutton.dtd
+++ b/src/chrome/locale/sv/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Detta skapar den mest användbara upplevelsen.">
<!ENTITY torbutton.prefs.sec_low_desc "På den här säkerhetsnivån är webbläsarens alla funktioner aktiverade.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Användande av SVG OpenType-typsnitt är avaktiverad.">
-<!ENTITY torbutton.prefs.sec_med_low "Medium-låg">
<!ENTITY torbutton.prefs.sec_gen_desc "På den här säkerhetsnivån gäller följande förändringar (håll markören över för detaljer):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 ljud- och bildmedia blir click-to-play via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "På vissa webbsidor kan du vara tvungen att aktivera dessa mediatyper via NoScript-knappen.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Skript på vissa webbsidor kan gå långsammare.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Vissa funktioner för att visa matematiska formler är avaktiverade.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML är inaktiverat.">
-<!ENTITY torbutton.prefs.sec_med_high "Medium-hög">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "På sidor där JavaScript är aktiverat, är prestandaoptimeringar inaktiverade.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Vissa funktioner för gestaltning av typsnitt är avaktiverad.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Användande av Graphite-typsnitt är avaktiverad.">
diff --git a/src/chrome/locale/tr/torbutton.dtd b/src/chrome/locale/tr/torbutton.dtd
index 0edfc51..cca8d92 100644
--- a/src/chrome/locale/tr/torbutton.dtd
+++ b/src/chrome/locale/tr/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Bu seçenek en kullanılabilir deneyimi sunar.">
<!ENTITY torbutton.prefs.sec_low_desc "Bu güvenlik düzeyinde tüm tarayıcı özellikleri kullanılabilir.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "SVG OpenType yazı tipi görüntüleme düzeneği devre dışı bırakılır.">
-<!ENTITY torbutton.prefs.sec_med_low "Orta-Düşük">
<!ENTITY torbutton.prefs.sec_gen_desc "Bu güvenlik düzeyinde, şu değişiklikler uygulanır (ayrıntılar için fare ile üzerlerinde dolaşın):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 görüntü ve ses ortamı NoScript aracılığıyla tıklayıp oynat şekline dönüştürülür.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Bazı sitelerde bu ortam nesnelerini etkinleştirebilmek için NoScript düğmesinin kullanılması gerekebilir.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Bazı sitelerde betikler daha yavaş çalışabilir.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Matematik denklemlerini görüntüleyen bazı düzenekler devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML devre dışı bırakılır.">
-<!ENTITY torbutton.prefs.sec_med_high "Orta-Yüksek">
+<!ENTITY torbutton.prefs.sec_medium "Orta">
<!ENTITY torbutton.prefs.sec_all_jit_desc "JavaScript kullanılan web sitelerinde başarım iyileştirmeleri devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Bazı yazı tipi işleme özellikleri devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Graphite yazı tipi görüntüleme düzeneği devre dışı bırakılır.">
diff --git a/src/chrome/locale/vi/torbutton.dtd b/src/chrome/locale/vi/torbutton.dtd
index 04ec66b..c1b4a0a 100644
--- a/src/chrome/locale/vi/torbutton.dtd
+++ b/src/chrome/locale/vi/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "Điều này cung cấp trải nghiệm tiện lợi nhất">
<!ENTITY torbutton.prefs.sec_low_desc "Ở mức này, tất cả tính năng của trình duyệt đều được kích hoạt.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Cơ chế kết xuất font SVG OpenType bị vô hiệu.">
-<!ENTITY torbutton.prefs.sec_med_low "Trung bình-Thấp">
<!ENTITY torbutton.prefs.sec_gen_desc "Ở mức bảo mật này, những thay đổi sau sẽ được áp dụng (rê chuột vào để xem chi tiết):">
<!ENTITY torbutton.prefs.sec_html5_desc "Video và âm thanh truyền thông HTML5 có thể trở thành nhấp để phát qua NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Trên một số trang, có thể bạn cần phải dùng nút thanh công cụ NoScript để kích hoạt những đối tượng đa phương tiện này.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Những đoạn mã trên một số trang có thể chạy chậm hơn.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Một vài cơ chế hiển thị công thức toán học bị vô hiệu.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathMK bị vô hiệu">
-<!ENTITY torbutton.prefs.sec_med_high "Trung bình-Cao">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "Trên những trang nơi JavaScript được cho phép, việc tối ưu hóa hiệu suất bị vô hiệu.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Một vài chức năng tô vẽ phông chữ bị vô hiệu.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Cơ chế tô vẽ phông chữ Graphite bị vô hiệu.">
diff --git a/src/chrome/locale/zh-CN/torbutton.dtd b/src/chrome/locale/zh-CN/torbutton.dtd
index d435c6f..86c18bf 100644
--- a/src/chrome/locale/zh-CN/torbutton.dtd
+++ b/src/chrome/locale/zh-CN/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "该选项可提供最佳的用户体验。">
<!ENTITY torbutton.prefs.sec_low_desc "该安全级别将启用所有浏览器功能。">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "禁用 SVG OpenType 字体渲染功能。">
-<!ENTITY torbutton.prefs.sec_med_low "中低">
<!ENTITY torbutton.prefs.sec_gen_desc "在这个安全级别,下列更改将会生效(鼠标悬停查看细节):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 视频和音频需通过 NoScript 点击播放。">
<!ENTITY torbutton.prefs.sec_html5_tooltip "在某些网站,可通过 NoScript 工具栏按钮播放这些媒体。">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "一些网站脚本可能会暂缓执行。">
<!ENTITY torbutton.prefs.sec_mathml_desc "禁用数学方程式的某些显示机制。">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "禁用 MathML。">
-<!ENTITY torbutton.prefs.sec_med_high "中高">
+<!ENTITY torbutton.prefs.sec_medium "中等">
<!ENTITY torbutton.prefs.sec_all_jit_desc "在开启 JavaScript 的站点上禁用性能优化。">
<!ENTITY torbutton.prefs.sec_font_rend_desc "禁用某些字体渲染功能。">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "禁用 Graphite 字体渲染。">
1
0

[torbutton/master] Bug 19459: Remove code that sizes new windows (moved to tor-browser.git)
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit 105b155787944799a38ad2c48f0bd015b1fa032e
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Wed Aug 31 21:09:05 2016 -0700
Bug 19459: Remove code that sizes new windows (moved to tor-browser.git)
---
src/chrome/content/content-sizer.js | 8 +-
src/chrome/content/torbutton.js | 158 +-------------------------------
src/defaults/preferences/preferences.js | 1 -
src/modules/utils.js | 20 +++-
4 files changed, 31 insertions(+), 156 deletions(-)
diff --git a/src/chrome/content/content-sizer.js b/src/chrome/content/content-sizer.js
index e627c3c..ded06d7 100644
--- a/src/chrome/content/content-sizer.js
+++ b/src/chrome/content/content-sizer.js
@@ -501,7 +501,13 @@ let quantizeBrowserSizeMain = function (window, xStep, yStep) {
window.addEventListener("unload", unbind, true);
};
-quantizeBrowserSizeMain(window, xStep, yStep);
+// Only start quantizing once the window has become visible.
+var stopObserving = observe("xul-window-visible", function () {
+ if (Services.wm.getMostRecentWindow("navigator:browser") === window) {
+ quantizeBrowserSizeMain(window, xStep, yStep);
+ stopObserving();
+ }
+});
// end of quantizeBrowserSize definition
};
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index 60f12d6..53e5479 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -17,8 +17,6 @@ const k_tb_last_browser_version_pref = "extensions.torbutton.lastBrowserVersion"
const k_tb_browser_update_needed_pref = "extensions.torbutton.updateNeeded";
const k_tb_last_update_check_pref = "extensions.torbutton.lastUpdateCheck";
const k_tb_tor_check_failed_topic = "Torbutton:TorCheckFailed";
-const k_tb_tor_resize_warn_pref =
- "extensions.torbutton.startup_resize_period"
var m_tb_prefs = Services.prefs;
@@ -399,6 +397,8 @@ function torbutton_init() {
m_tb_control_port, m_tb_control_pass,
"extensions.torbutton.display_circuit");
+ quantizeBrowserSize(window, 100, 100);
+
torbutton_log(3, 'init completed');
}
@@ -2210,105 +2210,13 @@ var torbutton_resizelistener =
var progress =
Components.classes["@mozilla.org/docloaderservice;1"].
getService(Components.interfaces.nsIWebProgress);
- var win = getBrowser().contentWindow,
- container = getBrowser().parentElement;
+ var win = getBrowser().contentWindow;
if (!win || typeof(win) == "undefined") {
torbutton_log(5, "No initial browser content window?");
progress.removeProgressListener(this);
return;
}
- // We need to set the inner width to an initial value because it has none
- // at this point... Choosing "300" as this works even on Windows
- // reliably.
- win.innerWidth = 300;
- win.innerHeight = 300;
-
- var screenMan = Components.classes["@mozilla.org/gfx/screenmanager;1"].
- getService(Components.interfaces.nsIScreenManager);
- var junk = {}, availWidth = {}, availHeight = {};
- screenMan.primaryScreen.GetAvailRect(junk, junk, availWidth, availHeight);
-
- torbutton_log(3, "About to resize window: " +
- window.outerWidth + "x" + window.outerHeight +
- " inner: " + win.innerWidth + "x" + win.innerHeight +
- " in state " + window.windowState +
- " Available: " + availWidth.value + "x" +
- availHeight.value);
-
- var diff_width = window.outerWidth - win.innerWidth;
- var diff_height = window.outerHeight - win.innerHeight;
- var delta_fix = 0;
-
- // The following block tries to cope with funny corner cases where the
- // title bar is not included in window.outerHeight. What could happen in
- // this case? Well, assume the difference between window.outerHeight and
- // win.innerHeight is 39. And lets further assume the available height is
- // 725x539. If we resize the window in this case we get 600x500 for the
- // inner window. And the outer window has a height of 539 *plus* the
- // height of the titlebar (as it occupies some screen space at least
- // after resizing) which probably leads to parts of the browser being not
- // visible.
- if (window.outerHeight == window.innerHeight) {
- // XXX: Let's assume a reasonable safety margin.
- // |delta_fix = Math.floor(window.mozInnerScreenY) - window.screenY;|
- // is not working at this stage of the browser start-up. Although it
- // would give us slightly better values. But calling it later makes
- // the resizing visible even on fast computers which is bad for UX.
- delta_fix = Math.floor(diff_height / 2);
- }
-
- // Check the DPI value and take it into acctount later when calculating
- // the max* values.
- var dpi = m_tb_domWindowUtils.screenPixelsPerCSSPixel;
-
- // We can't use screen resolution here as it does not account for e.g.
- // taskbars. We can't use window.screen.avail* either as it does not
- // report correct values on some platforms when used at this stage in the
- // startup process. Therefore, we resort to nsIScreenManager.
- // XXX: Note though, there are probably still some OS/window manager
- // configurations where this approach is not working. E.g. on a Debian
- // with XFCE the available height is the same as the screen height.
- // This is said to happen as well on Windows with Aero:
- // https://stackoverflow.com/questions/3044230/
- // difference-between-screen-availheight-and-window-height
- var maxHeight = Math.floor(availHeight.value / dpi) -
- (diff_height + delta_fix);
- var maxWidth = Math.floor(availWidth.value / dpi) - diff_width ;
-
- var width;
- var height;
-
- // Allow the user to overwrite the Torbutton logic in case it is still
- // wrong when resizing the window.
- try {
- width = m_tb_prefs.getIntPref("extensions.torbutton.window.innerWidth");
- } catch(e) {
- let cappedWidth = m_tb_prefs.getIntPref("extensions.torbutton.window.maxWidth");
- if (maxWidth > cappedWidth) {
- maxWidth = cappedWidth;
- }
- width = Math.floor(maxWidth/200.0)*200;
- }
-
- try {
- height = m_tb_prefs.getIntPref("extensions.torbutton.window.innerHeight");
- } catch(e) {
- let cappedHeight = m_tb_prefs.getIntPref("extensions.torbutton.window.maxHeight");
- if (maxHeight > cappedHeight) {
- maxHeight = cappedHeight;
- }
- height = Math.floor(maxHeight/100.0)*100;
- }
-
- let resizeInnerWindowTo = function (width, height) {
- window.resizeBy(width - win.innerWidth,
- height - win.innerHeight);
- torbutton_log(3, "Resized new window from: " + container.clientWidth + "x" +
- container.clientHeight + " to " + width + "x" + height +
- " in state " + window.windowState);
- }
-
m_tb_resize_handler = function() {
if (window.windowState === 1) {
if (m_tb_prefs.
@@ -2361,25 +2269,8 @@ var torbutton_resizelistener =
priority, buttons);
return;
}
- // This is for some weird OS-specific behavior on start-up where,
- // depending on the available screen size, the OS thinks it has to
- // maximize the window. We don't want to do that AND don't want to
- // show the user our notification in this case.
- if (m_tb_prefs.
- getBoolPref(k_tb_tor_resize_warn_pref)) {
- window.addEventListener("resize",
- function() {
- resizeInnerWindowTo(width, height);
- var calling_function = arguments.callee;
- setTimeout(function() {
- torbutton_log(3, "Removing resize listener..");
- window.removeEventListener("resize",
- calling_function, false);
- }, 1000);
- }, false);
- }
}
- };
+ }; // m_tb_resize_handler
// We need to handle OSes that auto-maximize windows depending on user
// settings and/or screen resolution in the start-up phase and users that
@@ -2401,50 +2292,11 @@ var torbutton_resizelistener =
// the window triggers more than one resize event the first being not the
// one we need. Thus we can't remove the listener after the first resize
// event got fired. Thus, we have the rather klunky setTimeout() call.
- m_tb_prefs.setBoolPref(k_tb_tor_resize_warn_pref, true);
window.addEventListener("sizemodechange", m_tb_resize_handler, false);
- // This is fun. any attempt to directly set the inner window actually
- // resizes the outer width to that value instead. Must use resizeBy()
- // instead of assignment or resizeTo()
- resizeInnerWindowTo(width, height);
-
- // Resizing within this progress listener does not always work as overlays
- // of other extensions might still influence the height/width of the
- // chrome and therefore the height/width of the content window. Doing a
- // fallback resize with setTimeout(0) from this progess listener does not
- // work on some machines (probably due to race conditions which are all
- // over the place). Thus we need a point later in the start-up process
- // where we can do this... Please welcome the mutation observer.
- let mut_target = document.getElementById("main-window");
- let mut_observer = new MutationObserver(
- function(mutations) {
- mutations.forEach(
- function(mutation) {
- setTimeout(function() {
- resizeInnerWindowTo(width, height);
- quantizeBrowserSize(window, 100, 100);
- // OS-specific window maximization on start-up should
- // be done by now. Disable the respective preference
- // to make sure the user is seeing our notification.
- m_tb_prefs.setBoolPref(k_tb_tor_resize_warn_pref,
- false);
- }, 0);
- mut_observer.disconnect();
- }
- );
- }
- );
- // Configuration of the observer. Looking at added nodes is enough as
- // DevTools related code is manipulating the DOM which we can capture.
- // From that on we can start our fallback resizing.
- let mut_config = { attributes: false, childList: true,
- characterData: false };
- mut_observer.observe(mut_target, mut_config);
-
progress.removeProgressListener(this);
}
- },
+ }, // onStateChange
onProgressChange: function(aProgress, aRequest, curSelfProgress,
maxSelfProgress, curTotalProgress,
diff --git a/src/defaults/preferences/preferences.js b/src/defaults/preferences/preferences.js
index 3284bde..ec2cdbc 100644
--- a/src/defaults/preferences/preferences.js
+++ b/src/defaults/preferences/preferences.js
@@ -26,7 +26,6 @@ pref("extensions.torbutton.prompted_language",false);
// See #7255 for details. We display the warning three times to make sure the
// user did not click on it by accident.
pref("extensions.torbutton.maximize_warnings_remaining", 0);
-pref("extensions.torbutton.startup_resize_period", true);
// Security prefs:
pref("extensions.torbutton.cookie_protections",true);
diff --git a/src/modules/utils.js b/src/modules/utils.js
index 507f008..fa4405e 100644
--- a/src/modules/utils.js
+++ b/src/modules/utils.js
@@ -48,6 +48,24 @@ var bindPref = function (prefName, prefHandler, init = false) {
var bindPrefAndInit = (prefName, prefHandler) =>
bindPref(prefName, prefHandler, true);
+// ## Observers
+
+// __observe(topic, callback)__.
+// Observe the given topic. When notification of that topic
+// occurs, calls callback(subject, data). Returns a zero-arg
+// function that stops observing.
+var observe = function (topic, callback) {
+ let observer = {
+ observe: function (aSubject, aTopic, aData) {
+ if (topic === aTopic) {
+ callback(aSubject, aData);
+ }
+ },
+ };
+ Services.obs.addObserver(observer, topic, false);
+ return () => Services.obs.removeObserver(observer, topic);
+};
+
// ## Environment variables
// __env__.
@@ -183,4 +201,4 @@ var unescapeTorString = function(str) {
// Export utility functions for external use.
let EXPORTED_SYMBOLS = ["bindPref", "bindPrefAndInit", "getEnv", "getPrefValue",
- "showDialog", "unescapeTorString"];
+ "observe", "showDialog", "unescapeTorString"];
1
0

[tor-browser/tor-browser-45.5.0esr-6.5-1] fixup! Bug 19459: Size new windows to 1000x1000 or nearest 200x100
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit 9d8658aed5e5cf6a1ed4b8cdbf1fcaa96bb875c7
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Thu Nov 3 13:41:34 2016 -0700
fixup! Bug 19459: Size new windows to 1000x1000 or nearest 200x100
---
xpfe/appshell/nsXULWindow.cpp | 50 +++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 26 deletions(-)
diff --git a/xpfe/appshell/nsXULWindow.cpp b/xpfe/appshell/nsXULWindow.cpp
index c523e31..b0b1f52 100644
--- a/xpfe/appshell/nsXULWindow.cpp
+++ b/xpfe/appshell/nsXULWindow.cpp
@@ -1028,46 +1028,44 @@ NS_IMETHODIMP nsXULWindow::ResizeToRoundedDimensions()
int32_t availHeight = NSToIntRound(devicePerCSSPixels *
availHeightCSS); // device pixels
shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
- // Useful for debugging:
- //printf("\nscaling factor: %f\n", devicePerCSSPixels);
- //printf("window size: %d x %d\n", windowWidth, windowHeight);
- //printf("avail screen size: %d x %d\n", availWidth, availHeight);
- //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ /* Useful for debugging:
+ printf("\nscaling factor: %f\n", devicePerCSSPixels);
+ printf("window size: %d x %d\n", windowWidth, windowHeight);
+ printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ */
int32_t chromeWidth = windowWidth - contentWidth;
int32_t chromeHeight = windowHeight - contentHeight;
int maxInnerWidth = Preferences::GetInt("privacy.window.maxInnerWidth",
- INT_MAX);
+ 1000);
int maxInnerHeight = Preferences::GetInt("privacy.window.maxInnerHeight",
- INT_MAX);
+ 1000);
int32_t availForContentWidthCSS =
- std::min(maxInnerWidth,
- NSToIntRound((0.95 * availWidth - chromeWidth) /
- devicePerCSSPixels));
+ std::min(maxInnerWidth, NSToIntRound((0.95 * availWidth - chromeWidth) /
+ devicePerCSSPixels));
int32_t availForContentHeightCSS =
- std::min(maxInnerHeight,
- NSToIntRound((0.95 * availHeight - chromeHeight) /
- devicePerCSSPixels));
+ std::min(maxInnerHeight, NSToIntRound((0.95 * availHeight - chromeHeight) /
+ devicePerCSSPixels));
int32_t targetContentWidth =
NSToIntRound(devicePerCSSPixels *
- std::min(1000, availForContentWidthCSS -
- (availForContentWidthCSS % 200)));
+ (availForContentWidthCSS - (availForContentWidthCSS % 200)));
int32_t targetContentHeight =
NSToIntRound(devicePerCSSPixels *
- std::min(1000, availForContentHeightCSS -
- (availForContentHeightCSS % 100)));
+ (availForContentHeightCSS - (availForContentHeightCSS % 100)));
SizeShellTo(mPrimaryContentShell,
targetContentWidth, targetContentHeight);
mIgnoreXULSize = true;
mIgnoreXULSizeMode = true;
- // Useful for debugging:
- //printf("target content size: %d, %d\n",
- // targetContentWidth, targetContentHeight);
- //GetSize(&windowWidth, &windowHeight);
- //GetAvailScreenSize(&availWidth, &availHeight);
- //shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
- //printf("\nwindow size: %d x %d\n", windowWidth, windowHeight);
- //printf("avail screen size: %d x %d\n", availWidth, availHeight);
- //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ /* Useful for debugging:
+ printf("target content size: %d, %d\n",
+ targetContentWidth, targetContentHeight);
+ GetSize(&windowWidth, &windowHeight);
+ GetAvailScreenSize(&availWidth, &availHeight);
+ shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ printf("\nwindow size: %d x %d\n", windowWidth, windowHeight);
+ printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ */
return NS_OK;
}
1
0

[tor-browser/tor-browser-45.5.0esr-6.5-1] Bug 19459: Size new windows to 1000x1000 or nearest 200x100
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit c8724d473603d63af82b1cf01d22dd5f7e4a8279
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Wed Oct 12 02:28:31 2016 +0000
Bug 19459: Size new windows to 1000x1000 or nearest 200x100
---
browser/base/content/browser.js | 10 +++-
xpfe/appshell/nsXULWindow.cpp | 108 ++++++++++++++++++++++++++++++++++------
xpfe/appshell/nsXULWindow.h | 2 +
3 files changed, 102 insertions(+), 18 deletions(-)
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 41d72ae..e5fb01c 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -999,8 +999,14 @@ var gBrowserInit = {
// have been initialized.
Services.obs.notifyObservers(window, "browser-window-before-show", "");
- // Set a sane starting width/height for all resolutions on new profiles.
- if (!document.documentElement.hasAttribute("width")) {
+ if (gPrefService.getBoolPref("privacy.resistFingerprinting")) {
+ // With fingerprinting resistance enabled, code elsewhere
+ // is going to generate rounded window dimensions. Make sure
+ // we don't have a maximized window that can interfere with
+ // that, as observed in http://trac.torproject.org/18175
+ document.documentElement.setAttribute("sizemode", "normal");
+ } else if (!document.documentElement.hasAttribute("width")) {
+ // Set a sane starting width/height for all resolutions on new profiles.
let defaultWidth;
let defaultHeight;
diff --git a/xpfe/appshell/nsXULWindow.cpp b/xpfe/appshell/nsXULWindow.cpp
index 99289a0..c523e31 100644
--- a/xpfe/appshell/nsXULWindow.cpp
+++ b/xpfe/appshell/nsXULWindow.cpp
@@ -1007,7 +1007,70 @@ NS_IMETHODIMP nsXULWindow::EnsureAuthPrompter()
}
return mAuthPrompter ? NS_OK : NS_ERROR_FAILURE;
}
-
+
+// Rounds window size to 1000x1000, or, if there isn't enough available
+// screen space, to a multiple of 200x100.
+NS_IMETHODIMP nsXULWindow::ResizeToRoundedDimensions()
+{
+ NS_ENSURE_STATE(mPrimaryContentShell);
+ nsCOMPtr<nsIBaseWindow> shellWindow(do_QueryInterface(mPrimaryContentShell));
+ NS_ENSURE_STATE(shellWindow);
+ int32_t windowWidth, windowHeight;
+ int32_t availWidthCSS, availHeightCSS;
+ int32_t contentWidth, contentHeight;
+ double devicePerCSSPixels = 1.0;
+ shellWindow->GetUnscaledDevicePixelsPerCSSPixel(&devicePerCSSPixels);
+ GetSize(&windowWidth, &windowHeight); // device pixels
+ NS_ENSURE_TRUE(GetAvailScreenSize(&availWidthCSS, &availHeightCSS),
+ NS_ERROR_FAILURE);
+ int32_t availWidth = NSToIntRound(devicePerCSSPixels *
+ availWidthCSS); // device pixels
+ int32_t availHeight = NSToIntRound(devicePerCSSPixels *
+ availHeightCSS); // device pixels
+ shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ // Useful for debugging:
+ //printf("\nscaling factor: %f\n", devicePerCSSPixels);
+ //printf("window size: %d x %d\n", windowWidth, windowHeight);
+ //printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ int32_t chromeWidth = windowWidth - contentWidth;
+ int32_t chromeHeight = windowHeight - contentHeight;
+ int maxInnerWidth = Preferences::GetInt("privacy.window.maxInnerWidth",
+ INT_MAX);
+ int maxInnerHeight = Preferences::GetInt("privacy.window.maxInnerHeight",
+ INT_MAX);
+ int32_t availForContentWidthCSS =
+ std::min(maxInnerWidth,
+ NSToIntRound((0.95 * availWidth - chromeWidth) /
+ devicePerCSSPixels));
+ int32_t availForContentHeightCSS =
+ std::min(maxInnerHeight,
+ NSToIntRound((0.95 * availHeight - chromeHeight) /
+ devicePerCSSPixels));
+ int32_t targetContentWidth =
+ NSToIntRound(devicePerCSSPixels *
+ std::min(1000, availForContentWidthCSS -
+ (availForContentWidthCSS % 200)));
+ int32_t targetContentHeight =
+ NSToIntRound(devicePerCSSPixels *
+ std::min(1000, availForContentHeightCSS -
+ (availForContentHeightCSS % 100)));
+ SizeShellTo(mPrimaryContentShell,
+ targetContentWidth, targetContentHeight);
+ mIgnoreXULSize = true;
+ mIgnoreXULSizeMode = true;
+ // Useful for debugging:
+ //printf("target content size: %d, %d\n",
+ // targetContentWidth, targetContentHeight);
+ //GetSize(&windowWidth, &windowHeight);
+ //GetAvailScreenSize(&availWidth, &availHeight);
+ //shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ //printf("\nwindow size: %d x %d\n", windowWidth, windowHeight);
+ //printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ return NS_OK;
+}
+
void nsXULWindow::OnChromeLoaded()
{
nsresult rv = EnsureContentTreeOwner();
@@ -1037,6 +1100,13 @@ void nsXULWindow::OnChromeLoaded()
}
}
+ // If we have a content browser object, and fingerprinting resistance
+ // is active, then set to a rounded size.
+ if (mPrimaryContentShell &&
+ Preferences::GetBool("privacy.resistFingerprinting", false)) {
+ ResizeToRoundedDimensions();
+ }
+
bool positionSet = !mIgnoreXULPosition;
nsCOMPtr<nsIXULWindow> parentWindow(do_QueryReferent(mParentWindow));
#if defined(XP_UNIX) && !defined(XP_MACOSX)
@@ -1137,6 +1207,21 @@ bool nsXULWindow::LoadPositionFromXUL()
return gotPosition;
}
+bool nsXULWindow::GetAvailScreenSize(int32_t* availWidth, int32_t* availHeight)
+{
+ nsCOMPtr<nsIDOMWindow> domWindow;
+ GetWindowDOMWindow(getter_AddRefs(domWindow));
+ if (nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(domWindow)) {
+ nsCOMPtr<nsIDOMScreen> screen = window->GetScreen();
+ if (screen) {
+ screen->GetAvailWidth(availWidth);
+ screen->GetAvailHeight(availHeight);
+ return true;
+ }
+ }
+ return false;
+}
+
bool nsXULWindow::LoadSizeFromXUL()
{
bool gotSize = false;
@@ -1181,21 +1266,12 @@ bool nsXULWindow::LoadSizeFromXUL()
}
if (gotSize) {
- // constrain to screen size
- nsCOMPtr<nsIDOMWindow> domWindow;
- GetWindowDOMWindow(getter_AddRefs(domWindow));
- if (nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(domWindow)) {
- nsCOMPtr<nsIDOMScreen> screen = window->GetScreen();
- if (screen) {
- int32_t screenWidth;
- int32_t screenHeight;
- screen->GetAvailWidth(&screenWidth);
- screen->GetAvailHeight(&screenHeight);
- if (specWidth > screenWidth)
- specWidth = screenWidth;
- if (specHeight > screenHeight)
- specHeight = screenHeight;
- }
+ int32_t screenWidth, screenHeight;
+ if (GetAvailScreenSize(&screenWidth, &screenHeight)) {
+ if (specWidth > screenWidth)
+ specWidth = screenWidth;
+ if (specHeight > screenHeight)
+ specHeight = screenHeight;
}
mIntrinsicallySized = false;
diff --git a/xpfe/appshell/nsXULWindow.h b/xpfe/appshell/nsXULWindow.h
index 882e614..f959e11 100644
--- a/xpfe/appshell/nsXULWindow.h
+++ b/xpfe/appshell/nsXULWindow.h
@@ -88,6 +88,7 @@ protected:
NS_IMETHOD EnsurePrimaryContentTreeOwner();
NS_IMETHOD EnsurePrompter();
NS_IMETHOD EnsureAuthPrompter();
+ NS_IMETHOD ResizeToRoundedDimensions();
void OnChromeLoaded();
void StaggerPosition(int32_t &aRequestedX, int32_t &aRequestedY,
@@ -120,6 +121,7 @@ protected:
void SetContentScrollbarVisibility(bool aVisible);
bool GetContentScrollbarVisibility();
void PersistentAttributesDirty(uint32_t aDirtyFlags);
+ bool GetAvailScreenSize(int32_t* availWidth, int32_t* availHeight);
nsChromeTreeOwner* mChromeTreeOwner;
nsContentTreeOwner* mContentTreeOwner;
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 19459: Size new windows to 1000x1000 or nearest 200x100
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit fa996469071a1442386f0313b278cf07ccb4d14c
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Wed Oct 12 02:28:31 2016 +0000
Bug 19459: Size new windows to 1000x1000 or nearest 200x100
---
browser/base/content/browser.js | 10 +++-
xpfe/appshell/nsXULWindow.cpp | 108 ++++++++++++++++++++++++++++++++++------
xpfe/appshell/nsXULWindow.h | 2 +
3 files changed, 102 insertions(+), 18 deletions(-)
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 41d72ae..e5fb01c 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -999,8 +999,14 @@ var gBrowserInit = {
// have been initialized.
Services.obs.notifyObservers(window, "browser-window-before-show", "");
- // Set a sane starting width/height for all resolutions on new profiles.
- if (!document.documentElement.hasAttribute("width")) {
+ if (gPrefService.getBoolPref("privacy.resistFingerprinting")) {
+ // With fingerprinting resistance enabled, code elsewhere
+ // is going to generate rounded window dimensions. Make sure
+ // we don't have a maximized window that can interfere with
+ // that, as observed in http://trac.torproject.org/18175
+ document.documentElement.setAttribute("sizemode", "normal");
+ } else if (!document.documentElement.hasAttribute("width")) {
+ // Set a sane starting width/height for all resolutions on new profiles.
let defaultWidth;
let defaultHeight;
diff --git a/xpfe/appshell/nsXULWindow.cpp b/xpfe/appshell/nsXULWindow.cpp
index 99289a0..c523e31 100644
--- a/xpfe/appshell/nsXULWindow.cpp
+++ b/xpfe/appshell/nsXULWindow.cpp
@@ -1007,7 +1007,70 @@ NS_IMETHODIMP nsXULWindow::EnsureAuthPrompter()
}
return mAuthPrompter ? NS_OK : NS_ERROR_FAILURE;
}
-
+
+// Rounds window size to 1000x1000, or, if there isn't enough available
+// screen space, to a multiple of 200x100.
+NS_IMETHODIMP nsXULWindow::ResizeToRoundedDimensions()
+{
+ NS_ENSURE_STATE(mPrimaryContentShell);
+ nsCOMPtr<nsIBaseWindow> shellWindow(do_QueryInterface(mPrimaryContentShell));
+ NS_ENSURE_STATE(shellWindow);
+ int32_t windowWidth, windowHeight;
+ int32_t availWidthCSS, availHeightCSS;
+ int32_t contentWidth, contentHeight;
+ double devicePerCSSPixels = 1.0;
+ shellWindow->GetUnscaledDevicePixelsPerCSSPixel(&devicePerCSSPixels);
+ GetSize(&windowWidth, &windowHeight); // device pixels
+ NS_ENSURE_TRUE(GetAvailScreenSize(&availWidthCSS, &availHeightCSS),
+ NS_ERROR_FAILURE);
+ int32_t availWidth = NSToIntRound(devicePerCSSPixels *
+ availWidthCSS); // device pixels
+ int32_t availHeight = NSToIntRound(devicePerCSSPixels *
+ availHeightCSS); // device pixels
+ shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ // Useful for debugging:
+ //printf("\nscaling factor: %f\n", devicePerCSSPixels);
+ //printf("window size: %d x %d\n", windowWidth, windowHeight);
+ //printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ int32_t chromeWidth = windowWidth - contentWidth;
+ int32_t chromeHeight = windowHeight - contentHeight;
+ int maxInnerWidth = Preferences::GetInt("privacy.window.maxInnerWidth",
+ INT_MAX);
+ int maxInnerHeight = Preferences::GetInt("privacy.window.maxInnerHeight",
+ INT_MAX);
+ int32_t availForContentWidthCSS =
+ std::min(maxInnerWidth,
+ NSToIntRound((0.95 * availWidth - chromeWidth) /
+ devicePerCSSPixels));
+ int32_t availForContentHeightCSS =
+ std::min(maxInnerHeight,
+ NSToIntRound((0.95 * availHeight - chromeHeight) /
+ devicePerCSSPixels));
+ int32_t targetContentWidth =
+ NSToIntRound(devicePerCSSPixels *
+ std::min(1000, availForContentWidthCSS -
+ (availForContentWidthCSS % 200)));
+ int32_t targetContentHeight =
+ NSToIntRound(devicePerCSSPixels *
+ std::min(1000, availForContentHeightCSS -
+ (availForContentHeightCSS % 100)));
+ SizeShellTo(mPrimaryContentShell,
+ targetContentWidth, targetContentHeight);
+ mIgnoreXULSize = true;
+ mIgnoreXULSizeMode = true;
+ // Useful for debugging:
+ //printf("target content size: %d, %d\n",
+ // targetContentWidth, targetContentHeight);
+ //GetSize(&windowWidth, &windowHeight);
+ //GetAvailScreenSize(&availWidth, &availHeight);
+ //shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ //printf("\nwindow size: %d x %d\n", windowWidth, windowHeight);
+ //printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ return NS_OK;
+}
+
void nsXULWindow::OnChromeLoaded()
{
nsresult rv = EnsureContentTreeOwner();
@@ -1037,6 +1100,13 @@ void nsXULWindow::OnChromeLoaded()
}
}
+ // If we have a content browser object, and fingerprinting resistance
+ // is active, then set to a rounded size.
+ if (mPrimaryContentShell &&
+ Preferences::GetBool("privacy.resistFingerprinting", false)) {
+ ResizeToRoundedDimensions();
+ }
+
bool positionSet = !mIgnoreXULPosition;
nsCOMPtr<nsIXULWindow> parentWindow(do_QueryReferent(mParentWindow));
#if defined(XP_UNIX) && !defined(XP_MACOSX)
@@ -1137,6 +1207,21 @@ bool nsXULWindow::LoadPositionFromXUL()
return gotPosition;
}
+bool nsXULWindow::GetAvailScreenSize(int32_t* availWidth, int32_t* availHeight)
+{
+ nsCOMPtr<nsIDOMWindow> domWindow;
+ GetWindowDOMWindow(getter_AddRefs(domWindow));
+ if (nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(domWindow)) {
+ nsCOMPtr<nsIDOMScreen> screen = window->GetScreen();
+ if (screen) {
+ screen->GetAvailWidth(availWidth);
+ screen->GetAvailHeight(availHeight);
+ return true;
+ }
+ }
+ return false;
+}
+
bool nsXULWindow::LoadSizeFromXUL()
{
bool gotSize = false;
@@ -1181,21 +1266,12 @@ bool nsXULWindow::LoadSizeFromXUL()
}
if (gotSize) {
- // constrain to screen size
- nsCOMPtr<nsIDOMWindow> domWindow;
- GetWindowDOMWindow(getter_AddRefs(domWindow));
- if (nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(domWindow)) {
- nsCOMPtr<nsIDOMScreen> screen = window->GetScreen();
- if (screen) {
- int32_t screenWidth;
- int32_t screenHeight;
- screen->GetAvailWidth(&screenWidth);
- screen->GetAvailHeight(&screenHeight);
- if (specWidth > screenWidth)
- specWidth = screenWidth;
- if (specHeight > screenHeight)
- specHeight = screenHeight;
- }
+ int32_t screenWidth, screenHeight;
+ if (GetAvailScreenSize(&screenWidth, &screenHeight)) {
+ if (specWidth > screenWidth)
+ specWidth = screenWidth;
+ if (specHeight > screenHeight)
+ specHeight = screenHeight;
}
mIntrinsicallySized = false;
diff --git a/xpfe/appshell/nsXULWindow.h b/xpfe/appshell/nsXULWindow.h
index 882e614..f959e11 100644
--- a/xpfe/appshell/nsXULWindow.h
+++ b/xpfe/appshell/nsXULWindow.h
@@ -88,6 +88,7 @@ protected:
NS_IMETHOD EnsurePrimaryContentTreeOwner();
NS_IMETHOD EnsurePrompter();
NS_IMETHOD EnsureAuthPrompter();
+ NS_IMETHOD ResizeToRoundedDimensions();
void OnChromeLoaded();
void StaggerPosition(int32_t &aRequestedX, int32_t &aRequestedY,
@@ -120,6 +121,7 @@ protected:
void SetContentScrollbarVisibility(bool aVisible);
bool GetContentScrollbarVisibility();
void PersistentAttributesDirty(uint32_t aDirtyFlags);
+ bool GetAvailScreenSize(int32_t* availWidth, int32_t* availHeight);
nsChromeTreeOwner* mChromeTreeOwner;
nsContentTreeOwner* mContentTreeOwner;
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] fixup! Bug 19459: Size new windows to 1000x1000 or nearest 200x100
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit f768cdd414cd3900f6927550c1a6eccb42cad05a
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Thu Nov 3 13:41:34 2016 -0700
fixup! Bug 19459: Size new windows to 1000x1000 or nearest 200x100
---
xpfe/appshell/nsXULWindow.cpp | 50 +++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 26 deletions(-)
diff --git a/xpfe/appshell/nsXULWindow.cpp b/xpfe/appshell/nsXULWindow.cpp
index c523e31..b0b1f52 100644
--- a/xpfe/appshell/nsXULWindow.cpp
+++ b/xpfe/appshell/nsXULWindow.cpp
@@ -1028,46 +1028,44 @@ NS_IMETHODIMP nsXULWindow::ResizeToRoundedDimensions()
int32_t availHeight = NSToIntRound(devicePerCSSPixels *
availHeightCSS); // device pixels
shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
- // Useful for debugging:
- //printf("\nscaling factor: %f\n", devicePerCSSPixels);
- //printf("window size: %d x %d\n", windowWidth, windowHeight);
- //printf("avail screen size: %d x %d\n", availWidth, availHeight);
- //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ /* Useful for debugging:
+ printf("\nscaling factor: %f\n", devicePerCSSPixels);
+ printf("window size: %d x %d\n", windowWidth, windowHeight);
+ printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ */
int32_t chromeWidth = windowWidth - contentWidth;
int32_t chromeHeight = windowHeight - contentHeight;
int maxInnerWidth = Preferences::GetInt("privacy.window.maxInnerWidth",
- INT_MAX);
+ 1000);
int maxInnerHeight = Preferences::GetInt("privacy.window.maxInnerHeight",
- INT_MAX);
+ 1000);
int32_t availForContentWidthCSS =
- std::min(maxInnerWidth,
- NSToIntRound((0.95 * availWidth - chromeWidth) /
- devicePerCSSPixels));
+ std::min(maxInnerWidth, NSToIntRound((0.95 * availWidth - chromeWidth) /
+ devicePerCSSPixels));
int32_t availForContentHeightCSS =
- std::min(maxInnerHeight,
- NSToIntRound((0.95 * availHeight - chromeHeight) /
- devicePerCSSPixels));
+ std::min(maxInnerHeight, NSToIntRound((0.95 * availHeight - chromeHeight) /
+ devicePerCSSPixels));
int32_t targetContentWidth =
NSToIntRound(devicePerCSSPixels *
- std::min(1000, availForContentWidthCSS -
- (availForContentWidthCSS % 200)));
+ (availForContentWidthCSS - (availForContentWidthCSS % 200)));
int32_t targetContentHeight =
NSToIntRound(devicePerCSSPixels *
- std::min(1000, availForContentHeightCSS -
- (availForContentHeightCSS % 100)));
+ (availForContentHeightCSS - (availForContentHeightCSS % 100)));
SizeShellTo(mPrimaryContentShell,
targetContentWidth, targetContentHeight);
mIgnoreXULSize = true;
mIgnoreXULSizeMode = true;
- // Useful for debugging:
- //printf("target content size: %d, %d\n",
- // targetContentWidth, targetContentHeight);
- //GetSize(&windowWidth, &windowHeight);
- //GetAvailScreenSize(&availWidth, &availHeight);
- //shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
- //printf("\nwindow size: %d x %d\n", windowWidth, windowHeight);
- //printf("avail screen size: %d x %d\n", availWidth, availHeight);
- //printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ /* Useful for debugging:
+ printf("target content size: %d, %d\n",
+ targetContentWidth, targetContentHeight);
+ GetSize(&windowWidth, &windowHeight);
+ GetAvailScreenSize(&availWidth, &availHeight);
+ shellWindow->GetSize(&contentWidth, &contentHeight); // device pixels
+ printf("\nwindow size: %d x %d\n", windowWidth, windowHeight);
+ printf("avail screen size: %d x %d\n", availWidth, availHeight);
+ printf("primary content shell: %d x %d\n", contentWidth, contentHeight);
+ */
return NS_OK;
}
1
0

10 Nov '16
commit c7798457fac62e77b0da9efac69296c0966325ca
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 13:07:50 2016 +0000
Adding fr, ru, and tr to the banner locales
---
src/chrome/content/aboutTor/donation_banner.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/chrome/content/aboutTor/donation_banner.js b/src/chrome/content/aboutTor/donation_banner.js
index 1087815..04f8db9 100644
--- a/src/chrome/content/aboutTor/donation_banner.js
+++ b/src/chrome/content/aboutTor/donation_banner.js
@@ -6,8 +6,11 @@ let kBannerLocales = [
"en",
"es",
"fa",
+ "fr",
"it",
"nl",
+ "ru",
+ "tr",
"vi",
"zh",
];
1
0

10 Nov '16
commit 07c917f0aa87ec7e4b3b668fd868bca58fac27be
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 11:10:02 2016 +0000
Update tor signing key
---
gitian/gpg/tor.gpg | Bin 14432 -> 21817 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/gitian/gpg/tor.gpg b/gitian/gpg/tor.gpg
index 319a9a6..51eeb40 100644
Binary files a/gitian/gpg/tor.gpg and b/gitian/gpg/tor.gpg differ
1
0
commit 2c2690fb3a2c76ae916fdb9d37b2f9f2a362de7f
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 11:10:02 2016 +0000
Update tor signing key
---
gitian/gpg/tor.gpg | Bin 14432 -> 21817 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/gitian/gpg/tor.gpg b/gitian/gpg/tor.gpg
index 319a9a6..51eeb40 100644
Binary files a/gitian/gpg/tor.gpg and b/gitian/gpg/tor.gpg differ
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] fixup! Bug #4234: Use the Firefox Update Process for Tor Browser.
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit 74af032f2b07b8106b216a240c175d163634d89d
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Jun 23 10:09:15 2016 -0400
fixup! Bug #4234: Use the Firefox Update Process for Tor Browser.
Change app.update.url to point to aus1.tpo (bug 19481).
---
browser/app/profile/firefox.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index 6e424cb..64ab700 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -147,7 +147,7 @@ pref("app.update.badge", false);
pref("app.update.staging.enabled", true);
// Update service URL:
-pref("app.update.url", "https://www.torproject.org/dist/torbrowser/update_2/%CHANNEL%/%BUILD_TARGET…");
+pref("app.update.url", "https://aus1.torproject.org/dist/torbrowser/update_2/%CHANNEL%/%BUILD_TARGE…");
// app.update.url.manual is in branding section
// app.update.url.details is in branding section
1
0

[tor-browser-bundle/maint-6.0] Revert "Revert "Bug 20023: Upgrade Go to 1.7.3.""
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit 04ad1276fb3e410f42a079cf0cac30bd7e1d0c53
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:25:37 2016 +0000
Revert "Revert "Bug 20023: Upgrade Go to 1.7.3.""
This reverts commit 8e93f0ddb6b018c6d5a28c2063554bb5174d9c45.
It seems the segfault was only spurious on my build machine.
---
gitian/descriptors/mac/gitian-pluggable-transports.yml | 12 +++++++-----
gitian/versions | 4 ++--
gitian/versions.alpha | 4 ++--
gitian/versions.beta | 4 ++--
gitian/versions.nightly | 4 ++--
5 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index 33b134e..519a3ee 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -48,6 +48,7 @@ files:
- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
+- "MacOSX10.7.sdk.tar.gz"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
- "gmp-mac64-utils.zip"
@@ -82,6 +83,8 @@ script: |
export PATH="/usr/sbin:/sbin:$PATH"
sudo dpkg -i *.deb
tar xaf multiarch-darwin*tar.xz
+ # The 10.7 SDK is needed for Go: https://bugs.torproject.org/20023#comment:6
+ tar xaf MacOSX10.7.sdk.tar.gz
export PATH="$PATH:$HOME/build/apple-osx/bin/"
if [ "z$INCLUDE_FTE" = "z1" ]; then
unzip -d $INSTDIR gmp-mac64-utils.zip
@@ -99,10 +102,6 @@ script: |
export CXX=$HOME/build/apple-osx/bin/i686-apple-darwin11-g++
# http://bugs.python.org/issue9437
export LDSHARED="$CC -pthread -shared"
- # XXX Clean up these flags?
- export CFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
- export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
- export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
# Building go 1.4.x
# This is needed to bootstrap the go that we actually use
@@ -122,7 +121,7 @@ script: |
# https://github.com/golang/go/issues/15457
CC_FOR_TARGET="$(pwd)/cc-for-target"
echo "#!/bin/sh" > "$CC_FOR_TARGET"
- echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS -isysroot $HOME/build/MacOSX10.7.sdk -std=gnu99 \"\$@\"" >> "$CC_FOR_TARGET"
chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
@@ -130,6 +129,9 @@ script: |
export GOARCH=386
tar xvf go.tar.gz
cd go/src
+ # Remove a preprocessor directive that causes problems when building with the 10.7 SDK.
+ # https://github.com/golang/go/issues/17732
+ sed -i -e '/^#cgo CFLAGS:/s/-D__MAC_OS_X_VERSION_MAX_ALLOWED=1060//' crypto/x509/root_cgo_darwin.go
CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/versions b/gitian/versions
index 387b7c5..2be65b4 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index d6044ce..68be3f3 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 1ff14b8..e19f53b 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -49,7 +49,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -96,7 +96,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index f4475bc..75cb02b 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -69,7 +69,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -121,7 +121,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
1
0

[tor-browser-bundle/maint-6.0] Revert "Remove the Go update from Changelog"
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit df5a2277a97f78a4384eeb0b5238d9d303756fb4
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:24:29 2016 +0000
Revert "Remove the Go update from Changelog"
This reverts commit fe44fa5dc3e1eb5889f64114d0a8a03d144e7891.
---
Bundle-Data/Docs/ChangeLog.txt | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index 0758477..b2a0719 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -21,6 +21,10 @@ Tor Browser 6.0.6 -- November 15
* Bug 20342: Add tor-gencert.exe to expert bundle
* OS X
* Bug 20204: Windows don't drag on macOS Sierra anymore
+ * Bug 20250: Meek fails on macOS Sierra if built with Go < 1.7
+ * Build system
+ * All platforms
+ * Bug 20023: Upgrade Go to 1.7.3
Tor Browser 6.0.5 -- September 16
* All Platforms
1
0

[tor-browser-bundle/maint-6.0] Bump Torbutton tag to pick up banner translations
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit 3e01d216bc9e9bc50995e8e5b7dd28dadf377f0a
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:27:23 2016 +0000
Bump Torbutton tag to pick up banner translations
---
Bundle-Data/Docs/ChangeLog.txt | 2 +-
gitian/versions | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index b2a0719..e6f9b74 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -3,7 +3,7 @@ Tor Browser 6.0.6 -- November 15
* Update Firefox to 45.5.0esr
* Update Tor to 0.2.8.9
* Update OpenSSL to 1.0.1u
- * Update Torbutton to 1.9.5.8
+ * Update Torbutton to 1.9.5.9
* Bug 20414: Add donation banner on about:tor for 2016 campaign
* Translation updates
* Update Tor Launcher to 0.2.9.4
diff --git a/gitian/versions b/gitian/versions
index 2be65b4..bb83b2d 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -17,7 +17,7 @@ TORBROWSER_UPDATE_CHANNEL=release
TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-6.0-1-build2
TOR_TAG=tor-0.2.8.9
TORLAUNCHER_TAG=0.2.9.4
-TORBUTTON_TAG=1.9.5.8
+TORBUTTON_TAG=1.9.5.9
HTTPSE_TAG=5.2.7
NSIS_TAG=v0.3.1
ZLIB_TAG=v1.2.8
1
0

[tor-browser-bundle/maint-6.0] Revert "Revert "Upgrade Go to 1.6.3.""
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit 9b9cf24a443a1fca1ca1920c81af0387ab8169a6
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:25:07 2016 +0000
Revert "Revert "Upgrade Go to 1.6.3.""
This reverts commit a10a5a000c5eaf294d7afc01ba4c6b9af9f67e50.
It seems the sefault was only spurious on my build machine.
---
.../linux/gitian-pluggable-transports.yml | 12 ++++++++++
.../mac/gitian-pluggable-transports.yml | 27 ++++++++++++++++-----
.../windows/gitian-pluggable-transports.yml | 28 +++++++++++++++++-----
gitian/fetch-inputs.sh | 5 ++--
gitian/verify-tags.sh | 2 +-
gitian/versions | 9 +++++--
gitian/versions.alpha | 9 +++++--
gitian/versions.beta | 9 +++++--
gitian/versions.nightly | 9 +++++--
9 files changed, 87 insertions(+), 23 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-pluggable-transports.yml b/gitian/descriptors/linux/gitian-pluggable-transports.yml
index 38ae561..a1cdc48 100644
--- a/gitian/descriptors/linux/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/linux/gitian-pluggable-transports.yml
@@ -46,6 +46,7 @@ files:
- "zope.interface.zip"
- "twisted.tar.bz2"
- "parsley.tar.gz"
+- "go14.tar.gz"
- "go.tar.gz"
- "dzip.sh"
- "gmp-linux32-utils.zip"
@@ -74,6 +75,17 @@ script: |
# FTE only needs libgmp.so.10 and no libgmpxx anymore.
cp $INSTDIR/gmp/lib/libgmp.so.10 $INSTDIR/Tor
+ # Building go 1.4.x
+ # This is needed to bootstrap the go that we actually use
+ # https://golang.org/doc/install/source#go14
+ tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
+ cd go1.4/src
+ # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
+ # https://github.com/golang/go/issues/13114#issuecomment-186922245
+ CGO_ENABLED=0 ./make.bash
+ cd ../..
+ export GOROOT_BOOTSTRAP="$PWD/go1.4"
+
# Building go
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index fbf38c2..33b134e 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -45,6 +45,7 @@ files:
- "zope.interface.zip"
- "twisted.tar.bz2"
- "parsley.tar.gz"
+- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
@@ -103,19 +104,33 @@ script: |
export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
+ # Building go 1.4.x
+ # This is needed to bootstrap the go that we actually use
+ # https://golang.org/doc/install/source#go14
+ tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
+ cd go1.4/src
+ # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
+ # https://github.com/golang/go/issues/13114#issuecomment-186922245
+ # Disable CC etc. that are set up for cross builds.
+ CGO_ENABLED=0 CC= CFLAGS= LDFLAGS= ./make.bash
+ cd ../..
+ export GOROOT_BOOTSTRAP="$PWD/go1.4"
+
# Building go
+ # Create a cc-for-target script that closes over CC, CFLAGS, and LDFLAGS.
+ # Go's CC_FOR_TARGET only allows a command name, not a command with arguments.
+ # https://github.com/golang/go/issues/15457
+ CC_FOR_TARGET="$(pwd)/cc-for-target"
+ echo "#!/bin/sh" > "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
export GOOS=darwin
export GOARCH=386
tar xvf go.tar.gz
cd go/src
- # http://golang.org/cmd/cgo/:
- # "To enable cgo during cross compiling builds, set the CGO_ENABLED
- # environment variable to 1 when building the Go tools with make.bash. Also,
- # set CC_FOR_TARGET to the C cross compiler for the target. CC will be used
- # for compiling for the host."
- CGO_ENABLED=1 CC_FOR_TARGET="$CC $CFLAGS $LDFLAGS" CC= CFLAGS= LDFLAGS= ./make.bash
+ CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/descriptors/windows/gitian-pluggable-transports.yml b/gitian/descriptors/windows/gitian-pluggable-transports.yml
index f073fd1..7e8a349 100644
--- a/gitian/descriptors/windows/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/windows/gitian-pluggable-transports.yml
@@ -47,6 +47,7 @@ files:
- "wine-wrappers"
- "python.msi"
- "py2exe.exe"
+- "go14.tar.gz"
- "go.tar.gz"
- "dzip.sh"
- "pyc-timestamp.sh"
@@ -139,19 +140,34 @@ script: |
cp -a dist/gcc.exe dist/g++.exe dist/dllwrap.exe $WINEROOT/windows/
cd ..
+ # Building go 1.4.x
+ # This is needed to bootstrap the go that we actually use
+ # https://golang.org/doc/install/source#go14
+ tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
+ cd go1.4/src
+ # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
+ # https://github.com/golang/go/issues/13114#issuecomment-186922245
+ # Disable CC etc. that are set up for cross builds.
+ CGO_ENABLED=0 CC= CFLAGS= LDFLAGS= ./make.bash
+ cd ../..
+ export GOROOT_BOOTSTRAP="$PWD/go1.4"
+
# Building go
+ CC=i686-w64-mingw32-gcc
+ # Create a cc-for-target script that closes over CC, CFLAGS, and LDFLAGS.
+ # Go's CC_FOR_TARGET only allows a command name, not a command with arguments.
+ # https://github.com/golang/go/issues/15457
+ CC_FOR_TARGET="$(pwd)/cc-for-target"
+ echo "#!/bin/sh" > "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
export GOOS=windows
export GOARCH=386
tar xvf go.tar.gz
cd go/src
- # http://golang.org/cmd/cgo/:
- # "To enable cgo during cross compiling builds, set the CGO_ENABLED
- # environment variable to 1 when building the Go tools with make.bash. Also,
- # set CC_FOR_TARGET to the C cross compiler for the target. CC will be used
- # for compiling for the host."
- CGO_ENABLED=1 CC_FOR_TARGET="i686-w64-mingw32-gcc" CC= CFLAGS= LDFLAGS= ./make.bash
+ CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/fetch-inputs.sh b/gitian/fetch-inputs.sh
index b5adfc2..50daec0 100755
--- a/gitian/fetch-inputs.sh
+++ b/gitian/fetch-inputs.sh
@@ -162,7 +162,7 @@ do
get "${!PACKAGE}" "${MIRROR_URL_ASN}${!PACKAGE}"
done
-for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
+for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO14 GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
do
URL="${i}_URL"
PACKAGE="${i}_PACKAGE"
@@ -174,7 +174,7 @@ wget -U "" -N ${NOSCRIPT_URL}
# Verify packages with weak or no signatures via direct sha256 check
# (OpenSSL is signed with MD5, and OSXSDK + OSXSDK_OLD are not signed at all)
-for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO14 GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
do
PACKAGE="${i}_PACKAGE"
HASH="${i}_HASH"
@@ -243,6 +243,7 @@ ln -sf "$PY2EXE_PACKAGE" py2exe.exe
ln -sf "$SETUPTOOLS_PACKAGE" setuptools.tar.gz
ln -sf "$GMP_PACKAGE" gmp.tar.bz2
ln -sf "$PARSLEY_PACKAGE" parsley.tar.gz
+ln -sf "$GO14_PACKAGE" go14.tar.gz
ln -sf "$GO_PACKAGE" go.tar.gz
ln -sf "$NSIS_PACKAGE" nsis.tar.bz2
ln -sf "$NSIS_DEBIAN_PACKAGE" nsis-debian.tar.xz
diff --git a/gitian/verify-tags.sh b/gitian/verify-tags.sh
index 33b54a4..d95b0e0 100755
--- a/gitian/verify-tags.sh
+++ b/gitian/verify-tags.sh
@@ -144,7 +144,7 @@ done
# Verify packages with weak or no signatures via direct sha256 check
# (OpenSSL is signed with MD5, and OSXSDK + OSXSDK_OLD are not signed at all)
-for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO14 GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
do
PACKAGE="${i}_PACKAGE"
HASH="${i}_HASH"
diff --git a/gitian/versions b/gitian/versions
index 143d56d..387b7c5 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -60,7 +60,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.3
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -83,6 +85,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -110,7 +113,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -140,6 +144,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 65acf45..d6044ce 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -60,7 +60,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.2
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -83,6 +85,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -110,7 +113,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -140,6 +144,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 2564e41..1ff14b8 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -47,7 +47,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.2
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -68,6 +70,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
STIXMATHFONT_PACKAGE=STIXv1.1.1-latex.zip
NOTOEMOJIFONT_PACKAGE=NotoEmoji-Regular.ttf
@@ -92,7 +95,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
@@ -118,6 +122,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
STIXMATHFONT_URL=http://iweb.dl.sourceforge.net/project/stixfonts/Current%2…
NOTOEMOJIFONT_URL=https://github.com/googlei18n/noto-emoji/raw/2f1ffdd6fbbd…
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index 781d4ae..f4475bc 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -67,7 +67,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.2
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -90,6 +92,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -117,7 +120,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -147,6 +151,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
1
0

10 Nov '16
commit 13e1da294f0cb5b45323f12827061878159ab9d8
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:21:04 2016 +0000
Version bump and CHANGELOG update
---
src/CHANGELOG | 2 +-
src/install.rdf | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index 0965a4a..db42f82 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -1,4 +1,4 @@
-1.9.5.8
+1.9.5.9
* Bug 20414: Add donation banner on about:tor for 2016 campaign
* Translation updates
diff --git a/src/install.rdf b/src/install.rdf
index 840997a..16adb7e 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry</em:creator>
<em:id>torbutton(a)torproject.org</em:id>
- <em:version>1.9.5.8</em:version>
+ <em:version>1.9.5.9</em:version>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html.en</em:homepageURL>
<em:optionsURL>chrome://torbutton/content/preferences.xul</em:optionsURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0

10 Nov '16
commit a244925c0de7768e2c370e2a9a4b7b75d03b2f54
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:19:47 2016 +0000
Include improved zh-CN banner translations
---
src/chrome/locale/zh-CN/aboutTor.properties | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/chrome/locale/zh-CN/aboutTor.properties b/src/chrome/locale/zh-CN/aboutTor.properties
index 4d017c3..421ac52 100644
--- a/src/chrome/locale/zh-CN/aboutTor.properties
+++ b/src/chrome/locale/zh-CN/aboutTor.properties
@@ -24,5 +24,5 @@ aboutTor.donationBanner.donate=立即捐助!
aboutTor.donationBanner.heart=Tor 是互联网自由的核心
aboutTor.donationBanner.tagline1=数百万人依靠 Tor 安全、私密地上网
aboutTor.donationBanner.tagline2=A Network of People Protecting People
-aboutTor.donationBanner.tagline3=Surveillance = Oppression
-aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
+aboutTor.donationBanner.tagline3=监视即压迫
+aboutTor.donationBanner.tagline4=为记者、告密者及活动人士提供保护,专注匿名安全 10 年
1
0

[torbutton/maint-1.9.5] Picking up fr and ru for the donation banner
by gk@torproject.org 10 Nov '16
by gk@torproject.org 10 Nov '16
10 Nov '16
commit dec9ac5d2c1592df7c64735502cf4c2332a89965
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:17:46 2016 +0000
Picking up fr and ru for the donation banner
---
src/chrome/content/aboutTor/donation_banner.js | 2 ++
src/chrome/locale/fr/aboutTor.properties | 10 +++++-----
src/chrome/locale/ru/aboutTor.properties | 12 ++++++------
3 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/src/chrome/content/aboutTor/donation_banner.js b/src/chrome/content/aboutTor/donation_banner.js
index 7ff3a98..04f8db9 100644
--- a/src/chrome/content/aboutTor/donation_banner.js
+++ b/src/chrome/content/aboutTor/donation_banner.js
@@ -6,8 +6,10 @@ let kBannerLocales = [
"en",
"es",
"fa",
+ "fr",
"it",
"nl",
+ "ru",
"tr",
"vi",
"zh",
diff --git a/src/chrome/locale/fr/aboutTor.properties b/src/chrome/locale/fr/aboutTor.properties
index 5842c54..9b9a7e6 100644
--- a/src/chrome/locale/fr/aboutTor.properties
+++ b/src/chrome/locale/fr/aboutTor.properties
@@ -20,9 +20,9 @@ aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
-aboutTor.donationBanner.donate=Donate Now!
-aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
-aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
-aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.donate=Faites un don maintenant !
+aboutTor.donationBanner.heart=Tor est au cœur de la liberté sur Internet
+aboutTor.donationBanner.tagline1=Des millions de personnes dépendent de Tor pour leur sécurité et la protection de leurs renseignements personnels en ligne
+aboutTor.donationBanner.tagline2=Un réseau de personnes qui protège les gens
aboutTor.donationBanner.tagline3=Surveillance = Oppression
-aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
+aboutTor.donationBanner.tagline4=Nous protégeons les journalistes, les activistes et les lanceurs d'alerte depuis 2006
diff --git a/src/chrome/locale/ru/aboutTor.properties b/src/chrome/locale/ru/aboutTor.properties
index 4d33808..055faae 100644
--- a/src/chrome/locale/ru/aboutTor.properties
+++ b/src/chrome/locale/ru/aboutTor.properties
@@ -20,9 +20,9 @@ aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
-aboutTor.donationBanner.donate=Donate Now!
-aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
-aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
-aboutTor.donationBanner.tagline2=A Network of People Protecting People
-aboutTor.donationBanner.tagline3=Surveillance = Oppression
-aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
+aboutTor.donationBanner.donate=Пожертвовать сейчас!
+aboutTor.donationBanner.heart=Tor это сердце свободы Интернета
+aboutTor.donationBanner.tagline1=Миллионы людей зависят от Tor в онлайн-безопасности и конфиденциальности
+aboutTor.donationBanner.tagline2=Сеть людей, защищающих людей
+aboutTor.donationBanner.tagline3=Наблюдение = Угнетение
+aboutTor.donationBanner.tagline4=Защита журналистов, активистов и информаторов с 2006 года
1
0
commit c216bcf991b8be4fcb517b4a773cc065a8bcf5b8
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Nov 10 08:07:56 2016 +0000
Update translations
---
src/chrome/locale/de/torbutton.dtd | 4 +-
src/chrome/locale/fr/aboutDialog.dtd | 14 ++---
src/chrome/locale/fr/aboutTBUpdate.dtd | 10 ++--
src/chrome/locale/fr/aboutTor.dtd | 26 ++++-----
src/chrome/locale/fr/aboutTor.properties | 18 +++---
src/chrome/locale/fr/brand.dtd | 8 +--
src/chrome/locale/fr/brand.properties | 4 +-
src/chrome/locale/fr/torbutton.dtd | 90 ++++++++++++++---------------
src/chrome/locale/ru/aboutTor.properties | 12 ++--
src/chrome/locale/ru/torbutton.dtd | 6 +-
src/chrome/locale/zh-CN/aboutTor.properties | 4 +-
11 files changed, 98 insertions(+), 98 deletions(-)
diff --git a/src/chrome/locale/de/torbutton.dtd b/src/chrome/locale/de/torbutton.dtd
index 56253fe..4cc42e9 100644
--- a/src/chrome/locale/de/torbutton.dtd
+++ b/src/chrome/locale/de/torbutton.dtd
@@ -11,8 +11,8 @@
<!ENTITY torbutton.context_menu.cookieProtections "Cookie-Schutz …">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Klicken, um Torbutton zu aktivieren">
-<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
-<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.security_settings "Tor-Browser-Sicherheitseinstellungen">
+<!ENTITY torbutton.prefs.restore_defaults "Standardeinstellungen wiederherstellen">
<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Cookie-Schutz verwalten">
<!ENTITY torbutton.cookiedialog.lockCol "Geschützt">
diff --git a/src/chrome/locale/fr/aboutDialog.dtd b/src/chrome/locale/fr/aboutDialog.dtd
index bd4f2f1..7fde298 100644
--- a/src/chrome/locale/fr/aboutDialog.dtd
+++ b/src/chrome/locale/fr/aboutDialog.dtd
@@ -1,19 +1,19 @@
<!ENTITY project.start "&brandShortName; est développé par">
<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
<!ENTITY project.tpoLink "le &vendorShortName;">
-<!ENTITY project.end ", une organisation à but non lucratif travaillant à défendre votre vie privée et liberté en ligne.">
+<!ENTITY project.end ", une organisation sans but lucratif travaillant à la protection de vos renseignements personnels et de votre liberté en ligne.">
-<!ENTITY help.start "voulez-vous aider ?">
+<!ENTITY help.start "Voulez-vous aider ?">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
-<!ENTITY help.donateLink "Faire une donation">
+<!ENTITY help.donateLink "Faites un don">
<!ENTITY help.or "ou">
<!-- LOCALIZATION NOTE (help.getInvolvedLink): This is a link title that links to https://www.torproject.org/getinvolved/volunteer.html.en -->
-<!ENTITY help.getInvolvedLink "s'engager">
+<!ENTITY help.getInvolvedLink "impliquez-vous">
<!ENTITY help.end "!">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
<!ENTITY bottomLinks.questions "Des questions ?">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/getinvolved/relays -->
-<!ENTITY bottomLinks.grow "Aider le réseau Tor à grandir !">
+<!ENTITY bottomLinks.grow "Aidez à la croissance du réseau Tor !">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to about:license -->
-<!ENTITY bottomLinks.license "Information sur les licences">
-<!ENTITY tor.TrademarkStatement ""Tor" et le "Logo Oignon" sont des marques déposés du Projet Tor, Inc.">
+<!ENTITY bottomLinks.license "Informations de licence">
+<!ENTITY tor.TrademarkStatement "« Tor » et le « logo Oignon » sont des marques déposées de The Tor Project, Inc. ">
diff --git a/src/chrome/locale/fr/aboutTBUpdate.dtd b/src/chrome/locale/fr/aboutTBUpdate.dtd
index bbc32e1..fc83797 100644
--- a/src/chrome/locale/fr/aboutTBUpdate.dtd
+++ b/src/chrome/locale/fr/aboutTBUpdate.dtd
@@ -1,6 +1,6 @@
-<!ENTITY aboutTBUpdate.title "Mise à jour du Navigateur Tor">
-<!ENTITY aboutTBUpdate.updated "Le Navigateur Tor a été mis à jour">
-<!ENTITY aboutTBUpdate.linkPrefix "Pour avoir les informations les plus récentes sur cette version,">
-<!ENTITY aboutTBUpdate.linkLabel "visitez notre site web">
+<!ENTITY aboutTBUpdate.title "Mise à jour du navigateur Tor">
+<!ENTITY aboutTBUpdate.updated "Le navigateur Tor a été mis à jour.">
+<!ENTITY aboutTBUpdate.linkPrefix "Pour les toutes dernières informations sur cette version,">
+<!ENTITY aboutTBUpdate.linkLabel "visitez notre site Web">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Changelog :">
+<!ENTITY aboutTBUpdate.changeLogHeading "Journal des changements :">
diff --git a/src/chrome/locale/fr/aboutTor.dtd b/src/chrome/locale/fr/aboutTor.dtd
index ab91620..0fc5b1e 100644
--- a/src/chrome/locale/fr/aboutTor.dtd
+++ b/src/chrome/locale/fr/aboutTor.dtd
@@ -4,20 +4,20 @@
- vim: set sw=2 sts=2 ts=8 et syntax=xml:
-->
-<!ENTITY aboutTor.title "A propos de Tor ">
+<!ENTITY aboutTor.title "À propos de Tor ">
-<!ENTITY aboutTor.outOfDateTorOn.label "ATTENTION : ce navigateur n'est pas à jour.">
+<!ENTITY aboutTor.outOfDateTorOn.label "AVERTISSEMENT : ce navigateur n'est pas à jour.">
<!ENTITY aboutTor.outOfDateTorOff.label "DE PLUS, ce navigateur n'est pas à jour.">
-<!ENTITY aboutTor.outOfDate2.label "Cliquez sur l'oignon et choisissez ensuite Vérifier les mises à jour du Navigateur Tor">
+<!ENTITY aboutTor.outOfDate2.label "Cliquer sur l'oignon, puis choisir Vérifier les màj. du navigateur Tor.">
<!ENTITY aboutTor.check.label "Tester les paramètres du réseau Tor">
-<!ENTITY aboutTor.success.label "Bienvenue dans le Navigateur Tor">
+<!ENTITY aboutTor.success.label "Bienvenue dans le navigateur Tor">
<!ENTITY aboutTor.success2.label "Connecté au réseau Tor.">
-<!ENTITY aboutTor.success3.label "Vous pouvez maintenant naviguer sur Internet de manière anonyme.">
-<!ENTITY aboutTor.failure.label "Une erreur s'est produite !">
+<!ENTITY aboutTor.success3.label "Vous êtes maintenant libre de naviguer sur Internet anonymement.">
+<!ENTITY aboutTor.failure.label "Une erreur s'est produite !">
<!ENTITY aboutTor.failure2.label "Tor ne fonctionne pas dans ce navigateur.">
-<!ENTITY aboutTor.failure3prefix.label "Pour obtenir de l'aide, veuillez contacter">
+<!ENTITY aboutTor.failure3prefix.label "Pour de l'assistance, veuillez contacter">
<!ENTITY aboutTor.failure3Link "help-fr(a)rt.torproject.org">
<!ENTITY aboutTor.failure3suffix.label ".">
@@ -30,20 +30,20 @@
<!ENTITY aboutTor.torInfo1.label "Informations supplémentaires :">
<!ENTITY aboutTor.torInfo2.label "Pays & adresse IP :">
<!ENTITY aboutTor.torInfo3.label "Nœud de sortie :">
-<!ENTITY aboutTor.torInfo4.label "Ce serveur n'enregistre aucune information sur les visites qu'il reçoit.">
-<!ENTITY aboutTor.whatnextQuestion.label "Que faire ensuite ?">
-<!ENTITY aboutTor.whatnextAnswer.label "Tor n'est PAS tout ce dont vous avez besoin pour assurer votre anonymat ! Vous devrez peut-être changer certaines de vos habitudes de navigation pour garder votre identité en sécurité.">
+<!ENTITY aboutTor.torInfo4.label "Ce serveur ne journalise aucune information sur les visteurs.">
+<!ENTITY aboutTor.whatnextQuestion.label "Que faire ensuite ?">
+<!ENTITY aboutTor.whatnextAnswer.label "Tor n'est PAS tout ce dont vous avez besoin pour naviguer anonymement! Vous aurez peut-être à changer certaines de vos habitudes de navigation pour garder votre identité en sécurité.">
<!ENTITY aboutTor.whatnext.label "Conseils pour rester anonyme »">
<!ENTITY aboutTor.whatnext.link "https://www.torproject.org/download/download.html#warning">
<!ENTITY aboutTor.helpInfo1.label "Vous pouvez aider !">
-<!ENTITY aboutTor.helpInfo2.label "Vous pouvez aider à rendre le réseau Tor plus rapide et plus puissant de plusieurs manières :">
-<!ENTITY aboutTor.helpInfo3.label "Faire fonctionner un relai Tor »">
+<!ENTITY aboutTor.helpInfo2.label "Vous pouvez aider à rendre le réseau Tor plus rapide et plus puissant de plusieurs façons :">
+<!ENTITY aboutTor.helpInfo3.label "Faire tourner un nœud relais Tor »">
<!ENTITY aboutTor.helpInfo3.link "https://www.torproject.org/docs/tor-doc-relay.html">
<!ENTITY aboutTor.helpInfo4.label "Devenir bénévole »">
<!ENTITY aboutTor.helpInfo4.link "https://www.torproject.org/getinvolved/volunteer.html">
<!ENTITY aboutTor.helpInfo5.label "Faire un don »">
<!ENTITY aboutTor.helpInfo5.link "https://www.torproject.org/donate/donate.html">
-<!ENTITY aboutTor.footer.label "Le projet Tor est une organisation à but non lucratif (US 501(c)(3)) dédiée à la recherche, le développement et l'éducation sur l'anonymat et la vie privée en ligne.">
+<!ENTITY aboutTor.footer.label "Le projet Tor est une organisation sans but lucratif US 501(c)(3) dédiée à la recherche, le développement et l'éducation sur l'anonymat et la vie privée en ligne.">
<!ENTITY aboutTor.learnMore.label "En savoir plus sur le projet Tor »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html">
diff --git a/src/chrome/locale/fr/aboutTor.properties b/src/chrome/locale/fr/aboutTor.properties
index 5842c54..174b286 100644
--- a/src/chrome/locale/fr/aboutTor.properties
+++ b/src/chrome/locale/fr/aboutTor.properties
@@ -2,27 +2,27 @@
# See LICENSE for licensing information.
# vim: set sw=2 sts=2 ts=8 et:
-aboutTor.searchSP.privacy=Rechercher <a href="%1$S">de manière sécurisée</a> avec <a href="%2$S">Startpage</a>.
+aboutTor.searchSP.privacy=Rechercher <a href="%1$S">en toute sécurité</a> avec <a href="%2$S">Startpage</a>.
# The following string is a link which replaces %1$S above.
-aboutTor.searchSP.privacy.link=https://startpage.com/eng/protect-privacy.html
+aboutTor.searchSP.privacy.link=https://startpage.com/fra/protect-privacy.html
# The following string is a link which replaces %2$S above.
aboutTor.searchSP.search.link=https://startpage.com/
-aboutTor.searchDDG.privacy=Rechercher <a href="%1$S">de manière sécurisée</a> avec <a href="%2$S">DuckDuckGo</a>.
+aboutTor.searchDDG.privacy=Rechercher <a href="%1$S">en toute sécurité</a> avec <a href="%2$S">DuckDuckGo</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchDDG.privacy.link=https://duckduckgo.com/privacy.html
# The following string is a link which replaces %2$S above.
aboutTor.searchDDG.search.link=https://duckduckgo.com/
-aboutTor.searchDC.privacy=Rechercher <a href="%1$S">de manière sécurisée</a> avec <a href="%2$S">Disconnect.me</a>.
+aboutTor.searchDC.privacy=Rechercher <a href="%1$S">en toute sécurité</a> avec <a href="%2$S">Disconnect.me</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
-aboutTor.donationBanner.donate=Donate Now!
-aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
-aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
-aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.donate=Faites un don maintenant !
+aboutTor.donationBanner.heart=Tor est au cœur de la liberté sur Internet
+aboutTor.donationBanner.tagline1=Des millions de personnes dépendent de Tor pour leur sécurité et la protection de leurs renseignements personnels en ligne
+aboutTor.donationBanner.tagline2=Un réseau de personnes qui protège les gens
aboutTor.donationBanner.tagline3=Surveillance = Oppression
-aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
+aboutTor.donationBanner.tagline4=Nous protégeons les journalistes, les activistes et les lanceurs d'alerte depuis 2006
diff --git a/src/chrome/locale/fr/brand.dtd b/src/chrome/locale/fr/brand.dtd
index 416aa42..b3fe3f1 100644
--- a/src/chrome/locale/fr/brand.dtd
+++ b/src/chrome/locale/fr/brand.dtd
@@ -9,7 +9,7 @@
<!ENTITY trademarkInfo.part1 "Firefox et les logos de Firefox sont des marques déposées de la Fondation Mozilla.">
<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
-<!ENTITY plugins.installed.find "Cliquer pour charger les modules complémentaires du système installés">
-<!ENTITY plugins.installed.enable "Activer les modules complémentaires">
-<!ENTITY plugins.installed.disable "Désactiver les modules complémentaires">
-<!ENTITY plugins.installed.disable.tip "Cliquer pour empêcher le chargement de modules complémentaires du système">
+<!ENTITY plugins.installed.find "Cliquer pour charger les greffons système installés">
+<!ENTITY plugins.installed.enable "Activer les greffons">
+<!ENTITY plugins.installed.disable "Désactiver les greffons">
+<!ENTITY plugins.installed.disable.tip "Cliquer pour empêcher le chargement des greffons système">
diff --git a/src/chrome/locale/fr/brand.properties b/src/chrome/locale/fr/brand.properties
index 375e8b1..f9fb5ac 100644
--- a/src/chrome/locale/fr/brand.properties
+++ b/src/chrome/locale/fr/brand.properties
@@ -10,7 +10,7 @@ vendorShortName=Projet Tor
homePageSingleStartMain=Firefox Start, une page d'accueil rapide avec recherche intégrée
homePageImport=Importez votre page d'accueil à partir de %S
-homePageMigrationPageTitle=Sélection de la Page d'accueil
-homePageMigrationDescription=S'il vous plaît sélectionnez la page d'accueil que vous souhaitez utiliser :
+homePageMigrationPageTitle=Choix de la page d'accueil
+homePageMigrationDescription=Veuillez choisir la page d'accueil que vous souhaitez utiliser :
syncBrandShortName=Sync
diff --git a/src/chrome/locale/fr/torbutton.dtd b/src/chrome/locale/fr/torbutton.dtd
index 035203b..26c9eb1 100644
--- a/src/chrome/locale/fr/torbutton.dtd
+++ b/src/chrome/locale/fr/torbutton.dtd
@@ -2,61 +2,61 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Nouveau circuit Tor pour ce site">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
-<!ENTITY torbutton.context_menu.preferences "Paramètres de sécurité ...">
+<!ENTITY torbutton.context_menu.preferences "Paramètres de sécurité...">
<!ENTITY torbutton.context_menu.preferences.key "S">
-<!ENTITY torbutton.context_menu.networksettings "Paramètres du réseau Tor">
+<!ENTITY torbutton.context_menu.networksettings "Paramètres du réseau Tor...">
<!ENTITY torbutton.context_menu.networksettings.key "N">
-<!ENTITY torbutton.context_menu.downloadUpdate "Vérifier les mises à jour du Navigateur Tor">
+<!ENTITY torbutton.context_menu.downloadUpdate "Vérifier les màj. du navigateur Tor">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
-<!ENTITY torbutton.context_menu.cookieProtections "Protections contre les cookies">
-<!ENTITY torbutton.context_menu.cookieProtections.key "C">
-<!ENTITY torbutton.button.tooltip "Cliquez pour lancer Torbutton">
-<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
-<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
-<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
-<!ENTITY torbutton.cookiedialog.title "Gérer les protections de cookies">
+<!ENTITY torbutton.context_menu.cookieProtections "Protections des fichiers témoins...">
+<!ENTITY torbutton.context_menu.cookieProtections.key "T">
+<!ENTITY torbutton.button.tooltip "Cliquer pour lancer Torbutton">
+<!ENTITY torbutton.prefs.security_settings "Paramètres de sécurité du navigateur Tor">
+<!ENTITY torbutton.prefs.restore_defaults "Revenir aux paramètres par défaut">
+<!ENTITY torbutton.prefs.custom_warning "Les préférences personnalisées de votre navigateur ont entraîné des paramètres de sécurité inhabituels. Pour des raisons de sécurité et de protection des informations personnelles, nous vous recommandons de choisir un des niveaux de sécurité par défaut.">
+<!ENTITY torbutton.cookiedialog.title "Gérer les protections des fichiers témoins">
<!ENTITY torbutton.cookiedialog.lockCol "Protégé">
<!ENTITY torbutton.cookiedialog.domainCol "Hôte">
<!ENTITY torbutton.cookiedialog.nameCol "Nom">
<!ENTITY torbutton.cookiedialog.pathCol "Chemin">
-<!ENTITY torbutton.cookiedialog.protectCookie "Protéger le cookie">
-<!ENTITY torbutton.cookiedialog.removeCookie "Supprimer le cookie">
-<!ENTITY torbutton.cookiedialog.unprotectCookie "Déprotéger le cookie">
-<!ENTITY torbutton.cookiedialog.removeAllBut "Supprimer tous les cookies non protégés">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Protéger les nouveaux cookies">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Ne pas protéger les nouveaux cookies">
-<!ENTITY torbutton.prefs.restrict_thirdparty "Limiter les cookies tiers ainsi que les autres données de traçage">
+<!ENTITY torbutton.cookiedialog.protectCookie "Protéger le fichier témoin">
+<!ENTITY torbutton.cookiedialog.removeCookie "Enlever le fichier témoin">
+<!ENTITY torbutton.cookiedialog.unprotectCookie "Déprotéger le fichier témoin">
+<!ENTITY torbutton.cookiedialog.removeAllBut "Enlever tous les fichiers témoins non protégés">
+<!ENTITY torbutton.cookiedialog.saveAllCookies "Protéger les nouveaux fichiers témoins">
+<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Ne pas protéger les nouveaux fichiers témoins">
+<!ENTITY torbutton.prefs.restrict_thirdparty "Limiter les fichiers témoins tiers et les autres données de traçage">
<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
-<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
-<!ENTITY torbutton.prefs.resist_fingerprinting "Modifier les détails qui vous distinguent des autres utilisateurs du Navigateur Tor">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Gardez cette case cochée pour empêcher que diverses fonctions du navigateur soient utilisées pour vous suivre à la trace lorsque vous surfez sur le Web. Les fonctions modifiées incluent les URL de grands objets binaires, les canaux de diffusion, le cache du navigateur, les fichiers fichiers témoins, les favoricônes, les en-têtes Auth HTTP, les préconnexions de liens, localStorage, les URL de sources de médias, les requêtes OCSP, les travailleurs Web SharedWorker, et les billets de session TLS.">
+<!ENTITY torbutton.prefs.resist_fingerprinting "Modifier les détails qui vous distingue d'autres utilisateurs du navigateur Tor">
<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
-<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Gardez cette case cochée pour cacher aux sites Web certaines choses qui pourraient être uniques à votre sujet, incluant l'état de votre batterie, les performances de l'ordinateur, l'agencement du clavier, les paramètres de langue, l'emplacement des greffons installés, la liste de greffons installés, l'état de votre réseau, l'orientation de l'écran, les niveaux de zoom particuliers aux sites, les types de fichiers pris en charge, les couleurs système et les capacités WebGL.">
<!ENTITY torbutton.prefs.sec_caption "Niveau de sécurité">
-<!ENTITY torbutton.prefs.sec_caption_tooltip "Le curseur de sécurité vous laisse mettre hors de service certaines fonctions de navigateur qui peuvent rendre votre navigateur plus vulnérable aux tentatives de piratage informatique.">
-<!ENTITY torbutton.prefs.sec_low "Faible (par défaut)">
-<!ENTITY torbutton.prefs.sec_low_usable_desc "Cela offre l'expérience la plus agréable.">
-<!ENTITY torbutton.prefs.sec_low_desc "A ce niveau de sécurité, toutes les fonctions de navigation sont activées.">
-<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Le mécanisme SVG OpenType de rendu des polices est désactivé.">
-<!ENTITY torbutton.prefs.sec_med_low "Moyen-Bas">
-<!ENTITY torbutton.prefs.sec_gen_desc "À ce niveau de sécurité, les changements suivants s'appliquent (passez la souris au dessus pour afficher des détails) :">
-<!ENTITY torbutton.prefs.sec_html5_desc "Les média audio-vidéos HTML5 doivent être cliqués pour être lus (via NoScript).">
-<!ENTITY torbutton.prefs.sec_html5_tooltip "Sur quelques sites, vous pourriez avoir à utiliser le bouton de barre d'outils de NoScript pour autoriser ces objets multimédias.">
-<!ENTITY torbutton.prefs.sec_some_jit_desc "Certaines optimisations liés à Javascript sont désactivées.">
-<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "JIT ION, inférence de types, ASM.JS.">
-<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "JIT Baseline.">
-<!ENTITY torbutton.prefs.sec_jit_slower_desc "Les scripts sur certains sites peuvent être ralentis.">
-<!ENTITY torbutton.prefs.sec_mathml_desc "Quelques mécanismes d'affichage d'équations mathématiques sont désactivés.">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Le bouton coulissant Sécurité vous permet de désactiver certaines fonctions du navigateur qui le rendent plus vulnérable aux tentatives de piratage.">
+<!ENTITY torbutton.prefs.sec_low "Bas (par défaut)">
+<!ENTITY torbutton.prefs.sec_low_usable_desc "Ceci offre l'expérience la plus conviviale.">
+<!ENTITY torbutton.prefs.sec_low_desc "À ce niveau de sécurité, toutes les fonctions du navigateur sont activées.">
+<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Le mécanisme de rendu de police SVG OpenType est désactivé.">
+<!ENTITY torbutton.prefs.sec_med_low "Moyen-bas">
+<!ENTITY torbutton.prefs.sec_gen_desc "À ce niveau de sécurité, les changements suivants sont applicables (survolez avec la souris pour plus de détails ) :">
+<!ENTITY torbutton.prefs.sec_html5_desc "Le contenu HTML5 vidéo et audio devient « cliquer pour lire » avec NoScript.">
+<!ENTITY torbutton.prefs.sec_html5_tooltip "Pour certains sites, vous aurez peut-être à utiliser le bouton NoScript de la barre d'outils pour activer ces objets multimédias.">
+<!ENTITY torbutton.prefs.sec_some_jit_desc "Certaines optimisations de performance de JavaScript sont désactivées.">
+<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "ION JIT, inférence de type, ASM.JS.">
+<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "Baseline JIT.">
+<!ENTITY torbutton.prefs.sec_jit_slower_desc "Les scripts pourraient être exécutés plus lentement sur certains sites.">
+<!ENTITY torbutton.prefs.sec_mathml_desc "Certains mécanismes d'affichage des équations mathématiques sont désactivés.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML est désactivé.">
-<!ENTITY torbutton.prefs.sec_med_high "Moyennement haut">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Sur les sites où Javascript est permis, les optimisations de performance sont désactivées.">
-<!ENTITY torbutton.prefs.sec_font_rend_desc "Certaines fonctionnalités de rendu de police sont désactivées.">
-<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Le mécanisme de rendu de police de caractères Graphite est désactivé.">
-<!ENTITY torbutton.prefs.sec_svg_desc "Certains formats d'images sont désactivés.">
+<!ENTITY torbutton.prefs.sec_med_high "Moyen-haut">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Sur les sites où JavaScript est activé, les optimisations des performances sont désactivées.">
+<!ENTITY torbutton.prefs.sec_font_rend_desc "Certaines fonctions de rendu de police sont désactivées.">
+<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Le mécanisme de rendu de police Graphite est désactivé.">
+<!ENTITY torbutton.prefs.sec_svg_desc "Certains types d'images sont désactivés.">
<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "Les images SVG sont désactivées.">
-<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript est désactivé par défaut sur tous les sites non-HTTPS.">
-<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript peut être activé selon le site via le bouton de barre d'outils NoScript.">
-<!ENTITY torbutton.prefs.sec_high "Haut">
-<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript est désactivé par défaut sur tous les sites.">
-<!ENTITY torbutton.prefs.sec_webfonts_desc "Certaines polices de caractères et icônes peuvent être affichées de façon incorrecte.">
-<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Les fichiers de police de caractères fournis par des sites Web sont bloqués.">
+<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript est désactivé par défaut pour tous les sites non HTTPS.">
+<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript peut être activé par site avec le bouton NoScript de la barre d'outils">
+<!ENTITY torbutton.prefs.sec_high "Élevé">
+<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript est désactivé par défaut pour tous les sites.">
+<!ENTITY torbutton.prefs.sec_webfonts_desc "Certains polices et icônes pourraient ne pas s'afficher correctement.">
+<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Les polices fournies par les sites Web sont bloquées.">
<!ENTITY torbutton.circuit_display.title "Circuit Tor pour ce site">
diff --git a/src/chrome/locale/ru/aboutTor.properties b/src/chrome/locale/ru/aboutTor.properties
index 4d33808..055faae 100644
--- a/src/chrome/locale/ru/aboutTor.properties
+++ b/src/chrome/locale/ru/aboutTor.properties
@@ -20,9 +20,9 @@ aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
-aboutTor.donationBanner.donate=Donate Now!
-aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
-aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
-aboutTor.donationBanner.tagline2=A Network of People Protecting People
-aboutTor.donationBanner.tagline3=Surveillance = Oppression
-aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
+aboutTor.donationBanner.donate=Пожертвовать сейчас!
+aboutTor.donationBanner.heart=Tor это сердце свободы Интернета
+aboutTor.donationBanner.tagline1=Миллионы людей зависят от Tor в онлайн-безопасности и конфиденциальности
+aboutTor.donationBanner.tagline2=Сеть людей, защищающих людей
+aboutTor.donationBanner.tagline3=Наблюдение = Угнетение
+aboutTor.donationBanner.tagline4=Защита журналистов, активистов и информаторов с 2006 года
diff --git a/src/chrome/locale/ru/torbutton.dtd b/src/chrome/locale/ru/torbutton.dtd
index de02dd2..c5c989a 100644
--- a/src/chrome/locale/ru/torbutton.dtd
+++ b/src/chrome/locale/ru/torbutton.dtd
@@ -11,9 +11,9 @@
<!ENTITY torbutton.context_menu.cookieProtections "Защита куки-файла">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Нажмите, чтобы инициализировать Torbutton">
-<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
-<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
-<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
+<!ENTITY torbutton.prefs.security_settings "Настройки безопасности Tor Browser">
+<!ENTITY torbutton.prefs.restore_defaults "Восстановить значения по умолчанию">
+<!ENTITY torbutton.prefs.custom_warning "Ваши настройки браузера, привели к необычным параметрам безопасности. По соображениям безопасности и конфиденциальности, мы рекомендуем вам выбрать один из уровней безопасности по умолчанию.">
<!ENTITY torbutton.cookiedialog.title "Управление защитой куки-файлов">
<!ENTITY torbutton.cookiedialog.lockCol "Защищено">
<!ENTITY torbutton.cookiedialog.domainCol "Ведущий узел">
diff --git a/src/chrome/locale/zh-CN/aboutTor.properties b/src/chrome/locale/zh-CN/aboutTor.properties
index 4d017c3..421ac52 100644
--- a/src/chrome/locale/zh-CN/aboutTor.properties
+++ b/src/chrome/locale/zh-CN/aboutTor.properties
@@ -24,5 +24,5 @@ aboutTor.donationBanner.donate=立即捐助!
aboutTor.donationBanner.heart=Tor 是互联网自由的核心
aboutTor.donationBanner.tagline1=数百万人依靠 Tor 安全、私密地上网
aboutTor.donationBanner.tagline2=A Network of People Protecting People
-aboutTor.donationBanner.tagline3=Surveillance = Oppression
-aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
+aboutTor.donationBanner.tagline3=监视即压迫
+aboutTor.donationBanner.tagline4=为记者、告密者及活动人士提供保护,专注匿名安全 10 年
1
0

09 Nov '16
commit fe44fa5dc3e1eb5889f64114d0a8a03d144e7891
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 20:40:21 2016 +0000
Remove the Go update from Changelog
---
Bundle-Data/Docs/ChangeLog.txt | 4 ----
1 file changed, 4 deletions(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index b2a0719..0758477 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -21,10 +21,6 @@ Tor Browser 6.0.6 -- November 15
* Bug 20342: Add tor-gencert.exe to expert bundle
* OS X
* Bug 20204: Windows don't drag on macOS Sierra anymore
- * Bug 20250: Meek fails on macOS Sierra if built with Go < 1.7
- * Build system
- * All platforms
- * Bug 20023: Upgrade Go to 1.7.3
Tor Browser 6.0.5 -- September 16
* All Platforms
1
0

09 Nov '16
commit a10a5a000c5eaf294d7afc01ba4c6b9af9f67e50
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 20:38:09 2016 +0000
Revert "Upgrade Go to 1.6.3."
This reverts commit 3dee56db1330daa8df7e4d0c90d88bff17b80fec.
---
.../linux/gitian-pluggable-transports.yml | 12 ----------
.../mac/gitian-pluggable-transports.yml | 27 +++++----------------
.../windows/gitian-pluggable-transports.yml | 28 +++++-----------------
gitian/fetch-inputs.sh | 5 ++--
gitian/verify-tags.sh | 2 +-
gitian/versions | 9 ++-----
gitian/versions.alpha | 9 ++-----
gitian/versions.beta | 9 ++-----
gitian/versions.nightly | 9 ++-----
9 files changed, 23 insertions(+), 87 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-pluggable-transports.yml b/gitian/descriptors/linux/gitian-pluggable-transports.yml
index a1cdc48..38ae561 100644
--- a/gitian/descriptors/linux/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/linux/gitian-pluggable-transports.yml
@@ -46,7 +46,6 @@ files:
- "zope.interface.zip"
- "twisted.tar.bz2"
- "parsley.tar.gz"
-- "go14.tar.gz"
- "go.tar.gz"
- "dzip.sh"
- "gmp-linux32-utils.zip"
@@ -75,17 +74,6 @@ script: |
# FTE only needs libgmp.so.10 and no libgmpxx anymore.
cp $INSTDIR/gmp/lib/libgmp.so.10 $INSTDIR/Tor
- # Building go 1.4.x
- # This is needed to bootstrap the go that we actually use
- # https://golang.org/doc/install/source#go14
- tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
- cd go1.4/src
- # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
- # https://github.com/golang/go/issues/13114#issuecomment-186922245
- CGO_ENABLED=0 ./make.bash
- cd ../..
- export GOROOT_BOOTSTRAP="$PWD/go1.4"
-
# Building go
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index 33b134e..fbf38c2 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -45,7 +45,6 @@ files:
- "zope.interface.zip"
- "twisted.tar.bz2"
- "parsley.tar.gz"
-- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
@@ -104,33 +103,19 @@ script: |
export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
- # Building go 1.4.x
- # This is needed to bootstrap the go that we actually use
- # https://golang.org/doc/install/source#go14
- tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
- cd go1.4/src
- # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
- # https://github.com/golang/go/issues/13114#issuecomment-186922245
- # Disable CC etc. that are set up for cross builds.
- CGO_ENABLED=0 CC= CFLAGS= LDFLAGS= ./make.bash
- cd ../..
- export GOROOT_BOOTSTRAP="$PWD/go1.4"
-
# Building go
- # Create a cc-for-target script that closes over CC, CFLAGS, and LDFLAGS.
- # Go's CC_FOR_TARGET only allows a command name, not a command with arguments.
- # https://github.com/golang/go/issues/15457
- CC_FOR_TARGET="$(pwd)/cc-for-target"
- echo "#!/bin/sh" > "$CC_FOR_TARGET"
- echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
- chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
export GOOS=darwin
export GOARCH=386
tar xvf go.tar.gz
cd go/src
- CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
+ # http://golang.org/cmd/cgo/:
+ # "To enable cgo during cross compiling builds, set the CGO_ENABLED
+ # environment variable to 1 when building the Go tools with make.bash. Also,
+ # set CC_FOR_TARGET to the C cross compiler for the target. CC will be used
+ # for compiling for the host."
+ CGO_ENABLED=1 CC_FOR_TARGET="$CC $CFLAGS $LDFLAGS" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/descriptors/windows/gitian-pluggable-transports.yml b/gitian/descriptors/windows/gitian-pluggable-transports.yml
index 7e8a349..f073fd1 100644
--- a/gitian/descriptors/windows/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/windows/gitian-pluggable-transports.yml
@@ -47,7 +47,6 @@ files:
- "wine-wrappers"
- "python.msi"
- "py2exe.exe"
-- "go14.tar.gz"
- "go.tar.gz"
- "dzip.sh"
- "pyc-timestamp.sh"
@@ -140,34 +139,19 @@ script: |
cp -a dist/gcc.exe dist/g++.exe dist/dllwrap.exe $WINEROOT/windows/
cd ..
- # Building go 1.4.x
- # This is needed to bootstrap the go that we actually use
- # https://golang.org/doc/install/source#go14
- tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
- cd go1.4/src
- # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
- # https://github.com/golang/go/issues/13114#issuecomment-186922245
- # Disable CC etc. that are set up for cross builds.
- CGO_ENABLED=0 CC= CFLAGS= LDFLAGS= ./make.bash
- cd ../..
- export GOROOT_BOOTSTRAP="$PWD/go1.4"
-
# Building go
- CC=i686-w64-mingw32-gcc
- # Create a cc-for-target script that closes over CC, CFLAGS, and LDFLAGS.
- # Go's CC_FOR_TARGET only allows a command name, not a command with arguments.
- # https://github.com/golang/go/issues/15457
- CC_FOR_TARGET="$(pwd)/cc-for-target"
- echo "#!/bin/sh" > "$CC_FOR_TARGET"
- echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
- chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
export GOOS=windows
export GOARCH=386
tar xvf go.tar.gz
cd go/src
- CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
+ # http://golang.org/cmd/cgo/:
+ # "To enable cgo during cross compiling builds, set the CGO_ENABLED
+ # environment variable to 1 when building the Go tools with make.bash. Also,
+ # set CC_FOR_TARGET to the C cross compiler for the target. CC will be used
+ # for compiling for the host."
+ CGO_ENABLED=1 CC_FOR_TARGET="i686-w64-mingw32-gcc" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/fetch-inputs.sh b/gitian/fetch-inputs.sh
index 50daec0..b5adfc2 100755
--- a/gitian/fetch-inputs.sh
+++ b/gitian/fetch-inputs.sh
@@ -162,7 +162,7 @@ do
get "${!PACKAGE}" "${MIRROR_URL_ASN}${!PACKAGE}"
done
-for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO14 GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
+for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
do
URL="${i}_URL"
PACKAGE="${i}_PACKAGE"
@@ -174,7 +174,7 @@ wget -U "" -N ${NOSCRIPT_URL}
# Verify packages with weak or no signatures via direct sha256 check
# (OpenSSL is signed with MD5, and OSXSDK + OSXSDK_OLD are not signed at all)
-for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO14 GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
do
PACKAGE="${i}_PACKAGE"
HASH="${i}_HASH"
@@ -243,7 +243,6 @@ ln -sf "$PY2EXE_PACKAGE" py2exe.exe
ln -sf "$SETUPTOOLS_PACKAGE" setuptools.tar.gz
ln -sf "$GMP_PACKAGE" gmp.tar.bz2
ln -sf "$PARSLEY_PACKAGE" parsley.tar.gz
-ln -sf "$GO14_PACKAGE" go14.tar.gz
ln -sf "$GO_PACKAGE" go.tar.gz
ln -sf "$NSIS_PACKAGE" nsis.tar.bz2
ln -sf "$NSIS_DEBIAN_PACKAGE" nsis-debian.tar.xz
diff --git a/gitian/verify-tags.sh b/gitian/verify-tags.sh
index d95b0e0..33b54a4 100755
--- a/gitian/verify-tags.sh
+++ b/gitian/verify-tags.sh
@@ -144,7 +144,7 @@ done
# Verify packages with weak or no signatures via direct sha256 check
# (OpenSSL is signed with MD5, and OSXSDK + OSXSDK_OLD are not signed at all)
-for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO14 GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
do
PACKAGE="${i}_PACKAGE"
HASH="${i}_HASH"
diff --git a/gitian/versions b/gitian/versions
index 387b7c5..143d56d 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -60,9 +60,7 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
-GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.4.3
NSIS_VER=2.51
## File names for the source packages
@@ -85,7 +83,6 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
-GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -113,8 +110,7 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -144,7 +140,6 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
-GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index d6044ce..65acf45 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -60,9 +60,7 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
-GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.4.2
NSIS_VER=2.51
## File names for the source packages
@@ -85,7 +83,6 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
-GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -113,8 +110,7 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -144,7 +140,6 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
-GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 1ff14b8..2564e41 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -47,9 +47,7 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
-GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.4.2
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -70,7 +68,6 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
-GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
STIXMATHFONT_PACKAGE=STIXv1.1.1-latex.zip
NOTOEMOJIFONT_PACKAGE=NotoEmoji-Regular.ttf
@@ -95,8 +92,7 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
@@ -122,7 +118,6 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
-GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
STIXMATHFONT_URL=http://iweb.dl.sourceforge.net/project/stixfonts/Current%2…
NOTOEMOJIFONT_URL=https://github.com/googlei18n/noto-emoji/raw/2f1ffdd6fbbd…
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index f4475bc..781d4ae 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -67,9 +67,7 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
-GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.4.2
NSIS_VER=2.51
## File names for the source packages
@@ -92,7 +90,6 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
-GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -120,8 +117,7 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -151,7 +147,6 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
-GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
1
0

[tor-browser-bundle/maint-6.0] Revert "Bug 20023: Upgrade Go to 1.7.3."
by gk@torproject.org 09 Nov '16
by gk@torproject.org 09 Nov '16
09 Nov '16
commit 8e93f0ddb6b018c6d5a28c2063554bb5174d9c45
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 20:37:53 2016 +0000
Revert "Bug 20023: Upgrade Go to 1.7.3."
This reverts commit 4a0bf1ed2578e3e742e00f95385f914a241904fd.
---
gitian/descriptors/mac/gitian-pluggable-transports.yml | 12 +++++-------
gitian/versions | 4 ++--
gitian/versions.alpha | 4 ++--
gitian/versions.beta | 4 ++--
gitian/versions.nightly | 4 ++--
5 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index 519a3ee..33b134e 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -48,7 +48,6 @@ files:
- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
-- "MacOSX10.7.sdk.tar.gz"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
- "gmp-mac64-utils.zip"
@@ -83,8 +82,6 @@ script: |
export PATH="/usr/sbin:/sbin:$PATH"
sudo dpkg -i *.deb
tar xaf multiarch-darwin*tar.xz
- # The 10.7 SDK is needed for Go: https://bugs.torproject.org/20023#comment:6
- tar xaf MacOSX10.7.sdk.tar.gz
export PATH="$PATH:$HOME/build/apple-osx/bin/"
if [ "z$INCLUDE_FTE" = "z1" ]; then
unzip -d $INSTDIR gmp-mac64-utils.zip
@@ -102,6 +99,10 @@ script: |
export CXX=$HOME/build/apple-osx/bin/i686-apple-darwin11-g++
# http://bugs.python.org/issue9437
export LDSHARED="$CC -pthread -shared"
+ # XXX Clean up these flags?
+ export CFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
+ export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
+ export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
# Building go 1.4.x
# This is needed to bootstrap the go that we actually use
@@ -121,7 +122,7 @@ script: |
# https://github.com/golang/go/issues/15457
CC_FOR_TARGET="$(pwd)/cc-for-target"
echo "#!/bin/sh" > "$CC_FOR_TARGET"
- echo "exec $CC $CFLAGS $LDFLAGS -isysroot $HOME/build/MacOSX10.7.sdk -std=gnu99 \"\$@\"" >> "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
@@ -129,9 +130,6 @@ script: |
export GOARCH=386
tar xvf go.tar.gz
cd go/src
- # Remove a preprocessor directive that causes problems when building with the 10.7 SDK.
- # https://github.com/golang/go/issues/17732
- sed -i -e '/^#cgo CFLAGS:/s/-D__MAC_OS_X_VERSION_MAX_ALLOWED=1060//' crypto/x509/root_cgo_darwin.go
CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/versions b/gitian/versions
index 2be65b4..387b7c5 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.7.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 68be3f3..d6044ce 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.7.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.beta b/gitian/versions.beta
index e19f53b..1ff14b8 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -49,7 +49,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.7.3
+GO_VER=1.6.3
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -96,7 +96,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index 75cb02b..f4475bc 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -69,7 +69,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.7.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -121,7 +121,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
1
0

09 Nov '16
commit 7268d7b63d3a6dc8c71fbb1d5ff8892d25884019
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 18:52:10 2016 +0000
Use the tor browser build2 tag
---
gitian/versions | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gitian/versions b/gitian/versions
index c08c7be..2be65b4 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -14,7 +14,7 @@ FIREFOX_VERSION=45.5.0esr
TORBROWSER_UPDATE_CHANNEL=release
-TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-6.0-1-build1
+TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-6.0-1-build2
TOR_TAG=tor-0.2.8.9
TORLAUNCHER_TAG=0.2.9.4
TORBUTTON_TAG=1.9.5.8
1
0

[tor-browser/tor-browser-45.5.0esr-6.0-1] fixup! Bug #4234: Use the Firefox Update Process for Tor Browser.
by gk@torproject.org 09 Nov '16
by gk@torproject.org 09 Nov '16
09 Nov '16
commit f0382d95b8145b91bae099024bce64affff34523
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Nov 9 12:02:00 2016 -0500
fixup! Bug #4234: Use the Firefox Update Process for Tor Browser.
Modify the AddSymlink implementation to use absolute paths when creating
symlinks. This fixes a compile error that was introduced due to the changes
Mozilla made for https://bugzilla.mozilla.org/show_bug.cgi?id=1246972.
---
toolkit/mozapps/update/updater/updater.cpp | 47 ++++++++++++++++++------------
1 file changed, 28 insertions(+), 19 deletions(-)
diff --git a/toolkit/mozapps/update/updater/updater.cpp b/toolkit/mozapps/update/updater/updater.cpp
index 9e45698..d6d0f09 100644
--- a/toolkit/mozapps/update/updater/updater.cpp
+++ b/toolkit/mozapps/update/updater/updater.cpp
@@ -1986,9 +1986,7 @@ PatchIfFile::Finish(int status)
class AddSymlink : public Action
{
public:
- AddSymlink() : mLinkName(NULL)
- , mTarget(NULL)
- , mAdded(false)
+ AddSymlink() : mAdded(false)
{ }
virtual int Parse(NS_tchar *line);
@@ -1997,8 +1995,9 @@ public:
virtual void Finish(int status);
private:
- const NS_tchar *mLinkName;
- const NS_tchar *mTarget;
+ mozilla::UniquePtr<NS_tchar[]> mLinkPath;
+ mozilla::UniquePtr<NS_tchar[]> mRelPath;
+ mozilla::UniquePtr<NS_tchar[]> mTarget;
bool mAdded;
};
@@ -2007,26 +2006,36 @@ AddSymlink::Parse(NS_tchar *line)
{
// format "<linkname>" "target"
- mLinkName = get_valid_path(&line);
- if (!mLinkName)
+ NS_tchar * validPath = get_valid_path(&line);
+ if (!validPath)
return PARSE_ERROR;
+ mRelPath = mozilla::MakeUnique<NS_tchar[]>(MAXPATHLEN);
+ NS_tstrcpy(mRelPath.get(), validPath);
+ mLinkPath.reset(get_full_path(validPath));
+ if (!mLinkPath) {
+ return PARSE_ERROR;
+ }
+
// consume whitespace between args
NS_tchar *q = mstrtok(kQuote, &line);
if (!q)
return PARSE_ERROR;
- mTarget = get_valid_path(&line, false, true);
- if (!mTarget)
+ validPath = get_valid_path(&line, false, true);
+ if (!validPath)
return PARSE_ERROR;
+ mTarget = mozilla::MakeUnique<NS_tchar[]>(MAXPATHLEN);
+ NS_tstrcpy(mTarget.get(), validPath);
+
return OK;
}
int
AddSymlink::Prepare()
{
- LOG(("PREPARE ADDSYMLINK " LOG_S " -> " LOG_S, mLinkName, mTarget));
+ LOG(("PREPARE ADDSYMLINK " LOG_S " -> " LOG_S, mRelPath.get(), mTarget.get()));
return OK;
}
@@ -2034,26 +2043,26 @@ AddSymlink::Prepare()
int
AddSymlink::Execute()
{
- LOG(("EXECUTE ADDSYMLINK " LOG_S " -> " LOG_S, mLinkName, mTarget));
+ LOG(("EXECUTE ADDSYMLINK " LOG_S " -> " LOG_S, mRelPath.get(), mTarget.get()));
// First make sure that we can actually get rid of any existing file or link.
struct stat linkInfo;
- int rv = lstat(mLinkName, &linkInfo);
+ int rv = lstat(mLinkPath.get(), &linkInfo);
if ((0 == rv) && !S_ISLNK(linkInfo.st_mode)) {
- rv = NS_taccess(mLinkName, F_OK);
+ rv = NS_taccess(mLinkPath.get(), F_OK);
}
if (rv == 0) {
- rv = backup_create(mLinkName);
+ rv = backup_create(mLinkPath.get());
if (rv)
return rv;
} else {
- rv = ensure_parent_dir(mLinkName);
+ rv = ensure_parent_dir(mLinkPath.get());
if (rv)
return rv;
}
// Create the link.
- rv = symlink(mTarget, mLinkName);
+ rv = symlink(mTarget.get(), mLinkPath.get());
if (!rv) {
mAdded = true;
}
@@ -2064,12 +2073,12 @@ AddSymlink::Execute()
void
AddSymlink::Finish(int status)
{
- LOG(("FINISH ADDSYMLINK " LOG_S " -> " LOG_S, mLinkName, mTarget));
+ LOG(("FINISH ADDSYMLINK " LOG_S " -> " LOG_S, mRelPath.get(), mTarget.get()));
// When there is an update failure and a link has been added it is removed
// here since there might not be a backup to replace it.
if (status && mAdded)
- NS_tremove(mLinkName);
- backup_finish(mLinkName, status);
+ NS_tremove(mLinkPath.get());
+ backup_finish(mLinkPath.get(), mRelPath.get(), status);
}
#endif
1
0

[torbutton/master] Bug 20264: Change security slider to 3 options (H, M, L)
by gk@torproject.org 09 Nov '16
by gk@torproject.org 09 Nov '16
09 Nov '16
commit 6c423a9aa505882bbb7685f3175dc131baad8809
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Wed Oct 19 11:55:21 2016 -0700
Bug 20264: Change security slider to 3 options (H,M,L)
---
src/chrome/content/preferences.js | 13 ++++++++---
src/chrome/content/preferences.xul | 47 ++++++--------------------------------
src/chrome/locale/en/torbutton.dtd | 3 +--
src/modules/security-prefs.js | 19 ++++++++++-----
4 files changed, 31 insertions(+), 51 deletions(-)
diff --git a/src/chrome/content/preferences.js b/src/chrome/content/preferences.js
index 7856ef1..3bb6c0c 100644
--- a/src/chrome/content/preferences.js
+++ b/src/chrome/content/preferences.js
@@ -7,11 +7,16 @@ let { getBoolPref, getIntPref, setBoolPref, setIntPref } =
// Description elements have the follow names.
const descNames =
- [, "desc_high", "desc_medium_high", "desc_medium_low", "desc_low"];
+ [, "desc_high", "desc_medium", "desc_low"];
// A single `state` object that reflects the user settings in this UI.
let state = { slider : 0, custom : false};
+// Utility functions to convert between the legacy 4-value pref index
+// and the 3-valued security slider.
+let sliderPositionToPrefSetting = pos => [, 1, 2, 4][pos];
+let prefSettingToSliderPosition = pref => [, 1, 2, 2, 3][pref];
+
// Set the desired slider value and update UI.
function torbutton_set_slider(sliderPosition) {
state.slider = sliderPosition;
@@ -33,12 +38,14 @@ function torbutton_set_custom(customValue) {
// Read prefs 'extensions.torbutton.security_slider' and
// 'extensions.torbutton.security_custom', and initialize the UI.
function torbutton_init_security_ui() {
- torbutton_set_slider(getIntPref("extensions.torbutton.security_slider"));
+ torbutton_set_slider(prefSettingToSliderPosition(
+ getIntPref("extensions.torbutton.security_slider")));
torbutton_set_custom(getBoolPref("extensions.torbutton.security_custom"));
};
// Write the two prefs from the current settings.
function torbutton_save_security_settings() {
- setIntPref("extensions.torbutton.security_slider", state.slider);
+ setIntPref("extensions.torbutton.security_slider",
+ sliderPositionToPrefSetting(state.slider));
setBoolPref("extensions.torbutton.security_custom", state.custom);
};
diff --git a/src/chrome/content/preferences.xul b/src/chrome/content/preferences.xul
index 53abd7f..c6432e0 100644
--- a/src/chrome/content/preferences.xul
+++ b/src/chrome/content/preferences.xul
@@ -28,7 +28,7 @@
<vbox>
<hbox height="200">
<vbox>
- <scale id="torbutton_sec_slider" flex="1" min="1" max="4"
+ <scale id="torbutton_sec_slider" flex="1" min="1" max="3"
movetoclick="true" orient="vertical"
onchange="torbutton_set_slider(this.value)"/>
</vbox>
@@ -41,22 +41,15 @@
</description>
</hbox>
<hbox flex="1" align="center">
- <description id="torbutton_sec_med_high"
+ <description id="torbutton_sec_medium"
onclick="torbutton_set_slider(2);"
- tooltip="mh_preview">
- &torbutton.prefs.sec_med_high;
- </description>
- </hbox>
- <hbox flex="1" align="center">
- <description id="torbutton_sec_med_low"
- onclick="torbutton_set_slider(3);"
- tooltip="ml_preview">
- &torbutton.prefs.sec_med_low;
+ tooltip="medium_preview">
+ &torbutton.prefs.sec_medium;
</description>
</hbox>
<hbox flex="1" align="end">
<description id="torbutton_sec_low"
- onclick="torbutton_set_slider(4);"
+ onclick="torbutton_set_slider(3);"
tooltip="low_preview">
&torbutton.prefs.sec_low;
</description>
@@ -101,7 +94,7 @@
&torbutton.prefs.sec_webfonts_desc;
</description>
</vbox>
- <vbox id="desc_medium_high" collapsed="true">
+ <vbox id="desc_medium" collapsed="true">
<description
class="slider-text-size, slider-text-weight">
&torbutton.prefs.sec_gen_desc;
@@ -127,24 +120,6 @@
&torbutton.prefs.sec_font_rend_desc;
</description>
</vbox>
- <vbox id="desc_medium_low" collapsed="true">
- <description
- class="slider-text-size, slider-text-weight">
- &torbutton.prefs.sec_gen_desc;
- </description>
- <description class="slider-text-size"
- tooltiptext="&torbutton.prefs.sec_jit_desc_tooltip;">
- &torbutton.prefs.sec_some_jit_desc; &torbutton.prefs.sec_jit_slower_desc;
- </description>
- <description class="slider-text-size"
- tooltiptext="&torbutton.prefs.sec_html5_tooltip;">
- &torbutton.prefs.sec_html5_desc;
- </description>
- <description class="slider-text-size"
- tooltiptext="&torbutton.prefs.sec_mathml_desc_tooltip;">
- &torbutton.prefs.sec_mathml_desc;
- </description>
- </vbox>
<vbox id="desc_low" collapsed="false">
<description
class="slider-text-size, slider-text-weight">
@@ -185,7 +160,7 @@
<html:div>&torbutton.prefs.sec_svg_desc;</html:div>
<html:div>&torbutton.prefs.sec_webfonts_desc;</html:div>
</tooltip>
- <tooltip id="mh_preview">
+ <tooltip id="medium_preview">
<html:b>&torbutton.prefs.sec_gen_desc;</html:b>
<html:br></html:br>
<html:br></html:br>
@@ -195,14 +170,6 @@
<html:div>&torbutton.prefs.sec_mathml_desc;</html:div>
<html:div>&torbutton.prefs.sec_font_rend_desc;</html:div>
</tooltip>
- <tooltip id="ml_preview">
- <html:b>&torbutton.prefs.sec_gen_desc;</html:b>
- <html:br></html:br>
- <html:br></html:br>
- <html:div>&torbutton.prefs.sec_some_jit_desc; &torbutton.prefs.sec_jit_slower_desc;</html:div>
- <html:div>&torbutton.prefs.sec_html5_desc;</html:div>
- <html:div>&torbutton.prefs.sec_mathml_desc;</html:div>
- </tooltip>
<tooltip id="low_preview">
<html:b>&torbutton.prefs.sec_low_desc;</html:b>
<html:br></html:br>
diff --git a/src/chrome/locale/en/torbutton.dtd b/src/chrome/locale/en/torbutton.dtd
index 0c10406..97a994f 100644
--- a/src/chrome/locale/en/torbutton.dtd
+++ b/src/chrome/locale/en/torbutton.dtd
@@ -37,7 +37,6 @@
<!ENTITY torbutton.prefs.sec_low_usable_desc "This provides the most usable experience.">
<!ENTITY torbutton.prefs.sec_low_desc "At this security level, all browser features are enabled.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "The SVG OpenType font rendering mechanism is disabled.">
-<!ENTITY torbutton.prefs.sec_med_low "Medium-Low">
<!ENTITY torbutton.prefs.sec_gen_desc "At this security level, the following changes apply (mouseover for details):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video and audio media become click-to-play via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "On some sites, you might need to use the NoScript toolbar button to enable these media objects.">
@@ -47,7 +46,7 @@
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts on some sites may run slower.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML is disabled.">
-<!ENTITY torbutton.prefs.sec_med_high "Medium-High">
+<!ENTITY torbutton.prefs.sec_medium "Medium">
<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Some font rendering features are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
diff --git a/src/modules/security-prefs.js b/src/modules/security-prefs.js
index fa30aba..e6a888c 100644
--- a/src/modules/security-prefs.js
+++ b/src/modules/security-prefs.js
@@ -15,18 +15,19 @@ let log = (level, msg) => logger.log(level, msg);
// __kSecuritySettings__.
// A table of all prefs bound to the security slider, and the value
-// for each security setting.
+// for each security setting. Note that 2-m and 3-m are identical,
+// corresponding to the old 2-medium-high setting.
const kSecuritySettings = {
- // Preference name : [0, 1-high 2-mh 3-ml 4-low]
+ // Preference name : [0, 1-high 2-m 3-m 4-low]
"javascript.options.ion.content" : [, false, false, false, true ],
"javascript.options.typeinference" : [, false, false, false, true ],
"noscript.forbidMedia" : [, true, true, true, false],
"media.webaudio.enabled" : [, false, false, false, true ],
"mathml.disabled" : [, true, true, true, false],
- "javascript.options.baselinejit.content" : [, false, false, true, true ],
- "gfx.font_rendering.opentype_svg.enabled" : [, false, false, true, true ],
- "noscript.global" : [, false, false, true, true ],
- "noscript.globalHttpsWhitelist" : [, false, true, false, false],
+ "javascript.options.baselinejit.content" : [, false, false, false, true ],
+ "gfx.font_rendering.opentype_svg.enabled" : [, false, false, false, true ],
+ "noscript.global" : [, false, false, false, true ],
+ "noscript.globalHttpsWhitelist" : [, false, true, true, false],
"noscript.forbidFonts" : [, true, false, false, false],
"svg.in-content.enabled" : [, false, true, true, true ],
};
@@ -123,6 +124,12 @@ var initialize = function () {
setBoolPref(kCustomPref, false);
}
});
+ // Migrate from old medium-low (3) to new medium (2).
+ if (getBoolPref("extensions.torbutton.security_custom") === false &&
+ getIntPref("extensions.torbutton.security_slider") === 3) {
+ setIntPref("extensions.torbutton.security_slider", 2);
+ write_setting_to_prefs(2);
+ }
log(4, "security-prefs.js initialization complete");
};
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] fixup! TB3: Tor Browser's official .mozconfigs.
by gk@torproject.org 09 Nov '16
by gk@torproject.org 09 Nov '16
09 Nov '16
commit db846f717b90c587b1934c65dd973e0ba0f14acd
Author: Nicolas Vigier <boklm(a)mars-attacks.org>
Date: Tue Nov 8 17:20:36 2016 +0100
fixup! TB3: Tor Browser's official .mozconfigs.
Bug 20439: make the build PIE on OSX
---
.mozconfig-mac | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.mozconfig-mac b/.mozconfig-mac
index 96f036a..cda309a 100644
--- a/.mozconfig-mac
+++ b/.mozconfig-mac
@@ -10,7 +10,7 @@ export CC="$topsrcdir/clang/bin/clang $FLAGS"
export CXX="$topsrcdir/clang/bin/clang++ $FLAGS"
export CPP="$topsrcdir/clang/bin/clang $FLAGS -E"
export LLVMCONFIG=$topsrcdir/clang/bin/llvm-config
-export LDFLAGS="-Wl,-syslibroot,$CROSS_SYSROOT -Wl,-dead_strip"
+export LDFLAGS="-Wl,-syslibroot,$CROSS_SYSROOT -Wl,-dead_strip -Wl,-pie"
export TOOLCHAIN_PREFIX=$CROSS_CCTOOLS_PATH/bin/x86_64-apple-darwin10-
#TODO: bug 1184202 - would be nice if these could be detected with TOOLCHAIN_PREFIX automatically
export AR=${TOOLCHAIN_PREFIX}ar
1
0

09 Nov '16
commit 565f2cc6e5c8e496bc50f03defa98947e24c93c4
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Tue Nov 8 17:32:00 2016 +0100
Bug 20439: make the build PIE on OSX
---
gitian/descriptors/mac/gitian-firefox.yml | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/gitian/descriptors/mac/gitian-firefox.yml b/gitian/descriptors/mac/gitian-firefox.yml
index 7461031..aae6139 100644
--- a/gitian/descriptors/mac/gitian-firefox.yml
+++ b/gitian/descriptors/mac/gitian-firefox.yml
@@ -40,6 +40,23 @@ script: |
tar xaf ../MacOSX10.7.sdk.tar.gz
tar xaf ../cctools.tar.gz
unzip ../clang-linux64-wheezy-utils.zip
+ # Bug 20439: build with PIE
+ # If we add -fPIE to the FLAGS, the build fails in js/src/ctypes/libffi
+ # with libtool giving an error:
+ # libtool: compile: unable to infer tagged configuration
+ # To avoid this error, we add -fPIE using wrappers on clang and clang++
+ mv clang/bin/clang clang/bin/clang.real
+ mv clang/bin/clang++ clang/bin/clang++.real
+ cat > clang/bin/clang << EOF
+ #!/bin/sh
+ exec $(pwd)/clang/bin/clang.real -fPIE "\$@"
+ EOF
+ cat > clang/bin/clang++ << EOF
+ #!/bin/sh
+ exec $(pwd)/clang/bin/clang++.real -fPIE "\$@"
+ EOF
+ chmod +x clang/bin/clang clang/bin/clang++
+ #
TB_COMMIT_DATE=$(git show -s --format='%ci')
COPYRIGHT_YEAR=${TB_COMMIT_DATE%%-*}
mv .mozconfig-mac .mozconfig
1
0

[tor-browser-bundle/hardened-builds] Bug 20186: extract mar tools when creating update responses
by gk@torproject.org 09 Nov '16
by gk@torproject.org 09 Nov '16
09 Nov '16
commit 3b26471de9544deaf9b34ed5e351a2f7ef9b5f3c
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Tue Nov 8 22:54:47 2016 +0100
Bug 20186: extract mar tools when creating update responses
After #19528, we are using mar tools when creating update responses.
---
tools/update-responses/update_responses | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index 9d9cce2..1064a01 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -580,6 +580,7 @@ my %actions = (
unless $config->{channels}{$channel};
$htdocsfiles{$channel} = { '.' => 1, '..' => 1 };
}
+ extract_martools;
write_responses($config, @channels);
write_htaccess($config, @channels);
write_downloads_json($config, @channels);
1
0

[tor-browser-bundle/master] Bug 20186: extract mar tools when creating update responses
by gk@torproject.org 09 Nov '16
by gk@torproject.org 09 Nov '16
09 Nov '16
commit 03c0e4bb0fd295e16a72d755a52e74c7e73ce965
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Tue Nov 8 22:54:47 2016 +0100
Bug 20186: extract mar tools when creating update responses
After #19528, we are using mar tools when creating update responses.
---
tools/update-responses/update_responses | 1 +
1 file changed, 1 insertion(+)
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index 5f8eb36..fd59132 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -590,6 +590,7 @@ my %actions = (
unless $config->{channels}{$channel};
$htdocsfiles{$channel} = { '.' => 1, '..' => 1 };
}
+ extract_martools;
write_responses($config, @channels);
write_htaccess($config, @channels);
write_downloads_json($config, @channels);
1
0

[tor-browser-bundle/hardened-builds] Bug 20612: fix path to application.ini
by gk@torproject.org 09 Nov '16
by gk@torproject.org 09 Nov '16
09 Nov '16
commit 7b0f893e548f7dc0090d22ccfa58e06940adc61c
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Tue Nov 8 23:10:23 2016 +0100
Bug 20612: fix path to application.ini
---
tools/update-responses/update_responses | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index bef5615..9d9cce2 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -255,7 +255,7 @@ sub get_buildinfos {
$appfile = "$tmpdir/Contents/Resources/application.ini"
if -f "$tmpdir/Contents/Resources/application.ini";
exit_error "Could not find application.ini" unless $appfile;
- foreach my $line (read_file("$tmpdir/application.ini")) {
+ foreach my $line (read_file($appfile)) {
if ($line =~ m/^BuildID=(.*)$/) {
$config->{versions}{$version}{buildID} = $1;
return;
1
0

09 Nov '16
commit 418f5d66e9d064530b1a4d7ce5a96b03980ea14f
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Tue Nov 8 23:10:23 2016 +0100
Bug 20612: fix path to application.ini
---
tools/update-responses/update_responses | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index a89a18a..5f8eb36 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -265,7 +265,7 @@ sub get_buildinfos {
$appfile = "$tmpdir/Contents/Resources/application.ini"
if -f "$tmpdir/Contents/Resources/application.ini";
exit_error "Could not find application.ini" unless $appfile;
- foreach my $line (read_file("$tmpdir/application.ini")) {
+ foreach my $line (read_file($appfile)) {
if ($line =~ m/^BuildID=(.*)$/) {
$config->{versions}{$version}{buildID} = $1;
return;
1
0
commit 84c39a83d62b1b62ca03200099bd61dd46c38b42
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 11:10:02 2016 +0000
Update tor signing key
---
gitian/gpg/tor.gpg | Bin 14432 -> 21817 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/gitian/gpg/tor.gpg b/gitian/gpg/tor.gpg
index 319a9a6..51eeb40 100644
Binary files a/gitian/gpg/tor.gpg and b/gitian/gpg/tor.gpg differ
1
0

09 Nov '16
commit f2de25fe6365b0d4f0fbbfdf78bd1f5593756ee7
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 10:46:38 2016 +0000
Add bug number for Go update
---
Bundle-Data/Docs/ChangeLog.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index f2eddea..b2a0719 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -24,7 +24,7 @@ Tor Browser 6.0.6 -- November 15
* Bug 20250: Meek fails on macOS Sierra if built with Go < 1.7
* Build system
* All platforms
- * Upgrade Go to 1.7.3
+ * Bug 20023: Upgrade Go to 1.7.3
Tor Browser 6.0.5 -- September 16
* All Platforms
1
0

09 Nov '16
commit 75de6487f7aa4ce7b3feb90e39933ddd424c7d1f
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 10:44:59 2016 +0000
Release preparations for 6.0.6
Changelog update, versions bumps, and config.yml update
---
Bundle-Data/Docs/ChangeLog.txt | 28 ++++++++++++++++++++++++++++
gitian/versions | 10 +++++-----
tools/update-responses/config.yml | 10 +++++-----
3 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index ecb6572..f2eddea 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,31 @@
+Tor Browser 6.0.6 -- November 15
+ * All Platforms
+ * Update Firefox to 45.5.0esr
+ * Update Tor to 0.2.8.9
+ * Update OpenSSL to 1.0.1u
+ * Update Torbutton to 1.9.5.8
+ * Bug 20414: Add donation banner on about:tor for 2016 campaign
+ * Translation updates
+ * Update Tor Launcher to 0.2.9.4
+ * Bug 20429: Do not open progress window if tor doesn't get started
+ * Bug 19646: Wrong location for meek browser profile on OS X
+ * Update HTTPS-Everywhere to 5.2.7
+ * Update meek to 0.25
+ * Bug 19646: Wrong location for meek browser profile on OS X
+ * Bug 20030: Shut down meek-http-helper cleanly if built with Go > 1.5.4
+ * Bug 19838: Add dgoulet's bridge and add another one commented out
+ * Bug 20296: Rotate ports again for default obfs4 bridges
+ * Bug 19735: Switch default search engine to DuckDuckGo
+ * Bug 20118: Don't unpack HTTPS Everywhere anymore
+ * Windows
+ * Bug 20342: Add tor-gencert.exe to expert bundle
+ * OS X
+ * Bug 20204: Windows don't drag on macOS Sierra anymore
+ * Bug 20250: Meek fails on macOS Sierra if built with Go < 1.7
+ * Build system
+ * All platforms
+ * Upgrade Go to 1.7.3
+
Tor Browser 6.0.5 -- September 16
* All Platforms
* Update Firefox to 45.4.0esr
diff --git a/gitian/versions b/gitian/versions
index 92d7125..c08c7be 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -10,15 +10,15 @@ DATA_OUTSIDE_APP_DIR=1
VERIFY_TAGS=1
-FIREFOX_VERSION=45.4.0esr
+FIREFOX_VERSION=45.5.0esr
TORBROWSER_UPDATE_CHANNEL=release
TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-6.0-1-build1
-TOR_TAG=tor-0.2.8.7
-TORLAUNCHER_TAG=0.2.9.3
-TORBUTTON_TAG=1.9.5.7
-HTTPSE_TAG=5.2.4
+TOR_TAG=tor-0.2.8.9
+TORLAUNCHER_TAG=0.2.9.4
+TORBUTTON_TAG=1.9.5.8
+HTTPSE_TAG=5.2.7
NSIS_TAG=v0.3.1
ZLIB_TAG=v1.2.8
LIBEVENT_TAG=release-2.0.22-stable
diff --git a/tools/update-responses/config.yml b/tools/update-responses/config.yml
index d81d102..4d21f0e 100644
--- a/tools/update-responses/config.yml
+++ b/tools/update-responses/config.yml
@@ -16,13 +16,13 @@ build_targets:
osx64: Darwin_x86_64-gcc3
channels:
alpha: 6.5a2
- release: 6.0.5
+ release: 6.0.6
versions:
- 6.0.5:
- platformVersion: 45.4.0
- detailsURL: https://blog.torproject.org/blog/tor-browser-605-released
+ 6.0.6:
+ platformVersion: 45.5.0
+ detailsURL: https://blog.torproject.org/blog/tor-browser-606-released
incremental_from:
- - 6.0.4
+ - 6.0.5
migrate_archs:
osx32: osx64
osx32:
1
0
commit d1dffb97cc79a1a25b70a81c51135a3672f39aed
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 10:38:33 2016 +0000
Release preparations for 1.9.5.8
Version bump and changelog update
---
src/CHANGELOG | 4 ++++
src/install.rdf | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index 93eddba..0965a4a 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -1,3 +1,7 @@
+1.9.5.8
+ * Bug 20414: Add donation banner on about:tor for 2016 campaign
+ * Translation updates
+
1.9.5.7
* Bug 18589: Clear site security settings during New Identity
* Bug 19906: "Maximizing Tor Browser" Notification can exist multiple times
diff --git a/src/install.rdf b/src/install.rdf
index 0d1f843..840997a 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry</em:creator>
<em:id>torbutton(a)torproject.org</em:id>
- <em:version>1.9.5.7</em:version>
+ <em:version>1.9.5.8</em:version>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html.en</em:homepageURL>
<em:optionsURL>chrome://torbutton/content/preferences.xul</em:optionsURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0
commit 94e5cfa96ed3ce4a3172efcbda8638e280de637e
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 10:34:02 2016 +0000
Update Translations
---
src/chrome/locale/ar/aboutTor.properties | 7 +++++++
src/chrome/locale/de/aboutTor.properties | 7 +++++++
src/chrome/locale/es/aboutTor.properties | 7 +++++++
src/chrome/locale/eu/aboutTor.properties | 7 +++++++
src/chrome/locale/fa/aboutTor.properties | 7 +++++++
src/chrome/locale/fr/aboutTor.properties | 7 +++++++
src/chrome/locale/it/aboutTor.properties | 7 +++++++
src/chrome/locale/ja/aboutTor.properties | 7 +++++++
src/chrome/locale/ko/aboutTor.properties | 7 +++++++
src/chrome/locale/nl/aboutTor.properties | 7 +++++++
src/chrome/locale/pl/aboutTor.properties | 7 +++++++
src/chrome/locale/pt/aboutTor.properties | 7 +++++++
src/chrome/locale/ru/aboutTor.properties | 7 +++++++
src/chrome/locale/sv/aboutTor.properties | 7 +++++++
src/chrome/locale/tr/aboutTor.properties | 7 +++++++
src/chrome/locale/vi/aboutTor.properties | 7 +++++++
src/chrome/locale/zh-CN/aboutTor.properties | 7 +++++++
17 files changed, 119 insertions(+)
diff --git a/src/chrome/locale/ar/aboutTor.properties b/src/chrome/locale/ar/aboutTor.properties
index d607324..76192f4 100644
--- a/src/chrome/locale/ar/aboutTor.properties
+++ b/src/chrome/locale/ar/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/de/aboutTor.properties b/src/chrome/locale/de/aboutTor.properties
index b7fc4bf..cb7a1fe 100644
--- a/src/chrome/locale/de/aboutTor.properties
+++ b/src/chrome/locale/de/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%1$S">Sicheres</a> Suchen mit <a href="%2$S">
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Jetzt spenden!
+aboutTor.donationBanner.heart=Tor ist am Herz der Internetfreiheit
+aboutTor.donationBanner.tagline1=Millionen von Menschen verlassen sich auf Tor für Online-Sicherheit & Datenschutz
+aboutTor.donationBanner.tagline2=Ein Netzwerk von Menschen, die Menschen schützen
+aboutTor.donationBanner.tagline3=Überwachung = Unterdrückung
+aboutTor.donationBanner.tagline4=Schutz von Journalisten, Aktivisten und Hinweisgebern seit 2006
diff --git a/src/chrome/locale/es/aboutTor.properties b/src/chrome/locale/es/aboutTor.properties
index fb92251..fe998a0 100644
--- a/src/chrome/locale/es/aboutTor.properties
+++ b/src/chrome/locale/es/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Busque <a href="%1$S">de forma segura</a> con <a href=
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=¡Done ahora!
+aboutTor.donationBanner.heart=Tor está en el corazón de la libertad en Internet
+aboutTor.donationBanner.tagline1=Millones de personas dependen de Tor para la seguridad y la privacidad en línea
+aboutTor.donationBanner.tagline2=Una red de personas protegiendo a personas
+aboutTor.donationBanner.tagline3=Vigilancia = Opresión
+aboutTor.donationBanner.tagline4=Protegiendo a periodistas, activistas e informantes desde 2006
diff --git a/src/chrome/locale/eu/aboutTor.properties b/src/chrome/locale/eu/aboutTor.properties
index 30a7858..81d4c44 100644
--- a/src/chrome/locale/eu/aboutTor.properties
+++ b/src/chrome/locale/eu/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Bilatu<a href="%1$S">modu seguruan</a> ondokoarekin: <
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/fa/aboutTor.properties b/src/chrome/locale/fa/aboutTor.properties
index 54e04d9..a591490 100644
--- a/src/chrome/locale/fa/aboutTor.properties
+++ b/src/chrome/locale/fa/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=جستجو <a href="%1$S">ایمن</a> با <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=اکنون اهداء کنید!
+aboutTor.donationBanner.heart=تور هست در قلب آزادی اینترنت
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=یک شبکه از مردم برای حفاظت از مردم
+aboutTor.donationBanner.tagline3=نظارت = ستم
+aboutTor.donationBanner.tagline4=حفاظت از روزنامه نگاران، فعالان و افشاگران از سال 2006
diff --git a/src/chrome/locale/fr/aboutTor.properties b/src/chrome/locale/fr/aboutTor.properties
index ec59d81..5842c54 100644
--- a/src/chrome/locale/fr/aboutTor.properties
+++ b/src/chrome/locale/fr/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Rechercher <a href="%1$S">de manière sécurisée</a>
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/it/aboutTor.properties b/src/chrome/locale/it/aboutTor.properties
index db49b15..58592a6 100644
--- a/src/chrome/locale/it/aboutTor.properties
+++ b/src/chrome/locale/it/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Cerca <a href="%1$S"> in sicurezza </a> con <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Dona ora!
+aboutTor.donationBanner.heart=Tor è al centro della libertà di Internet
+aboutTor.donationBanner.tagline1=Milioni di persone dipendono da Tor per la loro Sicurezza e Privacy online
+aboutTor.donationBanner.tagline2=Una rete di persone a protezione delle persone
+aboutTor.donationBanner.tagline3=Sorveglianza = Oppressione
+aboutTor.donationBanner.tagline4=Proteggiamo giornalisti, attivisti e informatori dal 2006
diff --git a/src/chrome/locale/ja/aboutTor.properties b/src/chrome/locale/ja/aboutTor.properties
index ed1ecc6..317071d 100644
--- a/src/chrome/locale/ja/aboutTor.properties
+++ b/src/chrome/locale/ja/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%2$S">Disconnect.me</a>で<a href="%1$S">安
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/ko/aboutTor.properties b/src/chrome/locale/ko/aboutTor.properties
index 69c53da..0f526d8 100644
--- a/src/chrome/locale/ko/aboutTor.properties
+++ b/src/chrome/locale/ko/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%2$S">Diconnect.me</a>를 통해 <a href="%1$
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/nl/aboutTor.properties b/src/chrome/locale/nl/aboutTor.properties
index 63c49fa..83c190a 100644
--- a/src/chrome/locale/nl/aboutTor.properties
+++ b/src/chrome/locale/nl/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%1$S">Veilig</a> zoeken met <a href="%2$S">Di
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Doneer nu!
+aboutTor.donationBanner.heart=Tor staat aan de basis van internetvrijheid
+aboutTor.donationBanner.tagline1=Miljoenen mensen hangen af van Tor voor online veiligheid en privacy
+aboutTor.donationBanner.tagline2=Een netwerk van mensen die mensen beschermen
+aboutTor.donationBanner.tagline3=Afluisteren = onderdrukken
+aboutTor.donationBanner.tagline4=Beschermt journalisten, activisten en klokkenluiders sinds 2006
diff --git a/src/chrome/locale/pl/aboutTor.properties b/src/chrome/locale/pl/aboutTor.properties
index 9bf0dcd..5a66e6a 100644
--- a/src/chrome/locale/pl/aboutTor.properties
+++ b/src/chrome/locale/pl/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Szukaj <a href="%1$S">bezpiecznie</a> używając wyszu
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/pt/aboutTor.properties b/src/chrome/locale/pt/aboutTor.properties
index 7bf9d5d..f9b6dbf 100644
--- a/src/chrome/locale/pt/aboutTor.properties
+++ b/src/chrome/locale/pt/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Procurar com <a href="%1$S">segurança</a> com <a href
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/ru/aboutTor.properties b/src/chrome/locale/ru/aboutTor.properties
index 07d591c..4d33808 100644
--- a/src/chrome/locale/ru/aboutTor.properties
+++ b/src/chrome/locale/ru/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Ищите <a href="%1$S">конфиденциальн
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/sv/aboutTor.properties b/src/chrome/locale/sv/aboutTor.properties
index fafe44a..3b0ddcd 100644
--- a/src/chrome/locale/sv/aboutTor.properties
+++ b/src/chrome/locale/sv/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Sök <a href="%1$S">säkert</a> med <a href="%2$S">Dis
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donera nu!
+aboutTor.donationBanner.heart=Tor är i centrum av internetfrihet
+aboutTor.donationBanner.tagline1=Miljoner av människor använder Tor för onlinesäkerhet och integritet
+aboutTor.donationBanner.tagline2=Ett nätverk av folk som skyddar folk
+aboutTor.donationBanner.tagline3=Övervakning = Förtryck
+aboutTor.donationBanner.tagline4=Skyddar journalister, aktivister och visselblåsare sedan 2006
diff --git a/src/chrome/locale/tr/aboutTor.properties b/src/chrome/locale/tr/aboutTor.properties
index 686b883..322cc2e 100644
--- a/src/chrome/locale/tr/aboutTor.properties
+++ b/src/chrome/locale/tr/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%2$S">Disconnect.me</a> kullanarak <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Bağış Yapın
+aboutTor.donationBanner.heart=Tor İnternet özgürlüğünün kalbinde yer alır
+aboutTor.donationBanner.tagline1=Milyonlarda İnsan Çevrimiçi Güvenlik ve Gizlilik Sağlamak için Tor Kullanıyor
+aboutTor.donationBanner.tagline2=İnsanları İnsanlardan Koruyan Bir Ağ
+aboutTor.donationBanner.tagline3=İzleme = Baskı
+aboutTor.donationBanner.tagline4=2006 Yılından Beri Gazeteci, Aktivist ve Yolsuzluk Açıklayanları Koruyor
diff --git a/src/chrome/locale/vi/aboutTor.properties b/src/chrome/locale/vi/aboutTor.properties
index d607324..bd634f6 100644
--- a/src/chrome/locale/vi/aboutTor.properties
+++ b/src/chrome/locale/vi/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Tài trợ ngay bây giờ!
+aboutTor.donationBanner.heart=Tor đang ở trái tim của sự tự do trên Internet
+aboutTor.donationBanner.tagline1=Hàng triệu người tin vào Tor vì an ninh trực tuyến và sự riêng tư
+aboutTor.donationBanner.tagline2=Một mạng lưới của những người đang bảo vệ người
+aboutTor.donationBanner.tagline3=Sự giám sát = Sự đàn áp
+aboutTor.donationBanner.tagline4=Đang bảo vệ các nhà báo, nhà hoạt động & những người thổi còi từ năm 2006
diff --git a/src/chrome/locale/zh-CN/aboutTor.properties b/src/chrome/locale/zh-CN/aboutTor.properties
index 39dbd19..4d017c3 100644
--- a/src/chrome/locale/zh-CN/aboutTor.properties
+++ b/src/chrome/locale/zh-CN/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=使用<a href="%2$S">Disconnect.me</a><a href="%1$S">
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=立即捐助!
+aboutTor.donationBanner.heart=Tor 是互联网自由的核心
+aboutTor.donationBanner.tagline1=数百万人依靠 Tor 安全、私密地上网
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
1
0

09 Nov '16
commit f5b70b5a4d5f5fd8db9acb74d62c3cc1b86f3ee2
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Tue Nov 8 09:22:31 2016 -0800
Bug 20414.2: Tor Donation Banner 2016
---
src/chrome/content/aboutTor/aboutTor.xhtml | 26 +-
src/chrome/content/aboutTor/donation_banner.js | 184 ++
src/chrome/content/aboutTor/onion-heart.svg | 142 ++
src/chrome/content/aboutTor/tor-roots-only.svg | 2716 ++++++++++++++++++++++++
src/chrome/skin/donation_banner.css | 148 ++
5 files changed, 3215 insertions(+), 1 deletion(-)
diff --git a/src/chrome/content/aboutTor/aboutTor.xhtml b/src/chrome/content/aboutTor/aboutTor.xhtml
index dbb8a89..1ecae65 100644
--- a/src/chrome/content/aboutTor/aboutTor.xhtml
+++ b/src/chrome/content/aboutTor/aboutTor.xhtml
@@ -21,6 +21,8 @@
<title>&aboutTor.title;</title>
<link rel="stylesheet" type="text/css" media="all"
href="chrome://torbutton/skin/aboutTor.css"/>
+ <link rel="stylesheet" type="text/css" media="all"
+ href="chrome://torbutton/skin/donation_banner.css"/>
<script type="text/javascript;version=1.7">
<![CDATA[
function onLoad()
@@ -164,6 +166,28 @@ window.addEventListener("pageshow", function() {
</script>
</head>
<body dir="&locale.dir;" onload="onLoad();">
+ <div id="banner" class="onions-bg">
+ <div id="banner-contents-container">
+ <div id="banner-logo-container">
+ <img id="banner-logo" alt="Tor Onion-Heart Logo"
+ src="chrome://torbutton/content/aboutTor/onion-heart.svg"/>
+ </div>
+ <div id="banner-text">
+ <div id="banner-tagline"><span></span></div>
+ <div id="banner-heart"><span></span></div>
+ </div>
+ <a id="banner-donate-button-link"
+ href="https://www.torproject.org/donate/donate-tbb">
+ <div id="banner-donate-button-container">
+ <div id="banner-donate-button">
+ <div id="banner-donate-button-text"></div>
+ <div id="banner-donate-button-arrow"></div>
+ </div>
+ </div>
+ </a>
+ </div>
+ </div>
+ <div id="banner-spacer"></div>
<div id="torstatus" class="top">
<div id="torstatus-version"/>
<div id="torstatus-image"/>
@@ -237,6 +261,6 @@ window.addEventListener("pageshow", function() {
<p>&aboutTor.footer.label;
<a href="&aboutTor.learnMore.link;">&aboutTor.learnMore.label;</a></p>
</div>
-
+ <script src="chrome://torbutton/content/aboutTor/donation_banner.js"></script>
</body>
</html>
diff --git a/src/chrome/content/aboutTor/donation_banner.js b/src/chrome/content/aboutTor/donation_banner.js
new file mode 100644
index 0000000..1087815
--- /dev/null
+++ b/src/chrome/content/aboutTor/donation_banner.js
@@ -0,0 +1,184 @@
+/* jshint esnext:true */
+
+// A list of locales for which the banner has been translated.
+let kBannerLocales = [
+ "de",
+ "en",
+ "es",
+ "fa",
+ "it",
+ "nl",
+ "vi",
+ "zh",
+];
+
+// A list of donation page locales (at least redirects should exist).
+let kDonationPageLocales = [
+ "ar",
+ "de",
+ "en",
+ "es",
+ "fa",
+ "fr",
+ "it",
+ "ja",
+ "ko",
+ "nl",
+ "pl",
+ "pt",
+ "ru",
+ "tr",
+ "vi",
+ "zh",
+];
+
+let kPropertiesURL = "chrome://torbutton/locale/aboutTor.properties";
+Components.utils.import("resource://gre/modules/Services.jsm");
+let gStringBundle = Services.strings.createBundle(kPropertiesURL);
+let kBrowserLocale = Services.prefs.getCharPref("general.useragent.locale");
+let kBrowserLocaleShort = kBrowserLocale.match(/[a-zA-Z]+/)[0].toLowerCase();
+
+let sel = selector => document.querySelector(selector);
+
+// Check if we should show the banner, depends on
+// browser locale, current date, and how many times
+// we have already shown the banner.
+let shouldShowBanner = function () {
+ try {
+ // Don't show a banner if update is needed.
+ let updateNeeded = Services.prefs.getBoolPref("extensions.torbutton.updateNeeded");
+ if (updateNeeded) {
+ return false;
+ }
+ // Only show banner when we have that locale and if a donation redirect exists.
+ if (kBannerLocales.indexOf(kBrowserLocaleShort) === -1 ||
+ kDonationPageLocales.indexOf(kBrowserLocaleShort) === -1) {
+ return false;
+ }
+ // Only show banner between 2016 Nov 15 and 2017 Jan 25.
+ let now = new Date();
+ let start = new Date(2016, 10, 15);
+ let end = new Date(2017, 0, 26);
+ let shownCountPref = "extensions.torbutton.donation_banner2016.shown_count";
+ if (now < start || now > end) {
+ // Clean up pref if not in use.
+ Services.prefs.clearUserPref(shownCountPref);
+ return false;
+ }
+ // Only show banner 10 times.
+ let count = 0;
+ if (Services.prefs.prefHasUserValue(shownCountPref)) {
+ count = Services.prefs.getIntPref(shownCountPref);
+ }
+ if (count >= 10) {
+ return false;
+ }
+ Services.prefs.setIntPref(shownCountPref, count+1);
+ return true;
+ } catch (e) {
+ return false;
+ }
+};
+
+// Shrink the font size if the text in the given element is overflowing.
+let fitTextInElement = function (element) {
+ element.style.fontSize = "8px";
+ let defaultWidth = element.scrollWidth,
+ defaultHeight = element.scrollHeight;
+ for (let testSize = 8; testSize <= 40; testSize += 0.5) {
+ element.style.fontSize = `${testSize}px`;
+ if (element.scrollWidth <= defaultWidth &&
+ element.scrollHeight <= defaultHeight) {
+ bestSize = testSize;
+ } else {
+ break;
+ }
+ }
+ element.style.fontSize = `${bestSize}px`;
+};
+
+// Increase padding at left and right to "squeeze" text, until it gets
+// squeezed so much that it gets longer vertically.
+let avoidWidows = function (element) {
+ element.style.paddingLeft = "0px";
+ element.style.paddingRight = "0px";
+ let originalWidth = element.scrollWidth;
+ let originalHeight = element.scrollHeight;
+ for (let testPadding = 0; testPadding < originalWidth / 2; testPadding += 0.5) {
+ element.style.paddingLeft = element.style.paddingRight = `${testPadding}px`;
+ if (element.scrollHeight <= originalHeight) {
+ bestPadding = testPadding;
+ } else {
+ break;
+ }
+ }
+ element.style.paddingLeft = element.style.paddingRight = `${bestPadding}px`;
+};
+
+// Resize the text inside banner to fit.
+let updateTextSizes = function () {
+ fitTextInElement(sel("#banner-tagline"));
+ fitTextInElement(sel("#banner-heart"));
+ fitTextInElement(sel("#banner-donate-button"));
+ avoidWidows(sel("#banner-tagline span"));
+};
+
+// Read the tagline with the given index.
+let getTagline = index => gStringBundle.GetStringFromName(
+ "aboutTor.donationBanner.tagline" + (index + 1));
+
+// Returns a random integer x, such that 0 <= x < max
+let randomInteger = max => Math.floor(max * Math.random());
+
+
+// The main donation banner function.
+let runDonationBanner = function () {
+ try {
+ if (!shouldShowBanner()) {
+ return;
+ }
+ sel("#banner-tagline span").innerText = getTagline(randomInteger(4));
+ sel("#banner-heart span").innerText =
+ gStringBundle.GetStringFromName("aboutTor.donationBanner.heart");
+ sel("#banner-donate-button-text").innerHTML =
+ gStringBundle.GetStringFromName("aboutTor.donationBanner.donate");
+ sel("#banner-donate-button-arrow").innerHTML = "▶";
+ sel("#banner").style.display = "flex";
+ sel("#banner-spacer").style.display = "block";
+ addEventListener("resize", updateTextSizes);
+ updateTextSizes();
+ // Add a suffix corresponding to locale so we can send user
+ // to a correctly-localized donation page via redirect.
+ sel("#banner-donate-button-link").href += "-" + kBrowserLocaleShort;
+ sel("#torstatus-image").style.display = "none";
+ } catch (e) {
+ // Something went wrong.
+ console.error(e.message);
+ sel("#banner").style.display = "none";
+ sel("#bannerSpacer").style.display = "none";
+ sel("#torstatus-image").style.display = "block";
+ }
+};
+
+// Calls callback(attributeValue) when the specified attribute changes on
+// target. Returns a zero-arg function that stops observing.
+let observeAttribute = function (target, attributeName, callback) {
+ let observer = new MutationObserver(mutations => {
+ mutations.forEach(mutation => {
+ if (mutation.type === "attributes" &&
+ mutation.attributeName === attributeName) {
+ callback(target.getAttribute(attributeName));
+ }
+ });
+ });
+ observer.observe(document.body, { attributes: true });
+ return () => observer.disconnect();
+};
+
+// Start the donation banner if "toron" has been set to "yes".
+let stopObserving = observeAttribute(document.body, "toron", value => {
+ stopObserving();
+ if (value === "yes") {
+ runDonationBanner();
+ }
+});
diff --git a/src/chrome/content/aboutTor/onion-heart.svg b/src/chrome/content/aboutTor/onion-heart.svg
new file mode 100644
index 0000000..300002a
--- /dev/null
+++ b/src/chrome/content/aboutTor/onion-heart.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg3004"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="399.96011"
+ height="574.18964"
+ xml:space="preserve"
+ sodipodi:docname="tor_onion-heart-no-roots.svg"><metadata
+ id="metadata3010"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3008"><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3730"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path3732"
+ inkscape:connector-curvature="0" /></clipPath><linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(48.064392,308.5928,-308.5928,48.064392,538.70312,416.25879)"
+ spreadMethod="pad"
+ id="linearGradient4548"><stop
+ style="stop-opacity:1;stop-color:#533c5f"
+ offset="0"
+ id="stop4550" /><stop
+ style="stop-opacity:1;stop-color:#c3a1cc"
+ offset="1"
+ id="stop4552" /></linearGradient><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4560"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path4562"
+ inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview3006"
+ showgrid="false"
+ inkscape:zoom="0.20512821"
+ inkscape:cx="191.66224"
+ inkscape:cy="225.57375"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="g3012"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><g
+ id="g3012"
+ inkscape:groupmode="layer"
+ inkscape:label="tor_onion-heart-tat_k"
+ transform="matrix(1.25,0,0,-1.25,-393.33776,933.61587)"><g
+ id="g5498"><g
+ transform="translate(467.2668,636.4615)"
+ id="g4534"><path
+ inkscape:connector-curvature="0"
+ id="path4536"
+ style="fill:#fefbde;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 38.336,-23.387 c -1.623,-10.421 -7.42,-42.074 -2.365,-52.467 54.488,-98.402 15.611,-272.581 -55.594,-266.116 -107.359,16.723 -136.943,96.034 -126.502,163.069 9.521,61.129 89.133,90.349 138.523,119.652 C 5.023,-51.257 6.441,-29.463 0,0" /></g><g
+ transform="translate(-11.7,-132.6)"
+ id="g4538"><g
+ id="g4540"><g
+ id="g4546"><path
+ inkscape:connector-curvature="0"
+ id="path4554"
+ style="fill:url(#linearGradient4548);stroke:none"
+ d="m 515.125,691.615 c 14.398,-33.193 21.002,-61.614 23.349,-92.216 l 0,0 c 5.282,-78.024 -18.683,-145.076 -69.431,-171.68 l 0,0 c 82.295,-22.068 194.019,58 153.076,169.678 l 0,0 c -11.436,31.663 -47.526,67.164 -86.427,100.616 l 0,0 c -8.858,7.069 -7.588,28.931 -4.684,38.436 l 0,0 -13.594,9.835 c -2.5,-20.602 -8.252,-38.547 -2.289,-54.669" /></g></g></g><g
+ transform="translate(539.4914,722.0167)"
+ id="g4564"><path
+ inkscape:connector-curvature="0"
+ id="path4566"
+ style="fill:#acce45;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="M 0,0 -20.238,-47.718 C 2.938,-15.399 35.18,6.613 71.105,24.853 43.215,1.096 17.408,-22.991 -0.063,-48.373 27.033,-20.575 59.609,-7.864 95.082,-1.648 44.057,-34.611 1.818,-71.932 -31.735,-110.53 l -20.071,12.731 C -42.881,-64.259 -24.406,-31.065 0,0" /></g><g
+ transform="translate(610.6633,746.8927)"
+ id="g4568"><path
+ inkscape:connector-curvature="0"
+ id="path4570"
+ style="fill:#4f7944;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c -18.732,-14.643 -51.215,-40.396 -70.211,-64.362 -16.199,-20.443 -28.023,-39.03 -34.963,-51.689 -4.435,-8.1 -16.986,-6.057 -11.148,7.569 0.06,0.134 0.131,0.231 0.189,0.368 6.617,10.675 16.436,25.483 25.996,38.372 l 18.924,44.909 c -8.81,-18.827 -19.836,-35.509 -28.074,-55.15 0.006,0 -12.072,-19.051 -15.252,-23.871 -1.08,-1.638 -2.02,-3.232 -2.857,-4.727 -0.055,-0.094 -0.12,-0.144 -0.17,-0.239 -1.356,-2.085 -2.416,-4.43 -3.268,-6.515 -0.141,-0.342 -0.145,-0.56 -0.27,-0.887 -1.146,-2.966 -1.884,-5.274 -1.884,-5.274 3.131,-3.687 19.793,-14.219 19.793,-14.219 33.797,38.847 76.142,76.218 127.17,109.18 C -11.502,-32.75 -44.096,-45.426 -71.191,-73.223 -53.719,-47.841 -27.889,-23.757 0,0" /></g><g
+ transform="translate(504.0246,614.7198)"
+ id="g4572"><path
+ inkscape:connector-curvature="0"
+ id="path4574"
+ style="fill:#364733;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="M 0,0 3.443,-3.542 C 37.24,35.305 79.586,72.676 130.613,105.638 101.641,88.618 62.617,65.032 45.039,48.176 22.799,26.855 37.211,47.893 37.211,47.893 c 0,0 13.723,23.78 33.42,36.975 C 59.879,81.646 39.172,62.772 35.447,58.95 35.447,58.95 18.482,35.696 7.662,13.96 4.756,8.131 0,0 0,0" /></g><g
+ transform="translate(495.4396,619.3077)"
+ id="g4576"><path
+ inkscape:connector-curvature="0"
+ id="path4578"
+ style="fill:#f3ecac;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 -50.606,-324.234 c 1.214,-0.211 1.599,-0.373 2.834,-0.564 71.205,-6.467 110.13,167.744 55.642,266.146 -5.057,10.391 0.705,41.975 2.328,52.398 L 0,0 z" /></g><g
+ transform="translate(496.173,618.858)"
+ id="g4580"><path
+ inkscape:connector-curvature="0"
+ id="path4582"
+ style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 32.734,-10.453 c -13.681,-28.463 9.821,-53.468 17.739,-59.683 17.775,-13.799 34.8,-27.831 47.625,-43.702 24.132,-30.084 34.48,-68.694 28.527,-106.9 -5.895,-37.853 -28.941,-71.615 -61.904,-91.384 -31.006,-18.65 -70.377,-22.477 -107.196,-16.742 -22.92,3.57 -43.251,7.801 -64.341,18.556 -48.054,24.922 -79.152,74.228 -74.163,126.815 3.549,41.068 17.397,70.575 54.035,97.952 18.971,14.475 54.997,28.784 80.01,40.897 12.305,5.91 27.467,25.606 11.219,69.755 l 5.057,2.771 30.42,-27.723 -26.887,16.145 c 1.891,-3.854 6.055,-20.512 6.742,-25.242 1.125,-13.337 -2.211,-25.627 -5.855,-30.748 -18.242,-23.485 -43.637,-26.643 -63.619,-38.471 -35.263,-20.832 -72.493,-36.022 -79.655,-107.122 -3.672,-35 16.819,-81.593 54.367,-107.718 21.193,-14.688 46.887,-23.316 73.415,-28.867 23.8,-4.774 71.867,2.324 100.117,19.265 30.201,18.063 50.386,49.427 55.742,83.807 5.41,34.736 -3.344,69.895 -25.768,97.222 C 75.537,-105.7 53.42,-85.534 39.496,-74.471 25.564,-63.407 10.248,-36.12 20.123,-13.825
L 0,0 z" /></g><g
+ transform="translate(504.3195,604.0934)"
+ id="g4584"><path
+ inkscape:connector-curvature="0"
+ id="path4586"
+ style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c -3.924,-18.399 -5.262,-25.191 -3.904,-39.278 1.494,-15.528 17.593,-40.092 21.738,-65.995 7.926,-49.617 -5.521,-110.842 -24.156,-157.384 -6.819,-16.368 -30.459,-37.95 -51.5,-42.849 l 14.047,-5.748 c 8.041,-0.892 31.505,15.016 42.904,35.65 18.207,32.385 27.021,72.987 28.521,116.866 0.299,4.223 -0.861,42.469 -5.025,59.125 C 16.871,-74.884 3.447,-51.447 2.414,-46.666 0.484,-38.538 -3.91,-21.602 0,0" /></g><g
+ transform="translate(495.4807,619.3595)"
+ id="g4588"><path
+ inkscape:connector-curvature="0"
+ id="path4590"
+ style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="M 0,0 C 0.155,-0.008 -49.259,-320.493 -50.456,-319.838 L -0.062,-0.032 C -0.062,0.16 -0.009,-0.035 0,0 c 0.003,0.037 0.231,-0.25 1.218,-0.73 0,0 -43.223,-281.344 -49.418,-321.118 -0.852,0.131 -1.707,0.265 -2.559,0.396 C -44.276,-279.334 -0.148,0.039 0,0" /></g><g
+ transform="translate(453.0549,350.485)"
+ id="g4592"><path
+ inkscape:connector-curvature="0"
+ id="path4594"
+ style="fill:#df3441;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c 0,0 -89.234,63.608 -79.039,129.324 3.929,25.318 23.153,43.156 51.53,38.994 38.91,-5.709 47.481,-43.043 47.481,-43.043 L 0,0 z" /></g><g
+ transform="translate(473.216,476.2032)"
+ id="g4596"><path
+ inkscape:connector-curvature="0"
+ id="path4598"
+ style="fill:#bc303a;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c 0,0 15.029,38.665 32.414,24.385 10.727,-8.813 7.828,-36.448 3.953,-51.406 -12.875,-49.717 -56.528,-98.697 -56.528,-98.697 L 0,0 z" /></g></g></g></svg>
\ No newline at end of file
diff --git a/src/chrome/content/aboutTor/tor-roots-only.svg b/src/chrome/content/aboutTor/tor-roots-only.svg
new file mode 100644
index 0000000..bb84b1b
--- /dev/null
+++ b/src/chrome/content/aboutTor/tor-roots-only.svg
@@ -0,0 +1,2716 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="718.2995"
+ height="464.96451"
+ xml:space="preserve"
+ sodipodi:docname="tor-roots-only.svg"><metadata
+ id="metadata2991"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs2989"><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3711"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path3713"
+ inkscape:connector-curvature="0" /></clipPath><linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(48.064392,308.5928,-308.5928,48.064392,538.70312,416.25879)"
+ spreadMethod="pad"
+ id="linearGradient4529"><stop
+ style="stop-opacity:1;stop-color:#533c5f"
+ offset="0"
+ id="stop4531" /><stop
+ style="stop-opacity:1;stop-color:#c3a1cc"
+ offset="1"
+ id="stop4533" /></linearGradient><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4541"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path4543"
+ inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="746"
+ id="namedview2987"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.905014"
+ inkscape:cx="195.7241"
+ inkscape:cy="358.82752"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g2993" /><g
+ id="g2993"
+ inkscape:groupmode="layer"
+ inkscape:label="tor_onion-heart-tat_k"
+ transform="matrix(1.25,0,0,-1.25,-235.68237,557.80025)"><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g2995"
+ transform="translate(471.4521,228.168)"><path
+ d="m 0,0 0,18.214 -9.236,9.237 -0.229,50.448"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path2997"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g2999"
+ transform="translate(478.7373,266.6787)"><path
+ d="M 0,0 -16.572,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3001"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3003"
+ transform="translate(483.9424,229.9893)"><path
+ d="M 0,0 -12.49,12.489"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3005"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3007"
+ transform="translate(475.7461,321.9717)"><path
+ d="m 0,0 -7.155,7.157 0,9.888 10.278,10.276 0,27.713 -17.5,17.499 0,38.706"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3009"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3011"
+ transform="translate(486.2852,340.0566)"><path
+ d="m 0,0 0,42.674 -16.783,16.783 0,31.615"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3013"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3015"
+ transform="translate(478.4795,407.4502)"><path
+ d="M 0,0 0,23.679"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3017"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3019"
+ transform="translate(488.6289,398.082)"><path
+ d="M 0,0 0,33.308"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3021"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3023"
+ transform="translate(499.0361,381.9482)"><path
+ d="M 0,0 0,51.782"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3025"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3027"
+ transform="translate(515.6895,401.9854)"><path
+ d="M 0,0 9.911,-9.911"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3029"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3031"
+ transform="translate(546.3945,384.292)"><path
+ d="m 0,0 -31.614,31.614 0,19.907"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3033"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3035"
+ transform="translate(413.7471,446.2402)"><path
+ d="m 0,0 0,-8.771 -73.676,-74.116 0,-5.699 -74.551,-74.552 0,-7.893 -42.539,-42.1"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3037"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3039"
+ transform="translate(364.7764,388.207)"><path
+ d="M 0,0 -18.127,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3041"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3043"
+ transform="translate(354.501,377.8701)"><path
+ d="M 0,0 -44.689,0 -58.086,-13.397"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3045"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3047"
+ transform="translate(335.7275,377.8701)"><path
+ d="M 0,0 -18.473,-18.476"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3049"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3051"
+ transform="translate(241.8379,386.5977)"><path
+ d="M 0,0 -27.628,-28.943"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3053"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3055"
+ transform="translate(259.9463,340.6777)"><path
+ d="M 0,0 -14.129,-14.128"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3057"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3059"
+ transform="translate(278.2373,315.1172)"><path
+ d="M 0,0 -13.734,-13.734"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3061"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3063"
+ transform="translate(248.8545,276.9629)"><path
+ d="M 0,0 -15.349,-15.347"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3065"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3067"
+ transform="translate(291.832,265.1221)"><path
+ d="M 0,0 -32.013,-32.013"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3069"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3071"
+ transform="translate(322.5293,279.5947)"><path
+ d="M 0,0 -13.155,-12.719"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3073"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3075"
+ transform="translate(322.0908,250.6514)"><path
+ d="M 0,0 -12.277,-12.28"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3077"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3079"
+ transform="translate(318.583,215.1289)"><path
+ d="m 0,0 -11.93,-11.929 0.09,-10.436 -16.66,-16.659 0,-8.962"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3081"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3083"
+ transform="translate(293.585,143.6465)"><path
+ d="m 0,0 11.404,11.401 9.648,9.651 0,9.209 33.766,33.764"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3085"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3087"
+ transform="translate(338.7559,160.751)"><path
+ d="m 0,0 9.647,9.646 0,59.205 6.798,6.795 0,6.36 -9.319,9.319 0,62.163 -5.975,5.975 0,11.127 3.673,3.948 0,12.717 41.393,41.394"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3089"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3091"
+ transform="translate(278.6748,234.4248)"><path
+ d="M 0,0 0,17.541"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3093"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3095"
+ transform="translate(292.2705,250.2119)"><path
+ d="m 0,0 -0.438,24.121 18.199,18.198 0,35.08"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3097"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3099"
+ transform="translate(258.0215,267.7881)"><path
+ d="M 0,0 -22.767,22.767"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3101"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3103"
+ transform="translate(243.5879,282.2217)"><path
+ d="M 0,0 -30.255,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3105"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3107"
+ transform="translate(197.1064,370.373)"><path
+ d="M 0,0 29.256,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3109"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3111"
+ transform="translate(209.3857,413.3486)"><path
+ d="M 0,0 27.631,-26.751"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3113"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3115"
+ transform="translate(226.0508,386.5977)"><path
+ d="m 0,0 87.709,0 8.728,-8.728"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3117"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3119"
+ transform="translate(235.6982,364.6699)"><path
+ d="M 0,0 0,15.474"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3121"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3123"
+ transform="translate(254.9941,401.5078)"><path
+ d="M 0,0 14.91,-14.91"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3125"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3127"
+ transform="translate(287.8857,401.9463)"><path
+ d="M 0,0 15.35,-15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3129"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3131"
+ transform="translate(245.3467,340.6777)"><path
+ d="m 0,0 77.634,0 0,-20.739 -5.707,-5.704 0,-10.958 5.04,-5.041 -0.223,-76.967"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3133"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3135"
+ transform="translate(258.9424,365.9873)"><path
+ d="M 0,0 23.554,-25.31"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3137"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3139"
+ transform="translate(291.3936,330.0254)"><path
+ d="M 0,0 0,10.652"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3141"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3143"
+ transform="translate(263.3271,315.1172)"><path
+ d="M 0,0 34.206,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3145"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3147"
+ transform="translate(276.9219,371.249)"><path
+ d="M 0,0 0,15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3149"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3151"
+ transform="translate(278.2373,295.8193)"><path
+ d="M 0,0 -0.146,-14.429"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3153"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3155"
+ transform="translate(261.7705,271.5)"><path
+ d="M 0,0 0,-14.271"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3157"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3159"
+ transform="translate(235.1045,245.1084)"><path
+ d="M 0,0 0,-15.507"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3161"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3163"
+ transform="translate(322.1514,241.8789)"><path
+ d="m 0,0 16.635,-16.635 0,-8.359"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3165"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3167"
+ transform="translate(317.7061,142.3311)"><path
+ d="M 0,0 -12.717,12.717"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3169"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3171"
+ transform="translate(348.4033,217.7607)"><path
+ d="M 0,0 10.525,-11.402"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3173"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3175"
+ transform="translate(338.3174,243.6338)"><path
+ d="m 0,0 0,57.889 7.564,6.575"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3177"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3179"
+ transform="translate(331.5205,349.1035)"><path
+ d="M 0,0 0,-35.303"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3181"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3183"
+ transform="translate(382.7012,406.2383)"><path
+ d="m 0,0 5.39,-5.389 0,-4.603"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3185"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3187"
+ transform="translate(403.2217,407.209)"><path
+ d="m 0,0 7.895,7.894 0,5.702 10.523,10.524 0,10.087"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3189"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3191"
+ transform="translate(350.5967,330.9033)"><path
+ d="m 0,0 0,5.701 9.867,9.865 0,5.484 57.778,57.777 0,4.935 12.224,12.224 0,12.773"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3193"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3195"
+ transform="translate(353.667,262.0527)"><path
+ d="m 0,0 0,24.119 -7.785,7.784"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3197"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3199"
+ transform="translate(361.999,177.8535)"><path
+ d="M 0,0 18.857,20.172"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3201"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3203"
+ transform="translate(388.75,162.0664)"><path
+ d="m 0,0 -8.114,8.111 -0.657,80.035 10.525,10.526 0,6.575 -10.744,10.747"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3205"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3207"
+ transform="translate(364.6299,230.4775)"><path
+ d="m 0,0 0,21.488 10.525,10.527 0,11.401 8.772,8.333 0,21.928 -11.403,11.402"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3209"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3211"
+ transform="translate(369.8916,312.9248)"><path
+ d="m 0,0 19.734,19.73 0,13.161 31.662,31.658 -4.349,4.347 -6.615,6.616"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3213"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3215"
+ transform="translate(364.1904,271.7012)"><path
+ d="m 0,0 0,20.174 -8.99,8.989 0,12.061 14.803,14.797 0,19.847 30.666,30.665"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3217"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3219"
+ transform="translate(405.958,384.0723)"><path
+ d="m 0,0 31.909,31.906 0,20.174"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3221"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3223"
+ transform="translate(401.0283,279.5947)"><path
+ d="m 0,0 -11.182,11.183 -0.22,55.038"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3225"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3227"
+ transform="translate(381.2939,119.9648)"><path
+ d="M 0,0 14.034,14.033"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3229"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3231"
+ transform="translate(379.1016,138.8232)"><path
+ d="M 0,0 16.227,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3233"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3235"
+ transform="translate(379.9785,93.6533)"><path
+ d="M 0,0 15.35,13.595"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3237"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3239"
+ transform="translate(395.3281,92.7754)"><path
+ d="m 0,0 0,48.241 10.171,10.171 0,9.677 -15.873,16.111 0.878,83.763"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3241"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3243"
+ transform="translate(402.7822,252.8428)"><path
+ d="M 0,0 -12.278,12.279"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3245"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3247"
+ transform="translate(405.499,152.751)"><path
+ d="m 0,0 0,-28.597 8.279,-8.278"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3249"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3251"
+ transform="translate(427.2139,391.835)"><path
+ d="m 0,0 18.604,18.604 0,21.989"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3253"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3255"
+ transform="translate(444.1279,315.335)"><path
+ d="m 0,0 9.988,10.092 0,27.117"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3257"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3259"
+ transform="translate(451.2256,359.4463)"><path
+ d="m 0,0 -6.546,6.546 0.1,21.941 -10.735,10.734"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3261"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3263"
+ transform="translate(426.1738,346.8193)"><path
+ d="M 0,0 18.506,19.173"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3265"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3267"
+ transform="translate(443.9355,344.4111)"><path
+ d="M 0,0 -10.086,10.084"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3269"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3271"
+ transform="translate(418.3682,268.7588)"><path
+ d="m 0,0 0,7.284 -20.297,20.299 0,57.918"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3273"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3275"
+ transform="translate(422.0098,289.5752)"><path
+ d="M 0,0 -16.652,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3277"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3279"
+ transform="translate(410.3008,307.0088)"><path
+ d="m 0,0 12.101,12.1 0,9.237 -9.173,9.172 0,31.898"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3281"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3283"
+ transform="translate(406.1377,331.4668)"><path
+ d="M 0,0 0,30.858"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3285"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3287"
+ transform="translate(423.6523,310.1475)"><path
+ d="M 0,0 -10.099,0.114"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3289"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3291"
+ transform="translate(419.4111,201.3662)"><path
+ d="m 0,0 0,43.974 13.661,13.663 0,9.239 19.971,19.968 0,8.913 8.944,8.944 0,11.091 9.286,9.285 8.246,-8.243 0,-28.704"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3293"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3295"
+ transform="translate(429.2979,168.5811)"><path
+ d="m 0,0 17.435,17.434 0,11.449 -13.791,13.79 0.13,50.74"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3297"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3299"
+ transform="translate(441.2686,238.8359)"><path
+ d="M 0,0 -8.235,8.236"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3301"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3303"
+ transform="translate(450.6357,217.7607)"><path
+ d="M 0,0 -17.677,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3305"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3307"
+ transform="translate(438.1455,142.0391)"><path
+ d="m 0,0 0,23.68 8.978,8.976 0,12.881"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3309"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3311"
+ transform="translate(446.9932,159.4717)"><path
+ d="M 0,0 0,18.477"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3313"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3315"
+ transform="translate(464.166,179.5078)"><path
+ d="M 0,0 -17.173,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3317"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3319"
+ transform="translate(453.043,290.8789)"><path
+ d="m 0,0 0,-43.012 6.299,-6.299"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3321"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3323"
+ transform="translate(463.9082,363.7354)"><path
+ d="m 0,0 -11.061,11.059 0,56.075"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3325"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3327"
+ transform="translate(417.8506,380.9072)"><path
+ d="M 0,0 8.326,-8.324"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3329"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3331"
+ transform="translate(538.8232,446.2402)"><path
+ d="m 0,0 0,-8.771 73.673,-74.116 0,-5.699 74.554,-74.552 0,-7.893 42.538,-42.1"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3333"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3335"
+ transform="translate(587.793,388.207)"><path
+ d="M 0,0 18.126,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3337"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3339"
+ transform="translate(598.0674,377.8701)"><path
+ d="M 0,0 44.689,0 58.085,-13.397"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3341"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3343"
+ transform="translate(616.8418,377.8701)"><path
+ d="M 0,0 18.472,-18.476"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3345"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3347"
+ transform="translate(710.7295,386.5977)"><path
+ d="M 0,0 27.629,-28.943"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3349"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3351"
+ transform="translate(691.8721,341.4287)"><path
+ d="M 0,0 14.878,-14.879"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3353"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3355"
+ transform="translate(674.332,315.1172)"><path
+ d="M 0,0 13.733,-13.734"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3357"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3359"
+ transform="translate(703.7148,276.9629)"><path
+ d="M 0,0 15.349,-15.347"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3361"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3363"
+ transform="translate(660.7354,265.1221)"><path
+ d="M 0,0 32.015,-32.013"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3365"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3367"
+ transform="translate(630.041,279.5947)"><path
+ d="M 0,0 12.423,-11.987"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3369"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3371"
+ transform="translate(630.4756,250.6514)"><path
+ d="M 0,0 12.281,-12.28"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3373"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3375"
+ transform="translate(633.5039,215.6113)"><path
+ d="m 0,0 12.541,-12.541 -0.218,-10.307 17.104,-17.102 0,-8.129"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3377"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3379"
+ transform="translate(658.9834,143.6465)"><path
+ d="m 0,0 -11.401,11.401 -9.651,9.651 0,9.209 -33.766,33.766"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3381"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3383"
+ transform="translate(613.8135,160.751)"><path
+ d="m 0,0 -9.648,9.646 0,59.205 -6.797,6.795 0,6.36 9.319,9.319 0,62.163 5.975,5.975 0,11.127 -3.674,3.948 0,12.717 -41.297,41.299"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3385"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3387"
+ transform="translate(673.8936,234.4248)"><path
+ d="M 0,0 0,17.541"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3389"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3391"
+ transform="translate(660.2988,250.2119)"><path
+ d="m 0,0 0.437,24.121 -18.199,18.198 0,35.08"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3393"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3395"
+ transform="translate(694.5479,267.7881)"><path
+ d="M 0,0 22.764,22.767"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3397"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3399"
+ transform="translate(708.9824,282.2217)"><path
+ d="M 0,0 30.253,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3401"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3403"
+ transform="translate(754.8018,370.373)"><path
+ d="M 0,0 -28.596,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3405"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3407"
+ transform="translate(743.1826,413.3486)"><path
+ d="M 0,0 -27.604,-26.751"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3409"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3411"
+ transform="translate(726.5176,386.5977)"><path
+ d="m 0,0 -87.708,0 -8.728,-8.728"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3413"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3415"
+ transform="translate(716.8711,364.6699)"><path
+ d="M 0,0 0,15.474"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3417"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3419"
+ transform="translate(697.5752,401.5078)"><path
+ d="M 0,0 -14.912,-14.91"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3421"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3423"
+ transform="translate(664.6846,401.9463)"><path
+ d="M 0,0 -15.35,-15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3425"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3427"
+ transform="translate(707.2227,341.4287)"><path
+ d="m 0,0 -77.634,0 0,-21.49 5.706,-5.704 0,-10.958 -5.039,-5.041 0.22,-76.277"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3429"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3431"
+ transform="translate(693.626,365.9873)"><path
+ d="M 0,0 -22.802,-24.559"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3433"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3435"
+ transform="translate(661.1748,330.0254)"><path
+ d="M 0,0 0,11.403"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3437"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3439"
+ transform="translate(689.2422,315.1172)"><path
+ d="M 0,0 -34.207,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3441"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3443"
+ transform="translate(675.6475,371.249)"><path
+ d="M 0,0 0,15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3445"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3447"
+ transform="translate(674.3311,295.8193)"><path
+ d="M 0,0 0.165,-14.015"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3449"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3451"
+ transform="translate(690.7969,271.5)"><path
+ d="M 0,0 0,-14.271"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3453"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3455"
+ transform="translate(717.4639,245.1084)"><path
+ d="M 0,0 0,-15.507"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3457"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3459"
+ transform="translate(630.418,241.8789)"><path
+ d="m 0,0 -16.635,-16.635 0,-8.359"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3461"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3463"
+ transform="translate(634.8633,142.3311)"><path
+ d="M 0,0 12.719,12.717"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3465"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3467"
+ transform="translate(604.165,217.7607)"><path
+ d="M 0,0 -10.525,-11.402"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3469"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3471"
+ transform="translate(614.25,243.6338)"><path
+ d="m 0,0 0,57.889 -7.563,6.575"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3473"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3475"
+ transform="translate(621.0469,349.1035)"><path
+ d="M 0,0 0,-35.303"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3477"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3479"
+ transform="translate(569.8682,406.2383)"><path
+ d="m 0,0 -5.389,-5.389 0,-4.603"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3481"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3483"
+ transform="translate(549.3467,407.209)"><path
+ d="m 0,0 -7.894,7.894 0,5.702 -10.525,10.524 0,10.087"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3485"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3487"
+ transform="translate(601.9727,330.9033)"><path
+ d="m 0,0 0,5.701 -9.868,9.865 0,5.484 -57.778,57.777 0,4.935 -12.225,12.224 0,12.773"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3489"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3491"
+ transform="translate(598.9033,262.0527)"><path
+ d="m 0,0 0,24.119 7.784,7.784"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3493"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3495"
+ transform="translate(587.9385,230.4775)"><path
+ d="m 0,0 0,21.488 -10.524,10.527 0,11.401 -8.77,8.333 0,21.928 11.4,11.401"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3497"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3499"
+ transform="translate(582.6768,312.9248)"><path
+ d="m 0,0 -19.735,19.73 0,13.161 -31.659,31.658 4.348,4.347 6.615,6.616"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3501"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3503"
+ transform="translate(588.3789,271.7012)"><path
+ d="m 0,0 0,20.174 8.989,8.989 0,12.061 -14.8,14.797 0,19.847 -30.939,30.936"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3505"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3507"
+ transform="translate(545.8408,384.8438)"><path
+ d="m 0,0 -31.139,31.135 0,20.174"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3509"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3511"
+ transform="translate(552.8926,278.2422)"><path
+ d="m 0,0 9.543,9.542 0.506,58.031"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3513"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3515"
+ transform="translate(506.749,410.4395)"><path
+ d="M 0,0 0,21.988"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3517"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3519"
+ transform="translate(508.4404,315.335)"><path
+ d="m 0,0 -9.527,10.126 0,26.35"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3521"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3523"
+ transform="translate(501.9824,358.8398)"><path
+ d="M 0,0 5.929,5.928 5.811,28.614 17.023,39.827 4.859,51.993 l 0,22.898"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3525"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3527"
+ transform="translate(526.3965,346.8193)"><path
+ d="M 0,0 -18.485,17.948"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3529"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3531"
+ transform="translate(508.8135,344.5908)"><path
+ d="M 0,0 9.906,9.904"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3533"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3535"
+ transform="translate(534.2002,268.7588)"><path
+ d="m 0,0 0,7.284 20.297,20.299 0,57.918"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3537"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3539"
+ transform="translate(534.251,290.5547)"><path
+ d="M 0,0 14.46,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3541"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3543"
+ transform="translate(542.2686,307.0088)"><path
+ d="m 0,0 -12.1,12.1 0,9.237 9.172,9.172 0,31.898"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3545"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3547"
+ transform="translate(546.4316,331.4668)"><path
+ d="M 0,0 0,30.858"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3549"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3551"
+ transform="translate(534.7188,380.9072)"><path
+ d="M 0,0 -8.326,-8.324"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3553"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3555"
+ transform="translate(492.0098,281.251)"><path
+ d="M 0,0 0,30.185 10.279,40.46"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3557"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3559"
+ transform="translate(492.0098,304.9287)"><path
+ d="M 0,0 27.72,-27.719"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3561"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3563"
+ transform="translate(295.5713,181.5918)"><path
+ d="M 0,0 0,18.667"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3565"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3567"
+ transform="translate(278.3896,191.6787)"><path
+ d="M 0,0 17.182,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3569"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3571"
+ transform="translate(324.7402,172.4229)"><path
+ d="M 0,0 0,12.094"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3573"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3575"
+ transform="translate(498.6836,222.5635)"><path
+ d="m 0,0 0,35.48 11.362,11.363 0,17.486"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3577"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3579"
+ transform="translate(510.0459,274.9873)"><path
+ d="M 0,0 -0.199,-18.736"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3581"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3583"
+ transform="translate(508.0527,234.5225)"><path
+ d="M 0,0 -9.369,9.369"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3585"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3587"
+ transform="translate(487.3223,249.4727)"><path
+ d="M 0,0 11.361,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3589"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3591"
+ transform="translate(561.2754,143.0254)"><path
+ d="M 0,0 10.467,10.467 21.2,-0.267"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3593"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3595"
+ transform="translate(571.7422,153.4922)"><path
+ d="m 0,0 0,26.81 -9.42,9.418 0,15.299 -39.395,39.396 0,25.591"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3597"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3599"
+ transform="translate(555.6943,233.9248)"><path
+ d="M 0,0 0,33.887 13.701,47.586"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3601"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3603"
+ transform="translate(575.6299,251.666)"><path
+ d="M 0,0 6.304,6.305"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3605"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3607"
+ transform="translate(571.4434,229.7383)"><path
+ d="M 0,0 -15.749,15.747"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3609"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3611"
+ transform="translate(549.5156,253.8584)"><path
+ d="M 0,0 6.179,6.179"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3613"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3615"
+ transform="translate(519.2129,198.8271)"><path
+ d="M 0,0 0,26.514 11.397,37.906"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3617"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3619"
+ transform="translate(519.2129,209.9912)"><path
+ d="M 0,0 11.563,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3621"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3623"
+ transform="translate(489.5127,208.9941)"><path
+ d="M 0,0 17.542,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3625"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3627"
+ transform="translate(533.9658,185.2734)"><path
+ d="M 0,0 11.76,11.76"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3629"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3631"
+ transform="translate(556.8916,173.1133)"><path
+ d="M 0,0 -11.166,11.166"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3633"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3635"
+ transform="translate(536.7568,115.7021)"><path
+ d="m 0,0 0,33.093 8.969,8.966"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3637"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3639"
+ transform="translate(545.7256,146.2021)"><path
+ d="M 0,0 0,75.414"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3641"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3643"
+ transform="translate(494.2979,157.3643)"><path
+ d="M 0,0 0,38.474 24.915,63.789"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3645"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3647"
+ transform="translate(502.3701,181.9844)"><path
+ d="M 0,0 -8.072,8.071"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3649"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3651"
+ transform="translate(466.5889,82.2158)"><path
+ d="M 0,0 15.35,15.349 31.383,-0.684"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3653"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3655"
+ transform="translate(481.9385,97.5645)"><path
+ d="m 0,0 0,24.318 7.773,7.774"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3657"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3659"
+ transform="translate(494.4961,124.8721)"><path
+ d="m 0,0 -11.76,11.76 -0.2,24.122 11.762,11.76 17.64,-17.641 0,-25.813"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3661"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3663"
+ transform="translate(511.9385,142.0176)"><path
+ d="M 0,0 11.583,-11.582"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3665"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3667"
+ transform="translate(474.1631,106.5352)"><path
+ d="M 0,0 7.775,7.774"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3669"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3671"
+ transform="translate(492.1045,104.7393)"><path
+ d="M 0,0 -10.166,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3673"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3675"
+ transform="translate(521.209,165.7383)"><path
+ d="M 0,0 -20.136,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3677"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3679"
+ transform="translate(575.2285,205.209)"><path
+ d="M 0,0 -12.906,-12.906"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3681"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3683"
+ transform="translate(591.8916,184.9961)"><path
+ d="M 0,0 -12.479,-12.48"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3685"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3687"
+ transform="translate(585.3945,166.7354)"><path
+ d="M 0,0 -13.652,13.566"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3689"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3691"
+ transform="translate(628.0508,172.3184)"><path
+ d="M 0,0 0,11.47"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3693"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3695"
+ transform="translate(637.2217,201.6211)"><path
+ d="M 0,0 0,10.271"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3697"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3699"
+ transform="translate(657.7529,201.2217)"><path
+ d="M 0,0 0,-20.387"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3701"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3703"
+ transform="translate(657.7529,192.4512)"><path
+ d="M 0,0 15.757,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3705"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3715"
+ transform="translate(280.7451,404.9951)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.999 3.996,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3717"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3719"
+ transform="translate(338.3232,387.7021)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.998,3.996 6.205,3.996 7.996,2.206 7.996,0 7.996,-2.208 6.205,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3721"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3723"
+ transform="translate(384.0732,391.9258)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.998,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3725"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3727"
+ transform="translate(396.8115,404.0264)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.998,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.206 6.205,-3.996 3.998,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3729"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3731"
+ transform="translate(311.2139,356.9854)"><path
+ d="M 0,0 C 0,2.205 1.789,3.996 3.998,3.996 6.205,3.996 7.994,2.205 7.994,0 7.994,-2.21 6.205,-3.999 3.998,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3733"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3735"
+ transform="translate(290.4092,361.6758)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.209 6.205,-3.998 3.996,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3737"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3739"
+ transform="translate(272.709,367.3008)"><path
+ d="M 0,0 C 0,2.206 1.79,3.995 3.997,3.995 6.204,3.995 7.993,2.206 7.993,0 7.993,-2.209 6.204,-4 3.997,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3741"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3743"
+ transform="translate(247.9668,404.1123)"><path
+ d="M 0,0 C 0,2.21 1.789,4 3.997,4 6.205,4 7.995,2.21 7.995,0 7.995,-2.206 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3745"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3747"
+ transform="translate(251.6455,369.1592)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.997,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3749"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3751"
+ transform="translate(202.1025,416.2373)"><path
+ d="M 0,0 C 0,2.209 1.789,3.998 3.998,3.998 6.205,3.998 7.994,2.209 7.994,0 7.994,-2.207 6.205,-3.996 3.998,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3753"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3755"
+ transform="translate(218.1689,386.9355)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.997,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.208 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3757"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3759"
+ transform="translate(189.0459,369.9004)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.998,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.21 6.205,-4 3.998,-4 1.789,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3761"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3763"
+ transform="translate(206.9775,355.3125)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.206 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3765"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3767"
+ transform="translate(231.7021,360.6738)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.996,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.209 6.205,-3.999 3.996,-3.999 1.789,-3.999 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3769"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3771"
+ transform="translate(237.3525,340.6777)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.996,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.206 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3773"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3775"
+ transform="translate(239.6729,323.8027)"><path
+ d="M 0,0 C 0,2.207 1.79,3.996 3.998,3.996 6.206,3.996 7.996,2.207 7.996,0 7.996,-2.206 6.206,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3777"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3779"
+ transform="translate(255.332,315.1172)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.205,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.205,-3.999 3.997,-3.999 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3781"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3783"
+ transform="translate(257.3662,298.9141)"><path
+ d="M 0,0 C 0,2.21 1.79,3.999 3.998,3.999 6.205,3.999 7.995,2.21 7.995,0 7.995,-2.206 6.205,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3785"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3787"
+ transform="translate(287.3965,326.0293)"><path
+ d="M 0,0 C 0,2.207 1.79,3.996 3.997,3.996 6.204,3.996 7.993,2.207 7.993,0 7.993,-2.208 6.204,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3789"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3791"
+ transform="translate(228.54,293.4766)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.996,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.206 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3793"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3795"
+ transform="translate(273.6484,277.3936)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3797"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3799"
+ transform="translate(298.4092,301.71)"><path
+ d="M 0,0 11.622,11.621"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3801"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3803"
+ transform="translate(291.292,299.2148)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.206 7.994,0 7.994,-2.207 6.204,-3.998 3.996,-3.998 1.789,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3805"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3807"
+ transform="translate(328.001,309.707)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.998,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3809"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3811"
+ transform="translate(346.5996,326.9063)"><path
+ d="M 0,0 C 0,2.206 1.79,3.997 3.997,3.997 6.205,3.997 7.995,2.206 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3813"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3815"
+ transform="translate(205.3389,282.2217)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.998,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.206 6.205,-3.998 3.998,-3.998 1.789,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3817"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3819"
+ transform="translate(226.5693,258.9131)"><path
+ d="M 0,0 C 0,2.206 1.789,3.994 3.997,3.994 6.205,3.994 7.994,2.206 7.994,0 7.994,-2.21 6.205,-3.999 3.997,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3821"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3823"
+ transform="translate(216.125,230.3184)"><path
+ d="M 0,0 C 0,2.207 1.79,3.998 3.997,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.208 6.206,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3825"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3827"
+ transform="translate(231.1074,225.6016)"><path
+ d="M 0,0 C 0,2.209 1.79,4 3.997,4 6.204,4 7.993,2.209 7.993,0 7.993,-2.206 6.204,-3.995 3.997,-3.995 1.79,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3829"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3831"
+ transform="translate(252.6787,230.6465)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.997,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3833"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3835"
+ transform="translate(274.6787,230.4268)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.996,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3837"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3839"
+ transform="translate(288.2734,246.2148)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.997,3.997 6.205,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.205,-3.996 3.997,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3841"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3843"
+ transform="translate(258.2168,253.2324)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.997,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3845"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3847"
+ transform="translate(302.8809,264.7256)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.997,3.999 6.205,3.999 7.995,2.21 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3849"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3851"
+ transform="translate(326.6416,279.0107)"><path
+ d="M 0,0 C 0,1.052 0.406,2.009 1.072,2.723 1.801,3.506 2.843,3.996 3.997,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.21 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3853"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3855"
+ transform="translate(322.2822,287.166)"><path
+ d="M 0,0 5.432,-5.433"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3857"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3859"
+ transform="translate(303.0313,235.5068)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.997,3.997 6.205,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.205,-3.998 3.997,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3861"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3863"
+ transform="translate(318.0215,217.335)"><path
+ d="M 0,0 C 0,2.206 1.79,3.998 3.997,3.998 6.205,3.998 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.999 3.997,-3.999 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3865"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3867"
+ transform="translate(316.1465,212.6924)"><path
+ d="M 0,0 -0.081,-11.799"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3869"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3871"
+ transform="translate(291.5742,204.2588)"><path
+ d="M 0,0 C 0,2.204 1.79,3.995 3.997,3.995 6.204,3.995 7.993,2.204 7.993,0 7.993,-2.21 6.204,-4 3.997,-4 1.79,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3873"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3875"
+ transform="translate(270.4248,192.1445)"><path
+ d="M 0,0 C 0,2.204 1.789,3.995 3.997,3.995 6.205,3.995 7.994,2.204 7.994,0 7.994,-2.21 6.205,-4 3.997,-4 1.789,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3877"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3879"
+ transform="translate(311.7334,197.2285)"><path
+ d="M 0,0 C 0,2.21 1.79,4 3.998,4 6.206,4 7.995,2.21 7.995,0 7.995,-2.206 6.206,-3.995 3.998,-3.995 1.79,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3881"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3883"
+ transform="translate(286.0869,163.1465)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.21 6.205,-3.999 3.996,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3885"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3887"
+ transform="translate(334.7891,212.8848)"><path
+ d="M 0,0 C 0,2.208 1.789,4 3.997,4 6.204,4 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.996 3.997,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3889"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3891"
+ transform="translate(334.3203,239.6377)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.997,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3893"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3895"
+ transform="translate(360.6328,226.4795)"><path
+ d="M 0,0 C 0,2.209 1.789,3.998 3.997,3.998 6.204,3.998 7.995,2.209 7.995,0 7.995,-2.206 6.204,-3.995 3.997,-3.995 1.789,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3897"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3899"
+ transform="translate(357.8564,203.6387)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.996,3.998 6.205,3.998 7.994,2.208 7.994,0 7.994,-2.206 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3901"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3903"
+ transform="translate(320.7432,168.4258)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.997,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.209 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3905"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3907"
+ transform="translate(332.1807,157.6982)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3909"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3911"
+ transform="translate(354.9463,175.2764)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.207 6.205,-3.998 3.998,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3913"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3915"
+ transform="translate(316.1328,139.1592)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.21 6.206,-3.999 3.997,-3.999 1.79,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3917"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3919"
+ transform="translate(286.3896,141.2539)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.999 3.997,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3921"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3923"
+ transform="translate(443.7686,155.5518)"><path
+ d="M 0,0 C 0,2.206 1.79,3.995 3.997,3.995 6.205,3.995 7.994,2.206 7.994,0 7.994,-2.209 6.205,-4 3.997,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3925"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3927"
+ transform="translate(434.5576,138.4824)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.996,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.21 6.204,-3.998 3.996,-3.998 1.789,-3.998 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3929"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3931"
+ transform="translate(422.2539,165.9961)"><path
+ d="M 0,0 C 0,2.208 1.79,3.998 3.997,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.205,-3.998 3.997,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3933"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3935"
+ transform="translate(412.7725,113.2285)"><path
+ d="M 0,0 C 0,2.209 1.789,3.998 3.998,3.998 6.205,3.998 7.994,2.209 7.994,0 7.994,-2.204 6.205,-3.995 3.998,-3.995 1.789,-3.995 0,-2.204 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3937"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3939"
+ transform="translate(374.6924,116.9375)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.997,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3941"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3943"
+ transform="translate(371.5713,139.1035)"><path
+ d="M 0,0 C 0,2.206 1.791,3.996 3.998,3.996 6.205,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.205,-3.998 3.998,-3.998 1.791,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3945"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3947"
+ transform="translate(405.8311,180.916)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.996,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3949"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3951"
+ transform="translate(387.2393,159.5996)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.206 7.994,0 7.994,-2.21 6.204,-3.999 3.996,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3953"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3955"
+ transform="translate(405.8311,180.916)"><path
+ d="M 0,0 -16.164,-0.118"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3957"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3959"
+ transform="translate(403.4482,200.4463)"><path
+ d="M 0,0 -13.719,-13.718"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3961"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3963"
+ transform="translate(459.8926,79.3896)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.997,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3965"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3967"
+ transform="translate(467.833,103.8262)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.207 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3969"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3971"
+ transform="translate(466.8994,141.0146)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.998,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3973"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3975"
+ transform="translate(372.7881,90.5059)"><path
+ d="M 0,0 C 0,2.208 1.79,3.998 3.998,3.998 6.207,3.998 7.996,2.208 7.996,0 7.996,-2.208 6.207,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3977"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3979"
+ transform="translate(391.3311,88.7793)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.997,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3981"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3983"
+ transform="translate(473.8965,143.6494)"><path
+ d="M 0,0 8.71,8.71"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3985"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3987"
+ transform="translate(554.5029,140.1523)"><path
+ d="M 0,0 C 0,2.209 1.791,3.999 3.997,3.999 6.205,3.999 7.995,2.209 7.995,0 7.995,-2.207 6.205,-3.998 3.997,-3.998 1.791,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3989"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3991"
+ transform="translate(541.7285,142.2061)"><path
+ d="M 0,0 C 0,2.207 1.791,3.996 3.997,3.996 6.205,3.996 7.995,2.207 7.995,0 7.995,-2.208 6.205,-3.999 3.997,-3.999 1.791,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3993"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3995"
+ transform="translate(533.0576,111.7197)"><path
+ d="M 0,0 C 0,2.21 1.79,3.999 3.996,3.999 6.206,3.999 7.993,2.21 7.993,0 7.993,-2.206 6.206,-3.996 3.996,-3.996 1.79,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3997"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3999"
+ transform="translate(521.209,165.7383)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.997,3.997 6.205,3.997 7.995,2.208 7.995,0 7.995,-2.209 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4001"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4003"
+ transform="translate(501.5654,178.7197)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.995,3.998 6.203,3.998 7.993,2.208 7.993,0 7.993,-2.208 6.203,-3.999 3.995,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4005"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4007"
+ transform="translate(496.8564,78.7686)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.998,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-4 3.998,-4 1.79,-4 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4009"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4011"
+ transform="translate(492.1045,104.7393)"><path
+ d="M 0,0 C 0,2.21 1.791,3.999 3.997,3.999 6.206,3.999 7.995,2.21 7.995,0 7.995,-2.207 6.206,-3.996 3.997,-3.996 1.791,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4013"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4015"
+ transform="translate(507.9414,125.5039)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.997,3.997 6.205,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4017"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4019"
+ transform="translate(493.1611,121.8975)"><path
+ d="M 0,0 C 0,2.208 1.791,3.998 3.998,3.998 6.207,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.207,-3.996 3.998,-3.996 1.791,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4021"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4023"
+ transform="translate(490.2998,153.3682)"><path
+ d="M 0,0 C 0,2.209 1.789,3.996 3.998,3.996 6.206,3.996 7.995,2.209 7.995,0 7.995,-2.208 6.206,-3.997 3.998,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4025"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4027"
+ transform="translate(463.8633,179.8105)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4029"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4031"
+ transform="translate(522.0918,127.374)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.995,3.996 6.205,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.205,-3.997 3.995,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4033"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4035"
+ transform="translate(584.4375,164.1455)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.205,3.996 7.995,2.207 7.995,0 7.995,-2.206 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4037"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4039"
+ transform="translate(555.7773,170.3516)"><path
+ d="M 0,0 C 0,2.206 1.789,3.998 3.999,3.998 6.205,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.205,-3.998 3.999,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4041"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4043"
+ transform="translate(581.5928,140.2549)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.999 3.996,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4045"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4047"
+ transform="translate(436.9297,290.792)"><path
+ d="M 0,0 C 0,1.054 0.406,2.01 1.072,2.726 1.802,3.507 2.843,3.998 3.997,3.998 6.204,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4049"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4051"
+ transform="translate(437.2666,312.5498)"><path
+ d="M 0,0 C 0,1.055 0.407,2.011 1.073,2.725 1.803,3.508 2.843,3.997 3.998,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.207 6.205,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4053"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4055"
+ transform="translate(422.0098,289.5752)"><path
+ d="M 0,0 C 0,1.054 0.407,2.009 1.073,2.723 1.804,3.507 2.844,3.998 3.998,3.998 6.206,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4057"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4059"
+ transform="translate(400.9951,249.4023)"><path
+ d="M 0,0 C 0,1.053 0.407,2.01 1.072,2.726 1.802,3.508 2.842,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.207 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4061"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4063"
+ transform="translate(414.3701,264.7607)"><path
+ d="m 0,0 c 0,1.054 0.407,2.011 1.073,2.725 0.73,0.782 1.77,1.273 2.925,1.273 2.207,0 3.996,-1.79 3.996,-3.998 0,-2.208 -1.789,-3.997 -3.996,-3.997 C 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4065"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4067"
+ transform="translate(423.5713,309.3506)"><path
+ d="M 0,0 C 0,1.052 0.408,2.009 1.072,2.723 1.803,3.506 2.843,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.206 6.206,-3.998 3.997,-3.998 1.79,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4069"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4071"
+ transform="translate(403.1826,304.5156)"><path
+ d="M 0,0 C 0,1.052 0.406,2.011 1.071,2.725 1.801,3.506 2.842,3.997 3.996,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.996,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4073"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4075"
+ transform="translate(401.7383,327.0674)"><path
+ d="M 0,0 C 0,1.052 0.406,2.01 1.072,2.726 1.802,3.507 2.843,3.998 3.997,3.998 6.204,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4077"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4079"
+ transform="translate(399.3789,276.8701)"><path
+ d="m 0,0 c 0,1.052 0.406,2.011 1.073,2.725 0.729,0.781 1.77,1.273 2.924,1.273 2.208,0 3.998,-1.79 3.998,-3.998 0,-2.208 -1.79,-3.999 -3.998,-3.999 C 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4081"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4083"
+ transform="translate(360.1943,267.7031)"><path
+ d="m 0,0 c 0,1.054 0.406,2.011 1.072,2.725 0.73,0.783 1.77,1.273 2.924,1.273 2.209,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.789,-3.997 -3.998,-3.997 C 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4085"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4087"
+ transform="translate(349.6689,258.0537)"><path
+ d="M 0,0 C 0,1.055 0.408,2.014 1.072,2.727 1.803,3.51 2.843,3.999 3.998,3.999 6.205,3.999 7.995,2.21 7.995,0 7.995,-2.205 6.205,-3.996 3.998,-3.996 1.79,-3.996 0,-2.205 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4089"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4091"
+ transform="translate(362.8799,310.3047)"><path
+ d="m 0,0 c 0,1.052 0.406,2.01 1.072,2.725 0.73,0.781 1.77,1.27 2.925,1.27 2.208,0 3.998,-1.789 3.998,-3.995 0,-2.209 -1.79,-3.998 -3.998,-3.998 C 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4093"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4095"
+ transform="translate(440.9268,286.7949)"><path
+ d="M 0,0 0,-10.749"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4097"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4099"
+ transform="translate(406.1182,221.9893)"><path
+ d="M 0,0 13.293,13.293"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4101"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4103"
+ transform="translate(494.6855,218.5654)"><path
+ d="M 0,0 C 0,2.207 1.79,3.998 3.998,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.206 6.206,-3.995 3.998,-3.995 1.79,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4105"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4107"
+ transform="translate(479.3271,249.4727)"><path
+ d="M 0,0 C 0,2.208 1.787,3.998 3.997,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.205,-3.996 3.997,-3.996 1.787,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4109"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4111"
+ transform="translate(482.4785,226.8984)"><path
+ d="M 0,0 C 0,2.206 1.789,3.998 3.997,3.998 6.206,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.999 3.997,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4113"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4115"
+ transform="translate(467.4561,224.1719)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4117"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4119"
+ transform="translate(458.1582,238.248)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.998,3.998 6.205,3.998 7.994,2.208 7.994,0 7.994,-2.206 6.205,-3.996 3.998,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4121"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4123"
+ transform="translate(450.6016,218.2637)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.997,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.204,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4125"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4127"
+ transform="translate(439.9971,235.9199)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.997,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.21 6.206,-3.999 3.997,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4129"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4131"
+ transform="translate(415.4131,197.3691)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.998,3.997 6.207,3.997 7.995,2.208 7.995,0 7.995,-2.206 6.207,-3.998 3.998,-3.998 1.789,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4133"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4135"
+ transform="translate(402.7939,202.6377)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.997,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.999 3.997,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4137"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4139"
+ transform="translate(398.9463,219.5635)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.998,3.997 6.207,3.997 7.996,2.208 7.996,0 7.996,-2.206 6.207,-3.996 3.998,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4141"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4143"
+ transform="translate(574.0801,207.582)"><path
+ d="M 0,0 C 0,2.207 1.79,3.996 3.996,3.996 6.206,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.206,-3.997 3.996,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4145"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4147"
+ transform="translate(587.1807,203.21)"><path
+ d="M 0,0 C 0,2.205 1.789,3.996 3.997,3.996 6.206,3.996 7.995,2.205 7.995,0 7.995,-2.21 6.206,-3.999 3.997,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4149"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4151"
+ transform="translate(591.043,187.4512)"><path
+ d="M 0,0 C 0,2.208 1.788,3.997 3.996,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.205 6.204,-3.996 3.996,-3.996 1.788,-3.996 0,-2.205 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4153"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4155"
+ transform="translate(612.29,158.2207)"><path
+ d="M 0,0 C 0,2.206 1.788,3.997 3.998,3.997 6.206,3.997 7.995,2.206 7.995,0 7.995,-2.208 6.206,-4 3.998,-4 1.788,-4 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4157"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4159"
+ transform="translate(623.6025,168.7734)"><path
+ d="M 0,0 C 0,2.206 1.788,3.995 3.998,3.995 6.206,3.995 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.788,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4161"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4163"
+ transform="translate(627.9824,139.5664)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.995,3.999 6.205,3.999 7.993,2.21 7.993,0 7.993,-2.207 6.205,-3.996 3.995,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4165"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4167"
+ transform="translate(657.1943,140.9199)"><path
+ d="M 0,0 C 0,2.206 1.789,3.998 3.999,3.998 6.204,3.998 7.993,2.206 7.993,0 7.993,-2.206 6.204,-3.996 3.999,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4169"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4171"
+ transform="translate(659.2793,164.1543)"><path
+ d="M 0,0 C 0,2.208 1.787,3.998 3.995,3.998 6.204,3.998 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.998 3.995,-3.998 1.787,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4173"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4175"
+ transform="translate(673.4834,192.0059)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.999,3.996 6.205,3.996 7.997,2.206 7.997,0 7.997,-2.208 6.205,-3.998 3.999,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4177"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4179"
+ transform="translate(654.209,204.7012)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.209 6.205,-3.998 3.996,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4181"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4183"
+ transform="translate(632.7344,197.6221)"><path
+ d="m 0,0 c 0,2.208 1.787,3.999 3.997,3.999 2.21,0 4,-1.791 4,-3.999 0,-2.206 -1.79,-3.996 -4,-3.996 C 1.787,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4185"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4187"
+ transform="translate(609.7871,212.8848)"><path
+ d="M 0,0 C 0,2.208 1.787,4 3.996,4 6.204,4 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.996 3.996,-3.996 1.787,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4189"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4191"
+ transform="translate(626.2832,217.9697)"><path
+ d="M 0,0 C 0,2.21 1.788,3.999 4,3.999 6.204,3.999 7.996,2.21 7.996,0 7.996,-2.206 6.204,-3.997 4,-3.997 1.788,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4193"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4195"
+ transform="translate(669.8955,230.4268)"><path
+ d="M 0,0 C 0,2.208 1.788,3.998 3.998,3.998 6.204,3.998 7.994,2.208 7.994,0 7.994,-2.208 6.204,-3.997 3.998,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4197"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4199"
+ transform="translate(691.3037,230.4268)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.996,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4201"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4203"
+ transform="translate(713.584,226.3818)"><path
+ d="M 0,0 C 0,2.207 1.788,3.998 3.996,3.998 6.204,3.998 7.993,2.207 7.993,0 7.993,-2.21 6.204,-3.999 3.996,-3.999 1.788,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4205"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4207"
+ transform="translate(728.3965,230.2646)"><path
+ d="M 0,0 C 0,2.206 1.791,3.998 3.997,3.998 6.207,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.207,-3.997 3.997,-3.997 1.791,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4209"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4211"
+ transform="translate(584.2021,226.4951)"><path
+ d="m 0,0 c 0,2.206 1.79,3.996 3.996,3.996 2.208,0 4,-1.79 4,-3.996 0,-2.208 -1.792,-3.999 -4,-3.999 C 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4213"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4215"
+ transform="translate(569.3311,248.5557)"><path
+ d="M 0,0 C 0,2.207 1.788,3.996 3.998,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.206 6.204,-3.997 3.998,-3.997 1.788,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4217"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4219"
+ transform="translate(569.8496,227.3203)"><path
+ d="M 0,0 C 0,2.207 1.788,3.998 3.996,3.998 6.202,3.998 7.993,2.207 7.993,0 7.993,-2.208 6.202,-3.997 3.996,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4221"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4223"
+ transform="translate(527.0576,182.5352)"><path
+ d="M 0,0 C 0,2.208 1.792,3.999 3.998,3.999 6.208,3.999 7.995,2.208 7.995,0 7.995,-2.208 6.208,-3.998 3.998,-3.998 1.792,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4225"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4227"
+ transform="translate(515.2168,194.832)"><path
+ d="M 0,0 C 0,2.206 1.79,3.995 3.996,3.995 6.206,3.995 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.996,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4229"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4231"
+ transform="translate(530.7754,209.9912)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.999,3.996 6.206,3.996 7.997,2.207 7.997,0 7.997,-2.206 6.206,-3.997 3.999,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4233"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4235"
+ transform="translate(551.6973,229.9268)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.997,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4237"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4239"
+ transform="translate(542.6074,251.124)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.998,3.996 6.208,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.208,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4241"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4243"
+ transform="translate(530.2031,264.7607)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.997,3.998 6.206,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.206,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4245"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4247"
+ transform="translate(505.8496,252.2529)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.997,3.998 6.204,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4249"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4251"
+ transform="translate(506.459,231.333)"><path
+ d="M 0,0 C 0,2.207 1.788,3.998 3.997,3.998 6.204,3.998 7.995,2.207 7.995,0 7.995,-2.208 6.204,-3.997 3.997,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4253"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4255"
+ transform="translate(478.7373,266.6787)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4257"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4259"
+ transform="translate(481.1279,208.6025)"><path
+ d="M 0,0 C 0,2.209 1.788,3.999 3.996,3.999 6.206,3.999 7.995,2.209 7.995,0 7.995,-2.207 6.206,-3.996 3.996,-3.996 1.788,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4261"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4263"
+ transform="translate(482.2891,336.0586)"><path
+ d="M 0,0 C 0,1.054 0.405,2.013 1.072,2.726 1.8,3.509 2.842,3.998 3.996,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.206 6.204,-3.997 3.996,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4265"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4267"
+ transform="translate(495.0381,377.9531)"><path
+ d="m 0,0 c 0,1.052 0.407,2.009 1.072,2.725 0.73,0.781 1.772,1.27 2.926,1.27 C 6.204,3.995 7.995,2.206 7.995,0 7.995,-2.209 6.204,-4 3.998,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4269"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4271"
+ transform="translate(484.6309,394.0869)"><path
+ d="m 0,0 c 0,1.052 0.407,2.01 1.072,2.725 0.73,0.781 1.771,1.27 2.926,1.27 C 6.204,3.995 7.993,2.208 7.993,0 7.993,-2.208 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4273"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4275"
+ transform="translate(474.4814,403.4521)"><path
+ d="M 0,0 C 0,1.054 0.408,2.011 1.072,2.725 1.803,3.509 2.844,3.998 3.998,3.998 6.204,3.998 7.995,2.209 7.995,0 7.995,-2.208 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4277"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4279"
+ transform="translate(462.7217,361.0098)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.509 2.843,3.998 3.998,3.998 6.205,3.998 7.995,2.207 7.995,0 7.995,-2.208 6.205,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4281"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4283"
+ transform="translate(450.0195,356.6143)"><path
+ d="M 0,0 C 0,1.054 0.406,2.009 1.072,2.725 1.801,3.506 2.843,3.997 3.997,3.997 6.204,3.997 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4285"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4287"
+ transform="translate(442.8623,341.6875)"><path
+ d="M 0,0 C 0,1.05 0.408,2.009 1.072,2.723 1.803,3.506 2.844,3.996 3.998,3.996 6.206,3.996 7.995,2.205 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4289"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4291"
+ transform="translate(419.8965,343.5381)"><path
+ d="M 0,0 C 0,1.053 0.407,2.012 1.071,2.726 1.802,3.508 2.843,3.997 3.997,3.997 6.204,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.204,-3.998 3.997,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4293"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4295"
+ transform="translate(425.377,370.1875)"><path
+ d="M 0,0 C 0,1.053 0.408,2.01 1.072,2.726 1.802,3.508 2.844,3.997 3.998,3.997 6.205,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.205,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4297"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4299"
+ transform="translate(420.4033,388.998)"><path
+ d="M 0,0 C 0,1.052 0.407,2.011 1.072,2.725 1.802,3.507 2.843,3.998 3.998,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.999 3.998,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4301"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4303"
+ transform="translate(399.8057,380.7109)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.724 1.801,3.507 2.843,3.996 3.997,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4305"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4307"
+ transform="translate(544.9678,381.4111)"><path
+ d="M 0,0 C 0,1.052 0.407,2.011 1.072,2.725 1.8,3.506 2.841,3.997 3.998,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.208 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4309"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4311"
+ transform="translate(524.2813,389.1113)"><path
+ d="M 0,0 C 0,1.052 0.406,2.009 1.073,2.724 1.803,3.507 2.845,3.996 3.997,3.996 6.205,3.996 7.995,2.207 7.995,0 7.995,-2.208 6.205,-3.997 3.997,-3.997 1.791,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4313"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4315"
+ transform="translate(519.3545,370.459)"><path
+ d="m 0,0 c 0,1.054 0.407,2.013 1.072,2.727 0.73,0.781 1.772,1.27 2.926,1.27 2.206,0 3.996,-1.789 3.996,-3.997 0,-2.206 -1.79,-3.996 -3.996,-3.996 C 1.79,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4317"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4319"
+ transform="translate(494.6953,355.7979)"><path
+ d="M 0,0 C 0,1.054 0.407,2.013 1.072,2.725 1.802,3.508 2.844,3.997 3.998,3.997 6.206,3.997 7.996,2.208 7.996,0 7.996,-2.206 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4321"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4323"
+ transform="translate(541.1943,304.2842)"><path
+ d="m 0,0 c 0,1.052 0.407,2.011 1.074,2.725 0.73,0.782 1.771,1.273 2.922,1.273 2.21,0 3.999,-1.79 3.999,-3.998 0,-2.208 -1.789,-3.997 -3.999,-3.997 C 1.792,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4325"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4327"
+ transform="translate(597.7295,327.3008)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.725 1.802,3.508 2.844,3.998 3.998,3.998 6.204,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4329"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4331"
+ transform="translate(605.9189,388.207)"><path
+ d="M 0,0 C 0,1.052 0.409,2.01 1.072,2.725 1.804,3.506 2.843,3.997 3.998,3.997 6.204,3.997 7.995,2.208 7.995,0 7.995,-2.209 6.204,-3.998 3.998,-3.998 1.79,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4333"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4335"
+ transform="translate(506.7529,312.6104)"><path
+ d="m 0,0 c 0,1.052 0.406,2.011 1.071,2.725 0.73,0.781 1.77,1.271 2.926,1.271 2.207,0 3.996,-1.79 3.996,-3.996 0,-2.208 -1.789,-3.998 -3.996,-3.998 C 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4337"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4339"
+ transform="translate(542.0625,327.8389)"><path
+ d="M 0,0 C 0,1.056 0.407,2.013 1.073,2.727 1.801,3.51 2.841,4 3.996,4 6.206,4 7.995,2.21 7.995,0 7.995,-2.206 6.206,-3.995 3.996,-3.995 1.789,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4341"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4343"
+ transform="translate(501.7949,341.9775)"><path
+ d="m 0,0 c 0,1.054 0.406,2.013 1.073,2.725 0.728,0.783 1.77,1.273 2.924,1.273 2.208,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.79,-3.996 -3.998,-3.996 C 1.791,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4345"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4347"
+ transform="translate(525.1553,343.7061)"><path
+ d="M 0,0 C 0,1.054 0.407,2.01 1.072,2.726 1.802,3.507 2.843,3.998 3.998,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.208 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4349"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4351"
+ transform="translate(560.6543,391.8955)"><path
+ d="M 0,0 C 0,1.052 0.407,2.009 1.073,2.723 1.802,3.506 2.843,3.996 3.998,3.996 6.204,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.999 3.998,-3.999 1.791,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4353"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4355"
+ transform="translate(548.2754,404.4844)"><path
+ d="M 0,0 C 0,1.053 0.406,2.01 1.071,2.725 1.801,3.506 2.844,3.997 3.997,3.997 6.205,3.997 7.995,2.206 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4357"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4359"
+ transform="translate(641.749,235.9199)"><path
+ d="m 0,0 c 0,1.056 0.408,2.013 1.073,2.725 0.73,0.783 1.77,1.273 2.924,1.273 2.209,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.789,-3.997 -3.998,-3.997 C 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4361"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4363"
+ transform="translate(656.3027,246.2148)"><path
+ d="M 0,0 C 0,1.053 0.407,2.011 1.07,2.725 1.801,3.508 2.843,3.997 3.996,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.204,-3.996 3.996,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4365"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4367"
+ transform="translate(610.2549,239.6377)"><path
+ d="m 0,0 c 0,1.053 0.408,2.009 1.07,2.723 0.731,0.783 1.771,1.273 2.925,1.273 2.21,0 4,-1.79 4,-3.996 0,-2.208 -1.79,-3.998 -4,-3.998 C 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4369"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4371"
+ transform="translate(617.0508,309.8027)"><path
+ d="m 0,0 c 0,1.054 0.407,2.013 1.072,2.725 0.73,0.783 1.771,1.273 2.924,1.273 2.21,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.788,-3.997 -3.998,-3.997 C 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4373"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4375"
+ transform="translate(594.8418,258.0928)"><path
+ d="M 0,0 C 0,1.053 0.408,2.012 1.071,2.727 1.803,3.508 2.843,3.997 3.997,3.997 6.205,3.997 7.995,2.21 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4377"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4379"
+ transform="translate(617.9893,281.2422)"><path
+ d="M 0,0 C 0,1.054 0.407,2.009 1.072,2.725 1.802,3.507 2.845,3.998 3.998,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.21 6.206,-3.999 3.998,-3.999 1.792,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4381"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4383"
+ transform="translate(717.9902,258.8896)"><path
+ d="m 0,0 c 0,1.053 0.407,2.011 1.073,2.727 0.728,0.781 1.77,1.27 2.923,1.27 C 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.208 6.204,-3.998 3.996,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4385"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4387"
+ transform="translate(686.8008,253.7139)"><path
+ d="M 0,0 C 0,1.053 0.407,2.01 1.07,2.723 1.804,3.506 2.844,3.997 3.996,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.209 6.206,-4 3.996,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4389"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4391"
+ transform="translate(716.2881,293.2197)"><path
+ d="m 0,0 c 0,1.054 0.407,2.009 1.072,2.725 0.73,0.782 1.772,1.273 2.926,1.273 2.206,0 3.996,-1.79 3.996,-3.998 0,-2.208 -1.79,-3.997 -3.996,-3.997 C 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4393"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4395"
+ transform="translate(739.2354,282.2217)"><path
+ d="M 0,0 C 0,1.054 0.409,2.009 1.072,2.725 1.802,3.506 2.844,3.997 3.998,3.997 6.204,3.997 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.998 3.998,-3.998 1.79,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4397"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4399"
+ transform="translate(641.3271,264.8213)"><path
+ d="M 0,0 C 0,1.052 0.406,2.009 1.073,2.724 1.801,3.507 2.843,3.996 3.996,3.996 6.204,3.996 7.993,2.207 7.993,0 7.993,-2.206 6.204,-3.995 3.996,-3.995 1.791,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4401"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4403"
+ transform="translate(653.4258,298.4277)"><path
+ d="M 0,0 C 0,1.052 0.405,2.011 1.07,2.724 1.802,3.507 2.843,3.996 3.998,3.996 6.202,3.996 7.992,2.207 7.992,0 7.992,-2.208 6.202,-3.997 3.998,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4405"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4407"
+ transform="translate(657.1807,326.0293)"><path
+ d="M 0,0 C 0,1.052 0.405,2.011 1.072,2.724 1.8,3.507 2.841,3.996 3.994,3.996 6.202,3.996 7.993,2.207 7.993,0 7.993,-2.208 6.202,-3.997 3.994,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4409"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4411"
+ transform="translate(633.8057,356.2744)"><path
+ d="M 0,0 C 0,1.056 0.409,2.013 1.076,2.726 1.804,3.509 2.844,3.998 4,3.998 6.206,3.998 7.996,2.209 7.996,0 7.996,-2.206 6.206,-3.997 4,-3.997 1.792,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4413"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4415"
+ transform="translate(654.7549,361.4219)"><path
+ d="M 0,0 C 0,1.052 0.405,2.009 1.071,2.724 1.801,3.507 2.843,3.996 3.996,3.996 6.204,3.996 7.993,2.205 7.993,0 7.993,-2.21 6.204,-3.999 3.996,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4417"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4419"
+ transform="translate(671.6494,367.251)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.509 2.844,3.998 3.998,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.206 6.204,-3.997 3.998,-3.997 1.792,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4421"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4423"
+ transform="translate(663.6543,404.6172)"><path
+ d="m 0,0 c 0,1.054 0.407,2.013 1.072,2.725 0.73,0.783 1.77,1.273 2.924,1.273 2.208,0 3.999,-1.79 3.999,-3.998 0,-2.206 -1.791,-3.997 -3.999,-3.997 C 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4425"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4427"
+ transform="translate(696.4658,404.0986)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.507 2.843,3.998 3.998,3.998 6.204,3.998 7.993,2.209 7.993,0 7.993,-2.206 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4429"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4431"
+ transform="translate(742.1533,415.5654)"><path
+ d="M 0,0 C 0,1.053 0.406,2.011 1.073,2.726 1.801,3.508 2.843,3.998 3.997,3.998 6.204,3.998 7.993,2.208 7.993,0 7.993,-2.207 6.204,-3.996 3.997,-3.996 1.791,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4433"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4435"
+ transform="translate(712.8721,360.6738)"><path
+ d="m 0,0 c 0,1.052 0.408,2.01 1.073,2.724 0.73,0.783 1.77,1.272 2.926,1.272 2.206,0 3.996,-1.789 3.996,-3.996 0,-2.209 -1.79,-3.999 -3.996,-3.999 C 1.789,-3.999 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4437"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4439"
+ transform="translate(692.2705,368.9873)"><path
+ d="M 0,0 C 0,1.053 0.407,2.009 1.072,2.725 1.802,3.504 2.843,3.997 3.998,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.21 6.204,-4 3.998,-4 1.79,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4441"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4443"
+ transform="translate(726.208,386.2871)"><path
+ d="M 0,0 C 0,1.054 0.407,2.009 1.07,2.723 1.802,3.507 2.843,3.996 3.998,3.996 6.204,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4445"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4447"
+ transform="translate(754.6855,370.3965)"><path
+ d="m 0,0 c 0,1.052 0.407,2.009 1.072,2.723 0.73,0.783 1.77,1.273 2.924,1.273 2.208,0 3.999,-1.79 3.999,-3.996 0,-2.208 -1.791,-3.998 -3.999,-3.998 C 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4449"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4451"
+ transform="translate(737.2842,354.9297)"><path
+ d="M 0,0 C 0,1.053 0.408,2.011 1.074,2.725 1.803,3.506 2.845,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.998 3.998,-3.998 1.791,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4453"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4455"
+ transform="translate(707.2227,341.4287)"><path
+ d="m 0,0 c 0,1.052 0.407,2.011 1.072,2.726 0.73,0.781 1.77,1.27 2.924,1.27 2.208,0 3.998,-1.789 3.998,-3.996 0,-2.208 -1.79,-3.997 -3.998,-3.997 C 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4457"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4459"
+ transform="translate(689.2422,315.1172)"><path
+ d="M 0,0 C 0,1.052 0.407,2.009 1.072,2.723 1.802,3.507 2.843,3.996 3.998,3.996 6.204,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.999 3.998,-3.999 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4461"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4463"
+ transform="translate(670.041,277.8359)"><path
+ d="M 0,0 C 0,1.053 0.408,2.011 1.073,2.725 1.803,3.508 2.843,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.998 3.998,-3.998 1.791,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4465"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4467"
+ transform="translate(686.9902,298.6592)"><path
+ d="m 0,0 c 0,1.052 0.41,2.009 1.075,2.724 0.73,0.783 1.77,1.272 2.924,1.272 2.208,0 3.998,-1.789 3.998,-3.996 0,-2.208 -1.79,-3.999 -3.998,-3.999 C 1.791,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4469"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4471"
+ transform="translate(704.7207,323.8252)"><path
+ d="M 0,0 C 0,1.053 0.407,2.012 1.074,2.725 1.8,3.508 2.842,3.997 3.996,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.998 3.996,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4473"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4475"
+ transform="translate(584.3818,267.7031)"><path
+ d="M 0,0 C 0,1.054 0.406,2.011 1.071,2.725 1.799,3.508 2.843,3.998 3.997,3.998 6.204,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4477"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4479"
+ transform="translate(581.1592,309.3857)"><path
+ d="M 0,0 C 0,1.052 0.408,2.009 1.071,2.724 1.803,3.507 2.843,3.996 3.999,3.996 6.205,3.996 7.995,2.205 7.995,0 7.995,-2.208 6.205,-3.997 3.999,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4481"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4483"
+ transform="translate(545.2139,275.751)"><path
+ d="M 0,0 C 0,1.052 0.407,2.009 1.072,2.723 1.802,3.505 2.845,3.996 3.998,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4485"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4487"
+ transform="translate(518.0771,273.9746)"><path
+ d="M 0,0 C 0,1.054 0.406,2.011 1.073,2.725 1.801,3.507 2.843,3.998 3.997,3.998 6.204,3.998 7.995,2.207 7.995,0 7.995,-2.206 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4489"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4491"
+ transform="translate(526.2578,290.5547)"><path
+ d="M 0,0 C 0,1.053 0.407,2.011 1.072,2.725 1.802,3.508 2.843,3.997 3.998,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4493"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4495"
+ transform="translate(513.6152,298.8906)"><path
+ d="M 0,0 C 0,1.054 0.406,2.013 1.073,2.727 1.801,3.51 2.843,3.997 3.996,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.996 3.996,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4497"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4499"
+ transform="translate(487.5342,277.2832)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.507 2.843,3.998 3.996,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.206 6.204,-3.997 3.996,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4501"
+ inkscape:connector-curvature="0" /></g><path
+ inkscape:connector-curvature="0"
+ id="path4505"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 475.5215,285.4971 c 0,1.053 0.408,2.01 1.073,2.725 0.729,0.781 1.77,1.274 2.925,1.274 2.206,0 3.997,-1.791 3.997,-3.999 0,-2.207 -1.791,-3.996 -3.997,-3.996 -2.208,0 -3.998,1.789 -3.998,3.996 z" /><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4507"
+ transform="translate(624.9453,283.9238)"><path
+ d="M 0,0 5.338,5.338"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4509"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4511"
+ transform="translate(654.4961,301.1514)"><path
+ d="M 0,0 -11.959,11.325"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4513"
+ inkscape:connector-curvature="0" /></g></g></svg>
\ No newline at end of file
diff --git a/src/chrome/skin/donation_banner.css b/src/chrome/skin/donation_banner.css
new file mode 100644
index 0000000..8ad3f88
--- /dev/null
+++ b/src/chrome/skin/donation_banner.css
@@ -0,0 +1,148 @@
+#banner {
+ -khtml-user-select: none; /* Konqueror */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* Internet Explorer/Edge */
+ -webkit-touch-callout: none; /* iOS Safari */
+ -webkit-user-select: none; /* Chrome/Safari/Opera */
+ background-color: #406;
+ background-opacity: 10%;
+ background-size: cover;
+ background: radial-gradient(circle, #406 90%, #203 100%);
+ border-bottom: 6px solid #305;
+ border-top: 5px solid #305;
+ display: none;
+ height: 120px;
+ justify-content: center;
+ left: 0px;
+ margin-top: 40px;
+ min-width: 900px;
+ opacity: 1;
+ position: absolute;
+ user-select: none;
+ width: 100%;
+ z-index: 1;
+}
+#banner:before {
+ background-image: url('chrome://torbutton/content/aboutTor/tor-roots-only.svg');
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ background-size: cover;
+ content: ' ';
+ display: block;
+ height: 100%;
+ left: 0;
+ opacity: 0.20;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+#banner-contents-container {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+ height: 100%;
+ max-width: 700px;
+ position: relative;
+ width: 700px;
+}
+#banner-text {
+ align-self: stretch;
+ color: white;
+ display: flex;
+ flex-direction: column;
+ flex: 1 1 auto;
+ font-family: sans-serif;
+ font-size: 8px;
+ margin: 10px 20px 10px 20px;
+ max-height: 100%;
+}
+#banner-tagline {
+ align-items: center;
+ display: flex;
+ flex: 2 2 67%;
+ font-weight: bold;
+ justify-content: center;
+ text-align: center;
+}
+#banner-heart {
+ align-items: center;
+ color: #f8f8a0;
+ display: flex;
+ flex: 1 1 33%;
+ justify-content: center;
+ text-align: center;
+ white-space: nowrap;
+}
+#banner-logo-container {
+ display: inline-block;
+ flex: 0 0 auto;
+ margin: 0px;
+ position: relative;
+}
+#banner-logo {
+ height: 155px;
+ position: relative;
+ padding-bottom: 40px;
+ width: 108px;
+}
+#banner-donate-button-container {
+ background-color: #FFD;
+ border: 4px solid #204;
+ color: #A20;
+ display: block;
+ flex-grow: 0.0;
+ flex: 0;
+ height: 50px;
+ letter-spacing: -0.00em;
+ opacity: 100%;
+ padding-bottom: 5px;
+ padding-left: 15px;
+ padding-right: 15px;
+ padding-top: 5px;
+ width: 80px;
+}
+#banner-donate-button-container:hover {
+ border-color: #610;
+}
+#banner-donate-button-container:active {
+ border-color: #A20;
+}
+#banner-donate-button {
+ align-items: center;
+ display: flex;
+ font-family: sans-serif;
+ font-size: 12px;
+ font-weight: bold;
+ height: 100%;
+ text-align: start;
+ width: 100%;
+}
+#banner-donate-button-arrow {
+ font-size: 14px;
+ margin-inline-start: 5px;
+}
+#banner-donate-button-arrow:-moz-dir(rtl) {
+ transform: scaleX(-1);
+}
+#banner-donate-button-link {
+ flex: 0 0 auto;
+ text-decoration: none;
+}
+#banner-donate-button-link:link {
+ color: #A20;
+}
+#banner-donate-button-link:hover {
+ color: #C40;
+}
+#banner-donate-button-link:visited {
+ color: #408;
+}
+#banner-donate-button-linka:active {
+ color: black;
+}
+#banner-spacer {
+ display: none;
+ height: 150px;
+ position: relative;
+ top: 0;
+};
1
0

09 Nov '16
commit 6af7c834e9f79af974625d0f925d064a098bbee8
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 10:35:36 2016 +0000
Activate donation banner for tr locale
---
src/chrome/content/aboutTor/donation_banner.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/chrome/content/aboutTor/donation_banner.js b/src/chrome/content/aboutTor/donation_banner.js
index 1087815..7ff3a98 100644
--- a/src/chrome/content/aboutTor/donation_banner.js
+++ b/src/chrome/content/aboutTor/donation_banner.js
@@ -8,6 +8,7 @@ let kBannerLocales = [
"fa",
"it",
"nl",
+ "tr",
"vi",
"zh",
];
1
0
commit 4e436580c010c5ed670302bfd872e10297ed2d11
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Nov 9 10:03:48 2016 +0000
Update translations
---
src/chrome/locale/ar/aboutDialog.dtd | 2 +-
src/chrome/locale/ar/aboutTor.properties | 13 ++++--
src/chrome/locale/ar/torbutton.dtd | 33 ++++++++------
src/chrome/locale/ar/torbutton.properties | 8 ++--
src/chrome/locale/de/aboutTor.properties | 7 +++
src/chrome/locale/de/torbutton.dtd | 51 +++++++++++++---------
src/chrome/locale/de/torbutton.properties | 2 +-
src/chrome/locale/es/aboutTor.properties | 7 +++
src/chrome/locale/es/torbutton.dtd | 19 ++++++--
src/chrome/locale/eu/aboutTor.properties | 7 +++
src/chrome/locale/eu/torbutton.dtd | 15 +++++--
src/chrome/locale/fa/aboutTor.properties | 7 +++
src/chrome/locale/fa/torbutton.dtd | 15 +++++--
src/chrome/locale/fr/aboutTor.properties | 7 +++
src/chrome/locale/fr/torbutton.dtd | 15 +++++--
src/chrome/locale/it/aboutTor.properties | 7 +++
src/chrome/locale/it/torbutton.dtd | 15 +++++--
src/chrome/locale/ja/aboutTor.properties | 7 +++
src/chrome/locale/ja/torbutton.dtd | 15 +++++--
src/chrome/locale/ko/aboutTor.properties | 7 +++
src/chrome/locale/ko/torbutton.dtd | 15 +++++--
src/chrome/locale/nl/aboutDialog.dtd | 2 +-
src/chrome/locale/nl/aboutTBUpdate.dtd | 8 ++--
src/chrome/locale/nl/aboutTor.dtd | 28 ++++++------
src/chrome/locale/nl/aboutTor.properties | 7 +++
src/chrome/locale/nl/brand.properties | 14 +++---
src/chrome/locale/nl/torbutton.dtd | 67 ++++++++++++++++-------------
src/chrome/locale/pl/aboutTor.properties | 7 +++
src/chrome/locale/pl/torbutton.dtd | 15 +++++--
src/chrome/locale/pt/aboutTor.properties | 7 +++
src/chrome/locale/pt/torbutton.dtd | 15 +++++--
src/chrome/locale/ru/aboutTor.properties | 7 +++
src/chrome/locale/ru/brand.properties | 2 +-
src/chrome/locale/ru/torbutton.dtd | 15 +++++--
src/chrome/locale/sv/aboutTor.properties | 7 +++
src/chrome/locale/sv/torbutton.dtd | 15 +++++--
src/chrome/locale/tr/aboutTor.properties | 7 +++
src/chrome/locale/tr/torbutton.dtd | 15 +++++--
src/chrome/locale/vi/aboutDialog.dtd | 18 ++++----
src/chrome/locale/vi/aboutTBUpdate.dtd | 8 ++--
src/chrome/locale/vi/aboutTor.dtd | 32 +++++++-------
src/chrome/locale/vi/aboutTor.properties | 13 ++++--
src/chrome/locale/vi/brand.dtd | 10 ++---
src/chrome/locale/vi/brand.properties | 4 +-
src/chrome/locale/vi/torbutton.dtd | 59 ++++++++++++++-----------
src/chrome/locale/vi/torbutton.properties | 56 ++++++++++++------------
src/chrome/locale/zh-CN/aboutTor.properties | 7 +++
src/chrome/locale/zh-CN/torbutton.dtd | 15 +++++--
48 files changed, 504 insertions(+), 230 deletions(-)
diff --git a/src/chrome/locale/ar/aboutDialog.dtd b/src/chrome/locale/ar/aboutDialog.dtd
index 7297ce3..fa1ebec 100644
--- a/src/chrome/locale/ar/aboutDialog.dtd
+++ b/src/chrome/locale/ar/aboutDialog.dtd
@@ -1,6 +1,6 @@
<!ENTITY project.start "مطوْر من طرف &brandShortName;">
<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
-<!ENTITY project.tpoLink "the &vendorShortName;">
+<!ENTITY project.tpoLink "ال&vendorShortName؛">
<!ENTITY project.end "لاتهدف للربح تعمل على حماية خصوصيتك وحريتك على الأنترنت">
<!ENTITY help.start "هل ترغب في المساعدة؟">
diff --git a/src/chrome/locale/ar/aboutTor.properties b/src/chrome/locale/ar/aboutTor.properties
index d607324..8befe26 100644
--- a/src/chrome/locale/ar/aboutTor.properties
+++ b/src/chrome/locale/ar/aboutTor.properties
@@ -2,20 +2,27 @@
# See LICENSE for licensing information.
# vim: set sw=2 sts=2 ts=8 et:
-aboutTor.searchSP.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S">Startpage</a>.
+aboutTor.searchSP.privacy=ابحث <a href="%1$S">آمنا</a> مع <a href="%2$S">Startpage</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchSP.privacy.link=https://startpage.com/eng/protect-privacy.ht…
# The following string is a link which replaces %2$S above.
aboutTor.searchSP.search.link=https://startpage.com/
-aboutTor.searchDDG.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S">DuckDuckGo</a>.
+aboutTor.searchDDG.privacy=ابحث <a href="%1$S">آمنا</a> مع <a href="%2$S">DuckDuckGo</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchDDG.privacy.link=https://duckduckgo.com/privacy.html
# The following string is a link which replaces %2$S above.
aboutTor.searchDDG.search.link=https://duckduckgo.com/
-aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S">Disconnect.me</a>.
+aboutTor.searchDC.privacy=ابحث <a href="%1$S">آمنا</a> مع <a href="%2$S">Disconnect.me</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/ar/torbutton.dtd b/src/chrome/locale/ar/torbutton.dtd
index e86ca90..feb367b 100644
--- a/src/chrome/locale/ar/torbutton.dtd
+++ b/src/chrome/locale/ar/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "دائرة تور جديدة لهذا الموقع">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Security Settings…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "إعدادات شبكة تور...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "تحقق من تحديثات متصفح تور...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "إعدادات أمان ملفات تعريف الارتباط...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "انقر لبدء زر تور">
-<!ENTITY torbutton.prefs.restore_defaults "استعادة الافتراضيات">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "إدارة إعدادت الحماية لملفات تعريف الارتباط">
<!ENTITY torbutton.cookiedialog.lockCol "محمية">
<!ENTITY torbutton.cookiedialog.domainCol "استضافة">
@@ -21,33 +26,37 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "احم ملفات تعريف الارتباط الجديدة">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "لا تحم ملفات تعريف الارتباط الجديدة">
<!ENTITY torbutton.prefs.restrict_thirdparty "تقييد الـCookies الخاصة بالطرف الثالث و بيانات التتبع الأخري.">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "تغيير التفاصيل التي تميزك عن المستخدمين الآخرين لمتصفح تور">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
<!ENTITY torbutton.prefs.sec_caption "مستوى الأمان">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "The Security Slider lets you disable certain browser features that may make your browser more vulnerable to hacking attempts.">
<!ENTITY torbutton.prefs.sec_low "منخفض (افتراضي)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "هذا يوفر أفضل خبرة للإستخدام">
<!ENTITY torbutton.prefs.sec_low_desc "طبقاً لهذا المستوى من إعدادات الأمان سوف يتم تفعيل كل صفات المتصفح">
-<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "The SVG OpenType font rendering mechanism is disabled.">
+<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "آلية تجسيد الخط SVG OpenType معطلة.">
<!ENTITY torbutton.prefs.sec_med_low "شبه منخفض">
<!ENTITY torbutton.prefs.sec_gen_desc "طبقاً لهذا المستوى من إعدادات الأمان سوف يتم تفعيل هذه التغيرات ( لمزيد من التفاصيل مرر الفأرة فوق)">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video and audio media become click-to-play via NoScript.">
-<!ENTITY torbutton.prefs.sec_html5_tooltip "في بعض المواقع من الممكن أن تحتاج لإستخدام زر تعطيل النصوص في شرط الأدوات لتفعل المحتويات المرئية">
+<!ENTITY torbutton.prefs.sec_html5_tooltip "في بعض المواقع من الممكن أن تحتاج لإستخدام زر تعطيل السكريبتات في شرط الأدوات لتفعل المحتويات المرئية.">
<!ENTITY torbutton.prefs.sec_some_jit_desc "بعض محسنات نصوص الجافا معطلة">
<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "ION JIT, Type Inference, ASM.JS.">
<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "Baseline JIT.">
<!ENTITY torbutton.prefs.sec_jit_slower_desc "سكربت في بعض المواقع قد تعمل بشكل بطيئ">
-<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
+<!ENTITY torbutton.prefs.sec_mathml_desc "بعض الآليات لعرض معادلات رياضية معطلة.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML is disabled.">
<!ENTITY torbutton.prefs.sec_med_high "شبه عالٍ">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "All JavaScript performance optimizations are disabled.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "في المواقع التي تشغل جافا سكريبت، يكون تطوير الأداء معطل.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "بعض ميزات إظهار الخطوط معطلة ">
-<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
+<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "آلية تجسيد الخط Graphite معطلة.">
<!ENTITY torbutton.prefs.sec_svg_desc "بعض الانواع من الصور معطله">
-<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "SVG images are disabled.">
-<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript is disabled by default on all non-HTTPS sites.">
-<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript can be enabled on a per-site basis via the NoScript toolbar button.">
+<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "الصور SVG معطلة.">
+<!ENTITY torbutton.prefs.sec_js_https_desc "تعطيل جافا سكريبت افتراضيا على جميع المواقع غير HTTPS.">
+<!ENTITY torbutton.prefs.sec_js_desc_tooltip "يمكن تفعيل جافا سكريبت حسب كل موقع عن طريق زر تعطيل السكريبتات الموجود على شريط الأدوات.">
<!ENTITY torbutton.prefs.sec_high "عالٍ">
-<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript is disabled by default on all sites.">
+<!ENTITY torbutton.prefs.sec_all_js_desc "جافا سكريبت معطل بشكل افتراضي على جميع المواقع.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "من الممكن أن بعض الخطوط والايقونات معروضة خطأ">
-<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Website-provided font files are blocked.">
-<!ENTITY torbutton.prefs.sec_custom "قيم مخصصة">
+<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "ملفات الخط المقدمة من طرف المواقع الإلكترونية محظورة.">
<!ENTITY torbutton.circuit_display.title "دائرة تور لهذا الموقع">
diff --git a/src/chrome/locale/ar/torbutton.properties b/src/chrome/locale/ar/torbutton.properties
index fd7e4b4..fb18bee 100644
--- a/src/chrome/locale/ar/torbutton.properties
+++ b/src/chrome/locale/ar/torbutton.properties
@@ -28,8 +28,8 @@ torbutton.popup.confirm_plugins = البرامج الإضافية مثل فلا
torbutton.popup.never_ask_again = لا تسألني مرة اخري
torbutton.popup.confirm_newnym = متصفح تور
-torbutton.slider_notification = The green onion menu now has a security slider which lets you adjust your security level. Check it out!
-torbutton.slider_notification_button = Open security settings
+torbutton.slider_notification = قائمة البصلة الخضراء لديها الآن منزلق أمني الذي يمكنك من ضبط مستوى أمانك. تحقق من ذلك!
+torbutton.slider_notification_button = فتح إعدادات الأمان
torbutton.maximize_warning = تكبير متصفح تور قد يسمح لبعض المواقع بالتعرف على حجم شاشتك، واستخدام هذه المعلومات لتقفيك. نوصي بابقاء نافذه متصف تور على حجمها الافتراضي.
@@ -45,7 +45,7 @@ canvas.neverAccessKey=ط
# Profile/startup error messages. Strings are kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
profileProblemTitle=%Sمشكله في ملف شخصي
-profileReadOnly=You cannot run %S from a read-only file system. Please copy %S to another location before trying to use it.
-profileReadOnlyMac=You cannot run %S from a read-only file system. Please copy %S to your Desktop or Applications folder before trying to use it.
+profileReadOnly=لا يمكنك تشغيل %S من نظام ملفات خاص بالقراءة فقط. يرجى نسخ %S إلى موقع آخر قبل محاولة استخدامها.
+profileReadOnlyMac=لا يمكنك تشغيل %S من نظام ملفات خاص بالقراءة فقط. يرجى نسخ %S إلى سطح المكتب أو مجلد التطبيقات قبل محاولة استخدامها.
profileAccessDenied=%S does not have permission to access the profile. Please adjust your file system permissions and try again.
profileMigrationFailed=Migration of your existing %S profile failed.\nNew settings will be used.
diff --git a/src/chrome/locale/de/aboutTor.properties b/src/chrome/locale/de/aboutTor.properties
index b7fc4bf..cb7a1fe 100644
--- a/src/chrome/locale/de/aboutTor.properties
+++ b/src/chrome/locale/de/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%1$S">Sicheres</a> Suchen mit <a href="%2$S">
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Jetzt spenden!
+aboutTor.donationBanner.heart=Tor ist am Herz der Internetfreiheit
+aboutTor.donationBanner.tagline1=Millionen von Menschen verlassen sich auf Tor für Online-Sicherheit & Datenschutz
+aboutTor.donationBanner.tagline2=Ein Netzwerk von Menschen, die Menschen schützen
+aboutTor.donationBanner.tagline3=Überwachung = Unterdrückung
+aboutTor.donationBanner.tagline4=Schutz von Journalisten, Aktivisten und Hinweisgebern seit 2006
diff --git a/src/chrome/locale/de/torbutton.dtd b/src/chrome/locale/de/torbutton.dtd
index aff98bf..56253fe 100644
--- a/src/chrome/locale/de/torbutton.dtd
+++ b/src/chrome/locale/de/torbutton.dtd
@@ -1,14 +1,19 @@
<!ENTITY torbutton.context_menu.new_identity "Neue Identität">
-<!ENTITY torbutton.context_menu.new_identity_key "N">
+<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Neuer Kanal für diese Seite">
-<!ENTITY torbutton.context_menu.new_circuit_key "B">
-<!ENTITY torbutton.context_menu.networksettings "Tor-Netzwerk-Einstellungen...">
-<!ENTITY torbutton.context_menu.downloadUpdate "Suche nach Tor-Browser-Aktualisierungen...">
+<!ENTITY torbutton.context_menu.new_circuit_key "K">
+<!ENTITY torbutton.context_menu.preferences "Sicherheitseinstellungen …">
+<!ENTITY torbutton.context_menu.preferences.key "S">
+<!ENTITY torbutton.context_menu.networksettings "Tor-Netzwerk-Einstellungen …">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
+<!ENTITY torbutton.context_menu.downloadUpdate "Auf Tor-Browser-Aktualisierungen prüfen …">
<!ENTITY torbutton.context_menu.downloadUpdate.key "A">
-<!ENTITY torbutton.context_menu.cookieProtections "Cookie-Schutz...">
+<!ENTITY torbutton.context_menu.cookieProtections "Cookie-Schutz …">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Klicken, um Torbutton zu aktivieren">
-<!ENTITY torbutton.prefs.restore_defaults "Vorgabeeinstellungen wiederherstellen">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Cookie-Schutz verwalten">
<!ENTITY torbutton.cookiedialog.lockCol "Geschützt">
<!ENTITY torbutton.cookiedialog.domainCol "Rechner">
@@ -21,33 +26,37 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Neue Cookies schützen">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Neue Cookies nicht schützen">
<!ENTITY torbutton.prefs.restrict_thirdparty "Profildateien (Cookies) von Drittanbietern und andere Überwachungsdaten einschränken">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "E">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Lassen Sie dieses Feld ausgewählt um zu verhindern, das verschiedene Browserfunktionen ausgenutzt werden um Ihr Surfverhalten nachzuverfolgen. Die veränderten Funktionen betreffen: BLOB-URLs, Rundruf-Kanäle, den Browser-Puffer, Cookies, Favicons, HTTP-Authentifizierungs-Kopfdaten, Verknüpfungs-Vorverbindungen, den lokalen Speicher, URLs von Medienquellen, OCSP-Anfrage, gemeinsame JavaScript-Instanzen und Tickets von TLS-Sitzungen.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Details ändern, die Sie von anderen Tor-Browser-Benutzern unterscheiden">
-<!ENTITY torbutton.prefs.sec_caption "Sicherheitslevel">
-<!ENTITY torbutton.prefs.sec_low "gering (Standard)">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Lassen Sie dieses Feld ausgewählt um bestimmte einzigartige Informationen Ihres Systems vor Webportalen zu verbergen, wie Ihrem Akku-Status, der Rechnerleistung, Tastaturbelegung, dem Sprachprofil, dem Installationsort von Erweiterungen, der Liste der intallierten Erweiterungen, Ihrem Netzwerkstatus, der Bildschirmausrichtung, Bildschirmgröße, seitenspezifischen Vergrößerungseinstellungen, unterstützten Dateitypen, Farbschema und WebGL-Unterstützung.">
+<!ENTITY torbutton.prefs.sec_caption "Sicherheitsstufe">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Der Sicherheitsschieberegler gestattet Ihnen bestimmte Browserfunktionen, die Ihren Browser für mögliche Attacken anfälliger machen, zu deaktivieren.">
+<!ENTITY torbutton.prefs.sec_low "Gering (Standard)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Dies liefert die am meisten nutzbaren Erfahrungen.">
-<!ENTITY torbutton.prefs.sec_low_desc "Auf diesem Sicherheitsniveau sind alle Merkmale des Browsers freigegeben.">
-<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Der SVG-OpenType-Schriftart-Renderingvorgang ist deaktiviert.">
-<!ENTITY torbutton.prefs.sec_med_low "unteres Mittel">
+<!ENTITY torbutton.prefs.sec_low_desc "Auf dieser Sicherheitsstufe sind alle Browserfunktionen aktiviert.">
+<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Der SVG-OpenType-Schriftdarstellungsvorgang ist deaktiviert.">
+<!ENTITY torbutton.prefs.sec_med_low "Unteres Mittel">
<!ENTITY torbutton.prefs.sec_gen_desc "Auf dieser Sicherheitsstufe gelten die folgenden Änderungen (für weitere Details mit der Maus überfahren):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5-Video- und Audiomedien werden per Click-to-Play über NoScript abspielbar.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Auf manchen Webseiten müssen Sie möglicherweise die NoScript-Schaltfläche in der Werkzeugleiste verwenden, um diese Medienobjekte zu aktivieren.">
-<!ENTITY torbutton.prefs.sec_some_jit_desc "Einige JavaScript Ausführungsoptimierungen sind unterbunden.">
+<!ENTITY torbutton.prefs.sec_some_jit_desc "Einige JavaScript-Ausführungsoptimierungen sind deaktiviert.">
<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "ION JIT, Typinferenz, ASM.JS.">
<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "JIT-Basis.">
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts können auf manchen Seiten langsamer laufen.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Manche Vorgänge zur Anzeige von mathematischen Gleichungen sind deaktiviert.">
-<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML ist blockiert.">
-<!ENTITY torbutton.prefs.sec_med_high "oberes Mittel">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Alle JavaScript-Leistungsoptimierungen sind deaktiviert.">
-<!ENTITY torbutton.prefs.sec_font_rend_desc "Einige Schriftabbildungseigenschaften sind blockiert.">
-<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Der Graphite-Schriftart-Renderingvorgang ist deaktiviert.">
-<!ENTITY torbutton.prefs.sec_svg_desc "Einige Arten von Bilddateien sind blockiert.">
-<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "SVG-Bilder sind blockiert.">
+<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML ist deaktiviert.">
+<!ENTITY torbutton.prefs.sec_med_high "Oberes Mittel">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Auf Seiten wo JavaScript aktiviert ist, sind Leistungsoptimierungen deaktiviert.">
+<!ENTITY torbutton.prefs.sec_font_rend_desc "Einige Schriftabbildungseigenschaften sind deaktiviert.">
+<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Der Graphite-Schriftdarstellungsvorgang ist deaktiviert.">
+<!ENTITY torbutton.prefs.sec_svg_desc "Einige Arten von Bilddateien sind deaktiviert.">
+<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "SVG-Bilder sind deaktiviert.">
<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript ist standardmäßig auf allen Nicht-HTTPS-Webseiten deaktiviert.">
<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript kann über die NoScript-Schaltfläche in der Werkzeugleiste für jede Webseite einzeln aktiviert werden.">
-<!ENTITY torbutton.prefs.sec_high "hoch">
+<!ENTITY torbutton.prefs.sec_high "Hoch">
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript ist standardmäßig auf allen Webseiten deaktiviert.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Manche Schriftarten und Symbole könnten falsch angezeigt werden.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Von Webseiten bereitgestellte Schriftartdateien sind gesperrt.">
-<!ENTITY torbutton.prefs.sec_custom "Eigene Werte">
<!ENTITY torbutton.circuit_display.title "Tor-Kanal für diese Seite">
diff --git a/src/chrome/locale/de/torbutton.properties b/src/chrome/locale/de/torbutton.properties
index c6cdcfe..1e38c45 100644
--- a/src/chrome/locale/de/torbutton.properties
+++ b/src/chrome/locale/de/torbutton.properties
@@ -29,7 +29,7 @@ torbutton.popup.never_ask_again = Nicht mehr nachfragen
torbutton.popup.confirm_newnym = Tor-Browser wird alle Fenster und Reiter schließen. Alle Internetseitensitzungen gehen verloren.\n\nTor-Browser jetzt neu starten, um Ihre Identität zurückzusetzen?\n\n
torbutton.slider_notification = Das grüne Onion-Menü hat jetzt einen Sicherheitsschieberegler, mit dem Sie Ihre Sicherheitsstufe anpassen können. Probieren Sie es aus!
-torbutton.slider_notification_button = Öffne Sicherheits-Einstellungen
+torbutton.slider_notification_button = Sicherheitseinstellungen öffnen
torbutton.maximize_warning = Die Maximierung des Tor-Browsers kann Webseiten die Bestimmung Ihrer Bildschirmgröße ermöglichen, um damit Ihre Spur zu verfolgen. Wir empfehlen Ihnen, das Tor-Browser-Fenster in seiner ursprünglichen Standardgröße zu belassen.
diff --git a/src/chrome/locale/es/aboutTor.properties b/src/chrome/locale/es/aboutTor.properties
index fb92251..fe998a0 100644
--- a/src/chrome/locale/es/aboutTor.properties
+++ b/src/chrome/locale/es/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Busque <a href="%1$S">de forma segura</a> con <a href=
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=¡Done ahora!
+aboutTor.donationBanner.heart=Tor está en el corazón de la libertad en Internet
+aboutTor.donationBanner.tagline1=Millones de personas dependen de Tor para la seguridad y la privacidad en línea
+aboutTor.donationBanner.tagline2=Una red de personas protegiendo a personas
+aboutTor.donationBanner.tagline3=Vigilancia = Opresión
+aboutTor.donationBanner.tagline4=Protegiendo a periodistas, activistas e informantes desde 2006
diff --git a/src/chrome/locale/es/torbutton.dtd b/src/chrome/locale/es/torbutton.dtd
index a945042..fad96e0 100644
--- a/src/chrome/locale/es/torbutton.dtd
+++ b/src/chrome/locale/es/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Nuevo circuito Tor para este sitio">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Configuración de seguridad...">
+<!ENTITY torbutton.context_menu.preferences.key "C">
<!ENTITY torbutton.context_menu.networksettings "Configuración de red Tor...">
+<!ENTITY torbutton.context_menu.networksettings.key "R">
<!ENTITY torbutton.context_menu.downloadUpdate "Comprobar actualización del Navegador Tor...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "a">
<!ENTITY torbutton.context_menu.cookieProtections "Protecciones de cookie...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Haga clic para inicializar Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Restablecer valores predeterminados ">
+<!ENTITY torbutton.prefs.security_settings "Configuración de seguridad del Navegador Tor">
+<!ENTITY torbutton.prefs.restore_defaults "Restaurar valores predeterminados">
+<!ENTITY torbutton.prefs.custom_warning "Sus preferencias personalizadas para el navegador han resultado en una configuración de seguridad inusual. Por motivos de seguridad y privacidad, le recomendamos uno de los de los niveles de seguridad predeterminados.">
<!ENTITY torbutton.cookiedialog.title "Administrar protecciones de cookie">
<!ENTITY torbutton.cookiedialog.lockCol "Protegidas">
<!ENTITY torbutton.cookiedialog.domainCol "Servidor (host)">
@@ -21,8 +26,15 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Proteger las nuevas cookies">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "No proteger las nuevas cookies">
<!ENTITY torbutton.prefs.restrict_thirdparty "Restringir cookies de terceros y otros datos de seguimiento">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "T">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "
+Mantenga marcada esta casilla para evitar que diversas características del navegador sean explotadas para rastrear su navegación por la web. Las características modificadas incluyen URLs blob (a objetos binarios internos), BroadcastChannel (comunicación interna dentro del mismo origen), caché del navegador, cookies, favicons, cabeceras Auth de HTTP (autentificación básica), preconexiones de enlaces, objetos localStorage (almacenamiento local para aplicaciones web), URLs de objetos MediaSource (audiovisuales), peticiones OCSP (estado de certificados), SharedWorkers (subprocesos compartidos), y tickets de sesión TLS.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Cambiar los detalles que le distinguen de otros usuarios del Navegador Tor">
-<!ENTITY torbutton.prefs.sec_caption "Nivel de Seguridad">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "H">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "
+Mantenga marcada esta casilla para ocultar a los sitios web detalles que pudieran ser únicos acerca de usted, incluyendo el estado de su batería, el rendimiento del equipo, la distribución del teclado, la configuración regional, la ubicación y la lista de los plugins instalados, el estado de la red, la orientación y el tamaño de la pantalla, niveles de zoom específicos para sitios web, tipos de fichero soportados, los colores del sistema, y las capacidades gráficas WebGL.">
+<!ENTITY torbutton.prefs.sec_caption "Nivel de seguridad">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "El control deslizante del nivel de seguridad le permite deshabilitar ciertas características del navegador que pueden hacerlo más vulnerable a tentativas de hackeo.">
<!ENTITY torbutton.prefs.sec_low "Bajo (por defecto)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Esto proporciona la mejor experiencia de usabilidad.">
<!ENTITY torbutton.prefs.sec_low_desc "En este nivel de seguridad, todas las funciones del navegador están habilitadas.">
@@ -38,7 +50,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Algunos mecanismos de representación de ecuaciones matemáticas están deshabilitados.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML está deshabilitado.">
<!ENTITY torbutton.prefs.sec_med_high "Medio-Alto">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Todas las optimizaciones de rendimiento de JavaScript están deshabilitadas.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "En sitios donde JavaScript esté habilitado, las optimizaciones de rendimiento están deshabilitadas.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Algunas características de representación de fuentes están deshabilitadas.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "El mecanismo de representación de fuentes Graphite está deshabilitado.">
<!ENTITY torbutton.prefs.sec_svg_desc "Algunos tipos de imágenes están deshabilitados.">
@@ -49,5 +61,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript está deshabilitado por defecto en todos los sitios.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Algunas fuentes e iconos pueden mostrarse de forma incorrecta.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Los ficheros de fuentes proporcionados por el sitio web están bloqueados.">
-<!ENTITY torbutton.prefs.sec_custom "Valores Personalizados">
<!ENTITY torbutton.circuit_display.title "Circuito Tor para este sitio">
diff --git a/src/chrome/locale/eu/aboutTor.properties b/src/chrome/locale/eu/aboutTor.properties
index 30a7858..81d4c44 100644
--- a/src/chrome/locale/eu/aboutTor.properties
+++ b/src/chrome/locale/eu/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Bilatu<a href="%1$S">modu seguruan</a> ondokoarekin: <
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/eu/torbutton.dtd b/src/chrome/locale/eu/torbutton.dtd
index 9d745a5..3a73531 100644
--- a/src/chrome/locale/eu/torbutton.dtd
+++ b/src/chrome/locale/eu/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Tor zirkuitu berria gune honetarako">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Security Settings…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Tor Sarearen Ezarpenak...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Tor Browser eguneraketa egiaztatu">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Cookie babesak...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Sakatu Torbutton abiarazteko">
-<!ENTITY torbutton.prefs.restore_defaults "Lehenetsiak berrezarri">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Cookie Babesak kudeatu">
<!ENTITY torbutton.cookiedialog.lockCol "Babestuta">
<!ENTITY torbutton.cookiedialog.domainCol "Ostalaria">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Cookie berriak babestu">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Ez babestu cookie berririk">
<!ENTITY torbutton.prefs.restrict_thirdparty "Hirugarrenen cookie-ak eta beste jarraipen datuak murriztu">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Zu beste Tor Browser erabiltzaileengandik nabarmentzen zaituzten xehetasunak aldatu">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
<!ENTITY torbutton.prefs.sec_caption "Segurtasun maila">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "The Security Slider lets you disable certain browser features that may make your browser more vulnerable to hacking attempts.">
<!ENTITY torbutton.prefs.sec_low "Baxua (lehentsia)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "This provides the most usable experience.">
<!ENTITY torbutton.prefs.sec_low_desc "At this security level, all browser features are enabled.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML ezgaituta dago.">
<!ENTITY torbutton.prefs.sec_med_high "Ertaina-altua">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "All JavaScript performance optimizations are disabled.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Some font rendering features are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
<!ENTITY torbutton.prefs.sec_svg_desc "Some types of images are disabled.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript is disabled by default on all sites.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Some fonts and icons may display incorrectly.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Webguneak hornitutako letra fitxategiak blokeatuta daude.">
-<!ENTITY torbutton.prefs.sec_custom "Balio pertsonalizatuak">
<!ENTITY torbutton.circuit_display.title "Gune honetako Tor zirkuitua">
diff --git a/src/chrome/locale/fa/aboutTor.properties b/src/chrome/locale/fa/aboutTor.properties
index 54e04d9..a591490 100644
--- a/src/chrome/locale/fa/aboutTor.properties
+++ b/src/chrome/locale/fa/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=جستجو <a href="%1$S">ایمن</a> با <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=اکنون اهداء کنید!
+aboutTor.donationBanner.heart=تور هست در قلب آزادی اینترنت
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=یک شبکه از مردم برای حفاظت از مردم
+aboutTor.donationBanner.tagline3=نظارت = ستم
+aboutTor.donationBanner.tagline4=حفاظت از روزنامه نگاران، فعالان و افشاگران از سال 2006
diff --git a/src/chrome/locale/fa/torbutton.dtd b/src/chrome/locale/fa/torbutton.dtd
index cfe1f66..b7edae6 100644
--- a/src/chrome/locale/fa/torbutton.dtd
+++ b/src/chrome/locale/fa/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "شبکه جدید Tor برای این سایت">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "تنظیمات امنیتی…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "تنظیمات شبکه تور">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "بررسی بروز رسانی Tor Browser ...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "حفاظت کوکی ها...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "جهت شروع دكمه تُرکليک کنيد">
-<!ENTITY torbutton.prefs.restore_defaults "بازگرداندن تنظیمات به حالت پیشفرض">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "مديريت حفاظت کلوچکها">
<!ENTITY torbutton.cookiedialog.lockCol "حفاظت شده">
<!ENTITY torbutton.cookiedialog.domainCol "ميزبان">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "حفاظت از کلوچکهای جديد">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "عدم حفاظت از کلوچکهای جديد">
<!ENTITY torbutton.prefs.restrict_thirdparty "محدودكردن كوكىهاى طرف سوم و دادههاى پيگردى ديگر">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "تغييردادن جزئياتى كه شمارا از كاربران ديگر تُر تميزمىكند">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
<!ENTITY torbutton.prefs.sec_caption "سطح امنیت">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "The Security Slider lets you disable certain browser features that may make your browser more vulnerable to hacking attempts.">
<!ENTITY torbutton.prefs.sec_low "پایین (به طور پیش فرض)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "این فراهم می کند بیشترین تجربه قابل استفاده.">
<!ENTITY torbutton.prefs.sec_low_desc "در این سطح امنیتی، تمام ویژگی های مرورگر ها فعال است.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "برخی مکانیسم ها نمایش معادلات ریاضی غیر فعال می باشد.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML غیر فعال است.">
<!ENTITY torbutton.prefs.sec_med_high "متوسط - بالا">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "همه بهینه سازی عملکرد جاوا اسکریپت غیر فعال شده است.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "برخی از ویژگی های رندر فونت غیر فعال می باشد.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "مکانیسم گرافیت رندر فونت غیر فعال است.">
<!ENTITY torbutton.prefs.sec_svg_desc "برخی از انواع تصاویر غیر فعال هستند.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "جاوا اسکریپت به طور پیش فرض در تمامی سایت ها غیر فعال است.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "برخی از فونت ها و آیکون های ممکن است نمایش نادرست داشته باشند.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "فایل های فونتی که در وب سایت ارائه می شوند مسدود شده است.">
-<!ENTITY torbutton.prefs.sec_custom "تنظیم سفارشی">
<!ENTITY torbutton.circuit_display.title "مدار Tor برای این سایت">
diff --git a/src/chrome/locale/fr/aboutTor.properties b/src/chrome/locale/fr/aboutTor.properties
index ec59d81..5842c54 100644
--- a/src/chrome/locale/fr/aboutTor.properties
+++ b/src/chrome/locale/fr/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Rechercher <a href="%1$S">de manière sécurisée</a>
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/fr/torbutton.dtd b/src/chrome/locale/fr/torbutton.dtd
index 184a9a6..035203b 100644
--- a/src/chrome/locale/fr/torbutton.dtd
+++ b/src/chrome/locale/fr/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Nouveau circuit Tor pour ce site">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Paramètres de sécurité ...">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Paramètres du réseau Tor">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Vérifier les mises à jour du Navigateur Tor">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Protections contre les cookies">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Cliquez pour lancer Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Valeurs par défaut">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Gérer les protections de cookies">
<!ENTITY torbutton.cookiedialog.lockCol "Protégé">
<!ENTITY torbutton.cookiedialog.domainCol "Hôte">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Protéger les nouveaux cookies">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Ne pas protéger les nouveaux cookies">
<!ENTITY torbutton.prefs.restrict_thirdparty "Limiter les cookies tiers ainsi que les autres données de traçage">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Modifier les détails qui vous distinguent des autres utilisateurs du Navigateur Tor">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
<!ENTITY torbutton.prefs.sec_caption "Niveau de sécurité">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Le curseur de sécurité vous laisse mettre hors de service certaines fonctions de navigateur qui peuvent rendre votre navigateur plus vulnérable aux tentatives de piratage informatique.">
<!ENTITY torbutton.prefs.sec_low "Faible (par défaut)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Cela offre l'expérience la plus agréable.">
<!ENTITY torbutton.prefs.sec_low_desc "A ce niveau de sécurité, toutes les fonctions de navigation sont activées.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Quelques mécanismes d'affichage d'équations mathématiques sont désactivés.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML est désactivé.">
<!ENTITY torbutton.prefs.sec_med_high "Moyennement haut">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Toutes les optimisations de performance de Javascript sont désactivées.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Sur les sites où Javascript est permis, les optimisations de performance sont désactivées.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Certaines fonctionnalités de rendu de police sont désactivées.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Le mécanisme de rendu de police de caractères Graphite est désactivé.">
<!ENTITY torbutton.prefs.sec_svg_desc "Certains formats d'images sont désactivés.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript est désactivé par défaut sur tous les sites.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Certaines polices de caractères et icônes peuvent être affichées de façon incorrecte.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Les fichiers de police de caractères fournis par des sites Web sont bloqués.">
-<!ENTITY torbutton.prefs.sec_custom "Valeurs personnalisées">
<!ENTITY torbutton.circuit_display.title "Circuit Tor pour ce site">
diff --git a/src/chrome/locale/it/aboutTor.properties b/src/chrome/locale/it/aboutTor.properties
index db49b15..58592a6 100644
--- a/src/chrome/locale/it/aboutTor.properties
+++ b/src/chrome/locale/it/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Cerca <a href="%1$S"> in sicurezza </a> con <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Dona ora!
+aboutTor.donationBanner.heart=Tor è al centro della libertà di Internet
+aboutTor.donationBanner.tagline1=Milioni di persone dipendono da Tor per la loro Sicurezza e Privacy online
+aboutTor.donationBanner.tagline2=Una rete di persone a protezione delle persone
+aboutTor.donationBanner.tagline3=Sorveglianza = Oppressione
+aboutTor.donationBanner.tagline4=Proteggiamo giornalisti, attivisti e informatori dal 2006
diff --git a/src/chrome/locale/it/torbutton.dtd b/src/chrome/locale/it/torbutton.dtd
index 307f6a7..eb1090a 100644
--- a/src/chrome/locale/it/torbutton.dtd
+++ b/src/chrome/locale/it/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Nuovo Circuito Tor per questo Sito">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Impostazioni di sicurezza...">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Impostazioni di rete di Tor...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Controllo per aggiornamento Tor Browser...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "A">
<!ENTITY torbutton.context_menu.cookieProtections "Protezioni dei Cookie...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Fai clic per inizializzare Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Reimposta i valori di default">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Gestisci protezione Cookies">
<!ENTITY torbutton.cookiedialog.lockCol "Protetto">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Proteggi i nuovi cookie">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Non proteggere i nuovi cookie">
<!ENTITY torbutton.prefs.restrict_thirdparty "Limita i cookie di terze parti e altri dati di tracciamento">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Mantieni questo box selezionato per evitare che diverse funzionalità del browser possano essere utilizzate per tracciare la tua navigazione. Le funzionalità modificate includono URL blob, canali di trasmissione, la cache del browser, cookie, favicon, intestazioni di Auth HTTP, link a cui ti sei connesso, localStorage, URL mediaSource, richieste OCSP, SharedWorkers, a ticket di sessioni TLS.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Cambia i dettagli che ti distinguono dagli altri utenti di Tor Browser">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Mantieni questo box selezionato per nascondere ai siti informazioni univoche su di te, incluse lo stato della batteria, le performance del computer, il layout della tastiera, locale, il luogo di installazione dei plugin, la lista dei plugin installati, lo stato della tua rete, l'orientamento dello schermo, le dimensioni dello schermo, livelli di zoom specifici per i siti, le tipologie di file supportati, i colori del sistema, and le capacità di gestire WebGL.">
<!ENTITY torbutton.prefs.sec_caption "Livello di Sicurezza">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Il Security Slider ti permette di disabilitare determinate funzionalità del browser che potrebbero renderlo più vulnerabile a tentativi di attacco.">
<!ENTITY torbutton.prefs.sec_low "Basso (default)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Questo permette la migliore esperienza di usablità.">
<!ENTITY torbutton.prefs.sec_low_desc "A questo livello di sicurezza, tutte le features del browser sono abilitate.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Alcuni meccanismi di visualizzazione di equazioni matematiche sono disabilitati.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML è disabilitato.">
<!ENTITY torbutton.prefs.sec_med_high "Medio-Alto">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Tutte le ottimizzazioni di JavaScript per le performance sono disattivate.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Nei siti dove è attivato JavaScript le ottimizzazioni sono disabilitate">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Alcuni rendering dei font sono disabilitati.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Il meccanismo di rendering font Graphite è disabilitato.">
<!ENTITY torbutton.prefs.sec_svg_desc "Alcuni tipi di immagini sono disabilitati.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript è disabilitato di default su tutti i siti.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Alcuni caratteri e icone possono non essere visualizzati correttamente.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "I font provvisti dal sito sono bloccati.">
-<!ENTITY torbutton.prefs.sec_custom "Valori personalizzati">
<!ENTITY torbutton.circuit_display.title "Circuito Tor per questo sito">
diff --git a/src/chrome/locale/ja/aboutTor.properties b/src/chrome/locale/ja/aboutTor.properties
index ed1ecc6..317071d 100644
--- a/src/chrome/locale/ja/aboutTor.properties
+++ b/src/chrome/locale/ja/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%2$S">Disconnect.me</a>で<a href="%1$S">安
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/ja/torbutton.dtd b/src/chrome/locale/ja/torbutton.dtd
index 37c4c68..6a82835 100644
--- a/src/chrome/locale/ja/torbutton.dtd
+++ b/src/chrome/locale/ja/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "このサイト用の新しい Tor サーキット">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Security Settings…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Torネットワークの設定...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "TorBrowserのアップデートを確認">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Cookie の防御">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Torbuttonを初期状態に戻す">
-<!ENTITY torbutton.prefs.restore_defaults "デフォルト設定に戻す">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Cookie保護を管理">
<!ENTITY torbutton.cookiedialog.lockCol "保護済み">
<!ENTITY torbutton.cookiedialog.domainCol "ホスト">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "新しいCookieを保護">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "新しいCookieを保護しない">
<!ENTITY torbutton.prefs.restrict_thirdparty "サードパーティーのCookieやその他のトラッキングデータを制限">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "このボックスをチェックしたままにすることで、様々なブラウザーの機能が悪用されウェブの閲覧中に追跡されることを防ぐ。影響を受ける機能:blob URL、ブロードキャスト・チャンネル、ブラウザー・キャッシュ、クッキー、favicon、HTTP認証ヘッダー、link preconnects、ローカルストレージ、mediaSource URL、OCSPリクエスト、共有ワーカー、TLSセッション・チケットなど。">
<!ENTITY torbutton.prefs.resist_fingerprinting "あなたとほかのTorブラウザのユーザーを区別する詳細を変更">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "このボックスをチェックしたままにすることで、ウェブサイトからあなたを識別する内容を隠す:バッテリー状態、コンピューターの性能、キーボードの配列、地域設定、インストールされたプラグインの場所、インストールされたプラグインの一覧、あなたのネットワーク状態、画面の向き、画面の大きさ、サイトごとのズームレベル、対応するファイルの種類、システムの色、WebGL能力など。">
<!ENTITY torbutton.prefs.sec_caption "セキュリティレベル">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "セキュリティ・スライダーを使って、あなたのブラウザーをハッキングの試みに対してより脆弱にする可能性のあるブラウザーの機能を無効にできます。">
<!ENTITY torbutton.prefs.sec_low "低い(デフォルト)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "最大の利便性を提供します。">
<!ENTITY torbutton.prefs.sec_low_desc "このレベルでは、全てのブラウザーの機能が有効化されます。">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "数式を表示するためのいくつかの機能が無効化されます。">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML が無効化されます。">
<!ENTITY torbutton.prefs.sec_med_high "高中">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "全ての JavaScript のパフォーマンス最適化機能が無効化されます。">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "JavaScriptが有効になっているサイトで、パフォーマンスの最適化が無効になります。">
<!ENTITY torbutton.prefs.sec_font_rend_desc "いくつかのフォントレンダリング機能が無効化されます。">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Graphite フォントレンダリング機能は無効化されます。">
<!ENTITY torbutton.prefs.sec_svg_desc "いくつかの画像の種類が無効化されます。">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "全てのサイトの JavaScript はデフォルトで無効化されます。">
<!ENTITY torbutton.prefs.sec_webfonts_desc "いくつかのフォントとアイコンは正常に表示されません。">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Web サイトが提供するフォントはブロックされます。">
-<!ENTITY torbutton.prefs.sec_custom "カスタム値">
<!ENTITY torbutton.circuit_display.title "このサイト用の Tor サーキット">
diff --git a/src/chrome/locale/ko/aboutTor.properties b/src/chrome/locale/ko/aboutTor.properties
index 69c53da..0f526d8 100644
--- a/src/chrome/locale/ko/aboutTor.properties
+++ b/src/chrome/locale/ko/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%2$S">Diconnect.me</a>를 통해 <a href="%1$
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/ko/torbutton.dtd b/src/chrome/locale/ko/torbutton.dtd
index 61b4d53..df64398 100644
--- a/src/chrome/locale/ko/torbutton.dtd
+++ b/src/chrome/locale/ko/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Tor 서킷 재구축">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Security Settings…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "토르 네트워크 설정...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "토르 브라우저 업데이트 체크하기...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "쿠키 보호....">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Torbutton 설정 초기화">
-<!ENTITY torbutton.prefs.restore_defaults "설정 초기화">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "쿠키 보호 관리">
<!ENTITY torbutton.cookiedialog.lockCol "보호됨">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "새로운 쿠키 보호">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "새로운 쿠키를 보호하지 않음">
<!ENTITY torbutton.prefs.restrict_thirdparty "제 3자 쿠키와 다른 추적 데이터 제한">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "다른 Tor browser 사용자로부터 구별되는 세부 사항 변경">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
<!ENTITY torbutton.prefs.sec_caption "보안 등급">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "The Security Slider lets you disable certain browser features that may make your browser more vulnerable to hacking attempts.">
<!ENTITY torbutton.prefs.sec_low "낮음 (기본)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "This provides the most usable experience.">
<!ENTITY torbutton.prefs.sec_low_desc "At this security level, all browser features are enabled.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML가 비활성화 되었습니다.">
<!ENTITY torbutton.prefs.sec_med_high "중간 높음">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "모든 JavaScript 의 성능 최적화가 비활성화되었습니다.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "일부 폰트의 렌터링이 비활성화되었습니다.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
<!ENTITY torbutton.prefs.sec_svg_desc "몇몇 종류의 이미지가 비활성화 되었습니다.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "자바 스크립트는 기본 설정으로 모든 사이트에서 비활성화 되어 있습니다.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "어떤 글씨체나 아이콘은 올바르지 않게 표시될 수 있습니다.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "사이트 내장 폰트가 차단되었습니다.">
-<!ENTITY torbutton.prefs.sec_custom "맞춤 값">
<!ENTITY torbutton.circuit_display.title "Tor circuit for this site">
diff --git a/src/chrome/locale/nl/aboutDialog.dtd b/src/chrome/locale/nl/aboutDialog.dtd
index 33e7e78..b173adb 100644
--- a/src/chrome/locale/nl/aboutDialog.dtd
+++ b/src/chrome/locale/nl/aboutDialog.dtd
@@ -1,7 +1,7 @@
<!ENTITY project.start "&brandShortName; wordt ontwikkeld door">
<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
<!ENTITY project.tpoLink "het &vendorShortName;">
-<!ENTITY project.end ", een non-profit die zich inzet om uw privacy en vrijheid online te verdedigen.">
+<!ENTITY project.end ", een non-profit die zich inzet om je privacy en vrijheid online te verdedigen.">
<!ENTITY help.start "Wil je meehelpen?">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
diff --git a/src/chrome/locale/nl/aboutTBUpdate.dtd b/src/chrome/locale/nl/aboutTBUpdate.dtd
index 57a8c54..e773a68 100644
--- a/src/chrome/locale/nl/aboutTBUpdate.dtd
+++ b/src/chrome/locale/nl/aboutTBUpdate.dtd
@@ -1,6 +1,6 @@
-<!ENTITY aboutTBUpdate.title "Tor Browser Update">
-<!ENTITY aboutTBUpdate.updated "Tor Browser is bijgewerkt.">
-<!ENTITY aboutTBUpdate.linkPrefix "Voor meer info over deze release,">
-<!ENTITY aboutTBUpdate.linkLabel "bekijk onze website">
+<!ENTITY aboutTBUpdate.title "Tor-browserupdate">
+<!ENTITY aboutTBUpdate.updated "Tor-browser is bijgewerkt.">
+<!ENTITY aboutTBUpdate.linkPrefix "Bezoek voor meer info over deze uitgave">
+<!ENTITY aboutTBUpdate.linkLabel "onze website">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.changeLogHeading "Wijzigingslogboek:">
diff --git a/src/chrome/locale/nl/aboutTor.dtd b/src/chrome/locale/nl/aboutTor.dtd
index 9c6068b..023457e 100644
--- a/src/chrome/locale/nl/aboutTor.dtd
+++ b/src/chrome/locale/nl/aboutTor.dtd
@@ -6,18 +6,18 @@
<!ENTITY aboutTor.title "Over Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "Waarschuwing: Deze browser is verouderd!">
+<!ENTITY aboutTor.outOfDateTorOn.label "Waarschuwing: deze browser is verouderd!">
<!ENTITY aboutTor.outOfDateTorOff.label "BOVENDIEN is deze browser verouderd.">
-<!ENTITY aboutTor.outOfDate2.label "Klik op de ui en kies Controleer op Tor Browser Update">
+<!ENTITY aboutTor.outOfDate2.label "Klik op de ui en kies Controleer op Tor-browserupdate.">
-<!ENTITY aboutTor.check.label "Test Tor Netwerkinstellingen">
+<!ENTITY aboutTor.check.label "Test Tor-netwerkinstellingen">
-<!ENTITY aboutTor.success.label "Welkom bij Tor Browser">
-<!ENTITY aboutTor.success2.label "Verbonden met het Tor netwerk.">
+<!ENTITY aboutTor.success.label "Welkom bij Tor-browser">
+<!ENTITY aboutTor.success2.label "Verbonden met het Tor-netwerk.">
<!ENTITY aboutTor.success3.label "Je kan nu anoniem over het internet browsen.">
<!ENTITY aboutTor.failure.label "Er ging iets mis!">
<!ENTITY aboutTor.failure2.label "Tor werkt niet in deze browser.">
-<!ENTITY aboutTor.failure3prefix.label "Voor hulp, contacteer">
+<!ENTITY aboutTor.failure3prefix.label "Contacteer voor hulp">
<!ENTITY aboutTor.failure3Link "help(a)rt.torproject.org">
<!ENTITY aboutTor.failure3suffix.label ".">
@@ -29,21 +29,21 @@
<!ENTITY aboutTor.torInfo1.label "Bijkomende informatie:">
<!ENTITY aboutTor.torInfo2.label "Land & IP-adres:">
-<!ENTITY aboutTor.torInfo3.label "Exit Node:">
-<!ENTITY aboutTor.torInfo4.label "Deze server logt geen enkele informatie over bezoekers.">
+<!ENTITY aboutTor.torInfo3.label "Exitnode:">
+<!ENTITY aboutTor.torInfo4.label "Deze server houdt geen enkele informatie over bezoekers bij.">
<!ENTITY aboutTor.whatnextQuestion.label "Wat nu?">
-<!ENTITY aboutTor.whatnextAnswer.label "Tor is NIET alles wat je nodig hebt om anoniem te kunnen browsen. Mogelijk is het nodig dat je bepaalde browsing-gewoontes veranderen om te verzekeren dat je identiteit veilig blijft.">
+<!ENTITY aboutTor.whatnextAnswer.label "Tor is NIET alles wat je nodig hebt om anoniem te kunnen browsen. Mogelijk is het nodig dat je bepaalde browsegewoontes verandert om te verzekeren dat je identiteit veilig blijft.">
<!ENTITY aboutTor.whatnext.label "Tips om anoniem te blijven »">
<!ENTITY aboutTor.whatnext.link "https://www.torproject.org/download/download.html.en#warning">
<!ENTITY aboutTor.helpInfo1.label "Jij kan helpen!">
-<!ENTITY aboutTor.helpInfo2.label "Er zijn veel verschillende manieren hoe jij kan helpen het Tor Netwerk sneller en sterker te maken:">
-<!ENTITY aboutTor.helpInfo3.label "Draai een Tor Relay Node »">
+<!ENTITY aboutTor.helpInfo2.label "Er zijn veel verschillende manieren hoe jij kan helpen het Tor-netwerk sneller en sterker te maken:">
+<!ENTITY aboutTor.helpInfo3.label "Draai een Tor-relaynode »">
<!ENTITY aboutTor.helpInfo3.link "https://www.torproject.org/docs/tor-doc-relay.html.en">
<!ENTITY aboutTor.helpInfo4.label "Word vrijwilliger">
<!ENTITY aboutTor.helpInfo4.link "https://www.torproject.org/getinvolved/volunteer.html.en">
-<!ENTITY aboutTor.helpInfo5.label "Maak een donatie »">
+<!ENTITY aboutTor.helpInfo5.label "Doneer »">
<!ENTITY aboutTor.helpInfo5.link "https://www.torproject.org/donate/donate.html.en">
-<!ENTITY aboutTor.footer.label "Het Tor Project is een US 501(c)(3) non-profit voor onderzoek, ontwikkeling, onderwijs in online anonimiteit en privacy.">
-<!ENTITY aboutTor.learnMore.label "Leer meer over Het Tor Project » ">
+<!ENTITY aboutTor.footer.label "Het Tor Project is een US 501(c)(3) non-profit voor onderzoek, ontwikkeling en onderwijs in online anonimiteit en privacy.">
+<!ENTITY aboutTor.learnMore.label "Leer meer over het Tor-project » ">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
diff --git a/src/chrome/locale/nl/aboutTor.properties b/src/chrome/locale/nl/aboutTor.properties
index 63c49fa..83c190a 100644
--- a/src/chrome/locale/nl/aboutTor.properties
+++ b/src/chrome/locale/nl/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%1$S">Veilig</a> zoeken met <a href="%2$S">Di
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Doneer nu!
+aboutTor.donationBanner.heart=Tor staat aan de basis van internetvrijheid
+aboutTor.donationBanner.tagline1=Miljoenen mensen hangen af van Tor voor online veiligheid en privacy
+aboutTor.donationBanner.tagline2=Een netwerk van mensen die mensen beschermen
+aboutTor.donationBanner.tagline3=Afluisteren = onderdrukken
+aboutTor.donationBanner.tagline4=Beschermt journalisten, activisten en klokkenluiders sinds 2006
diff --git a/src/chrome/locale/nl/brand.properties b/src/chrome/locale/nl/brand.properties
index 036f97a..43f4361 100644
--- a/src/chrome/locale/nl/brand.properties
+++ b/src/chrome/locale/nl/brand.properties
@@ -2,15 +2,15 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-brandShorterName=Tor Browser
-brandShortName=Tor Browser
-brandFullName=Tor Browser
-vendorShortName=Tor Project
+brandShorterName=Tor-browser
+brandShortName=Tor-browser
+brandFullName=Tor-browser
+vendorShortName=Tor-project
homePageSingleStartMain=Firefox Start, een snelle startpagina met ingebouwde zoekfunctie
homePageImport=Importeer je startpagina uit %S
-homePageMigrationPageTitle=Startpagina selectie
-homePageMigrationDescription=Selecteer de startpagina die jij wil gebruiken:
+homePageMigrationPageTitle=Startpaginakeuze
+homePageMigrationDescription=Selecteer de startpagina die je wil gebruiken:
-syncBrandShortName=Sync
+syncBrandShortName=Synchronisatie
diff --git a/src/chrome/locale/nl/torbutton.dtd b/src/chrome/locale/nl/torbutton.dtd
index 710a24b..79d0113 100644
--- a/src/chrome/locale/nl/torbutton.dtd
+++ b/src/chrome/locale/nl/torbutton.dtd
@@ -1,53 +1,62 @@
<!ENTITY torbutton.context_menu.new_identity "Nieuwe identiteit">
<!ENTITY torbutton.context_menu.new_identity_key "I">
-<!ENTITY torbutton.context_menu.new_circuit "Nieuw tor circuit voor deze website">
+<!ENTITY torbutton.context_menu.new_circuit "Nieuw Tor-circuit voor deze website">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
-<!ENTITY torbutton.context_menu.networksettings "Tor netwerk instellingen">
-<!ENTITY torbutton.context_menu.downloadUpdate "Controleer op updates voor de Tor Browser...">
+<!ENTITY torbutton.context_menu.preferences "Beveiligingsinstellingen…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
+<!ENTITY torbutton.context_menu.networksettings "Tor-netwerkinstellingen…">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
+<!ENTITY torbutton.context_menu.downloadUpdate "Controleer op updates voor de Tor-browser...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
-<!ENTITY torbutton.context_menu.cookieProtections "Cookie beveiligingen...">
+<!ENTITY torbutton.context_menu.cookieProtections "Cookiebeveiligingen...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Klik hier om Torbutton te initialiseren">
-<!ENTITY torbutton.prefs.restore_defaults "Terugzetten op begintoestand">
-<!ENTITY torbutton.cookiedialog.title "Beheer Cookie Beveiligingen">
+<!ENTITY torbutton.prefs.security_settings "Tor-browserbeveiligingsinstellingen">
+<!ENTITY torbutton.prefs.restore_defaults "Standaardwaarden herstellen">
+<!ENTITY torbutton.prefs.custom_warning "Je aangepaste browservoorkeuren hebben geleid tot ongebruikelijke beveiligingsinstellingen. Uit veiligheids- en privacy-overwegen raden we je aan een van de standaardbeveiligingsniveau's te kiezen.">
+<!ENTITY torbutton.cookiedialog.title "Beheer cookiebeveiligingen">
<!ENTITY torbutton.cookiedialog.lockCol "Beveiligd">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
<!ENTITY torbutton.cookiedialog.nameCol "Naam">
<!ENTITY torbutton.cookiedialog.pathCol "Pad">
-<!ENTITY torbutton.cookiedialog.protectCookie "Beveilig Cookie">
-<!ENTITY torbutton.cookiedialog.removeCookie "Verwijder Cookie">
-<!ENTITY torbutton.cookiedialog.unprotectCookie "Hef Cookie beveiliging op.">
-<!ENTITY torbutton.cookiedialog.removeAllBut "Verwijder alle behalve beveiligde">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Beveilig nieuwe Cookies">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Beveilig nieuwe Cookies niet">
+<!ENTITY torbutton.cookiedialog.protectCookie "Cookie beveiligen">
+<!ENTITY torbutton.cookiedialog.removeCookie "Cookie verwijderen">
+<!ENTITY torbutton.cookiedialog.unprotectCookie "Cookiebeveiliging opheffen">
+<!ENTITY torbutton.cookiedialog.removeAllBut "Alle cookies behalve beveiligde verwijderen">
+<!ENTITY torbutton.cookiedialog.saveAllCookies "Beveilig nieuwe cookies">
+<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Beveilig nieuwe cookies niet">
<!ENTITY torbutton.prefs.restrict_thirdparty "Beperk cookies en andere tracking-gegevens van derden">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Vink dit vakje aan om te voorkomen dat functies van je browser worden misbruikt om je te volgen op het internet. Gemodificeerde functies zijn o.a. URL's, uitzendingskanalen, de browsercache, cookies, favicons, HTTP-auth-hoofdingen, koppelingsvoorverbindingen, localStorage, mediaSource-URL's, OCSP-verzoeken, SharedWorkers en TLS-sessietickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Verander details die je onderscheiden van andere Tor Browser gebruikers">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Vink dit vakje aan om websites geen inzicht te geven in dingen die uniek aan je zijn, zoals je batterijstatus, computersnelheid, toetsenbordindeling, taal, geïnstalleerde plug-ins en hun locatie, netwerkstatus, schermoriëntatie, schermgrootte, zoomniveaus per site, ondersteunde bestandstypes, systeemkleuren en WebGL-mogelijkheden.">
<!ENTITY torbutton.prefs.sec_caption "Beveiligingsniveau">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "De beveiligingsschuifbalk laat je toe sommige functies uit te schakelen die je browser mogelijk blootstellen aan beveiligingsrisico's.">
<!ENTITY torbutton.prefs.sec_low "Laag (standaard)">
-<!ENTITY torbutton.prefs.sec_low_usable_desc "Dit verschaft de meest bruikbare ervaring">
+<!ENTITY torbutton.prefs.sec_low_usable_desc "Dit biedt de meest bruikbare ervaring.">
<!ENTITY torbutton.prefs.sec_low_desc "Op dit beveiligingsniveau worden alle browserfuncties ingeschakeld.">
-<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "De SVG OpenType font rendering mechanisme is uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_med_low "Medium-Laag">
-<!ENTITY torbutton.prefs.sec_gen_desc "Op dit beveiligingsniveau gelden de volgende wijzigingen (beweeg de muis over de items voor meer informatie)">
-<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video en audio media geworden click-to-play via NoScript.">
-<!ENTITY torbutton.prefs.sec_html5_tooltip "Op sommige sites zou je de NoScript werkbalk knop moeten gebruiken om deze media -objecten mogelijk te maken.">
+<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Het SVG OpenType-mechanisme voor weergave van lettertypen is uitgeschakeld.">
+<!ENTITY torbutton.prefs.sec_med_low "Medium-laag">
+<!ENTITY torbutton.prefs.sec_gen_desc "Op dit beveiligingsniveau gelden de volgende wijzigingen (beweeg de muis over de items voor meer informatie):">
+<!ENTITY torbutton.prefs.sec_html5_desc "HTML5-video en -audio worden klik-om-af-te-spelen via NoScript.">
+<!ENTITY torbutton.prefs.sec_html5_tooltip "Op sommige sites moet je de NoScript-werkbalkknop gebruiken om deze media-objecten in te schakelen.">
<!ENTITY torbutton.prefs.sec_some_jit_desc "Sommige JavaScript-prestatieverbeteringen zijn uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "ION JIT, Type Inference, ASM.JS.">
<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "Baseline JIT.">
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts kunnen op sommige websites trager zijn.">
-<!ENTITY torbutton.prefs.sec_mathml_desc "Sommige mechanismen van het weergeven van wiskundige vergelijkingen zijn uitgeschakeld.">
+<!ENTITY torbutton.prefs.sec_mathml_desc "Sommige mechanismen voor het weergeven van wiskundige vergelijkingen zijn uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML is uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_med_high "Medium-Hoog">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Alle JavaScript-prestatieverbeteringen zijn uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_font_rend_desc "Sommige lettertype-weergavefuncties zijn uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "De Graphite lettertype rendering mechanisme is uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_svg_desc "Sommige afbeeldingtypes zijn uitgeschakeld.">
+<!ENTITY torbutton.prefs.sec_med_high "Medium-hoog">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Op sites die JavaScript toestaan zijn de prestatieverbeteringen uitgeschakeld.">
+<!ENTITY torbutton.prefs.sec_font_rend_desc "Sommige functies voor weergave van lettertypen zijn uitgeschakeld.">
+<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Het Graphite-weergavemechanisme voor lettertypen is uitgeschakeld.">
+<!ENTITY torbutton.prefs.sec_svg_desc "Sommige afbeeldingstypen zijn uitgeschakeld.">
<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "SVG afbeeldingen zijn uitgeschakeld.">
-<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript is standaard uitgeschakeld op alle niet-HTTPS websites.">
-<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript kan worden ingeschakeld op een basis per - site via de NoScript werkbalk knop.">
+<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript is standaard uitgeschakeld op alle niet-HTTPS-websites.">
+<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript kan worden ingeschakeld op een site-basis via de NoScript-werkbalkknop.">
<!ENTITY torbutton.prefs.sec_high "Hoog">
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript is standaard uitgeschakeld op alle websites.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Sommige lettertypen en pictogrammen worden mogelijk niet goed weergegeven. ">
-<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Door websites aangeleverde lettertypes worden geblokkeerd.">
-<!ENTITY torbutton.prefs.sec_custom "Aangepaste waarden">
-<!ENTITY torbutton.circuit_display.title "Tor circuit voor deze website">
+<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Door websites aangeleverde lettertypen worden geblokkeerd.">
+<!ENTITY torbutton.circuit_display.title "Tor-circuit voor deze website">
diff --git a/src/chrome/locale/pl/aboutTor.properties b/src/chrome/locale/pl/aboutTor.properties
index 9bf0dcd..5a66e6a 100644
--- a/src/chrome/locale/pl/aboutTor.properties
+++ b/src/chrome/locale/pl/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Szukaj <a href="%1$S">bezpiecznie</a> używając wyszu
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/pl/torbutton.dtd b/src/chrome/locale/pl/torbutton.dtd
index 6a42d11..fff7438 100644
--- a/src/chrome/locale/pl/torbutton.dtd
+++ b/src/chrome/locale/pl/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "o">
<!ENTITY torbutton.context_menu.new_circuit "Nowy obwód dla tej strony">
<!ENTITY torbutton.context_menu.new_circuit_key "c">
+<!ENTITY torbutton.context_menu.preferences "Security Settings…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Ustawienia Sieci Tor...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Sprawdź czy są aktualizacje Tor Browser...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "u">
<!ENTITY torbutton.context_menu.cookieProtections "Ochrona plików cookie...">
<!ENTITY torbutton.context_menu.cookieProtections.key "c">
<!ENTITY torbutton.button.tooltip "Kliknij tutaj, aby uruchomić Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Ustawienia domyślne">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Zarządzaj ochroną ciasteczek">
<!ENTITY torbutton.cookiedialog.lockCol "Chronione">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Chroń nowe ciasteczka">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Nie chroń nowych ciasteczek">
<!ENTITY torbutton.prefs.restrict_thirdparty "Ograniczaj ciasteczka firm trzecich i inne dane służące do śledzenia">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Zmień szczegóły odróżniające Cię od innych użytkowników Przeglądarki Tora">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
<!ENTITY torbutton.prefs.sec_caption "Poziom bezpieczeństwa">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "The Security Slider lets you disable certain browser features that may make your browser more vulnerable to hacking attempts.">
<!ENTITY torbutton.prefs.sec_low "Niski (domyślny)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "To zapewnia najbardziej przyjazdne dla użytkownika ustawienia.">
<!ENTITY torbutton.prefs.sec_low_desc "Na tym poziomie zabezpieczeń, wszystkie funkcje przeglądarki są włączone.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Niektóre mechanizmy wyświetlania równań matematycznych są wyłączone.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML jest wyłączony.">
<!ENTITY torbutton.prefs.sec_med_high "Średni-Wysoki">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Wszystkie optymalizacje wydajności JavaScript są wyłączone.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Na stronach, na których włączony jest JavaScript optymalizacje wydajności są wyłączone.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Niektóre funkcje renderingu czcionki są wyłączone.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Mechanizm Graphite do renderowania czcionki jest wyłączony.">
<!ENTITY torbutton.prefs.sec_svg_desc "Niektóre typy obrazów są wyłączone.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript jest domyślnie wyłączona na wszystkich stronach.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Niektóre czcionki i ikony mogą być wyświetlane niepoprawnie.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Pliki czcionek dostarczane przez strony internetowe są blokowane.">
-<!ENTITY torbutton.prefs.sec_custom "Wartości niestandardowe">
<!ENTITY torbutton.circuit_display.title "Obwód Tor dla tej strony">
diff --git a/src/chrome/locale/pt/aboutTor.properties b/src/chrome/locale/pt/aboutTor.properties
index 7bf9d5d..f9b6dbf 100644
--- a/src/chrome/locale/pt/aboutTor.properties
+++ b/src/chrome/locale/pt/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Procurar com <a href="%1$S">segurança</a> com <a href
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/pt/torbutton.dtd b/src/chrome/locale/pt/torbutton.dtd
index e0247b5..f0bd467 100644
--- a/src/chrome/locale/pt/torbutton.dtd
+++ b/src/chrome/locale/pt/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Novo Circuito Tor para este Site">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Security Settings…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Configurações da Rede Tor...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Procurar por atualizações do Navegador Tor...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "A">
<!ENTITY torbutton.context_menu.cookieProtections "Proteções de Cookies...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Clique para inicializar o Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Restaurar Predefinições">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Gerir Proteções dos Cookies">
<!ENTITY torbutton.cookiedialog.lockCol "Protegido">
<!ENTITY torbutton.cookiedialog.domainCol "Hospedeiro">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Proteger Novos Cookies">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Não Proteger Novos Cookies">
<!ENTITY torbutton.prefs.restrict_thirdparty "Restringir os cookies de terceiros e outros dados de rastreamento">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Keep this box checked to prevent various browser features from being abused to track you as you browse the web. Modified features include blob URLs, broadcast channels, the browser cache, cookies, favicons, HTTP Auth headers, link preconnects, localStorage, mediaSource URLs, OCSP requests, SharedWorkers, and TLS session tickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Alterar os detalhes que o diferencia dos outros utilizadores do Navegador Tor">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Keep this box checked to hide things from websites that could be unique about you, including your battery status, computer performance, keyboard layout, locale, the location of installed plugins, the list of installed plugins, your network status, screen orientation, screen size, site-specific zoom levels, supported file types, system colors, and WebGL capabilities.">
<!ENTITY torbutton.prefs.sec_caption "Nível de Segurança">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "The Security Slider lets you disable certain browser features that may make your browser more vulnerable to hacking attempts.">
<!ENTITY torbutton.prefs.sec_low "Baixo (predefinição)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Isto proporciona a melhor experiência usável.">
<!ENTITY torbutton.prefs.sec_low_desc "Neste nível de segurança, as funções do navegador estão ativadas.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Alguns mecanismos de visualização de equações matemáticas estão desativados.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML está desativado.">
<!ENTITY torbutton.prefs.sec_med_high "Médio-Alto">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Todas as otimizações de desempenho da JavaScript estão desativadas.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "On sites where JavaScript is enabled, performance optimizations are disabled.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Algumas funções de renderização do tipo de letra estão desativadas.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "O mecanismo de renderização do tipo de letra Graphite está desativado.">
<!ENTITY torbutton.prefs.sec_svg_desc "Alguns tipos de imagens estão desativados.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript está desativada por predefinição em todos os sites.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Alguns tipos de letra e ícones poderão ser visualizados incorretamente.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Os ficheiros dos tipos de letra fornecidos pelo site da Web estão bloqueados.">
-<!ENTITY torbutton.prefs.sec_custom "Valores Personalizados">
<!ENTITY torbutton.circuit_display.title "Circuito Tor para este site">
diff --git a/src/chrome/locale/ru/aboutTor.properties b/src/chrome/locale/ru/aboutTor.properties
index 07d591c..4d33808 100644
--- a/src/chrome/locale/ru/aboutTor.properties
+++ b/src/chrome/locale/ru/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Ищите <a href="%1$S">конфиденциальн
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/ru/brand.properties b/src/chrome/locale/ru/brand.properties
index 5f0d9a8..91aef01 100644
--- a/src/chrome/locale/ru/brand.properties
+++ b/src/chrome/locale/ru/brand.properties
@@ -2,7 +2,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-brandShorterName=Tor Browser
+brandShorterName=Обозреватель Tor
brandShortName=Tor Browser
brandFullName=Tor Browser
vendorShortName=Проект Tor
diff --git a/src/chrome/locale/ru/torbutton.dtd b/src/chrome/locale/ru/torbutton.dtd
index d13ff00..de02dd2 100644
--- a/src/chrome/locale/ru/torbutton.dtd
+++ b/src/chrome/locale/ru/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "Я">
<!ENTITY torbutton.context_menu.new_circuit "Новая цепочка Tor для этого cайта">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Настройки безопасности...">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Настройки сети Tor">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Проверить на наличие обновлений Tor Browser">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Защита куки-файла">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Нажмите, чтобы инициализировать Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Восстановить значения по умолчанию">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Управление защитой куки-файлов">
<!ENTITY torbutton.cookiedialog.lockCol "Защищено">
<!ENTITY torbutton.cookiedialog.domainCol "Ведущий узел">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Защищать новые куки-файлы">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Не защищать новые куки-файлы">
<!ENTITY torbutton.prefs.restrict_thirdparty "Блокировать сторонние куки-файлы и другие данные слежения">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Оставьте флажок напротив этой опции отмеченным, чтобы защитить многие функции обозревателя от элементов отслеживания ваших действий во время сёрфинга в сети. Модифицированные компоненты включают в себя ссылки на блобы, транслируемые каналы, кэш браузера, файлы куки, значки, заголовки аутентификации HTTP, ссылки предпросмотра, локальное хранилище, ссылки на медиаконтент, запросы OCSP, SharedWorkers и объявления сессии TLS.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Изменить сведения, отличающие вас от других пользователей Tor Browser">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Оставьте флажок напротив этой опции отмеченным, чтобы скрывать те сведения, которые могли бы быть уникальными о вас, такие как: статус вашей батареи, производительность компьютера, раскладка клавиатуры, локализация, путь к установленным плагинам, список инсталлированных плагинов, статус вашей сети, ориентация дисплея, размер экрана, масштаб для конерктного сайта, поддерживаемые типы файлов, системная палитра и возможности WebGL.">
<!ENTITY torbutton.prefs.sec_caption "Уровень безопасности">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Ползунок безопасности позволяет вам запретить некоторые особенности обозревателя, которые могут сделать ваш браузер более уязвимым к попыткам взлома.">
<!ENTITY torbutton.prefs.sec_low "Низкий (по умолчанию)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Наиболее простой вариант использования.">
<!ENTITY torbutton.prefs.sec_low_desc "На этом уровне безопасности, все функции браузера включены.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Некоторые механизмы отображения математических уравнений отключены.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML отключен.">
<!ENTITY torbutton.prefs.sec_med_high "Умеренно высокий">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Все оптимизации производительности JavaScript отключены.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "На сайтах с применением JavaScript оптимизация отключена.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Некоторые функции отрисовки шрифтов отключены.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Механизм визуализации шрифта Graphite отключен.">
<!ENTITY torbutton.prefs.sec_svg_desc "Некоторые типы изображений отключены.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript отключен по умолчанию на всех сайтах.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Некоторые шрифты и значки могут отображаться некорректно.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Файлы шрифтов, предоставленные сайтом, заблокированы">
-<!ENTITY torbutton.prefs.sec_custom "Собственные значения">
<!ENTITY torbutton.circuit_display.title "Цепочка Tor для этого сайта">
diff --git a/src/chrome/locale/sv/aboutTor.properties b/src/chrome/locale/sv/aboutTor.properties
index fafe44a..3b0ddcd 100644
--- a/src/chrome/locale/sv/aboutTor.properties
+++ b/src/chrome/locale/sv/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Sök <a href="%1$S">säkert</a> med <a href="%2$S">Dis
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donera nu!
+aboutTor.donationBanner.heart=Tor är i centrum av internetfrihet
+aboutTor.donationBanner.tagline1=Miljoner av människor använder Tor för onlinesäkerhet och integritet
+aboutTor.donationBanner.tagline2=Ett nätverk av folk som skyddar folk
+aboutTor.donationBanner.tagline3=Övervakning = Förtryck
+aboutTor.donationBanner.tagline4=Skyddar journalister, aktivister och visselblåsare sedan 2006
diff --git a/src/chrome/locale/sv/torbutton.dtd b/src/chrome/locale/sv/torbutton.dtd
index e9d9a27..7452ae3 100644
--- a/src/chrome/locale/sv/torbutton.dtd
+++ b/src/chrome/locale/sv/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "N">
<!ENTITY torbutton.context_menu.new_circuit "Ny Tor-krets för den här webbsidan">
<!ENTITY torbutton.context_menu.new_circuit_key "S">
+<!ENTITY torbutton.context_menu.preferences "Säkerhetsinställningar...">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Tor nätverksinställningar...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Sök efter uppdateringar för Tor webbläsare...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Skydd mot Cookies...">
<!ENTITY torbutton.context_menu.cookieProtections.key "S">
<!ENTITY torbutton.button.tooltip "Klicka för att installera Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Återställ till standard">
+<!ENTITY torbutton.prefs.security_settings "Tor-webbläsares säkerhetsinställningar">
+<!ENTITY torbutton.prefs.restore_defaults "Återställ standard">
+<!ENTITY torbutton.prefs.custom_warning "Dina anpassade webbläsarinställningar har resulterat i ovanliga säkerhetsinställningar. Av säkerhets- och integritetsskäl rekommenderar vi att du använder en av de fördefinierade säkerhetsnivåerna.">
<!ENTITY torbutton.cookiedialog.title "Hantera skyddade kakor">
<!ENTITY torbutton.cookiedialog.lockCol "Skyddad">
<!ENTITY torbutton.cookiedialog.domainCol "Värd">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Skydda nya kakor">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Skydda inte nya kakor">
<!ENTITY torbutton.prefs.restrict_thirdparty "Begränsa tredjepartskakor och annan tracking data">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Behåll det här alternativet valt för att förhindra olika webbläsarfunktioner från att missbrukas för att spåra dig när du surfar på nätet. Ändrade funktioner inkluderar blog-URLer, broadcastkanaler, webbläsar-cache, kakor, favicons, HTTP-Auth-huvuden, länk-föranslutningar, localStorage, mediaSource URLer, OCSP-förfrågningar, SharedWorkers och TLS-sessionstickets.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Ändra detailjer som utmärker dig ifrån andra Tor Browser användare">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Behåll det här alternativet valt för att dölja saker från webbsidor som kan vara unika för dig, inklusive din batteristatus, datorprestanda, tangentbordslayout, språk, platser insticksmoduler är installerade på, lista över installerade insticksmoduler, din nätverksstatus, skärmorientering, skärmstorlek, platsspecifika zoom-nivåer, filtypsstöd, systemfärger och WebGL-stöd.">
<!ENTITY torbutton.prefs.sec_caption "Säkerhetsnivå">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Säkerhetsreglaget låter dig stänga av vissa webbläsarfunktioner som kan göra din webbläsare mer sårbar mot intrångsförsök.">
<!ENTITY torbutton.prefs.sec_low "Låg (förvald)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Detta skapar den mest användbara upplevelsen.">
<!ENTITY torbutton.prefs.sec_low_desc "På den här säkerhetsnivån är webbläsarens alla funktioner aktiverade.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Vissa funktioner för att visa matematiska formler är avaktiverade.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML är inaktiverat.">
<!ENTITY torbutton.prefs.sec_med_high "Medium-hög">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Alla prestandaoptimeringar av JavaScript är inaktiverade.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "På sidor där JavaScript är aktiverat, är prestandaoptimeringar inaktiverade.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Vissa funktioner för gestaltning av typsnitt är avaktiverad.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Användande av Graphite-typsnitt är avaktiverad.">
<!ENTITY torbutton.prefs.sec_svg_desc "Vissa typer av bilder är inaktiverade.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript är normalt avaktiverat på alla webbsidor.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Vissa typsnitt ock ikoner kan visas felaktigt.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Typsnitt som tillhandahålls av webbsidor är blockerade.">
-<!ENTITY torbutton.prefs.sec_custom "Anpassad nivå">
<!ENTITY torbutton.circuit_display.title "Tor-krets för den här webbsidan">
diff --git a/src/chrome/locale/tr/aboutTor.properties b/src/chrome/locale/tr/aboutTor.properties
index 686b883..322cc2e 100644
--- a/src/chrome/locale/tr/aboutTor.properties
+++ b/src/chrome/locale/tr/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=<a href="%2$S">Disconnect.me</a> kullanarak <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Bağış Yapın
+aboutTor.donationBanner.heart=Tor İnternet özgürlüğünün kalbinde yer alır
+aboutTor.donationBanner.tagline1=Milyonlarda İnsan Çevrimiçi Güvenlik ve Gizlilik Sağlamak için Tor Kullanıyor
+aboutTor.donationBanner.tagline2=İnsanları İnsanlardan Koruyan Bir Ağ
+aboutTor.donationBanner.tagline3=İzleme = Baskı
+aboutTor.donationBanner.tagline4=2006 Yılından Beri Gazeteci, Aktivist ve Yolsuzluk Açıklayanları Koruyor
diff --git a/src/chrome/locale/tr/torbutton.dtd b/src/chrome/locale/tr/torbutton.dtd
index d6c87d1..0edfc51 100644
--- a/src/chrome/locale/tr/torbutton.dtd
+++ b/src/chrome/locale/tr/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Bu site için Tor devresini yenile">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "Güvenlik Ayarları...">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Tor Ağ Ayarları...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Tor Browser Güncelleme Denetimi...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Çerez Koruması...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Torbutton uygulamasını başlatmak için tıklayın">
-<!ENTITY torbutton.prefs.restore_defaults "Varsayılanları Yükle">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Güvenlik Ayarları">
+<!ENTITY torbutton.prefs.restore_defaults "Varsayılanlara Sıfırla">
+<!ENTITY torbutton.prefs.custom_warning "Özel tarayıcı tercihleriniz alışılmadık güvenlik ayarları ile sonuçlandı. Güvenlik ve gizlilik nedenleri ile, aşağıdaki varsayılan güvenlik seviyelerinden birini seçmenizi öneriyoruz.">
<!ENTITY torbutton.cookiedialog.title "Çerez Koruması Yönetimi">
<!ENTITY torbutton.cookiedialog.lockCol "Korunmuş">
<!ENTITY torbutton.cookiedialog.domainCol "Sunucu">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Yeni Çerezleri Koru">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Yeni Çerezleri Koruma">
<!ENTITY torbutton.prefs.restrict_thirdparty "3. taraf çerez ve diğer iz sürücü bilgiler engellensin">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Bu seçeneği işaretleyerek, çeşitli web tarayıcıların, web sitelerinde yaptığınız işlemleri izlemesini engelleyebilirsiniz. Değiştirilen özellikler içinde blob İnternet adresleri, yayın kanalları, web tarayıcı ön belleği, çerezler, favicon dosyaları, HTTP Auth başlık bilgileri, ön bağlantı bilgileri, localStorage, mediaSource adresleri, OCSP istekleri, SharedWorkers ve TLS oturumu bulunur.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Diğer Tor Browser kullanıcılarından sizi ayıran ayrıntılar değiştirilsin">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Bu seçeneği işaretleyerek, web sitelerinden pil durumu, bilgisayar performansı, tuş takımı düzeni, yerel ayarlar, yüklü uygulama eklerinin konumu, yüklü uygulama eklerinin listesi, ağ durumunuz, ekran doğrultusu, ekran boyutu, siteye özel yakınlaştırma düzeyi, desteklenen dosya tipleri, sistem renkleri ve WebGL yetenekleri gibi sizin için önemli olabilecek bilgileri gizleyebilirsiniz. ">
<!ENTITY torbutton.prefs.sec_caption "Güvenlik Düzeyi">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Güvenlik ayarı ile belirli web tarayıcı özeliklerini kapatabilirsiniz. Ancak bu durumda web tarayıcınız saldırılara karşı daha korumasız olur.">
<!ENTITY torbutton.prefs.sec_low "Düşük (varsayılan)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Bu seçenek en kullanılabilir deneyimi sunar.">
<!ENTITY torbutton.prefs.sec_low_desc "Bu güvenlik düzeyinde tüm tarayıcı özellikleri kullanılabilir.">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Matematik denklemlerini görüntüleyen bazı düzenekler devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_med_high "Orta-Yüksek">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Tüm JavaScript başarım iyileştirmeleri devre dışı bırakılır.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "JavaScript kullanılan web sitelerinde başarım iyileştirmeleri devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Bazı yazı tipi işleme özellikleri devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Graphite yazı tipi görüntüleme düzeneği devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_svg_desc "Bazı görsel türleri devre dışı bırakılır.">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript varsayılan olarak tüm sitelerde devre dışı bırakılır.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Bazı yazı tipi ve simgeler düzgün görüntülenemeyebilir.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Web sitesi tarafından sunulan yazı tipi dosyaları engellenir.">
-<!ENTITY torbutton.prefs.sec_custom "Özel Değerler">
<!ENTITY torbutton.circuit_display.title "Bu site için Tor devresi">
diff --git a/src/chrome/locale/vi/aboutDialog.dtd b/src/chrome/locale/vi/aboutDialog.dtd
index d6693ed..9f90c6e 100644
--- a/src/chrome/locale/vi/aboutDialog.dtd
+++ b/src/chrome/locale/vi/aboutDialog.dtd
@@ -1,19 +1,19 @@
<!ENTITY project.start "&brandShortName; được phát triển bởi">
<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
<!ENTITY project.tpoLink "the &vendorShortName;">
-<!ENTITY project.end ", a nonprofit working to defend your privacy and freedom online.">
+<!ENTITY project.end ", một công viêc phi lợi nhuận để bảo vệ sự riêng tư và tự do trực tuyến của bạn.">
-<!ENTITY help.start "Want to help? ">
+<!ENTITY help.start "Muốn giúp đỡ?">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
-<!ENTITY help.donateLink "Donate">
-<!ENTITY help.or " or ">
+<!ENTITY help.donateLink "Quyên góp">
+<!ENTITY help.or "hoặc">
<!-- LOCALIZATION NOTE (help.getInvolvedLink): This is a link title that links to https://www.torproject.org/getinvolved/volunteer.html.en -->
-<!ENTITY help.getInvolvedLink "get involved">
+<!ENTITY help.getInvolvedLink "tham gia">
<!ENTITY help.end "!">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
-<!ENTITY bottomLinks.questions "Questions?">
+<!ENTITY bottomLinks.questions "Những câu hỏi?">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/getinvolved/relays -->
-<!ENTITY bottomLinks.grow "Help the Tor Network Grow!">
+<!ENTITY bottomLinks.grow "Giúp đỡ mạng lưới Tor phát triển!">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to about:license -->
-<!ENTITY bottomLinks.license "Licensing Information">
-<!ENTITY tor.TrademarkStatement "'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc.">
+<!ENTITY bottomLinks.license "Thông tin bản quyền">
+<!ENTITY tor.TrademarkStatement "'Tor' và logo Củ hành là thương hiệu đã được đăng ký của Tor Project, Inc.">
diff --git a/src/chrome/locale/vi/aboutTBUpdate.dtd b/src/chrome/locale/vi/aboutTBUpdate.dtd
index 4f0a9d4..3086fe2 100644
--- a/src/chrome/locale/vi/aboutTBUpdate.dtd
+++ b/src/chrome/locale/vi/aboutTBUpdate.dtd
@@ -1,6 +1,6 @@
<!ENTITY aboutTBUpdate.title "Cập nhật về Trình duyệt Tor">
-<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
-<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
-<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.updated "Trình duyệt Tor đã được cập nhật">
+<!ENTITY aboutTBUpdate.linkPrefix "Dành cho những thông tin cập nhật mới nhất về bản phát hành này,">
+<!ENTITY aboutTBUpdate.linkLabel "đến thăm trang của chúng tôi">
<!ENTITY aboutTBUpdate.linkSuffix ".">
-<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
+<!ENTITY aboutTBUpdate.changeLogHeading "Nhật ký thay đổi:">
diff --git a/src/chrome/locale/vi/aboutTor.dtd b/src/chrome/locale/vi/aboutTor.dtd
index 8a349b5..951f44c 100644
--- a/src/chrome/locale/vi/aboutTor.dtd
+++ b/src/chrome/locale/vi/aboutTor.dtd
@@ -6,18 +6,18 @@
<!ENTITY aboutTor.title "Thông tin về Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
+<!ENTITY aboutTor.outOfDateTorOn.label "CẢNH BÁO: trình duyệt này đã lỗi thời">
<!ENTITY aboutTor.outOfDateTorOff.label "Thêm nữa, trình duyệt này đã lỗi thời.">
-<!ENTITY aboutTor.outOfDate2.label "Click on the onion and then choose Check for Tor Browser Update.">
+<!ENTITY aboutTor.outOfDate2.label "Bấm chuột vào củ hành và sau đó chọn Kiểm tra bản cập nhật của Trình duyệt Tor">
-<!ENTITY aboutTor.check.label "Test Tor Network Settings">
+<!ENTITY aboutTor.check.label "Thử cài đặt mạng lưới Tor">
-<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
-<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
+<!ENTITY aboutTor.success.label "Chào mừng đến với Trình duyệt Tor">
+<!ENTITY aboutTor.success2.label "Đã kết nối với mạng lưới Tor.">
<!ENTITY aboutTor.success3.label "Bây giờ bạn sẽ tự do lướt web ẩn danh.">
-<!ENTITY aboutTor.failure.label "Có sai sót gì đó!">
+<!ENTITY aboutTor.failure.label "Có gì đó đã sai!">
<!ENTITY aboutTor.failure2.label "Tor không hoạt động trên trình duyệt này.">
-<!ENTITY aboutTor.failure3prefix.label "Để trợ giúp, vui lòng liên lạc">
+<!ENTITY aboutTor.failure3prefix.label "Để được trợ giúp, vui lòng liên lạc">
<!ENTITY aboutTor.failure3Link "help(a)rt.torproject.org">
<!ENTITY aboutTor.failure3suffix.label ".">
@@ -27,23 +27,23 @@
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com/html/">
<!ENTITY aboutTor.searchDCPost.link "https://search.disconnect.me/searchTerms/search?ses=Google&location_opt…">
-<!ENTITY aboutTor.torInfo1.label "Additional Info:">
+<!ENTITY aboutTor.torInfo1.label "Thông tin thêm:">
<!ENTITY aboutTor.torInfo2.label "Quốc gia & Địa chỉ IP:">
-<!ENTITY aboutTor.torInfo3.label "Exit Node:">
+<!ENTITY aboutTor.torInfo3.label "Thoát khỏi giao điểm:">
<!ENTITY aboutTor.torInfo4.label "Máy chủ này không ghi lại bất kỳ thông tin nào của khách truy cập.">
<!ENTITY aboutTor.whatnextQuestion.label "Điều gì tiếp theo?">
-<!ENTITY aboutTor.whatnextAnswer.label "Tor KHÔNG phải là tất cả những gì bạn cần để ẩn danh! Bạn cần nên thay đổi một vài thói quen lướt net để chắc chắn rằng danh tính của mình sẽ an toàn.">
-<!ENTITY aboutTor.whatnext.label "Tips On Staying Anonymous »">
+<!ENTITY aboutTor.whatnextAnswer.label "Tor KHÔNG phải là tất cả những gì bạn cần để ẩn danh! Bạn cần nên thay đổi một vài thói quen lướt net để chắc chắn rằng xác minh danh tính sẽ an toàn.">
+<!ENTITY aboutTor.whatnext.label "Gợi ý cho việc ẩn danh »">
<!ENTITY aboutTor.whatnext.link "https://www.torproject.org/download/download.html.en#warning">
-<!ENTITY aboutTor.helpInfo1.label "You Can Help!">
+<!ENTITY aboutTor.helpInfo1.label "Bạn có thể giúp đỡ!">
<!ENTITY aboutTor.helpInfo2.label "Có nhiều cách mà bạn có thể giúp mạng Tor nhanh hơn và tốt hơn.">
-<!ENTITY aboutTor.helpInfo3.label "Run a Tor Relay Node »">
+<!ENTITY aboutTor.helpInfo3.label "Chạy một đầu mối tiếp sức Tor »">
<!ENTITY aboutTor.helpInfo3.link "https://www.torproject.org/docs/tor-doc-relay.html.en">
-<!ENTITY aboutTor.helpInfo4.label "Volunteer Your Services »">
+<!ENTITY aboutTor.helpInfo4.label "Tình nguyện những dịch vụ của bạn »">
<!ENTITY aboutTor.helpInfo4.link "https://www.torproject.org/getinvolved/volunteer.html.en">
-<!ENTITY aboutTor.helpInfo5.label "Make a Donation »">
+<!ENTITY aboutTor.helpInfo5.label "Ủng hộ »">
<!ENTITY aboutTor.helpInfo5.link "https://www.torproject.org/donate/donate.html.en">
-<!ENTITY aboutTor.footer.label "Dự án Tor là một US 501(c)(3) không lợi nhuận chuyên dùng cho nghiên cứu, phát triển và giao dục về vô danh và riêng tư trực tuyến">
+<!ENTITY aboutTor.footer.label "Dự án Tor là một tổ chức không lợi nhuận theo US 501(c)(3) chuyên về nghiên cứu, phát triển và giáo dục về vô danh vàjavascript:; riêng tư trực tuyến.">
<!ENTITY aboutTor.learnMore.label "Tìm hiểu thêm về Tor Project">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
diff --git a/src/chrome/locale/vi/aboutTor.properties b/src/chrome/locale/vi/aboutTor.properties
index d607324..7984d21 100644
--- a/src/chrome/locale/vi/aboutTor.properties
+++ b/src/chrome/locale/vi/aboutTor.properties
@@ -2,20 +2,27 @@
# See LICENSE for licensing information.
# vim: set sw=2 sts=2 ts=8 et:
-aboutTor.searchSP.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S">Startpage</a>.
+aboutTor.searchSP.privacy=Tìm kiếm <a href="%1$S">một cách an toàn</a>với <a href="%2$S"> Trang bắt đầu</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchSP.privacy.link=https://startpage.com/eng/protect-privacy.ht…
# The following string is a link which replaces %2$S above.
aboutTor.searchSP.search.link=https://startpage.com/
-aboutTor.searchDDG.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S">DuckDuckGo</a>.
+aboutTor.searchDDG.privacy=Tìm kiếm <a href="%1$S">một cách an toàn</a>với <a href="%2$S"> DuckDuckGo</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchDDG.privacy.link=https://duckduckgo.com/privacy.html
# The following string is a link which replaces %2$S above.
aboutTor.searchDDG.search.link=https://duckduckgo.com/
-aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S">Disconnect.me</a>.
+aboutTor.searchDC.privacy=Tìm kiếm <a href="%1$S">một cách an toàn</a>với <a href="%2$S"> Disconnect.me</a>.
# The following string is a link which replaces %1$S above.
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Tài trợ ngay bây giờ!
+aboutTor.donationBanner.heart=Tor đang ở trái tim của sự tự do trên Internet
+aboutTor.donationBanner.tagline1=Hàng triệu người tin vào Tor vì an ninh trực tuyến và sự riêng tư
+aboutTor.donationBanner.tagline2=Một mạng lưới của những người đang bảo vệ người
+aboutTor.donationBanner.tagline3=Sự giám sát = Sự đàn áp
+aboutTor.donationBanner.tagline4=Đang bảo vệ các nhà báo, nhà hoạt động & những người thổi còi từ năm 2006
diff --git a/src/chrome/locale/vi/brand.dtd b/src/chrome/locale/vi/brand.dtd
index 6664eca..0667b7e 100644
--- a/src/chrome/locale/vi/brand.dtd
+++ b/src/chrome/locale/vi/brand.dtd
@@ -6,10 +6,10 @@
<!ENTITY brandShortName "Trình duyệt Tor">
<!ENTITY brandFullName "Trình duyệt Tor">
<!ENTITY vendorShortName "Dự án Tor">
-<!ENTITY trademarkInfo.part1 "Firefox and the Firefox logos are trademarks of the Mozilla Foundation.">
+<!ENTITY trademarkInfo.part1 "Firefox và logo của Firefox là thương hiệu của Tổ chức Mozilla">
<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
-<!ENTITY plugins.installed.find "Click to load installed system plugins">
-<!ENTITY plugins.installed.enable "Enable plugins">
-<!ENTITY plugins.installed.disable "Disable plugins">
-<!ENTITY plugins.installed.disable.tip "Click to prevent loading system plugins">
+<!ENTITY plugins.installed.find "Bấm chuột để tải những những chương trình gắn thêm vào hệ thống đã được cài đặt">
+<!ENTITY plugins.installed.enable "Cho phép những chương trình gắn thêm">
+<!ENTITY plugins.installed.disable "Vô hiệu những chương trình gắn thêm">
+<!ENTITY plugins.installed.disable.tip "Bấm chuột để ngăn chặn việc tải những những chương trình gắn thêm vào hệ thống">
diff --git a/src/chrome/locale/vi/brand.properties b/src/chrome/locale/vi/brand.properties
index bb1ea2d..73a728e 100644
--- a/src/chrome/locale/vi/brand.properties
+++ b/src/chrome/locale/vi/brand.properties
@@ -7,8 +7,8 @@ brandShortName=Trình duyệt Tor
brandFullName=Trình duyệt Tor
vendorShortName=Dự án Tor
-homePageSingleStartMain=Firefox Start, a fast home page with built-in search
-homePageImport=Import your home page from %S
+homePageSingleStartMain=Firefox Start, một trang chủ nhanh với trình tìm kiếm được tích hợp sẵn
+homePageImport=Nhập trang chủ của bạn từ %S
homePageMigrationPageTitle=Lựa chọn trang chủ
homePageMigrationDescription=Vui lòng chọn trang chủ mà bạn muốn dùng:
diff --git a/src/chrome/locale/vi/torbutton.dtd b/src/chrome/locale/vi/torbutton.dtd
index 25fbcec..04ec66b 100644
--- a/src/chrome/locale/vi/torbutton.dtd
+++ b/src/chrome/locale/vi/torbutton.dtd
@@ -1,14 +1,19 @@
-<!ENTITY torbutton.context_menu.new_identity "Định danh mới">
+<!ENTITY torbutton.context_menu.new_identity "Danh tính mới">
<!ENTITY torbutton.context_menu.new_identity_key "I">
-<!ENTITY torbutton.context_menu.new_circuit "Vòng Tor mới cho trang này">
+<!ENTITY torbutton.context_menu.new_circuit "Mạch nối Tor mới cho trang này">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
-<!ENTITY torbutton.context_menu.networksettings "Cài đặt Mạng Tor...">
-<!ENTITY torbutton.context_menu.downloadUpdate "Kiểm tra việc cập nhật trình duyệt Tor">
+<!ENTITY torbutton.context_menu.preferences "Những cài đặt về an ninh...">
+<!ENTITY torbutton.context_menu.preferences.key "S">
+<!ENTITY torbutton.context_menu.networksettings "Những cài đặt Mạng Tor...">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
+<!ENTITY torbutton.context_menu.downloadUpdate "Kiểm tra Bản cập nhật của trình duyệt Tor...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
-<!ENTITY torbutton.context_menu.cookieProtections "Bảo vệ Cookie...">
+<!ENTITY torbutton.context_menu.cookieProtections "Những sự bảo vệ Cookie...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
-<!ENTITY torbutton.button.tooltip "Nhấp để nhận diện Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "Khôi phục Mặc định">
+<!ENTITY torbutton.button.tooltip "Bấm chuột để khởi chạy Torbutton">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Manage Cookie Protections">
<!ENTITY torbutton.cookiedialog.lockCol "Protected">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
@@ -21,33 +26,37 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "Protect New Cookies">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Do Not Protect New Cookies">
<!ENTITY torbutton.prefs.restrict_thirdparty "Restrict third party cookies and other tracking data">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "Bảo đảm hộp này được đánh dấu để ngăn những tính năng khác nhau của trình duyệt không bị làm dụng để theo dõi bạn khi bạn duyệt web. Những tính năng được sửa đổi bao gồm những blob URL, những đường dẫn được kết nối trước, nơi lưu trữ nội bộ, URL nguồn trung gian, những yêu cầu OCSP, SharedWorkers, và vé của phiên TLS.">
<!ENTITY torbutton.prefs.resist_fingerprinting "Change details that distinguish you from other Tor Browser users">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "Bảo đảm hộp này được đánh dấu để ẩn những thứ từ trang web mà có thể là duy nhất về bạn bao gồm tình trạng pin, hiệu suất máy tính, nền bàn phím, nơi xảy ra, địa điểm của những thứ gắn thêm được cài đặt, danh sách những thứ gắn thêm được cài đặt, tình trạng mạng lưới của bạn, hướng xoay màn hình, kích cỡ màn hình, những mức độ phóng đại riêng của trang, những loại tập tin được hỗ trợ, những màu sắc hệ thống, và những khả năng WebGL.">
<!ENTITY torbutton.prefs.sec_caption "Mức độ Bảo mật">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "Những Người điều chỉnh an ninh để cho bạn vô hiệu một vài tính năng của trình duyệt mà có thể làm trình duyệt của bạn dễ bị tổn thương đổi với những cố gắng tấn công.">
<!ENTITY torbutton.prefs.sec_low "Thấp (mặc định)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Điều này cung cấp trải nghiệm tiện lợi nhất">
<!ENTITY torbutton.prefs.sec_low_desc "Ở mức này, tất cả tính năng của trình duyệt đều được kích hoạt.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "Cơ chế kết xuất font SVG OpenType bị vô hiệu.">
<!ENTITY torbutton.prefs.sec_med_low "Trung bình-Thấp">
<!ENTITY torbutton.prefs.sec_gen_desc "Ở mức bảo mật này, những thay đổi sau sẽ được áp dụng (rê chuột vào để xem chi tiết):">
-<!ENTITY torbutton.prefs.sec_html5_desc "Video và âm thanh HTML5 có thể nhấp để phát qua NoScript.">
+<!ENTITY torbutton.prefs.sec_html5_desc "Video và âm thanh truyền thông HTML5 có thể trở thành nhấp để phát qua NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "Trên một số trang, có thể bạn cần phải dùng nút thanh công cụ NoScript để kích hoạt những đối tượng đa phương tiện này.">
<!ENTITY torbutton.prefs.sec_some_jit_desc "Một số tối ưu hoá JavaScript bị vô hiệu.">
<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "ION JIT, Type Inference, ASM.JS.">
<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "Baseline JIT.">
-<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts on some sites may run slower.">
-<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
-<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML is disabled.">
-<!ENTITY torbutton.prefs.sec_med_high "Medium-High">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "All JavaScript performance optimizations are disabled.">
-<!ENTITY torbutton.prefs.sec_font_rend_desc "Some font rendering features are disabled.">
-<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
-<!ENTITY torbutton.prefs.sec_svg_desc "Some types of images are disabled.">
-<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "SVG images are disabled.">
-<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript is disabled by default on all non-HTTPS sites.">
-<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript can be enabled on a per-site basis via the NoScript toolbar button.">
-<!ENTITY torbutton.prefs.sec_high "High">
-<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript is disabled by default on all sites.">
-<!ENTITY torbutton.prefs.sec_webfonts_desc "Some fonts and icons may display incorrectly.">
-<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Website-provided font files are blocked.">
-<!ENTITY torbutton.prefs.sec_custom "Custom Values">
-<!ENTITY torbutton.circuit_display.title "Tor circuit for this site">
+<!ENTITY torbutton.prefs.sec_jit_slower_desc "Những đoạn mã trên một số trang có thể chạy chậm hơn.">
+<!ENTITY torbutton.prefs.sec_mathml_desc "Một vài cơ chế hiển thị công thức toán học bị vô hiệu.">
+<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathMK bị vô hiệu">
+<!ENTITY torbutton.prefs.sec_med_high "Trung bình-Cao">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Trên những trang nơi JavaScript được cho phép, việc tối ưu hóa hiệu suất bị vô hiệu.">
+<!ENTITY torbutton.prefs.sec_font_rend_desc "Một vài chức năng tô vẽ phông chữ bị vô hiệu.">
+<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "Cơ chế tô vẽ phông chữ Graphite bị vô hiệu.">
+<!ENTITY torbutton.prefs.sec_svg_desc "Một vài loại hình ảnh bị vô hiệu.">
+<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "Hình ảnh SVG bị vô hiệu.">
+<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript mặc định bị vô hiệu trên tất cả các trang non-HTTPS.">
+<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript có thể được cho phép trên nền tảng mỗi trang thông qua nút NoScript trên thanh công cụ.">
+<!ENTITY torbutton.prefs.sec_high "Cao">
+<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript mặc định bị vô hiệu trên tất cả các trang.">
+<!ENTITY torbutton.prefs.sec_webfonts_desc "Một vài phông chữ và biểu tượng có thể hiển thị không đúng.">
+<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Những tập tin phông chữ do trang web cung cấp bị chặn.">
+<!ENTITY torbutton.circuit_display.title "Đầu nối Tor dành cho trang này.">
diff --git a/src/chrome/locale/vi/torbutton.properties b/src/chrome/locale/vi/torbutton.properties
index 34169dc..34a800c 100644
--- a/src/chrome/locale/vi/torbutton.properties
+++ b/src/chrome/locale/vi/torbutton.properties
@@ -1,51 +1,51 @@
torbutton.circuit_display.internet = Internet
-torbutton.circuit_display.ip_unknown = IP unknown
-torbutton.circuit_display.onion_site = Onion site
-torbutton.circuit_display.this_browser = This browser
-torbutton.circuit_display.relay = relay
-torbutton.circuit_display.tor_bridge = Bridge
-torbutton.circuit_display.unknown_country = Unknown country
-torbutton.content_sizer.margin_tooltip = Tor Browser adds this margin to make the width and height of your window less distinctive, and thus reduces the ability of people to track you online.
+torbutton.circuit_display.ip_unknown = Địa chỉ IP không biết đến
+torbutton.circuit_display.onion_site = Trang củ hành
+torbutton.circuit_display.this_browser = Trình duyệt này
+torbutton.circuit_display.relay = tiếp sức
+torbutton.circuit_display.tor_bridge = Cầu nối
+torbutton.circuit_display.unknown_country = Đất nước không được biết đến
+torbutton.content_sizer.margin_tooltip = Trình duyệt Tor thêm lề này để làm cho chiều rộng và chiều cao của màn hình của bạn ít dễ bị phân biệt hơn, và vì thế giảm khả năng của những người theo dõi bạn trực tuyến.
torbutton.panel.tooltip.disabled = Nhấn để bật Tor
torbutton.panel.tooltip.enabled = Nhấn để tắt Tor
torbutton.panel.label.disabled = Tor bị tắt
torbutton.panel.label.enabled = Tor được bật
extensions.torbutton(a)torproject.org.description = Torbutton provides a button to configure Tor settings and quickly and easily clear private browsing data.
-torbutton.popup.external.title = Download an external file type?
-torbutton.popup.external.app = Tor Browser cannot display this file. You will need to open it with another application.\n\n
-torbutton.popup.external.note = Some types of files can cause applications to connect to the Internet without using Tor.\n\n
-torbutton.popup.external.suggest = To be safe, you should only open downloaded files while offline, or use a Tor Live CD such as Tails.\n
-torbutton.popup.launch = Download file
+torbutton.popup.external.title = Tải về một loại tập tin bên ngoài?
+torbutton.popup.external.app = Trình duyệt Tor không thể hiển thị tập tin này. Bạn cần mở nó với một ứng dụng khác.\n\n
+torbutton.popup.external.note = Môộtiài loại tập tin có thể làm những ứng dụng kết nối tới Internet mà không dùng Tor.\n\n
+torbutton.popup.external.suggest = Để an toàn, bạn chỉ nên mở những tập tin được tải về khi đang offline, hoặc sử dụng một Tor Live CD như là Tails.\n
+torbutton.popup.launch = Tải tập tin
torbutton.popup.cancel = Hủy bỏ
-torbutton.popup.dontask = Automatically download files from now on
-torbutton.popup.prompted_language = Để bạn có thêm sư riêng tư, Torbutton có thể yêu cầu trang mạng sử dụng phiên bản Tiếng Anh. Đây có thể là nguyên nhân trang mạng mà bạn đề nghị hiển thị tiến bản địa lại hiển thị Tiếng Anh.\n\nBạn có muốn yêu cầu trang mạng tiếng anh để có thêm sự riêng tư?
-torbutton.popup.no_newnym = Torbutton có thể đưa bạn một danh tính mới một cách không an toàn. Nó không hề truy cập vào Tor Control Port.\n\nCó phải bạn đang dùng Tor Browser Bundle?
+torbutton.popup.dontask = Tự động tải những tập tin kể từ bây giờ
+torbutton.popup.prompted_language = Để bạn có thêm sư riêng tư, Torbutton có thể yêu cầu trang mạng sử dụng phiên bản Tiếng Anh. Việc này có thể gây ra việc những trang bạn muốn đọc bằng tiếng mẹ đẻ lại hiển thị bằng tiếng Anh thay vào đó.\n\nBạn có muốn yêu cầu trang mạng bằng tiếng Anh để có thêm sự riêng tư?
+torbutton.popup.no_newnym = Torbutton không thể đưa bạn một danh tính mới một cách an toàn. Nó không có đường truy cập vào Tor Control Port.\n\nCó phải bạn đang dùng Tor Browser Bundle?
torbutton.title.prompt_torbrowser = Important Torbutton Information
torbutton.popup.prompt_torbrowser = Torbutton works differently now: you can't turn it off any more.\n\nWe made this change because it isn't safe to use Torbutton in a browser that's also used for non-Tor browsing. There were too many bugs there that we couldn't fix any other way.\n\nIf you want to keep using Firefox normally, you should uninstall Torbutton and download Tor Browser Bundle. The privacy properties of Tor Browser are also superior to those of normal Firefox, even when Firefox is used with Torbutton.\n\nTo remove Torbutton, go to Tools->Addons->Extensions and then click the Remove button next to Torbutton.
torbutton.popup.short_torbrowser = Important Torbutton Information!\n\nTorbutton is now always enabled.\n\nClick on the Torbutton for more information.
torbutton.popup.confirm_plugins = Plugins such as Flash can harm your privacy and anonymity.\n\nThey can also bypass Tor to reveal your current location and IP address.\n\nAre you sure you want to enable plugins?\n\n
torbutton.popup.never_ask_again = Never ask me again
-torbutton.popup.confirm_newnym = Tor Browser will close all windows and tabs. All website sessions will be lost.\n\nRestart Tor Browser now to reset your identity?\n\n
+torbutton.popup.confirm_newnym = Trình duyệt Tor sẽ đóng tất cả cửa sổ và các thẻ. Mọi trang phiên của trang web sẽ mất.\n\nKhởi động lại Trình duyệt Tor bây giờ để đặt lại danh tính của bạn?\n\n
-torbutton.slider_notification = The green onion menu now has a security slider which lets you adjust your security level. Check it out!
-torbutton.slider_notification_button = Open security settings
+torbutton.slider_notification = Trình đơn Củ hành màu xanh bây giờ có một trình điều chỉnh an ninh thứ cho phép bạn điều chỉnh mức độ an ninh của bạn. Thử ngay bây giờ!
+torbutton.slider_notification_button = Mở cài đặt an ninh
-torbutton.maximize_warning = Maximizing Tor Browser can allow websites to determine your monitor size, which can be used to track you. We recommend that you leave Tor Browser windows in their original default size.
+torbutton.maximize_warning = Mở rộng tối đa Trình duyệt Tor có thể cho phép trang web xác định kích cỡ màn hình của bạn, thứ có thể được dùng để theo dõi bạn. Chúng tôi khuyên bạn để của sổ Trình duyệt Tor ở kích cỡ mặc định gốc.
# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=This website (%S) attempted to extract HTML5 canvas image data, which may be used to uniquely identify your computer.\n\nShould Tor Browser allow this website to extract HTML5 canvas image data?
-canvas.notNow=Not Now
+canvas.siteprompt=Trang web này (%S) đã cố gắng trích xuất dữ liệu bức vẽ hình ảnh HTML5, thứ có thể sử dụng để xác định một cách duy nhất máy tính của bạn.\n\nTrình duyệt Tor có nên cho phép trang web này trích xuất dữ liệu bức vẽ hình ảnh HTML5?
+canvas.notNow=Không phải bây giờ
canvas.notNowAccessKey=N
-canvas.allow=Allow in the future
+canvas.allow=Cho phép trong tương lai
canvas.allowAccessKey=T
-canvas.never=Never for this site (recommended)
+canvas.never=Không bao giờ đối với trang này (được khuyến khích)
canvas.neverAccessKey=e
# Profile/startup error messages. Strings are kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-profileProblemTitle=%S Profile Problem
-profileReadOnly=You cannot run %S from a read-only file system. Please copy %S to another location before trying to use it.
-profileReadOnlyMac=You cannot run %S from a read-only file system. Please copy %S to your Desktop or Applications folder before trying to use it.
-profileAccessDenied=%S does not have permission to access the profile. Please adjust your file system permissions and try again.
-profileMigrationFailed=Migration of your existing %S profile failed.\nNew settings will be used.
+profileProblemTitle=%S Vấn đề về cấu hình
+profileReadOnly=Bạn không thể chạy %S từ một tập tin hệ thống chỉ cho đọc. Vui lòng chép %S tới một vị trí khác trước khi sử dụng nó.
+profileReadOnlyMac=Bạn không thể chạy %S từ một tập tin hệ thống chỉ cho đọc. Vui lòng chép %S tới Desktop hoặc ứng dụng thư mục trước khi cố gắng sử dụng nó.
+profileAccessDenied=%S không được phép truy cập cấu hình. Vui lòng điều chỉnh sự cho phép của tập tin hệ thống và thử lại.
+profileMigrationFailed=Việc di chuyển hồ sơ %S hiện tại của bạn đã thất bại.\nNhững cài đặt mới sẽ được sử dụng.
diff --git a/src/chrome/locale/zh-CN/aboutTor.properties b/src/chrome/locale/zh-CN/aboutTor.properties
index 39dbd19..4d017c3 100644
--- a/src/chrome/locale/zh-CN/aboutTor.properties
+++ b/src/chrome/locale/zh-CN/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=使用<a href="%2$S">Disconnect.me</a><a href="%1$S">
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=立即捐助!
+aboutTor.donationBanner.heart=Tor 是互联网自由的核心
+aboutTor.donationBanner.tagline1=数百万人依靠 Tor 安全、私密地上网
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
diff --git a/src/chrome/locale/zh-CN/torbutton.dtd b/src/chrome/locale/zh-CN/torbutton.dtd
index a73d4dd..d435c6f 100644
--- a/src/chrome/locale/zh-CN/torbutton.dtd
+++ b/src/chrome/locale/zh-CN/torbutton.dtd
@@ -2,13 +2,18 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "为此站点使用新 Tor 线路">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
+<!ENTITY torbutton.context_menu.preferences "安全设置…">
+<!ENTITY torbutton.context_menu.preferences.key "S">
<!ENTITY torbutton.context_menu.networksettings "Tor 网络设置…">
+<!ENTITY torbutton.context_menu.networksettings.key "N">
<!ENTITY torbutton.context_menu.downloadUpdate "Tor Browser 检查更新…">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Cookie 保护…">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "点此初始化 Torbutton">
-<!ENTITY torbutton.prefs.restore_defaults "恢复默认设置">
+<!ENTITY torbutton.prefs.security_settings "Tor 浏览器安全设置">
+<!ENTITY torbutton.prefs.restore_defaults "恢复默认值">
+<!ENTITY torbutton.prefs.custom_warning "您自定义的浏览器设置导致了不安全的安全设置。出于安全和隐私考虑,我们建议您选择一个默认的安全级别。">
<!ENTITY torbutton.cookiedialog.title "管理受保护的 Cookie">
<!ENTITY torbutton.cookiedialog.lockCol "受保护">
<!ENTITY torbutton.cookiedialog.domainCol "主机">
@@ -21,8 +26,13 @@
<!ENTITY torbutton.cookiedialog.saveAllCookies "保护新的 Cookie">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "不保护新的 Cookie">
<!ENTITY torbutton.prefs.restrict_thirdparty "限制第三方 cookie 和其他数据跟踪程序">
+<!ENTITY torbutton.prefs.restrict_thirdparty.accesskey "R">
+<!ENTITY torbutton.prefs.restrict_thirdparty_tooltip "该选项用于防止滥用浏览器功能跟踪用户。修改的功能包括:blob 网址,广播通道,浏览器缓存,cookie,收藏夹图标,HTTP 验证头部,预连接,localStorage,mediaSource 网址,OCSP 请求,SharedWorker 和 TLS 会话票证。">
<!ENTITY torbutton.prefs.resist_fingerprinting "修改 Tor 浏览器中可区分你与其他 Tor 用户的细节信息">
+<!ENTITY torbutton.prefs.resist_fingerprinting.accesskey "F">
+<!ENTITY torbutton.prefs.resist_fingerprinting_tooltip "该选项可防止网站参看可识别用户的信息,包括电池状态,计算机性能,键盘布局,区域,插件安装位置,插件列表,网络状态,屏幕方向和大小,特定网站缩放比例,支持文件类型,系统颜色,以及 WebGL 功能。 ">
<!ENTITY torbutton.prefs.sec_caption "安全等级">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "安全滑块可禁用某些浏览器功能,避免因这些功能导致的漏洞而受到攻击。">
<!ENTITY torbutton.prefs.sec_low "低(默认)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "该选项可提供最佳的用户体验。">
<!ENTITY torbutton.prefs.sec_low_desc "该安全级别将启用所有浏览器功能。">
@@ -38,7 +48,7 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "禁用数学方程式的某些显示机制。">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "禁用 MathML。">
<!ENTITY torbutton.prefs.sec_med_high "中高">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "禁用全部 JavaScript 性能优化。">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "在开启 JavaScript 的站点上禁用性能优化。">
<!ENTITY torbutton.prefs.sec_font_rend_desc "禁用某些字体渲染功能。">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "禁用 Graphite 字体渲染。">
<!ENTITY torbutton.prefs.sec_svg_desc "禁用某些图像类型。">
@@ -49,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "默认禁用所有网站 JavaScript。">
<!ENTITY torbutton.prefs.sec_webfonts_desc "某些字体和图标可能无法正确显示。">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "禁用网站提供的字体文件。">
-<!ENTITY torbutton.prefs.sec_custom "自定义">
<!ENTITY torbutton.circuit_display.title "为此站点使用的 Tor 线路">
1
0
commit c8ec31a111cf15971a341df02bca04fe09dd3bed
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Tue Nov 8 09:22:31 2016 -0800
Bug 20414.2: Tor Donation Banner 2016
---
src/chrome/content/aboutTor/aboutTor.xhtml | 26 +-
src/chrome/content/aboutTor/donation_banner.js | 184 ++
src/chrome/content/aboutTor/onion-heart.svg | 142 ++
src/chrome/content/aboutTor/tor-roots-only.svg | 2716 ++++++++++++++++++++++++
src/chrome/skin/donation_banner.css | 148 ++
5 files changed, 3215 insertions(+), 1 deletion(-)
diff --git a/src/chrome/content/aboutTor/aboutTor.xhtml b/src/chrome/content/aboutTor/aboutTor.xhtml
index dbb8a89..1ecae65 100644
--- a/src/chrome/content/aboutTor/aboutTor.xhtml
+++ b/src/chrome/content/aboutTor/aboutTor.xhtml
@@ -21,6 +21,8 @@
<title>&aboutTor.title;</title>
<link rel="stylesheet" type="text/css" media="all"
href="chrome://torbutton/skin/aboutTor.css"/>
+ <link rel="stylesheet" type="text/css" media="all"
+ href="chrome://torbutton/skin/donation_banner.css"/>
<script type="text/javascript;version=1.7">
<![CDATA[
function onLoad()
@@ -164,6 +166,28 @@ window.addEventListener("pageshow", function() {
</script>
</head>
<body dir="&locale.dir;" onload="onLoad();">
+ <div id="banner" class="onions-bg">
+ <div id="banner-contents-container">
+ <div id="banner-logo-container">
+ <img id="banner-logo" alt="Tor Onion-Heart Logo"
+ src="chrome://torbutton/content/aboutTor/onion-heart.svg"/>
+ </div>
+ <div id="banner-text">
+ <div id="banner-tagline"><span></span></div>
+ <div id="banner-heart"><span></span></div>
+ </div>
+ <a id="banner-donate-button-link"
+ href="https://www.torproject.org/donate/donate-tbb">
+ <div id="banner-donate-button-container">
+ <div id="banner-donate-button">
+ <div id="banner-donate-button-text"></div>
+ <div id="banner-donate-button-arrow"></div>
+ </div>
+ </div>
+ </a>
+ </div>
+ </div>
+ <div id="banner-spacer"></div>
<div id="torstatus" class="top">
<div id="torstatus-version"/>
<div id="torstatus-image"/>
@@ -237,6 +261,6 @@ window.addEventListener("pageshow", function() {
<p>&aboutTor.footer.label;
<a href="&aboutTor.learnMore.link;">&aboutTor.learnMore.label;</a></p>
</div>
-
+ <script src="chrome://torbutton/content/aboutTor/donation_banner.js"></script>
</body>
</html>
diff --git a/src/chrome/content/aboutTor/donation_banner.js b/src/chrome/content/aboutTor/donation_banner.js
new file mode 100644
index 0000000..1087815
--- /dev/null
+++ b/src/chrome/content/aboutTor/donation_banner.js
@@ -0,0 +1,184 @@
+/* jshint esnext:true */
+
+// A list of locales for which the banner has been translated.
+let kBannerLocales = [
+ "de",
+ "en",
+ "es",
+ "fa",
+ "it",
+ "nl",
+ "vi",
+ "zh",
+];
+
+// A list of donation page locales (at least redirects should exist).
+let kDonationPageLocales = [
+ "ar",
+ "de",
+ "en",
+ "es",
+ "fa",
+ "fr",
+ "it",
+ "ja",
+ "ko",
+ "nl",
+ "pl",
+ "pt",
+ "ru",
+ "tr",
+ "vi",
+ "zh",
+];
+
+let kPropertiesURL = "chrome://torbutton/locale/aboutTor.properties";
+Components.utils.import("resource://gre/modules/Services.jsm");
+let gStringBundle = Services.strings.createBundle(kPropertiesURL);
+let kBrowserLocale = Services.prefs.getCharPref("general.useragent.locale");
+let kBrowserLocaleShort = kBrowserLocale.match(/[a-zA-Z]+/)[0].toLowerCase();
+
+let sel = selector => document.querySelector(selector);
+
+// Check if we should show the banner, depends on
+// browser locale, current date, and how many times
+// we have already shown the banner.
+let shouldShowBanner = function () {
+ try {
+ // Don't show a banner if update is needed.
+ let updateNeeded = Services.prefs.getBoolPref("extensions.torbutton.updateNeeded");
+ if (updateNeeded) {
+ return false;
+ }
+ // Only show banner when we have that locale and if a donation redirect exists.
+ if (kBannerLocales.indexOf(kBrowserLocaleShort) === -1 ||
+ kDonationPageLocales.indexOf(kBrowserLocaleShort) === -1) {
+ return false;
+ }
+ // Only show banner between 2016 Nov 15 and 2017 Jan 25.
+ let now = new Date();
+ let start = new Date(2016, 10, 15);
+ let end = new Date(2017, 0, 26);
+ let shownCountPref = "extensions.torbutton.donation_banner2016.shown_count";
+ if (now < start || now > end) {
+ // Clean up pref if not in use.
+ Services.prefs.clearUserPref(shownCountPref);
+ return false;
+ }
+ // Only show banner 10 times.
+ let count = 0;
+ if (Services.prefs.prefHasUserValue(shownCountPref)) {
+ count = Services.prefs.getIntPref(shownCountPref);
+ }
+ if (count >= 10) {
+ return false;
+ }
+ Services.prefs.setIntPref(shownCountPref, count+1);
+ return true;
+ } catch (e) {
+ return false;
+ }
+};
+
+// Shrink the font size if the text in the given element is overflowing.
+let fitTextInElement = function (element) {
+ element.style.fontSize = "8px";
+ let defaultWidth = element.scrollWidth,
+ defaultHeight = element.scrollHeight;
+ for (let testSize = 8; testSize <= 40; testSize += 0.5) {
+ element.style.fontSize = `${testSize}px`;
+ if (element.scrollWidth <= defaultWidth &&
+ element.scrollHeight <= defaultHeight) {
+ bestSize = testSize;
+ } else {
+ break;
+ }
+ }
+ element.style.fontSize = `${bestSize}px`;
+};
+
+// Increase padding at left and right to "squeeze" text, until it gets
+// squeezed so much that it gets longer vertically.
+let avoidWidows = function (element) {
+ element.style.paddingLeft = "0px";
+ element.style.paddingRight = "0px";
+ let originalWidth = element.scrollWidth;
+ let originalHeight = element.scrollHeight;
+ for (let testPadding = 0; testPadding < originalWidth / 2; testPadding += 0.5) {
+ element.style.paddingLeft = element.style.paddingRight = `${testPadding}px`;
+ if (element.scrollHeight <= originalHeight) {
+ bestPadding = testPadding;
+ } else {
+ break;
+ }
+ }
+ element.style.paddingLeft = element.style.paddingRight = `${bestPadding}px`;
+};
+
+// Resize the text inside banner to fit.
+let updateTextSizes = function () {
+ fitTextInElement(sel("#banner-tagline"));
+ fitTextInElement(sel("#banner-heart"));
+ fitTextInElement(sel("#banner-donate-button"));
+ avoidWidows(sel("#banner-tagline span"));
+};
+
+// Read the tagline with the given index.
+let getTagline = index => gStringBundle.GetStringFromName(
+ "aboutTor.donationBanner.tagline" + (index + 1));
+
+// Returns a random integer x, such that 0 <= x < max
+let randomInteger = max => Math.floor(max * Math.random());
+
+
+// The main donation banner function.
+let runDonationBanner = function () {
+ try {
+ if (!shouldShowBanner()) {
+ return;
+ }
+ sel("#banner-tagline span").innerText = getTagline(randomInteger(4));
+ sel("#banner-heart span").innerText =
+ gStringBundle.GetStringFromName("aboutTor.donationBanner.heart");
+ sel("#banner-donate-button-text").innerHTML =
+ gStringBundle.GetStringFromName("aboutTor.donationBanner.donate");
+ sel("#banner-donate-button-arrow").innerHTML = "▶";
+ sel("#banner").style.display = "flex";
+ sel("#banner-spacer").style.display = "block";
+ addEventListener("resize", updateTextSizes);
+ updateTextSizes();
+ // Add a suffix corresponding to locale so we can send user
+ // to a correctly-localized donation page via redirect.
+ sel("#banner-donate-button-link").href += "-" + kBrowserLocaleShort;
+ sel("#torstatus-image").style.display = "none";
+ } catch (e) {
+ // Something went wrong.
+ console.error(e.message);
+ sel("#banner").style.display = "none";
+ sel("#bannerSpacer").style.display = "none";
+ sel("#torstatus-image").style.display = "block";
+ }
+};
+
+// Calls callback(attributeValue) when the specified attribute changes on
+// target. Returns a zero-arg function that stops observing.
+let observeAttribute = function (target, attributeName, callback) {
+ let observer = new MutationObserver(mutations => {
+ mutations.forEach(mutation => {
+ if (mutation.type === "attributes" &&
+ mutation.attributeName === attributeName) {
+ callback(target.getAttribute(attributeName));
+ }
+ });
+ });
+ observer.observe(document.body, { attributes: true });
+ return () => observer.disconnect();
+};
+
+// Start the donation banner if "toron" has been set to "yes".
+let stopObserving = observeAttribute(document.body, "toron", value => {
+ stopObserving();
+ if (value === "yes") {
+ runDonationBanner();
+ }
+});
diff --git a/src/chrome/content/aboutTor/onion-heart.svg b/src/chrome/content/aboutTor/onion-heart.svg
new file mode 100644
index 0000000..300002a
--- /dev/null
+++ b/src/chrome/content/aboutTor/onion-heart.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg3004"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="399.96011"
+ height="574.18964"
+ xml:space="preserve"
+ sodipodi:docname="tor_onion-heart-no-roots.svg"><metadata
+ id="metadata3010"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3008"><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3730"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path3732"
+ inkscape:connector-curvature="0" /></clipPath><linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(48.064392,308.5928,-308.5928,48.064392,538.70312,416.25879)"
+ spreadMethod="pad"
+ id="linearGradient4548"><stop
+ style="stop-opacity:1;stop-color:#533c5f"
+ offset="0"
+ id="stop4550" /><stop
+ style="stop-opacity:1;stop-color:#c3a1cc"
+ offset="1"
+ id="stop4552" /></linearGradient><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4560"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path4562"
+ inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview3006"
+ showgrid="false"
+ inkscape:zoom="0.20512821"
+ inkscape:cx="191.66224"
+ inkscape:cy="225.57375"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="g3012"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0" /><g
+ id="g3012"
+ inkscape:groupmode="layer"
+ inkscape:label="tor_onion-heart-tat_k"
+ transform="matrix(1.25,0,0,-1.25,-393.33776,933.61587)"><g
+ id="g5498"><g
+ transform="translate(467.2668,636.4615)"
+ id="g4534"><path
+ inkscape:connector-curvature="0"
+ id="path4536"
+ style="fill:#fefbde;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 38.336,-23.387 c -1.623,-10.421 -7.42,-42.074 -2.365,-52.467 54.488,-98.402 15.611,-272.581 -55.594,-266.116 -107.359,16.723 -136.943,96.034 -126.502,163.069 9.521,61.129 89.133,90.349 138.523,119.652 C 5.023,-51.257 6.441,-29.463 0,0" /></g><g
+ transform="translate(-11.7,-132.6)"
+ id="g4538"><g
+ id="g4540"><g
+ id="g4546"><path
+ inkscape:connector-curvature="0"
+ id="path4554"
+ style="fill:url(#linearGradient4548);stroke:none"
+ d="m 515.125,691.615 c 14.398,-33.193 21.002,-61.614 23.349,-92.216 l 0,0 c 5.282,-78.024 -18.683,-145.076 -69.431,-171.68 l 0,0 c 82.295,-22.068 194.019,58 153.076,169.678 l 0,0 c -11.436,31.663 -47.526,67.164 -86.427,100.616 l 0,0 c -8.858,7.069 -7.588,28.931 -4.684,38.436 l 0,0 -13.594,9.835 c -2.5,-20.602 -8.252,-38.547 -2.289,-54.669" /></g></g></g><g
+ transform="translate(539.4914,722.0167)"
+ id="g4564"><path
+ inkscape:connector-curvature="0"
+ id="path4566"
+ style="fill:#acce45;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="M 0,0 -20.238,-47.718 C 2.938,-15.399 35.18,6.613 71.105,24.853 43.215,1.096 17.408,-22.991 -0.063,-48.373 27.033,-20.575 59.609,-7.864 95.082,-1.648 44.057,-34.611 1.818,-71.932 -31.735,-110.53 l -20.071,12.731 C -42.881,-64.259 -24.406,-31.065 0,0" /></g><g
+ transform="translate(610.6633,746.8927)"
+ id="g4568"><path
+ inkscape:connector-curvature="0"
+ id="path4570"
+ style="fill:#4f7944;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c -18.732,-14.643 -51.215,-40.396 -70.211,-64.362 -16.199,-20.443 -28.023,-39.03 -34.963,-51.689 -4.435,-8.1 -16.986,-6.057 -11.148,7.569 0.06,0.134 0.131,0.231 0.189,0.368 6.617,10.675 16.436,25.483 25.996,38.372 l 18.924,44.909 c -8.81,-18.827 -19.836,-35.509 -28.074,-55.15 0.006,0 -12.072,-19.051 -15.252,-23.871 -1.08,-1.638 -2.02,-3.232 -2.857,-4.727 -0.055,-0.094 -0.12,-0.144 -0.17,-0.239 -1.356,-2.085 -2.416,-4.43 -3.268,-6.515 -0.141,-0.342 -0.145,-0.56 -0.27,-0.887 -1.146,-2.966 -1.884,-5.274 -1.884,-5.274 3.131,-3.687 19.793,-14.219 19.793,-14.219 33.797,38.847 76.142,76.218 127.17,109.18 C -11.502,-32.75 -44.096,-45.426 -71.191,-73.223 -53.719,-47.841 -27.889,-23.757 0,0" /></g><g
+ transform="translate(504.0246,614.7198)"
+ id="g4572"><path
+ inkscape:connector-curvature="0"
+ id="path4574"
+ style="fill:#364733;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="M 0,0 3.443,-3.542 C 37.24,35.305 79.586,72.676 130.613,105.638 101.641,88.618 62.617,65.032 45.039,48.176 22.799,26.855 37.211,47.893 37.211,47.893 c 0,0 13.723,23.78 33.42,36.975 C 59.879,81.646 39.172,62.772 35.447,58.95 35.447,58.95 18.482,35.696 7.662,13.96 4.756,8.131 0,0 0,0" /></g><g
+ transform="translate(495.4396,619.3077)"
+ id="g4576"><path
+ inkscape:connector-curvature="0"
+ id="path4578"
+ style="fill:#f3ecac;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 -50.606,-324.234 c 1.214,-0.211 1.599,-0.373 2.834,-0.564 71.205,-6.467 110.13,167.744 55.642,266.146 -5.057,10.391 0.705,41.975 2.328,52.398 L 0,0 z" /></g><g
+ transform="translate(496.173,618.858)"
+ id="g4580"><path
+ inkscape:connector-curvature="0"
+ id="path4582"
+ style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 32.734,-10.453 c -13.681,-28.463 9.821,-53.468 17.739,-59.683 17.775,-13.799 34.8,-27.831 47.625,-43.702 24.132,-30.084 34.48,-68.694 28.527,-106.9 -5.895,-37.853 -28.941,-71.615 -61.904,-91.384 -31.006,-18.65 -70.377,-22.477 -107.196,-16.742 -22.92,3.57 -43.251,7.801 -64.341,18.556 -48.054,24.922 -79.152,74.228 -74.163,126.815 3.549,41.068 17.397,70.575 54.035,97.952 18.971,14.475 54.997,28.784 80.01,40.897 12.305,5.91 27.467,25.606 11.219,69.755 l 5.057,2.771 30.42,-27.723 -26.887,16.145 c 1.891,-3.854 6.055,-20.512 6.742,-25.242 1.125,-13.337 -2.211,-25.627 -5.855,-30.748 -18.242,-23.485 -43.637,-26.643 -63.619,-38.471 -35.263,-20.832 -72.493,-36.022 -79.655,-107.122 -3.672,-35 16.819,-81.593 54.367,-107.718 21.193,-14.688 46.887,-23.316 73.415,-28.867 23.8,-4.774 71.867,2.324 100.117,19.265 30.201,18.063 50.386,49.427 55.742,83.807 5.41,34.736 -3.344,69.895 -25.768,97.222 C 75.537,-105.7 53.42,-85.534 39.496,-74.471 25.564,-63.407 10.248,-36.12 20.123,-13.825
L 0,0 z" /></g><g
+ transform="translate(504.3195,604.0934)"
+ id="g4584"><path
+ inkscape:connector-curvature="0"
+ id="path4586"
+ style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c -3.924,-18.399 -5.262,-25.191 -3.904,-39.278 1.494,-15.528 17.593,-40.092 21.738,-65.995 7.926,-49.617 -5.521,-110.842 -24.156,-157.384 -6.819,-16.368 -30.459,-37.95 -51.5,-42.849 l 14.047,-5.748 c 8.041,-0.892 31.505,15.016 42.904,35.65 18.207,32.385 27.021,72.987 28.521,116.866 0.299,4.223 -0.861,42.469 -5.025,59.125 C 16.871,-74.884 3.447,-51.447 2.414,-46.666 0.484,-38.538 -3.91,-21.602 0,0" /></g><g
+ transform="translate(495.4807,619.3595)"
+ id="g4588"><path
+ inkscape:connector-curvature="0"
+ id="path4590"
+ style="fill:#292929;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="M 0,0 C 0.155,-0.008 -49.259,-320.493 -50.456,-319.838 L -0.062,-0.032 C -0.062,0.16 -0.009,-0.035 0,0 c 0.003,0.037 0.231,-0.25 1.218,-0.73 0,0 -43.223,-281.344 -49.418,-321.118 -0.852,0.131 -1.707,0.265 -2.559,0.396 C -44.276,-279.334 -0.148,0.039 0,0" /></g><g
+ transform="translate(453.0549,350.485)"
+ id="g4592"><path
+ inkscape:connector-curvature="0"
+ id="path4594"
+ style="fill:#df3441;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c 0,0 -89.234,63.608 -79.039,129.324 3.929,25.318 23.153,43.156 51.53,38.994 38.91,-5.709 47.481,-43.043 47.481,-43.043 L 0,0 z" /></g><g
+ transform="translate(473.216,476.2032)"
+ id="g4596"><path
+ inkscape:connector-curvature="0"
+ id="path4598"
+ style="fill:#bc303a;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ d="m 0,0 c 0,0 15.029,38.665 32.414,24.385 10.727,-8.813 7.828,-36.448 3.953,-51.406 -12.875,-49.717 -56.528,-98.697 -56.528,-98.697 L 0,0 z" /></g></g></g></svg>
\ No newline at end of file
diff --git a/src/chrome/content/aboutTor/tor-roots-only.svg b/src/chrome/content/aboutTor/tor-roots-only.svg
new file mode 100644
index 0000000..bb84b1b
--- /dev/null
+++ b/src/chrome/content/aboutTor/tor-roots-only.svg
@@ -0,0 +1,2716 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2985"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="718.2995"
+ height="464.96451"
+ xml:space="preserve"
+ sodipodi:docname="tor-roots-only.svg"><metadata
+ id="metadata2991"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs2989"><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3711"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path3713"
+ inkscape:connector-curvature="0" /></clipPath><linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(48.064392,308.5928,-308.5928,48.064392,538.70312,416.25879)"
+ spreadMethod="pad"
+ id="linearGradient4529"><stop
+ style="stop-opacity:1;stop-color:#533c5f"
+ offset="0"
+ id="stop4531" /><stop
+ style="stop-opacity:1;stop-color:#c3a1cc"
+ offset="1"
+ id="stop4533" /></linearGradient><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4541"><path
+ d="M 0,936 936,936 936,0 0,0 0,936 z"
+ id="path4543"
+ inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="746"
+ id="namedview2987"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="1.905014"
+ inkscape:cx="195.7241"
+ inkscape:cy="358.82752"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g2993" /><g
+ id="g2993"
+ inkscape:groupmode="layer"
+ inkscape:label="tor_onion-heart-tat_k"
+ transform="matrix(1.25,0,0,-1.25,-235.68237,557.80025)"><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g2995"
+ transform="translate(471.4521,228.168)"><path
+ d="m 0,0 0,18.214 -9.236,9.237 -0.229,50.448"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path2997"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g2999"
+ transform="translate(478.7373,266.6787)"><path
+ d="M 0,0 -16.572,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3001"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3003"
+ transform="translate(483.9424,229.9893)"><path
+ d="M 0,0 -12.49,12.489"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3005"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3007"
+ transform="translate(475.7461,321.9717)"><path
+ d="m 0,0 -7.155,7.157 0,9.888 10.278,10.276 0,27.713 -17.5,17.499 0,38.706"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3009"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3011"
+ transform="translate(486.2852,340.0566)"><path
+ d="m 0,0 0,42.674 -16.783,16.783 0,31.615"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3013"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3015"
+ transform="translate(478.4795,407.4502)"><path
+ d="M 0,0 0,23.679"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3017"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3019"
+ transform="translate(488.6289,398.082)"><path
+ d="M 0,0 0,33.308"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3021"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3023"
+ transform="translate(499.0361,381.9482)"><path
+ d="M 0,0 0,51.782"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3025"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3027"
+ transform="translate(515.6895,401.9854)"><path
+ d="M 0,0 9.911,-9.911"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3029"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3031"
+ transform="translate(546.3945,384.292)"><path
+ d="m 0,0 -31.614,31.614 0,19.907"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3033"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3035"
+ transform="translate(413.7471,446.2402)"><path
+ d="m 0,0 0,-8.771 -73.676,-74.116 0,-5.699 -74.551,-74.552 0,-7.893 -42.539,-42.1"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3037"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3039"
+ transform="translate(364.7764,388.207)"><path
+ d="M 0,0 -18.127,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3041"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3043"
+ transform="translate(354.501,377.8701)"><path
+ d="M 0,0 -44.689,0 -58.086,-13.397"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3045"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3047"
+ transform="translate(335.7275,377.8701)"><path
+ d="M 0,0 -18.473,-18.476"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3049"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3051"
+ transform="translate(241.8379,386.5977)"><path
+ d="M 0,0 -27.628,-28.943"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3053"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3055"
+ transform="translate(259.9463,340.6777)"><path
+ d="M 0,0 -14.129,-14.128"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3057"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3059"
+ transform="translate(278.2373,315.1172)"><path
+ d="M 0,0 -13.734,-13.734"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3061"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3063"
+ transform="translate(248.8545,276.9629)"><path
+ d="M 0,0 -15.349,-15.347"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3065"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3067"
+ transform="translate(291.832,265.1221)"><path
+ d="M 0,0 -32.013,-32.013"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3069"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3071"
+ transform="translate(322.5293,279.5947)"><path
+ d="M 0,0 -13.155,-12.719"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3073"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3075"
+ transform="translate(322.0908,250.6514)"><path
+ d="M 0,0 -12.277,-12.28"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3077"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3079"
+ transform="translate(318.583,215.1289)"><path
+ d="m 0,0 -11.93,-11.929 0.09,-10.436 -16.66,-16.659 0,-8.962"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3081"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3083"
+ transform="translate(293.585,143.6465)"><path
+ d="m 0,0 11.404,11.401 9.648,9.651 0,9.209 33.766,33.764"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3085"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3087"
+ transform="translate(338.7559,160.751)"><path
+ d="m 0,0 9.647,9.646 0,59.205 6.798,6.795 0,6.36 -9.319,9.319 0,62.163 -5.975,5.975 0,11.127 3.673,3.948 0,12.717 41.393,41.394"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3089"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3091"
+ transform="translate(278.6748,234.4248)"><path
+ d="M 0,0 0,17.541"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3093"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3095"
+ transform="translate(292.2705,250.2119)"><path
+ d="m 0,0 -0.438,24.121 18.199,18.198 0,35.08"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3097"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3099"
+ transform="translate(258.0215,267.7881)"><path
+ d="M 0,0 -22.767,22.767"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3101"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3103"
+ transform="translate(243.5879,282.2217)"><path
+ d="M 0,0 -30.255,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3105"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3107"
+ transform="translate(197.1064,370.373)"><path
+ d="M 0,0 29.256,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3109"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3111"
+ transform="translate(209.3857,413.3486)"><path
+ d="M 0,0 27.631,-26.751"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3113"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3115"
+ transform="translate(226.0508,386.5977)"><path
+ d="m 0,0 87.709,0 8.728,-8.728"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3117"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3119"
+ transform="translate(235.6982,364.6699)"><path
+ d="M 0,0 0,15.474"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3121"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3123"
+ transform="translate(254.9941,401.5078)"><path
+ d="M 0,0 14.91,-14.91"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3125"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3127"
+ transform="translate(287.8857,401.9463)"><path
+ d="M 0,0 15.35,-15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3129"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3131"
+ transform="translate(245.3467,340.6777)"><path
+ d="m 0,0 77.634,0 0,-20.739 -5.707,-5.704 0,-10.958 5.04,-5.041 -0.223,-76.967"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3133"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3135"
+ transform="translate(258.9424,365.9873)"><path
+ d="M 0,0 23.554,-25.31"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3137"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3139"
+ transform="translate(291.3936,330.0254)"><path
+ d="M 0,0 0,10.652"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3141"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3143"
+ transform="translate(263.3271,315.1172)"><path
+ d="M 0,0 34.206,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3145"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3147"
+ transform="translate(276.9219,371.249)"><path
+ d="M 0,0 0,15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3149"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3151"
+ transform="translate(278.2373,295.8193)"><path
+ d="M 0,0 -0.146,-14.429"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3153"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3155"
+ transform="translate(261.7705,271.5)"><path
+ d="M 0,0 0,-14.271"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3157"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3159"
+ transform="translate(235.1045,245.1084)"><path
+ d="M 0,0 0,-15.507"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3161"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3163"
+ transform="translate(322.1514,241.8789)"><path
+ d="m 0,0 16.635,-16.635 0,-8.359"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3165"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3167"
+ transform="translate(317.7061,142.3311)"><path
+ d="M 0,0 -12.717,12.717"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3169"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3171"
+ transform="translate(348.4033,217.7607)"><path
+ d="M 0,0 10.525,-11.402"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3173"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3175"
+ transform="translate(338.3174,243.6338)"><path
+ d="m 0,0 0,57.889 7.564,6.575"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3177"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3179"
+ transform="translate(331.5205,349.1035)"><path
+ d="M 0,0 0,-35.303"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3181"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3183"
+ transform="translate(382.7012,406.2383)"><path
+ d="m 0,0 5.39,-5.389 0,-4.603"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3185"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3187"
+ transform="translate(403.2217,407.209)"><path
+ d="m 0,0 7.895,7.894 0,5.702 10.523,10.524 0,10.087"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3189"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3191"
+ transform="translate(350.5967,330.9033)"><path
+ d="m 0,0 0,5.701 9.867,9.865 0,5.484 57.778,57.777 0,4.935 12.224,12.224 0,12.773"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3193"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3195"
+ transform="translate(353.667,262.0527)"><path
+ d="m 0,0 0,24.119 -7.785,7.784"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3197"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3199"
+ transform="translate(361.999,177.8535)"><path
+ d="M 0,0 18.857,20.172"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3201"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3203"
+ transform="translate(388.75,162.0664)"><path
+ d="m 0,0 -8.114,8.111 -0.657,80.035 10.525,10.526 0,6.575 -10.744,10.747"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3205"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3207"
+ transform="translate(364.6299,230.4775)"><path
+ d="m 0,0 0,21.488 10.525,10.527 0,11.401 8.772,8.333 0,21.928 -11.403,11.402"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3209"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3211"
+ transform="translate(369.8916,312.9248)"><path
+ d="m 0,0 19.734,19.73 0,13.161 31.662,31.658 -4.349,4.347 -6.615,6.616"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3213"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3215"
+ transform="translate(364.1904,271.7012)"><path
+ d="m 0,0 0,20.174 -8.99,8.989 0,12.061 14.803,14.797 0,19.847 30.666,30.665"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3217"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3219"
+ transform="translate(405.958,384.0723)"><path
+ d="m 0,0 31.909,31.906 0,20.174"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3221"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3223"
+ transform="translate(401.0283,279.5947)"><path
+ d="m 0,0 -11.182,11.183 -0.22,55.038"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3225"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3227"
+ transform="translate(381.2939,119.9648)"><path
+ d="M 0,0 14.034,14.033"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3229"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3231"
+ transform="translate(379.1016,138.8232)"><path
+ d="M 0,0 16.227,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3233"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3235"
+ transform="translate(379.9785,93.6533)"><path
+ d="M 0,0 15.35,13.595"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3237"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3239"
+ transform="translate(395.3281,92.7754)"><path
+ d="m 0,0 0,48.241 10.171,10.171 0,9.677 -15.873,16.111 0.878,83.763"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3241"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3243"
+ transform="translate(402.7822,252.8428)"><path
+ d="M 0,0 -12.278,12.279"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3245"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3247"
+ transform="translate(405.499,152.751)"><path
+ d="m 0,0 0,-28.597 8.279,-8.278"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3249"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3251"
+ transform="translate(427.2139,391.835)"><path
+ d="m 0,0 18.604,18.604 0,21.989"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3253"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3255"
+ transform="translate(444.1279,315.335)"><path
+ d="m 0,0 9.988,10.092 0,27.117"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3257"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3259"
+ transform="translate(451.2256,359.4463)"><path
+ d="m 0,0 -6.546,6.546 0.1,21.941 -10.735,10.734"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3261"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3263"
+ transform="translate(426.1738,346.8193)"><path
+ d="M 0,0 18.506,19.173"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3265"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3267"
+ transform="translate(443.9355,344.4111)"><path
+ d="M 0,0 -10.086,10.084"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3269"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3271"
+ transform="translate(418.3682,268.7588)"><path
+ d="m 0,0 0,7.284 -20.297,20.299 0,57.918"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3273"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3275"
+ transform="translate(422.0098,289.5752)"><path
+ d="M 0,0 -16.652,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3277"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3279"
+ transform="translate(410.3008,307.0088)"><path
+ d="m 0,0 12.101,12.1 0,9.237 -9.173,9.172 0,31.898"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3281"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3283"
+ transform="translate(406.1377,331.4668)"><path
+ d="M 0,0 0,30.858"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3285"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3287"
+ transform="translate(423.6523,310.1475)"><path
+ d="M 0,0 -10.099,0.114"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3289"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3291"
+ transform="translate(419.4111,201.3662)"><path
+ d="m 0,0 0,43.974 13.661,13.663 0,9.239 19.971,19.968 0,8.913 8.944,8.944 0,11.091 9.286,9.285 8.246,-8.243 0,-28.704"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3293"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3295"
+ transform="translate(429.2979,168.5811)"><path
+ d="m 0,0 17.435,17.434 0,11.449 -13.791,13.79 0.13,50.74"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3297"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3299"
+ transform="translate(441.2686,238.8359)"><path
+ d="M 0,0 -8.235,8.236"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3301"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3303"
+ transform="translate(450.6357,217.7607)"><path
+ d="M 0,0 -17.677,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3305"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3307"
+ transform="translate(438.1455,142.0391)"><path
+ d="m 0,0 0,23.68 8.978,8.976 0,12.881"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3309"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3311"
+ transform="translate(446.9932,159.4717)"><path
+ d="M 0,0 0,18.477"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3313"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3315"
+ transform="translate(464.166,179.5078)"><path
+ d="M 0,0 -17.173,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3317"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3319"
+ transform="translate(453.043,290.8789)"><path
+ d="m 0,0 0,-43.012 6.299,-6.299"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3321"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3323"
+ transform="translate(463.9082,363.7354)"><path
+ d="m 0,0 -11.061,11.059 0,56.075"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3325"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3327"
+ transform="translate(417.8506,380.9072)"><path
+ d="M 0,0 8.326,-8.324"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3329"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3331"
+ transform="translate(538.8232,446.2402)"><path
+ d="m 0,0 0,-8.771 73.673,-74.116 0,-5.699 74.554,-74.552 0,-7.893 42.538,-42.1"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3333"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3335"
+ transform="translate(587.793,388.207)"><path
+ d="M 0,0 18.126,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3337"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3339"
+ transform="translate(598.0674,377.8701)"><path
+ d="M 0,0 44.689,0 58.085,-13.397"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3341"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3343"
+ transform="translate(616.8418,377.8701)"><path
+ d="M 0,0 18.472,-18.476"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3345"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3347"
+ transform="translate(710.7295,386.5977)"><path
+ d="M 0,0 27.629,-28.943"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3349"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3351"
+ transform="translate(691.8721,341.4287)"><path
+ d="M 0,0 14.878,-14.879"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3353"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3355"
+ transform="translate(674.332,315.1172)"><path
+ d="M 0,0 13.733,-13.734"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3357"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3359"
+ transform="translate(703.7148,276.9629)"><path
+ d="M 0,0 15.349,-15.347"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3361"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3363"
+ transform="translate(660.7354,265.1221)"><path
+ d="M 0,0 32.015,-32.013"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3365"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3367"
+ transform="translate(630.041,279.5947)"><path
+ d="M 0,0 12.423,-11.987"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3369"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3371"
+ transform="translate(630.4756,250.6514)"><path
+ d="M 0,0 12.281,-12.28"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3373"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3375"
+ transform="translate(633.5039,215.6113)"><path
+ d="m 0,0 12.541,-12.541 -0.218,-10.307 17.104,-17.102 0,-8.129"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3377"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3379"
+ transform="translate(658.9834,143.6465)"><path
+ d="m 0,0 -11.401,11.401 -9.651,9.651 0,9.209 -33.766,33.766"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3381"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3383"
+ transform="translate(613.8135,160.751)"><path
+ d="m 0,0 -9.648,9.646 0,59.205 -6.797,6.795 0,6.36 9.319,9.319 0,62.163 5.975,5.975 0,11.127 -3.674,3.948 0,12.717 -41.297,41.299"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3385"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3387"
+ transform="translate(673.8936,234.4248)"><path
+ d="M 0,0 0,17.541"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3389"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3391"
+ transform="translate(660.2988,250.2119)"><path
+ d="m 0,0 0.437,24.121 -18.199,18.198 0,35.08"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3393"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3395"
+ transform="translate(694.5479,267.7881)"><path
+ d="M 0,0 22.764,22.767"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3397"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3399"
+ transform="translate(708.9824,282.2217)"><path
+ d="M 0,0 30.253,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3401"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3403"
+ transform="translate(754.8018,370.373)"><path
+ d="M 0,0 -28.596,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3405"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3407"
+ transform="translate(743.1826,413.3486)"><path
+ d="M 0,0 -27.604,-26.751"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3409"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3411"
+ transform="translate(726.5176,386.5977)"><path
+ d="m 0,0 -87.708,0 -8.728,-8.728"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3413"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3415"
+ transform="translate(716.8711,364.6699)"><path
+ d="M 0,0 0,15.474"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3417"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3419"
+ transform="translate(697.5752,401.5078)"><path
+ d="M 0,0 -14.912,-14.91"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3421"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3423"
+ transform="translate(664.6846,401.9463)"><path
+ d="M 0,0 -15.35,-15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3425"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3427"
+ transform="translate(707.2227,341.4287)"><path
+ d="m 0,0 -77.634,0 0,-21.49 5.706,-5.704 0,-10.958 -5.039,-5.041 0.22,-76.277"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3429"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3431"
+ transform="translate(693.626,365.9873)"><path
+ d="M 0,0 -22.802,-24.559"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3433"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3435"
+ transform="translate(661.1748,330.0254)"><path
+ d="M 0,0 0,11.403"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3437"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3439"
+ transform="translate(689.2422,315.1172)"><path
+ d="M 0,0 -34.207,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3441"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3443"
+ transform="translate(675.6475,371.249)"><path
+ d="M 0,0 0,15.349"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3445"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3447"
+ transform="translate(674.3311,295.8193)"><path
+ d="M 0,0 0.165,-14.015"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3449"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3451"
+ transform="translate(690.7969,271.5)"><path
+ d="M 0,0 0,-14.271"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3453"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3455"
+ transform="translate(717.4639,245.1084)"><path
+ d="M 0,0 0,-15.507"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3457"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3459"
+ transform="translate(630.418,241.8789)"><path
+ d="m 0,0 -16.635,-16.635 0,-8.359"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3461"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3463"
+ transform="translate(634.8633,142.3311)"><path
+ d="M 0,0 12.719,12.717"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3465"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3467"
+ transform="translate(604.165,217.7607)"><path
+ d="M 0,0 -10.525,-11.402"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3469"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3471"
+ transform="translate(614.25,243.6338)"><path
+ d="m 0,0 0,57.889 -7.563,6.575"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3473"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3475"
+ transform="translate(621.0469,349.1035)"><path
+ d="M 0,0 0,-35.303"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3477"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3479"
+ transform="translate(569.8682,406.2383)"><path
+ d="m 0,0 -5.389,-5.389 0,-4.603"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3481"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3483"
+ transform="translate(549.3467,407.209)"><path
+ d="m 0,0 -7.894,7.894 0,5.702 -10.525,10.524 0,10.087"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3485"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3487"
+ transform="translate(601.9727,330.9033)"><path
+ d="m 0,0 0,5.701 -9.868,9.865 0,5.484 -57.778,57.777 0,4.935 -12.225,12.224 0,12.773"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3489"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3491"
+ transform="translate(598.9033,262.0527)"><path
+ d="m 0,0 0,24.119 7.784,7.784"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3493"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3495"
+ transform="translate(587.9385,230.4775)"><path
+ d="m 0,0 0,21.488 -10.524,10.527 0,11.401 -8.77,8.333 0,21.928 11.4,11.401"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3497"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3499"
+ transform="translate(582.6768,312.9248)"><path
+ d="m 0,0 -19.735,19.73 0,13.161 -31.659,31.658 4.348,4.347 6.615,6.616"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3501"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3503"
+ transform="translate(588.3789,271.7012)"><path
+ d="m 0,0 0,20.174 8.989,8.989 0,12.061 -14.8,14.797 0,19.847 -30.939,30.936"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3505"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3507"
+ transform="translate(545.8408,384.8438)"><path
+ d="m 0,0 -31.139,31.135 0,20.174"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3509"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3511"
+ transform="translate(552.8926,278.2422)"><path
+ d="m 0,0 9.543,9.542 0.506,58.031"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3513"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3515"
+ transform="translate(506.749,410.4395)"><path
+ d="M 0,0 0,21.988"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3517"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3519"
+ transform="translate(508.4404,315.335)"><path
+ d="m 0,0 -9.527,10.126 0,26.35"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3521"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3523"
+ transform="translate(501.9824,358.8398)"><path
+ d="M 0,0 5.929,5.928 5.811,28.614 17.023,39.827 4.859,51.993 l 0,22.898"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3525"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3527"
+ transform="translate(526.3965,346.8193)"><path
+ d="M 0,0 -18.485,17.948"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3529"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3531"
+ transform="translate(508.8135,344.5908)"><path
+ d="M 0,0 9.906,9.904"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3533"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3535"
+ transform="translate(534.2002,268.7588)"><path
+ d="m 0,0 0,7.284 20.297,20.299 0,57.918"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3537"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3539"
+ transform="translate(534.251,290.5547)"><path
+ d="M 0,0 14.46,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3541"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3543"
+ transform="translate(542.2686,307.0088)"><path
+ d="m 0,0 -12.1,12.1 0,9.237 9.172,9.172 0,31.898"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3545"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3547"
+ transform="translate(546.4316,331.4668)"><path
+ d="M 0,0 0,30.858"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3549"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3551"
+ transform="translate(534.7188,380.9072)"><path
+ d="M 0,0 -8.326,-8.324"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3553"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3555"
+ transform="translate(492.0098,281.251)"><path
+ d="M 0,0 0,30.185 10.279,40.46"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3557"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3559"
+ transform="translate(492.0098,304.9287)"><path
+ d="M 0,0 27.72,-27.719"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3561"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3563"
+ transform="translate(295.5713,181.5918)"><path
+ d="M 0,0 0,18.667"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3565"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3567"
+ transform="translate(278.3896,191.6787)"><path
+ d="M 0,0 17.182,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3569"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3571"
+ transform="translate(324.7402,172.4229)"><path
+ d="M 0,0 0,12.094"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3573"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3575"
+ transform="translate(498.6836,222.5635)"><path
+ d="m 0,0 0,35.48 11.362,11.363 0,17.486"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3577"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3579"
+ transform="translate(510.0459,274.9873)"><path
+ d="M 0,0 -0.199,-18.736"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3581"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3583"
+ transform="translate(508.0527,234.5225)"><path
+ d="M 0,0 -9.369,9.369"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3585"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3587"
+ transform="translate(487.3223,249.4727)"><path
+ d="M 0,0 11.361,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3589"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3591"
+ transform="translate(561.2754,143.0254)"><path
+ d="M 0,0 10.467,10.467 21.2,-0.267"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3593"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3595"
+ transform="translate(571.7422,153.4922)"><path
+ d="m 0,0 0,26.81 -9.42,9.418 0,15.299 -39.395,39.396 0,25.591"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3597"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3599"
+ transform="translate(555.6943,233.9248)"><path
+ d="M 0,0 0,33.887 13.701,47.586"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3601"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3603"
+ transform="translate(575.6299,251.666)"><path
+ d="M 0,0 6.304,6.305"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3605"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3607"
+ transform="translate(571.4434,229.7383)"><path
+ d="M 0,0 -15.749,15.747"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3609"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3611"
+ transform="translate(549.5156,253.8584)"><path
+ d="M 0,0 6.179,6.179"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3613"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3615"
+ transform="translate(519.2129,198.8271)"><path
+ d="M 0,0 0,26.514 11.397,37.906"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3617"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3619"
+ transform="translate(519.2129,209.9912)"><path
+ d="M 0,0 11.563,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3621"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3623"
+ transform="translate(489.5127,208.9941)"><path
+ d="M 0,0 17.542,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3625"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3627"
+ transform="translate(533.9658,185.2734)"><path
+ d="M 0,0 11.76,11.76"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3629"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3631"
+ transform="translate(556.8916,173.1133)"><path
+ d="M 0,0 -11.166,11.166"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3633"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3635"
+ transform="translate(536.7568,115.7021)"><path
+ d="m 0,0 0,33.093 8.969,8.966"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3637"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3639"
+ transform="translate(545.7256,146.2021)"><path
+ d="M 0,0 0,75.414"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3641"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3643"
+ transform="translate(494.2979,157.3643)"><path
+ d="M 0,0 0,38.474 24.915,63.789"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3645"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3647"
+ transform="translate(502.3701,181.9844)"><path
+ d="M 0,0 -8.072,8.071"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3649"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3651"
+ transform="translate(466.5889,82.2158)"><path
+ d="M 0,0 15.35,15.349 31.383,-0.684"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3653"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3655"
+ transform="translate(481.9385,97.5645)"><path
+ d="m 0,0 0,24.318 7.773,7.774"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3657"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3659"
+ transform="translate(494.4961,124.8721)"><path
+ d="m 0,0 -11.76,11.76 -0.2,24.122 11.762,11.76 17.64,-17.641 0,-25.813"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3661"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3663"
+ transform="translate(511.9385,142.0176)"><path
+ d="M 0,0 11.583,-11.582"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3665"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3667"
+ transform="translate(474.1631,106.5352)"><path
+ d="M 0,0 7.775,7.774"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3669"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3671"
+ transform="translate(492.1045,104.7393)"><path
+ d="M 0,0 -10.166,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3673"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3675"
+ transform="translate(521.209,165.7383)"><path
+ d="M 0,0 -20.136,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3677"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3679"
+ transform="translate(575.2285,205.209)"><path
+ d="M 0,0 -12.906,-12.906"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3681"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3683"
+ transform="translate(591.8916,184.9961)"><path
+ d="M 0,0 -12.479,-12.48"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3685"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3687"
+ transform="translate(585.3945,166.7354)"><path
+ d="M 0,0 -13.652,13.566"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3689"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3691"
+ transform="translate(628.0508,172.3184)"><path
+ d="M 0,0 0,11.47"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3693"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3695"
+ transform="translate(637.2217,201.6211)"><path
+ d="M 0,0 0,10.271"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3697"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3699"
+ transform="translate(657.7529,201.2217)"><path
+ d="M 0,0 0,-20.387"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3701"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3703"
+ transform="translate(657.7529,192.4512)"><path
+ d="M 0,0 15.757,0"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3705"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3715"
+ transform="translate(280.7451,404.9951)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.999 3.996,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3717"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3719"
+ transform="translate(338.3232,387.7021)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.998,3.996 6.205,3.996 7.996,2.206 7.996,0 7.996,-2.208 6.205,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3721"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3723"
+ transform="translate(384.0732,391.9258)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.998,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3725"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3727"
+ transform="translate(396.8115,404.0264)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.998,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.206 6.205,-3.996 3.998,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3729"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3731"
+ transform="translate(311.2139,356.9854)"><path
+ d="M 0,0 C 0,2.205 1.789,3.996 3.998,3.996 6.205,3.996 7.994,2.205 7.994,0 7.994,-2.21 6.205,-3.999 3.998,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3733"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3735"
+ transform="translate(290.4092,361.6758)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.209 6.205,-3.998 3.996,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3737"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3739"
+ transform="translate(272.709,367.3008)"><path
+ d="M 0,0 C 0,2.206 1.79,3.995 3.997,3.995 6.204,3.995 7.993,2.206 7.993,0 7.993,-2.209 6.204,-4 3.997,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3741"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3743"
+ transform="translate(247.9668,404.1123)"><path
+ d="M 0,0 C 0,2.21 1.789,4 3.997,4 6.205,4 7.995,2.21 7.995,0 7.995,-2.206 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3745"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3747"
+ transform="translate(251.6455,369.1592)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.997,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3749"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3751"
+ transform="translate(202.1025,416.2373)"><path
+ d="M 0,0 C 0,2.209 1.789,3.998 3.998,3.998 6.205,3.998 7.994,2.209 7.994,0 7.994,-2.207 6.205,-3.996 3.998,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3753"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3755"
+ transform="translate(218.1689,386.9355)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.997,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.208 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3757"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3759"
+ transform="translate(189.0459,369.9004)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.998,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.21 6.205,-4 3.998,-4 1.789,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3761"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3763"
+ transform="translate(206.9775,355.3125)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.206 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3765"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3767"
+ transform="translate(231.7021,360.6738)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.996,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.209 6.205,-3.999 3.996,-3.999 1.789,-3.999 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3769"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3771"
+ transform="translate(237.3525,340.6777)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.996,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.206 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3773"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3775"
+ transform="translate(239.6729,323.8027)"><path
+ d="M 0,0 C 0,2.207 1.79,3.996 3.998,3.996 6.206,3.996 7.996,2.207 7.996,0 7.996,-2.206 6.206,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3777"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3779"
+ transform="translate(255.332,315.1172)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.205,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.205,-3.999 3.997,-3.999 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3781"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3783"
+ transform="translate(257.3662,298.9141)"><path
+ d="M 0,0 C 0,2.21 1.79,3.999 3.998,3.999 6.205,3.999 7.995,2.21 7.995,0 7.995,-2.206 6.205,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3785"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3787"
+ transform="translate(287.3965,326.0293)"><path
+ d="M 0,0 C 0,2.207 1.79,3.996 3.997,3.996 6.204,3.996 7.993,2.207 7.993,0 7.993,-2.208 6.204,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3789"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3791"
+ transform="translate(228.54,293.4766)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.996,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.206 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3793"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3795"
+ transform="translate(273.6484,277.3936)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3797"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3799"
+ transform="translate(298.4092,301.71)"><path
+ d="M 0,0 11.622,11.621"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3801"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3803"
+ transform="translate(291.292,299.2148)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.206 7.994,0 7.994,-2.207 6.204,-3.998 3.996,-3.998 1.789,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3805"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3807"
+ transform="translate(328.001,309.707)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.998,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3809"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3811"
+ transform="translate(346.5996,326.9063)"><path
+ d="M 0,0 C 0,2.206 1.79,3.997 3.997,3.997 6.205,3.997 7.995,2.206 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3813"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3815"
+ transform="translate(205.3389,282.2217)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.998,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.206 6.205,-3.998 3.998,-3.998 1.789,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3817"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3819"
+ transform="translate(226.5693,258.9131)"><path
+ d="M 0,0 C 0,2.206 1.789,3.994 3.997,3.994 6.205,3.994 7.994,2.206 7.994,0 7.994,-2.21 6.205,-3.999 3.997,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3821"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3823"
+ transform="translate(216.125,230.3184)"><path
+ d="M 0,0 C 0,2.207 1.79,3.998 3.997,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.208 6.206,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3825"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3827"
+ transform="translate(231.1074,225.6016)"><path
+ d="M 0,0 C 0,2.209 1.79,4 3.997,4 6.204,4 7.993,2.209 7.993,0 7.993,-2.206 6.204,-3.995 3.997,-3.995 1.79,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3829"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3831"
+ transform="translate(252.6787,230.6465)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.997,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3833"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3835"
+ transform="translate(274.6787,230.4268)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.996,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3837"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3839"
+ transform="translate(288.2734,246.2148)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.997,3.997 6.205,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.205,-3.996 3.997,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3841"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3843"
+ transform="translate(258.2168,253.2324)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.997,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3845"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3847"
+ transform="translate(302.8809,264.7256)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.997,3.999 6.205,3.999 7.995,2.21 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3849"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3851"
+ transform="translate(326.6416,279.0107)"><path
+ d="M 0,0 C 0,1.052 0.406,2.009 1.072,2.723 1.801,3.506 2.843,3.996 3.997,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.21 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3853"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3855"
+ transform="translate(322.2822,287.166)"><path
+ d="M 0,0 5.432,-5.433"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3857"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3859"
+ transform="translate(303.0313,235.5068)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.997,3.997 6.205,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.205,-3.998 3.997,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3861"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3863"
+ transform="translate(318.0215,217.335)"><path
+ d="M 0,0 C 0,2.206 1.79,3.998 3.997,3.998 6.205,3.998 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.999 3.997,-3.999 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3865"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3867"
+ transform="translate(316.1465,212.6924)"><path
+ d="M 0,0 -0.081,-11.799"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3869"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3871"
+ transform="translate(291.5742,204.2588)"><path
+ d="M 0,0 C 0,2.204 1.79,3.995 3.997,3.995 6.204,3.995 7.993,2.204 7.993,0 7.993,-2.21 6.204,-4 3.997,-4 1.79,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3873"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3875"
+ transform="translate(270.4248,192.1445)"><path
+ d="M 0,0 C 0,2.204 1.789,3.995 3.997,3.995 6.205,3.995 7.994,2.204 7.994,0 7.994,-2.21 6.205,-4 3.997,-4 1.789,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3877"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3879"
+ transform="translate(311.7334,197.2285)"><path
+ d="M 0,0 C 0,2.21 1.79,4 3.998,4 6.206,4 7.995,2.21 7.995,0 7.995,-2.206 6.206,-3.995 3.998,-3.995 1.79,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3881"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3883"
+ transform="translate(286.0869,163.1465)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.21 6.205,-3.999 3.996,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3885"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3887"
+ transform="translate(334.7891,212.8848)"><path
+ d="M 0,0 C 0,2.208 1.789,4 3.997,4 6.204,4 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.996 3.997,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3889"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3891"
+ transform="translate(334.3203,239.6377)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.997,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3893"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3895"
+ transform="translate(360.6328,226.4795)"><path
+ d="M 0,0 C 0,2.209 1.789,3.998 3.997,3.998 6.204,3.998 7.995,2.209 7.995,0 7.995,-2.206 6.204,-3.995 3.997,-3.995 1.789,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3897"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3899"
+ transform="translate(357.8564,203.6387)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.996,3.998 6.205,3.998 7.994,2.208 7.994,0 7.994,-2.206 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3901"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3903"
+ transform="translate(320.7432,168.4258)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.997,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.209 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3905"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3907"
+ transform="translate(332.1807,157.6982)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3909"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3911"
+ transform="translate(354.9463,175.2764)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.207 6.205,-3.998 3.998,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3913"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3915"
+ transform="translate(316.1328,139.1592)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.21 6.206,-3.999 3.997,-3.999 1.79,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3917"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3919"
+ transform="translate(286.3896,141.2539)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.999 3.997,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3921"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3923"
+ transform="translate(443.7686,155.5518)"><path
+ d="M 0,0 C 0,2.206 1.79,3.995 3.997,3.995 6.205,3.995 7.994,2.206 7.994,0 7.994,-2.209 6.205,-4 3.997,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3925"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3927"
+ transform="translate(434.5576,138.4824)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.996,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.21 6.204,-3.998 3.996,-3.998 1.789,-3.998 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3929"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3931"
+ transform="translate(422.2539,165.9961)"><path
+ d="M 0,0 C 0,2.208 1.79,3.998 3.997,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.205,-3.998 3.997,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3933"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3935"
+ transform="translate(412.7725,113.2285)"><path
+ d="M 0,0 C 0,2.209 1.789,3.998 3.998,3.998 6.205,3.998 7.994,2.209 7.994,0 7.994,-2.204 6.205,-3.995 3.998,-3.995 1.789,-3.995 0,-2.204 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3937"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3939"
+ transform="translate(374.6924,116.9375)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.997,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3941"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3943"
+ transform="translate(371.5713,139.1035)"><path
+ d="M 0,0 C 0,2.206 1.791,3.996 3.998,3.996 6.205,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.205,-3.998 3.998,-3.998 1.791,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3945"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3947"
+ transform="translate(405.8311,180.916)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.996,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3949"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3951"
+ transform="translate(387.2393,159.5996)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.206 7.994,0 7.994,-2.21 6.204,-3.999 3.996,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3953"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3955"
+ transform="translate(405.8311,180.916)"><path
+ d="M 0,0 -16.164,-0.118"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3957"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3959"
+ transform="translate(403.4482,200.4463)"><path
+ d="M 0,0 -13.719,-13.718"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3961"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3963"
+ transform="translate(459.8926,79.3896)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.997,3.999 6.205,3.999 7.994,2.21 7.994,0 7.994,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3965"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3967"
+ transform="translate(467.833,103.8262)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.207 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3969"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3971"
+ transform="translate(466.8994,141.0146)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.998,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3973"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3975"
+ transform="translate(372.7881,90.5059)"><path
+ d="M 0,0 C 0,2.208 1.79,3.998 3.998,3.998 6.207,3.998 7.996,2.208 7.996,0 7.996,-2.208 6.207,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3977"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3979"
+ transform="translate(391.3311,88.7793)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.997,3.996 6.205,3.996 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3981"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3983"
+ transform="translate(473.8965,143.6494)"><path
+ d="M 0,0 8.71,8.71"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3985"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3987"
+ transform="translate(554.5029,140.1523)"><path
+ d="M 0,0 C 0,2.209 1.791,3.999 3.997,3.999 6.205,3.999 7.995,2.209 7.995,0 7.995,-2.207 6.205,-3.998 3.997,-3.998 1.791,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3989"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3991"
+ transform="translate(541.7285,142.2061)"><path
+ d="M 0,0 C 0,2.207 1.791,3.996 3.997,3.996 6.205,3.996 7.995,2.207 7.995,0 7.995,-2.208 6.205,-3.999 3.997,-3.999 1.791,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3993"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3995"
+ transform="translate(533.0576,111.7197)"><path
+ d="M 0,0 C 0,2.21 1.79,3.999 3.996,3.999 6.206,3.999 7.993,2.21 7.993,0 7.993,-2.206 6.206,-3.996 3.996,-3.996 1.79,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3997"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g3999"
+ transform="translate(521.209,165.7383)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.997,3.997 6.205,3.997 7.995,2.208 7.995,0 7.995,-2.209 6.205,-3.998 3.997,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4001"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4003"
+ transform="translate(501.5654,178.7197)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.995,3.998 6.203,3.998 7.993,2.208 7.993,0 7.993,-2.208 6.203,-3.999 3.995,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4005"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4007"
+ transform="translate(496.8564,78.7686)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.998,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-4 3.998,-4 1.79,-4 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4009"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4011"
+ transform="translate(492.1045,104.7393)"><path
+ d="M 0,0 C 0,2.21 1.791,3.999 3.997,3.999 6.206,3.999 7.995,2.21 7.995,0 7.995,-2.207 6.206,-3.996 3.997,-3.996 1.791,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4013"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4015"
+ transform="translate(507.9414,125.5039)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.997,3.997 6.205,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4017"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4019"
+ transform="translate(493.1611,121.8975)"><path
+ d="M 0,0 C 0,2.208 1.791,3.998 3.998,3.998 6.207,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.207,-3.996 3.998,-3.996 1.791,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4021"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4023"
+ transform="translate(490.2998,153.3682)"><path
+ d="M 0,0 C 0,2.209 1.789,3.996 3.998,3.996 6.206,3.996 7.995,2.209 7.995,0 7.995,-2.208 6.206,-3.997 3.998,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4025"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4027"
+ transform="translate(463.8633,179.8105)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4029"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4031"
+ transform="translate(522.0918,127.374)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.995,3.996 6.205,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.205,-3.997 3.995,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4033"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4035"
+ transform="translate(584.4375,164.1455)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.997,3.996 6.205,3.996 7.995,2.207 7.995,0 7.995,-2.206 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4037"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4039"
+ transform="translate(555.7773,170.3516)"><path
+ d="M 0,0 C 0,2.206 1.789,3.998 3.999,3.998 6.205,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.205,-3.998 3.999,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4041"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4043"
+ transform="translate(581.5928,140.2549)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.996,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.999 3.996,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4045"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4047"
+ transform="translate(436.9297,290.792)"><path
+ d="M 0,0 C 0,1.054 0.406,2.01 1.072,2.726 1.802,3.507 2.843,3.998 3.997,3.998 6.204,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4049"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4051"
+ transform="translate(437.2666,312.5498)"><path
+ d="M 0,0 C 0,1.055 0.407,2.011 1.073,2.725 1.803,3.508 2.843,3.997 3.998,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.207 6.205,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4053"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4055"
+ transform="translate(422.0098,289.5752)"><path
+ d="M 0,0 C 0,1.054 0.407,2.009 1.073,2.723 1.804,3.507 2.844,3.998 3.998,3.998 6.206,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4057"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4059"
+ transform="translate(400.9951,249.4023)"><path
+ d="M 0,0 C 0,1.053 0.407,2.01 1.072,2.726 1.802,3.508 2.842,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.207 6.205,-3.996 3.996,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4061"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4063"
+ transform="translate(414.3701,264.7607)"><path
+ d="m 0,0 c 0,1.054 0.407,2.011 1.073,2.725 0.73,0.782 1.77,1.273 2.925,1.273 2.207,0 3.996,-1.79 3.996,-3.998 0,-2.208 -1.789,-3.997 -3.996,-3.997 C 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4065"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4067"
+ transform="translate(423.5713,309.3506)"><path
+ d="M 0,0 C 0,1.052 0.408,2.009 1.072,2.723 1.803,3.506 2.843,3.996 3.997,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.206 6.206,-3.998 3.997,-3.998 1.79,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4069"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4071"
+ transform="translate(403.1826,304.5156)"><path
+ d="M 0,0 C 0,1.052 0.406,2.011 1.071,2.725 1.801,3.506 2.842,3.997 3.996,3.997 6.205,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.205,-3.998 3.996,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4073"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4075"
+ transform="translate(401.7383,327.0674)"><path
+ d="M 0,0 C 0,1.052 0.406,2.01 1.072,2.726 1.802,3.507 2.843,3.998 3.997,3.998 6.204,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4077"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4079"
+ transform="translate(399.3789,276.8701)"><path
+ d="m 0,0 c 0,1.052 0.406,2.011 1.073,2.725 0.729,0.781 1.77,1.273 2.924,1.273 2.208,0 3.998,-1.79 3.998,-3.998 0,-2.208 -1.79,-3.999 -3.998,-3.999 C 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4081"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4083"
+ transform="translate(360.1943,267.7031)"><path
+ d="m 0,0 c 0,1.054 0.406,2.011 1.072,2.725 0.73,0.783 1.77,1.273 2.924,1.273 2.209,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.789,-3.997 -3.998,-3.997 C 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4085"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4087"
+ transform="translate(349.6689,258.0537)"><path
+ d="M 0,0 C 0,1.055 0.408,2.014 1.072,2.727 1.803,3.51 2.843,3.999 3.998,3.999 6.205,3.999 7.995,2.21 7.995,0 7.995,-2.205 6.205,-3.996 3.998,-3.996 1.79,-3.996 0,-2.205 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4089"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4091"
+ transform="translate(362.8799,310.3047)"><path
+ d="m 0,0 c 0,1.052 0.406,2.01 1.072,2.725 0.73,0.781 1.77,1.27 2.925,1.27 2.208,0 3.998,-1.789 3.998,-3.995 0,-2.209 -1.79,-3.998 -3.998,-3.998 C 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4093"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4095"
+ transform="translate(440.9268,286.7949)"><path
+ d="M 0,0 0,-10.749"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4097"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4099"
+ transform="translate(406.1182,221.9893)"><path
+ d="M 0,0 13.293,13.293"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4101"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4103"
+ transform="translate(494.6855,218.5654)"><path
+ d="M 0,0 C 0,2.207 1.79,3.998 3.998,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.206 6.206,-3.995 3.998,-3.995 1.79,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4105"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4107"
+ transform="translate(479.3271,249.4727)"><path
+ d="M 0,0 C 0,2.208 1.787,3.998 3.997,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.205,-3.996 3.997,-3.996 1.787,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4109"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4111"
+ transform="translate(482.4785,226.8984)"><path
+ d="M 0,0 C 0,2.206 1.789,3.998 3.997,3.998 6.206,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.999 3.997,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4113"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4115"
+ transform="translate(467.4561,224.1719)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.996,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.204,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4117"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4119"
+ transform="translate(458.1582,238.248)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.998,3.998 6.205,3.998 7.994,2.208 7.994,0 7.994,-2.206 6.205,-3.996 3.998,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4121"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4123"
+ transform="translate(450.6016,218.2637)"><path
+ d="M 0,0 C 0,2.206 1.789,3.997 3.997,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.208 6.204,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4125"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4127"
+ transform="translate(439.9971,235.9199)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.997,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.21 6.206,-3.999 3.997,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4129"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4131"
+ transform="translate(415.4131,197.3691)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.998,3.997 6.207,3.997 7.995,2.208 7.995,0 7.995,-2.206 6.207,-3.998 3.998,-3.998 1.789,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4133"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4135"
+ transform="translate(402.7939,202.6377)"><path
+ d="M 0,0 C 0,2.207 1.789,3.998 3.997,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.999 3.997,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4137"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4139"
+ transform="translate(398.9463,219.5635)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.998,3.997 6.207,3.997 7.996,2.208 7.996,0 7.996,-2.206 6.207,-3.996 3.998,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4141"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4143"
+ transform="translate(574.0801,207.582)"><path
+ d="M 0,0 C 0,2.207 1.79,3.996 3.996,3.996 6.206,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.206,-3.997 3.996,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4145"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4147"
+ transform="translate(587.1807,203.21)"><path
+ d="M 0,0 C 0,2.205 1.789,3.996 3.997,3.996 6.206,3.996 7.995,2.205 7.995,0 7.995,-2.21 6.206,-3.999 3.997,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4149"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4151"
+ transform="translate(591.043,187.4512)"><path
+ d="M 0,0 C 0,2.208 1.788,3.997 3.996,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.205 6.204,-3.996 3.996,-3.996 1.788,-3.996 0,-2.205 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4153"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4155"
+ transform="translate(612.29,158.2207)"><path
+ d="M 0,0 C 0,2.206 1.788,3.997 3.998,3.997 6.206,3.997 7.995,2.206 7.995,0 7.995,-2.208 6.206,-4 3.998,-4 1.788,-4 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4157"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4159"
+ transform="translate(623.6025,168.7734)"><path
+ d="M 0,0 C 0,2.206 1.788,3.995 3.998,3.995 6.206,3.995 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.788,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4161"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4163"
+ transform="translate(627.9824,139.5664)"><path
+ d="M 0,0 C 0,2.21 1.789,3.999 3.995,3.999 6.205,3.999 7.993,2.21 7.993,0 7.993,-2.207 6.205,-3.996 3.995,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4165"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4167"
+ transform="translate(657.1943,140.9199)"><path
+ d="M 0,0 C 0,2.206 1.789,3.998 3.999,3.998 6.204,3.998 7.993,2.206 7.993,0 7.993,-2.206 6.204,-3.996 3.999,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4169"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4171"
+ transform="translate(659.2793,164.1543)"><path
+ d="M 0,0 C 0,2.208 1.787,3.998 3.995,3.998 6.204,3.998 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.998 3.995,-3.998 1.787,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4173"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4175"
+ transform="translate(673.4834,192.0059)"><path
+ d="M 0,0 C 0,2.206 1.789,3.996 3.999,3.996 6.205,3.996 7.997,2.206 7.997,0 7.997,-2.208 6.205,-3.998 3.999,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4177"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4179"
+ transform="translate(654.209,204.7012)"><path
+ d="M 0,0 C 0,2.208 1.789,3.997 3.996,3.997 6.205,3.997 7.994,2.208 7.994,0 7.994,-2.209 6.205,-3.998 3.996,-3.998 1.789,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4181"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4183"
+ transform="translate(632.7344,197.6221)"><path
+ d="m 0,0 c 0,2.208 1.787,3.999 3.997,3.999 2.21,0 4,-1.791 4,-3.999 0,-2.206 -1.79,-3.996 -4,-3.996 C 1.787,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4185"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4187"
+ transform="translate(609.7871,212.8848)"><path
+ d="M 0,0 C 0,2.208 1.787,4 3.996,4 6.204,4 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.996 3.996,-3.996 1.787,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4189"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4191"
+ transform="translate(626.2832,217.9697)"><path
+ d="M 0,0 C 0,2.21 1.788,3.999 4,3.999 6.204,3.999 7.996,2.21 7.996,0 7.996,-2.206 6.204,-3.997 4,-3.997 1.788,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4193"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4195"
+ transform="translate(669.8955,230.4268)"><path
+ d="M 0,0 C 0,2.208 1.788,3.998 3.998,3.998 6.204,3.998 7.994,2.208 7.994,0 7.994,-2.208 6.204,-3.997 3.998,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4197"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4199"
+ transform="translate(691.3037,230.4268)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.996,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.205,-3.997 3.996,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4201"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4203"
+ transform="translate(713.584,226.3818)"><path
+ d="M 0,0 C 0,2.207 1.788,3.998 3.996,3.998 6.204,3.998 7.993,2.207 7.993,0 7.993,-2.21 6.204,-3.999 3.996,-3.999 1.788,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4205"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4207"
+ transform="translate(728.3965,230.2646)"><path
+ d="M 0,0 C 0,2.206 1.791,3.998 3.997,3.998 6.207,3.998 7.995,2.206 7.995,0 7.995,-2.208 6.207,-3.997 3.997,-3.997 1.791,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4209"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4211"
+ transform="translate(584.2021,226.4951)"><path
+ d="m 0,0 c 0,2.206 1.79,3.996 3.996,3.996 2.208,0 4,-1.79 4,-3.996 0,-2.208 -1.792,-3.999 -4,-3.999 C 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4213"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4215"
+ transform="translate(569.3311,248.5557)"><path
+ d="M 0,0 C 0,2.207 1.788,3.996 3.998,3.996 6.204,3.996 7.994,2.207 7.994,0 7.994,-2.206 6.204,-3.997 3.998,-3.997 1.788,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4217"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4219"
+ transform="translate(569.8496,227.3203)"><path
+ d="M 0,0 C 0,2.207 1.788,3.998 3.996,3.998 6.202,3.998 7.993,2.207 7.993,0 7.993,-2.208 6.202,-3.997 3.996,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4221"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4223"
+ transform="translate(527.0576,182.5352)"><path
+ d="M 0,0 C 0,2.208 1.792,3.999 3.998,3.999 6.208,3.999 7.995,2.208 7.995,0 7.995,-2.208 6.208,-3.998 3.998,-3.998 1.792,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4225"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4227"
+ transform="translate(515.2168,194.832)"><path
+ d="M 0,0 C 0,2.206 1.79,3.995 3.996,3.995 6.206,3.995 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.996,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4229"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4231"
+ transform="translate(530.7754,209.9912)"><path
+ d="M 0,0 C 0,2.207 1.789,3.996 3.999,3.996 6.206,3.996 7.997,2.207 7.997,0 7.997,-2.206 6.206,-3.997 3.999,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4233"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4235"
+ transform="translate(551.6973,229.9268)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.997,3.998 6.205,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.205,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4237"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4239"
+ transform="translate(542.6074,251.124)"><path
+ d="M 0,0 C 0,2.206 1.79,3.996 3.998,3.996 6.208,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.208,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4241"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4243"
+ transform="translate(530.2031,264.7607)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.997,3.998 6.206,3.998 7.995,2.208 7.995,0 7.995,-2.208 6.206,-3.997 3.997,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4245"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4247"
+ transform="translate(505.8496,252.2529)"><path
+ d="M 0,0 C 0,2.208 1.789,3.998 3.997,3.998 6.204,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4249"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4251"
+ transform="translate(506.459,231.333)"><path
+ d="M 0,0 C 0,2.207 1.788,3.998 3.997,3.998 6.204,3.998 7.995,2.207 7.995,0 7.995,-2.208 6.204,-3.997 3.997,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4253"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4255"
+ transform="translate(478.7373,266.6787)"><path
+ d="M 0,0 C 0,2.208 1.79,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4257"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4259"
+ transform="translate(481.1279,208.6025)"><path
+ d="M 0,0 C 0,2.209 1.788,3.999 3.996,3.999 6.206,3.999 7.995,2.209 7.995,0 7.995,-2.207 6.206,-3.996 3.996,-3.996 1.788,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4261"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4263"
+ transform="translate(482.2891,336.0586)"><path
+ d="M 0,0 C 0,1.054 0.405,2.013 1.072,2.726 1.8,3.509 2.842,3.998 3.996,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.206 6.204,-3.997 3.996,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4265"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4267"
+ transform="translate(495.0381,377.9531)"><path
+ d="m 0,0 c 0,1.052 0.407,2.009 1.072,2.725 0.73,0.781 1.772,1.27 2.926,1.27 C 6.204,3.995 7.995,2.206 7.995,0 7.995,-2.209 6.204,-4 3.998,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4269"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4271"
+ transform="translate(484.6309,394.0869)"><path
+ d="m 0,0 c 0,1.052 0.407,2.01 1.072,2.725 0.73,0.781 1.771,1.27 2.926,1.27 C 6.204,3.995 7.993,2.208 7.993,0 7.993,-2.208 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4273"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4275"
+ transform="translate(474.4814,403.4521)"><path
+ d="M 0,0 C 0,1.054 0.408,2.011 1.072,2.725 1.803,3.509 2.844,3.998 3.998,3.998 6.204,3.998 7.995,2.209 7.995,0 7.995,-2.208 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4277"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4279"
+ transform="translate(462.7217,361.0098)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.509 2.843,3.998 3.998,3.998 6.205,3.998 7.995,2.207 7.995,0 7.995,-2.208 6.205,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4281"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4283"
+ transform="translate(450.0195,356.6143)"><path
+ d="M 0,0 C 0,1.054 0.406,2.009 1.072,2.725 1.801,3.506 2.843,3.997 3.997,3.997 6.204,3.997 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.998 3.997,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4285"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4287"
+ transform="translate(442.8623,341.6875)"><path
+ d="M 0,0 C 0,1.05 0.408,2.009 1.072,2.723 1.803,3.506 2.844,3.996 3.998,3.996 6.206,3.996 7.995,2.205 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4289"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4291"
+ transform="translate(419.8965,343.5381)"><path
+ d="M 0,0 C 0,1.053 0.407,2.012 1.071,2.726 1.802,3.508 2.843,3.997 3.997,3.997 6.204,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.204,-3.998 3.997,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4293"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4295"
+ transform="translate(425.377,370.1875)"><path
+ d="M 0,0 C 0,1.053 0.408,2.01 1.072,2.726 1.802,3.508 2.844,3.997 3.998,3.997 6.205,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.205,-3.996 3.998,-3.996 1.79,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4297"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4299"
+ transform="translate(420.4033,388.998)"><path
+ d="M 0,0 C 0,1.052 0.407,2.011 1.072,2.725 1.802,3.507 2.843,3.998 3.998,3.998 6.205,3.998 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.999 3.998,-3.999 1.789,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4301"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4303"
+ transform="translate(399.8057,380.7109)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.724 1.801,3.507 2.843,3.996 3.997,3.996 6.205,3.996 7.994,2.207 7.994,0 7.994,-2.208 6.205,-3.997 3.997,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4305"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4307"
+ transform="translate(544.9678,381.4111)"><path
+ d="M 0,0 C 0,1.052 0.407,2.011 1.072,2.725 1.8,3.506 2.841,3.997 3.998,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.208 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4309"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4311"
+ transform="translate(524.2813,389.1113)"><path
+ d="M 0,0 C 0,1.052 0.406,2.009 1.073,2.724 1.803,3.507 2.845,3.996 3.997,3.996 6.205,3.996 7.995,2.207 7.995,0 7.995,-2.208 6.205,-3.997 3.997,-3.997 1.791,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4313"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4315"
+ transform="translate(519.3545,370.459)"><path
+ d="m 0,0 c 0,1.054 0.407,2.013 1.072,2.727 0.73,0.781 1.772,1.27 2.926,1.27 2.206,0 3.996,-1.789 3.996,-3.997 0,-2.206 -1.79,-3.996 -3.996,-3.996 C 1.79,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4317"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4319"
+ transform="translate(494.6953,355.7979)"><path
+ d="M 0,0 C 0,1.054 0.407,2.013 1.072,2.725 1.802,3.508 2.844,3.997 3.998,3.997 6.206,3.997 7.996,2.208 7.996,0 7.996,-2.206 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4321"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4323"
+ transform="translate(541.1943,304.2842)"><path
+ d="m 0,0 c 0,1.052 0.407,2.011 1.074,2.725 0.73,0.782 1.771,1.273 2.922,1.273 2.21,0 3.999,-1.79 3.999,-3.998 0,-2.208 -1.789,-3.997 -3.999,-3.997 C 1.792,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4325"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4327"
+ transform="translate(597.7295,327.3008)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.725 1.802,3.508 2.844,3.998 3.998,3.998 6.204,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4329"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4331"
+ transform="translate(605.9189,388.207)"><path
+ d="M 0,0 C 0,1.052 0.409,2.01 1.072,2.725 1.804,3.506 2.843,3.997 3.998,3.997 6.204,3.997 7.995,2.208 7.995,0 7.995,-2.209 6.204,-3.998 3.998,-3.998 1.79,-3.998 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4333"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4335"
+ transform="translate(506.7529,312.6104)"><path
+ d="m 0,0 c 0,1.052 0.406,2.011 1.071,2.725 0.73,0.781 1.77,1.271 2.926,1.271 2.207,0 3.996,-1.79 3.996,-3.996 0,-2.208 -1.789,-3.998 -3.996,-3.998 C 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4337"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4339"
+ transform="translate(542.0625,327.8389)"><path
+ d="M 0,0 C 0,1.056 0.407,2.013 1.073,2.727 1.801,3.51 2.841,4 3.996,4 6.206,4 7.995,2.21 7.995,0 7.995,-2.206 6.206,-3.995 3.996,-3.995 1.789,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4341"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4343"
+ transform="translate(501.7949,341.9775)"><path
+ d="m 0,0 c 0,1.054 0.406,2.013 1.073,2.725 0.728,0.783 1.77,1.273 2.924,1.273 2.208,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.79,-3.996 -3.998,-3.996 C 1.791,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4345"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4347"
+ transform="translate(525.1553,343.7061)"><path
+ d="M 0,0 C 0,1.054 0.407,2.01 1.072,2.726 1.802,3.507 2.843,3.998 3.998,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.208 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4349"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4351"
+ transform="translate(560.6543,391.8955)"><path
+ d="M 0,0 C 0,1.052 0.407,2.009 1.073,2.723 1.802,3.506 2.843,3.996 3.998,3.996 6.204,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.999 3.998,-3.999 1.791,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4353"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4355"
+ transform="translate(548.2754,404.4844)"><path
+ d="M 0,0 C 0,1.053 0.406,2.01 1.071,2.725 1.801,3.506 2.844,3.997 3.997,3.997 6.205,3.997 7.995,2.206 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4357"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4359"
+ transform="translate(641.749,235.9199)"><path
+ d="m 0,0 c 0,1.056 0.408,2.013 1.073,2.725 0.73,0.783 1.77,1.273 2.924,1.273 2.209,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.789,-3.997 -3.998,-3.997 C 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4361"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4363"
+ transform="translate(656.3027,246.2148)"><path
+ d="M 0,0 C 0,1.053 0.407,2.011 1.07,2.725 1.801,3.508 2.843,3.997 3.996,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.204,-3.996 3.996,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4365"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4367"
+ transform="translate(610.2549,239.6377)"><path
+ d="m 0,0 c 0,1.053 0.408,2.009 1.07,2.723 0.731,0.783 1.771,1.273 2.925,1.273 2.21,0 4,-1.79 4,-3.996 0,-2.208 -1.79,-3.998 -4,-3.998 C 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4369"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4371"
+ transform="translate(617.0508,309.8027)"><path
+ d="m 0,0 c 0,1.054 0.407,2.013 1.072,2.725 0.73,0.783 1.771,1.273 2.924,1.273 2.21,0 3.998,-1.79 3.998,-3.998 0,-2.206 -1.788,-3.997 -3.998,-3.997 C 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4373"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4375"
+ transform="translate(594.8418,258.0928)"><path
+ d="M 0,0 C 0,1.053 0.408,2.012 1.071,2.727 1.803,3.508 2.843,3.997 3.997,3.997 6.205,3.997 7.995,2.21 7.995,0 7.995,-2.207 6.205,-3.996 3.997,-3.996 1.789,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4377"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4379"
+ transform="translate(617.9893,281.2422)"><path
+ d="M 0,0 C 0,1.054 0.407,2.009 1.072,2.725 1.802,3.507 2.845,3.998 3.998,3.998 6.206,3.998 7.995,2.207 7.995,0 7.995,-2.21 6.206,-3.999 3.998,-3.999 1.792,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4381"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4383"
+ transform="translate(717.9902,258.8896)"><path
+ d="m 0,0 c 0,1.053 0.407,2.011 1.073,2.727 0.728,0.781 1.77,1.27 2.923,1.27 C 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.208 6.204,-3.998 3.996,-3.998 1.789,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4385"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4387"
+ transform="translate(686.8008,253.7139)"><path
+ d="M 0,0 C 0,1.053 0.407,2.01 1.07,2.723 1.804,3.506 2.844,3.997 3.996,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.209 6.206,-4 3.996,-4 1.79,-4 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4389"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4391"
+ transform="translate(716.2881,293.2197)"><path
+ d="m 0,0 c 0,1.054 0.407,2.009 1.072,2.725 0.73,0.782 1.772,1.273 2.926,1.273 2.206,0 3.996,-1.79 3.996,-3.998 0,-2.208 -1.79,-3.997 -3.996,-3.997 C 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4393"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4395"
+ transform="translate(739.2354,282.2217)"><path
+ d="M 0,0 C 0,1.054 0.409,2.009 1.072,2.725 1.802,3.506 2.844,3.997 3.998,3.997 6.204,3.997 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.998 3.998,-3.998 1.79,-3.998 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4397"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4399"
+ transform="translate(641.3271,264.8213)"><path
+ d="M 0,0 C 0,1.052 0.406,2.009 1.073,2.724 1.801,3.507 2.843,3.996 3.996,3.996 6.204,3.996 7.993,2.207 7.993,0 7.993,-2.206 6.204,-3.995 3.996,-3.995 1.791,-3.995 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4401"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4403"
+ transform="translate(653.4258,298.4277)"><path
+ d="M 0,0 C 0,1.052 0.405,2.011 1.07,2.724 1.802,3.507 2.843,3.996 3.998,3.996 6.202,3.996 7.992,2.207 7.992,0 7.992,-2.208 6.202,-3.997 3.998,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4405"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4407"
+ transform="translate(657.1807,326.0293)"><path
+ d="M 0,0 C 0,1.052 0.405,2.011 1.072,2.724 1.8,3.507 2.841,3.996 3.994,3.996 6.202,3.996 7.993,2.207 7.993,0 7.993,-2.208 6.202,-3.997 3.994,-3.997 1.788,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4409"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4411"
+ transform="translate(633.8057,356.2744)"><path
+ d="M 0,0 C 0,1.056 0.409,2.013 1.076,2.726 1.804,3.509 2.844,3.998 4,3.998 6.206,3.998 7.996,2.209 7.996,0 7.996,-2.206 6.206,-3.997 4,-3.997 1.792,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4413"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4415"
+ transform="translate(654.7549,361.4219)"><path
+ d="M 0,0 C 0,1.052 0.405,2.009 1.071,2.724 1.801,3.507 2.843,3.996 3.996,3.996 6.204,3.996 7.993,2.205 7.993,0 7.993,-2.21 6.204,-3.999 3.996,-3.999 1.789,-3.999 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4417"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4419"
+ transform="translate(671.6494,367.251)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.509 2.844,3.998 3.998,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.206 6.204,-3.997 3.998,-3.997 1.792,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4421"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4423"
+ transform="translate(663.6543,404.6172)"><path
+ d="m 0,0 c 0,1.054 0.407,2.013 1.072,2.725 0.73,0.783 1.77,1.273 2.924,1.273 2.208,0 3.999,-1.79 3.999,-3.998 0,-2.206 -1.791,-3.997 -3.999,-3.997 C 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4425"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4427"
+ transform="translate(696.4658,404.0986)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.507 2.843,3.998 3.998,3.998 6.204,3.998 7.993,2.209 7.993,0 7.993,-2.206 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4429"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4431"
+ transform="translate(742.1533,415.5654)"><path
+ d="M 0,0 C 0,1.053 0.406,2.011 1.073,2.726 1.801,3.508 2.843,3.998 3.997,3.998 6.204,3.998 7.993,2.208 7.993,0 7.993,-2.207 6.204,-3.996 3.997,-3.996 1.791,-3.996 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4433"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4435"
+ transform="translate(712.8721,360.6738)"><path
+ d="m 0,0 c 0,1.052 0.408,2.01 1.073,2.724 0.73,0.783 1.77,1.272 2.926,1.272 2.206,0 3.996,-1.789 3.996,-3.996 0,-2.209 -1.79,-3.999 -3.996,-3.999 C 1.789,-3.999 0,-2.209 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4437"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4439"
+ transform="translate(692.2705,368.9873)"><path
+ d="M 0,0 C 0,1.053 0.407,2.009 1.072,2.725 1.802,3.504 2.843,3.997 3.998,3.997 6.204,3.997 7.994,2.206 7.994,0 7.994,-2.21 6.204,-4 3.998,-4 1.79,-4 0,-2.21 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4441"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4443"
+ transform="translate(726.208,386.2871)"><path
+ d="M 0,0 C 0,1.054 0.407,2.009 1.07,2.723 1.802,3.507 2.843,3.996 3.998,3.996 6.204,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.997 3.998,-3.997 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4445"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4447"
+ transform="translate(754.6855,370.3965)"><path
+ d="m 0,0 c 0,1.052 0.407,2.009 1.072,2.723 0.73,0.783 1.77,1.273 2.924,1.273 2.208,0 3.999,-1.79 3.999,-3.996 0,-2.208 -1.791,-3.998 -3.999,-3.998 C 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4449"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4451"
+ transform="translate(737.2842,354.9297)"><path
+ d="M 0,0 C 0,1.053 0.408,2.011 1.074,2.725 1.803,3.506 2.845,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.998 3.998,-3.998 1.791,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4453"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4455"
+ transform="translate(707.2227,341.4287)"><path
+ d="m 0,0 c 0,1.052 0.407,2.011 1.072,2.726 0.73,0.781 1.77,1.27 2.924,1.27 2.208,0 3.998,-1.789 3.998,-3.996 0,-2.208 -1.79,-3.997 -3.998,-3.997 C 1.79,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4457"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4459"
+ transform="translate(689.2422,315.1172)"><path
+ d="M 0,0 C 0,1.052 0.407,2.009 1.072,2.723 1.802,3.507 2.843,3.996 3.998,3.996 6.204,3.996 7.993,2.206 7.993,0 7.993,-2.208 6.204,-3.999 3.998,-3.999 1.79,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4461"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4463"
+ transform="translate(670.041,277.8359)"><path
+ d="M 0,0 C 0,1.053 0.408,2.011 1.073,2.725 1.803,3.508 2.843,3.997 3.998,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.998 3.998,-3.998 1.791,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4465"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4467"
+ transform="translate(686.9902,298.6592)"><path
+ d="m 0,0 c 0,1.052 0.41,2.009 1.075,2.724 0.73,0.783 1.77,1.272 2.924,1.272 2.208,0 3.998,-1.789 3.998,-3.996 0,-2.208 -1.79,-3.999 -3.998,-3.999 C 1.791,-3.999 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4469"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4471"
+ transform="translate(704.7207,323.8252)"><path
+ d="M 0,0 C 0,1.053 0.407,2.012 1.074,2.725 1.8,3.508 2.842,3.997 3.996,3.997 6.206,3.997 7.995,2.208 7.995,0 7.995,-2.207 6.206,-3.998 3.996,-3.998 1.79,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4473"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4475"
+ transform="translate(584.3818,267.7031)"><path
+ d="M 0,0 C 0,1.054 0.406,2.011 1.071,2.725 1.799,3.508 2.843,3.998 3.997,3.998 6.204,3.998 7.995,2.208 7.995,0 7.995,-2.206 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4477"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4479"
+ transform="translate(581.1592,309.3857)"><path
+ d="M 0,0 C 0,1.052 0.408,2.009 1.071,2.724 1.803,3.507 2.843,3.996 3.999,3.996 6.205,3.996 7.995,2.205 7.995,0 7.995,-2.208 6.205,-3.997 3.999,-3.997 1.789,-3.997 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4481"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4483"
+ transform="translate(545.2139,275.751)"><path
+ d="M 0,0 C 0,1.052 0.407,2.009 1.072,2.723 1.802,3.505 2.845,3.996 3.998,3.996 6.206,3.996 7.995,2.206 7.995,0 7.995,-2.208 6.206,-3.998 3.998,-3.998 1.79,-3.998 0,-2.208 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4485"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4487"
+ transform="translate(518.0771,273.9746)"><path
+ d="M 0,0 C 0,1.054 0.406,2.011 1.073,2.725 1.801,3.507 2.843,3.998 3.997,3.998 6.204,3.998 7.995,2.207 7.995,0 7.995,-2.206 6.204,-3.997 3.997,-3.997 1.789,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4489"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4491"
+ transform="translate(526.2578,290.5547)"><path
+ d="M 0,0 C 0,1.053 0.407,2.011 1.072,2.725 1.802,3.508 2.843,3.997 3.998,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.207 6.204,-3.998 3.998,-3.998 1.789,-3.998 0,-2.207 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4493"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4495"
+ transform="translate(513.6152,298.8906)"><path
+ d="M 0,0 C 0,1.054 0.406,2.013 1.073,2.727 1.801,3.51 2.843,3.997 3.996,3.997 6.204,3.997 7.993,2.208 7.993,0 7.993,-2.206 6.204,-3.996 3.996,-3.996 1.789,-3.996 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4497"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4499"
+ transform="translate(487.5342,277.2832)"><path
+ d="M 0,0 C 0,1.054 0.407,2.011 1.072,2.726 1.802,3.507 2.843,3.998 3.996,3.998 6.204,3.998 7.994,2.209 7.994,0 7.994,-2.206 6.204,-3.997 3.996,-3.997 1.79,-3.997 0,-2.206 0,0 z"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4501"
+ inkscape:connector-curvature="0" /></g><path
+ inkscape:connector-curvature="0"
+ id="path4505"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 475.5215,285.4971 c 0,1.053 0.408,2.01 1.073,2.725 0.729,0.781 1.77,1.274 2.925,1.274 2.206,0 3.997,-1.791 3.997,-3.999 0,-2.207 -1.791,-3.996 -3.997,-3.996 -2.208,0 -3.998,1.789 -3.998,3.996 z" /><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4507"
+ transform="translate(624.9453,283.9238)"><path
+ d="M 0,0 5.338,5.338"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4509"
+ inkscape:connector-curvature="0" /></g><g
+ style="stroke-width:1.60000000000000009;stroke-miterlimit:4;stroke-dasharray:none;stroke:#4486c2;stroke-opacity:1"
+ id="g4511"
+ transform="translate(654.4961,301.1514)"><path
+ d="M 0,0 -11.959,11.325"
+ style="fill:none;stroke:#4486c2;stroke-width:1.60000000000000009;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path4513"
+ inkscape:connector-curvature="0" /></g></g></svg>
\ No newline at end of file
diff --git a/src/chrome/skin/donation_banner.css b/src/chrome/skin/donation_banner.css
new file mode 100644
index 0000000..8ad3f88
--- /dev/null
+++ b/src/chrome/skin/donation_banner.css
@@ -0,0 +1,148 @@
+#banner {
+ -khtml-user-select: none; /* Konqueror */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* Internet Explorer/Edge */
+ -webkit-touch-callout: none; /* iOS Safari */
+ -webkit-user-select: none; /* Chrome/Safari/Opera */
+ background-color: #406;
+ background-opacity: 10%;
+ background-size: cover;
+ background: radial-gradient(circle, #406 90%, #203 100%);
+ border-bottom: 6px solid #305;
+ border-top: 5px solid #305;
+ display: none;
+ height: 120px;
+ justify-content: center;
+ left: 0px;
+ margin-top: 40px;
+ min-width: 900px;
+ opacity: 1;
+ position: absolute;
+ user-select: none;
+ width: 100%;
+ z-index: 1;
+}
+#banner:before {
+ background-image: url('chrome://torbutton/content/aboutTor/tor-roots-only.svg');
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ background-size: cover;
+ content: ' ';
+ display: block;
+ height: 100%;
+ left: 0;
+ opacity: 0.20;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+#banner-contents-container {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+ height: 100%;
+ max-width: 700px;
+ position: relative;
+ width: 700px;
+}
+#banner-text {
+ align-self: stretch;
+ color: white;
+ display: flex;
+ flex-direction: column;
+ flex: 1 1 auto;
+ font-family: sans-serif;
+ font-size: 8px;
+ margin: 10px 20px 10px 20px;
+ max-height: 100%;
+}
+#banner-tagline {
+ align-items: center;
+ display: flex;
+ flex: 2 2 67%;
+ font-weight: bold;
+ justify-content: center;
+ text-align: center;
+}
+#banner-heart {
+ align-items: center;
+ color: #f8f8a0;
+ display: flex;
+ flex: 1 1 33%;
+ justify-content: center;
+ text-align: center;
+ white-space: nowrap;
+}
+#banner-logo-container {
+ display: inline-block;
+ flex: 0 0 auto;
+ margin: 0px;
+ position: relative;
+}
+#banner-logo {
+ height: 155px;
+ position: relative;
+ padding-bottom: 40px;
+ width: 108px;
+}
+#banner-donate-button-container {
+ background-color: #FFD;
+ border: 4px solid #204;
+ color: #A20;
+ display: block;
+ flex-grow: 0.0;
+ flex: 0;
+ height: 50px;
+ letter-spacing: -0.00em;
+ opacity: 100%;
+ padding-bottom: 5px;
+ padding-left: 15px;
+ padding-right: 15px;
+ padding-top: 5px;
+ width: 80px;
+}
+#banner-donate-button-container:hover {
+ border-color: #610;
+}
+#banner-donate-button-container:active {
+ border-color: #A20;
+}
+#banner-donate-button {
+ align-items: center;
+ display: flex;
+ font-family: sans-serif;
+ font-size: 12px;
+ font-weight: bold;
+ height: 100%;
+ text-align: start;
+ width: 100%;
+}
+#banner-donate-button-arrow {
+ font-size: 14px;
+ margin-inline-start: 5px;
+}
+#banner-donate-button-arrow:-moz-dir(rtl) {
+ transform: scaleX(-1);
+}
+#banner-donate-button-link {
+ flex: 0 0 auto;
+ text-decoration: none;
+}
+#banner-donate-button-link:link {
+ color: #A20;
+}
+#banner-donate-button-link:hover {
+ color: #C40;
+}
+#banner-donate-button-link:visited {
+ color: #408;
+}
+#banner-donate-button-linka:active {
+ color: black;
+}
+#banner-spacer {
+ display: none;
+ height: 150px;
+ position: relative;
+ top: 0;
+};
1
0

[torbutton/master] Bug 20347.1: Apply torbutton security_slider pref at startup
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit 595b01456eaa3b0759f1f80d562ebf6520c8c182
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Tue Nov 8 07:57:10 2016 -0800
Bug 20347.1: Apply torbutton security_slider pref at startup
Fixes bug in the main 20347 patch, reported at
https://trac.torproject.org/projects/tor/ticket/20347#comment:13
---
src/modules/security-prefs.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/modules/security-prefs.js b/src/modules/security-prefs.js
index 3710862..fa30aba 100644
--- a/src/modules/security-prefs.js
+++ b/src/modules/security-prefs.js
@@ -78,7 +78,7 @@ var watch_security_prefs = function (onSettingChanged) {
let prefNames = Object.keys(kSecuritySettings);
let unbindFuncs = [];
for (let prefName of prefNames) {
- unbindFuncs.push(bindPref(
+ unbindFuncs.push(bindPrefAndInit(
prefName, () => onSettingChanged(read_setting_from_prefs())));
}
// Call all the unbind functions.
@@ -102,7 +102,7 @@ var initialize = function () {
initialized = true;
// When security_custom is set to false, apply security_slider setting
// to the security-sensitive prefs.
- bindPref(kCustomPref, function (custom) {
+ bindPrefAndInit(kCustomPref, function (custom) {
if (custom === false) {
write_setting_to_prefs(getIntPref(kSliderPref));
}
1
0
commit 3dee56db1330daa8df7e4d0c90d88bff17b80fec
Author: David Fifield <david(a)bamsoftware.com>
Date: Sun Apr 10 08:32:54 2016 +0000
Upgrade Go to 1.6.3.
This commit is a combination of two commits from master:
778fd2d0 Bug 18333: Upgrade go to 1.6.2.
1aa712a5 Bug 19703: Upgrade Go to 1.6.3.
---
.../linux/gitian-pluggable-transports.yml | 12 ++++++++++
.../mac/gitian-pluggable-transports.yml | 27 ++++++++++++++++-----
.../windows/gitian-pluggable-transports.yml | 28 +++++++++++++++++-----
gitian/fetch-inputs.sh | 5 ++--
gitian/verify-tags.sh | 2 +-
gitian/versions | 9 +++++--
gitian/versions.alpha | 9 +++++--
gitian/versions.beta | 9 +++++--
gitian/versions.nightly | 9 +++++--
9 files changed, 87 insertions(+), 23 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-pluggable-transports.yml b/gitian/descriptors/linux/gitian-pluggable-transports.yml
index 38ae561..a1cdc48 100644
--- a/gitian/descriptors/linux/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/linux/gitian-pluggable-transports.yml
@@ -46,6 +46,7 @@ files:
- "zope.interface.zip"
- "twisted.tar.bz2"
- "parsley.tar.gz"
+- "go14.tar.gz"
- "go.tar.gz"
- "dzip.sh"
- "gmp-linux32-utils.zip"
@@ -74,6 +75,17 @@ script: |
# FTE only needs libgmp.so.10 and no libgmpxx anymore.
cp $INSTDIR/gmp/lib/libgmp.so.10 $INSTDIR/Tor
+ # Building go 1.4.x
+ # This is needed to bootstrap the go that we actually use
+ # https://golang.org/doc/install/source#go14
+ tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
+ cd go1.4/src
+ # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
+ # https://github.com/golang/go/issues/13114#issuecomment-186922245
+ CGO_ENABLED=0 ./make.bash
+ cd ../..
+ export GOROOT_BOOTSTRAP="$PWD/go1.4"
+
# Building go
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index fbf38c2..33b134e 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -45,6 +45,7 @@ files:
- "zope.interface.zip"
- "twisted.tar.bz2"
- "parsley.tar.gz"
+- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
@@ -103,19 +104,33 @@ script: |
export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
+ # Building go 1.4.x
+ # This is needed to bootstrap the go that we actually use
+ # https://golang.org/doc/install/source#go14
+ tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
+ cd go1.4/src
+ # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
+ # https://github.com/golang/go/issues/13114#issuecomment-186922245
+ # Disable CC etc. that are set up for cross builds.
+ CGO_ENABLED=0 CC= CFLAGS= LDFLAGS= ./make.bash
+ cd ../..
+ export GOROOT_BOOTSTRAP="$PWD/go1.4"
+
# Building go
+ # Create a cc-for-target script that closes over CC, CFLAGS, and LDFLAGS.
+ # Go's CC_FOR_TARGET only allows a command name, not a command with arguments.
+ # https://github.com/golang/go/issues/15457
+ CC_FOR_TARGET="$(pwd)/cc-for-target"
+ echo "#!/bin/sh" > "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
export GOOS=darwin
export GOARCH=386
tar xvf go.tar.gz
cd go/src
- # http://golang.org/cmd/cgo/:
- # "To enable cgo during cross compiling builds, set the CGO_ENABLED
- # environment variable to 1 when building the Go tools with make.bash. Also,
- # set CC_FOR_TARGET to the C cross compiler for the target. CC will be used
- # for compiling for the host."
- CGO_ENABLED=1 CC_FOR_TARGET="$CC $CFLAGS $LDFLAGS" CC= CFLAGS= LDFLAGS= ./make.bash
+ CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/descriptors/windows/gitian-pluggable-transports.yml b/gitian/descriptors/windows/gitian-pluggable-transports.yml
index f073fd1..7e8a349 100644
--- a/gitian/descriptors/windows/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/windows/gitian-pluggable-transports.yml
@@ -47,6 +47,7 @@ files:
- "wine-wrappers"
- "python.msi"
- "py2exe.exe"
+- "go14.tar.gz"
- "go.tar.gz"
- "dzip.sh"
- "pyc-timestamp.sh"
@@ -139,19 +140,34 @@ script: |
cp -a dist/gcc.exe dist/g++.exe dist/dllwrap.exe $WINEROOT/windows/
cd ..
+ # Building go 1.4.x
+ # This is needed to bootstrap the go that we actually use
+ # https://golang.org/doc/install/source#go14
+ tar xvf go14.tar.gz --transform='s,^go\>,go1.4,'
+ cd go1.4/src
+ # Disable cgo to avoid conflicts with newer GCC. cgo is not needed for the bootstrap go.
+ # https://github.com/golang/go/issues/13114#issuecomment-186922245
+ # Disable CC etc. that are set up for cross builds.
+ CGO_ENABLED=0 CC= CFLAGS= LDFLAGS= ./make.bash
+ cd ../..
+ export GOROOT_BOOTSTRAP="$PWD/go1.4"
+
# Building go
+ CC=i686-w64-mingw32-gcc
+ # Create a cc-for-target script that closes over CC, CFLAGS, and LDFLAGS.
+ # Go's CC_FOR_TARGET only allows a command name, not a command with arguments.
+ # https://github.com/golang/go/issues/15457
+ CC_FOR_TARGET="$(pwd)/cc-for-target"
+ echo "#!/bin/sh" > "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
export GOOS=windows
export GOARCH=386
tar xvf go.tar.gz
cd go/src
- # http://golang.org/cmd/cgo/:
- # "To enable cgo during cross compiling builds, set the CGO_ENABLED
- # environment variable to 1 when building the Go tools with make.bash. Also,
- # set CC_FOR_TARGET to the C cross compiler for the target. CC will be used
- # for compiling for the host."
- CGO_ENABLED=1 CC_FOR_TARGET="i686-w64-mingw32-gcc" CC= CFLAGS= LDFLAGS= ./make.bash
+ CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/fetch-inputs.sh b/gitian/fetch-inputs.sh
index b5adfc2..50daec0 100755
--- a/gitian/fetch-inputs.sh
+++ b/gitian/fetch-inputs.sh
@@ -162,7 +162,7 @@ do
get "${!PACKAGE}" "${MIRROR_URL_ASN}${!PACKAGE}"
done
-for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
+for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO14 GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
do
URL="${i}_URL"
PACKAGE="${i}_PACKAGE"
@@ -174,7 +174,7 @@ wget -U "" -N ${NOSCRIPT_URL}
# Verify packages with weak or no signatures via direct sha256 check
# (OpenSSL is signed with MD5, and OSXSDK + OSXSDK_OLD are not signed at all)
-for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO14 GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
do
PACKAGE="${i}_PACKAGE"
HASH="${i}_HASH"
@@ -243,6 +243,7 @@ ln -sf "$PY2EXE_PACKAGE" py2exe.exe
ln -sf "$SETUPTOOLS_PACKAGE" setuptools.tar.gz
ln -sf "$GMP_PACKAGE" gmp.tar.bz2
ln -sf "$PARSLEY_PACKAGE" parsley.tar.gz
+ln -sf "$GO14_PACKAGE" go14.tar.gz
ln -sf "$GO_PACKAGE" go.tar.gz
ln -sf "$NSIS_PACKAGE" nsis.tar.bz2
ln -sf "$NSIS_DEBIAN_PACKAGE" nsis-debian.tar.xz
diff --git a/gitian/verify-tags.sh b/gitian/verify-tags.sh
index 33b54a4..d95b0e0 100755
--- a/gitian/verify-tags.sh
+++ b/gitian/verify-tags.sh
@@ -144,7 +144,7 @@ done
# Verify packages with weak or no signatures via direct sha256 check
# (OpenSSL is signed with MD5, and OSXSDK + OSXSDK_OLD are not signed at all)
-for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in OSXSDK OSXSDK_OLD TOOLCHAIN4_OLD CCTOOLS NOSCRIPT MSVCR100 PYCRYPTO ARGPARSE PYYAML ZOPEINTERFACE TWISTED SETUPTOOLS OPENSSL GMP PARSLEY GO14 GO GCC STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
do
PACKAGE="${i}_PACKAGE"
HASH="${i}_HASH"
diff --git a/gitian/versions b/gitian/versions
index de92243..784b7ea 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -60,7 +60,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.3
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -83,6 +85,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -110,7 +113,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -140,6 +144,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 65acf45..d6044ce 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -60,7 +60,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.2
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -83,6 +85,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -110,7 +113,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -140,6 +144,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 2564e41..1ff14b8 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -47,7 +47,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.2
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -68,6 +70,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
STIXMATHFONT_PACKAGE=STIXv1.1.1-latex.zip
NOTOEMOJIFONT_PACKAGE=NotoEmoji-Regular.ttf
@@ -92,7 +95,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
@@ -118,6 +122,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
STIXMATHFONT_URL=http://iweb.dl.sourceforge.net/project/stixfonts/Current%2…
NOTOEMOJIFONT_URL=https://github.com/googlei18n/noto-emoji/raw/2f1ffdd6fbbd…
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index 781d4ae..f4475bc 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -67,7 +67,9 @@ TWISTED_VER=13.2.0
PY2EXE_VER=0.6.9
SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
-GO_VER=1.4.2
+# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
+GO14_VER=1.4.3
+GO_VER=1.6.3
NSIS_VER=2.51
## File names for the source packages
@@ -90,6 +92,7 @@ TWISTED_PACKAGE=Twisted-${TWISTED_VER}.tar.bz2
PY2EXE_PACKAGE=py2exe-${PY2EXE_VER}.win32-py2.7.exe
SETUPTOOLS_PACKAGE=setuptools-${SETUPTOOLS_VER}.tar.gz
PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
+GO14_PACKAGE=go${GO14_VER}.src.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
NSIS_PACKAGE=nsis-${NSIS_VER}-src.tar.bz2
NSIS_DEBIAN_PACKAGE=nsis_${NSIS_VER}-1.debian.tar.xz
@@ -117,7 +120,8 @@ TWISTED_HASH=095175638c019ac7c0604f4c291724a16ff1acd062e181b01293bf4dcbc62cf3
PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
-GO_HASH=299a6fd8f8adfdce15bc06bde926e7b252ae8e24dd5b16b7d8791ed79e7b5e9b
+GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
+GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
@@ -147,6 +151,7 @@ TWISTED_URL=https://pypi.python.org/packages/source/T/Twisted/${TWISTED_PAC…
PY2EXE_URL=http://downloads.sourceforge.net/py2exe/${PY2EXE_VER}/${PY2EXE_P…
SETUPTOOLS_URL=https://pypi.python.org/packages/source/s/setuptools/${SETUP…
PARSLEY_URL=https://pypi.python.org/packages/source/P/Parsley/${PARSLEY_PAC…
+GO14_URL=https://golang.org/dl/${GO14_PACKAGE}
GO_URL=https://golang.org/dl/${GO_PACKAGE}
NSIS_URL=http://downloads.sourceforge.net/nsis/${NSIS_PACKAGE}
NSIS_DEBIAN_URL=http://http.debian.net/debian/pool/main/n/nsis/${NSIS_DEBIA…
1
0

08 Nov '16
commit 4a0bf1ed2578e3e742e00f95385f914a241904fd
Author: David Fifield <david(a)bamsoftware.com>
Date: Sun Apr 10 08:32:54 2016 +0000
Bug 20023: Upgrade Go to 1.7.3.
Go 1.7 has a necessary fix for macOS Sierra that is not in Go 1.6.3 or
earlier:
https://github.com/golang/go/commit/2da5633eb9091608047881953f75b489a3134cdc
meek was unstable on macOS Sierra when compiled with Go 1.4.3 or 1.6.3.
Reported by tordevSZ0: https://bugs.torproject.org/20250.
We need to use the Mac OS X 10.7 SDK (not 10.6) to build Go 1.7 and
later:
https://bugs.torproject.org/20023#comment:6
We add -std=gnu99 to CFLAGS when building Go. A piece of new C code uses
c99 features. Other code uses "asm", which requires gnu99.
https://bugs.torproject.org/20023#comment:6
https://trac.macports.org/ticket/52506
We hack one of the source files with sed to remove -D__MAC_OS_X_VERSION_MAX_ALLOWED=1060,
which otherwise causes the build to fail, thinking a couple of functions
are unavailable.
https://github.com/golang/go/issues/17732
---
gitian/descriptors/mac/gitian-pluggable-transports.yml | 12 +++++++-----
gitian/versions | 4 ++--
gitian/versions.alpha | 4 ++--
gitian/versions.beta | 4 ++--
gitian/versions.nightly | 4 ++--
5 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index 33b134e..519a3ee 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -48,6 +48,7 @@ files:
- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
+- "MacOSX10.7.sdk.tar.gz"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
- "gmp-mac64-utils.zip"
@@ -82,6 +83,8 @@ script: |
export PATH="/usr/sbin:/sbin:$PATH"
sudo dpkg -i *.deb
tar xaf multiarch-darwin*tar.xz
+ # The 10.7 SDK is needed for Go: https://bugs.torproject.org/20023#comment:6
+ tar xaf MacOSX10.7.sdk.tar.gz
export PATH="$PATH:$HOME/build/apple-osx/bin/"
if [ "z$INCLUDE_FTE" = "z1" ]; then
unzip -d $INSTDIR gmp-mac64-utils.zip
@@ -99,10 +102,6 @@ script: |
export CXX=$HOME/build/apple-osx/bin/i686-apple-darwin11-g++
# http://bugs.python.org/issue9437
export LDSHARED="$CC -pthread -shared"
- # XXX Clean up these flags?
- export CFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
- export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
- export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
# Building go 1.4.x
# This is needed to bootstrap the go that we actually use
@@ -122,7 +121,7 @@ script: |
# https://github.com/golang/go/issues/15457
CC_FOR_TARGET="$(pwd)/cc-for-target"
echo "#!/bin/sh" > "$CC_FOR_TARGET"
- echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS -isysroot $HOME/build/MacOSX10.7.sdk -std=gnu99 \"\$@\"" >> "$CC_FOR_TARGET"
chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
@@ -130,6 +129,9 @@ script: |
export GOARCH=386
tar xvf go.tar.gz
cd go/src
+ # Remove a preprocessor directive that causes problems when building with the 10.7 SDK.
+ # https://github.com/golang/go/issues/17732
+ sed -i -e '/^#cgo CFLAGS:/s/-D__MAC_OS_X_VERSION_MAX_ALLOWED=1060//' crypto/x509/root_cgo_darwin.go
CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/versions b/gitian/versions
index 784b7ea..92d7125 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index d6044ce..68be3f3 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 1ff14b8..e19f53b 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -49,7 +49,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -96,7 +96,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index f4475bc..75cb02b 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -69,7 +69,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -121,7 +121,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
1
0

[tor-browser-bundle/hardened-builds] Bug 19646: Bump meek tag to 0.25
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit 0502b7aa79e336d826c80ed78800388ff573a60a
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Nov 8 13:33:24 2016 +0000
Bug 19646: Bump meek tag to 0.25
---
gitian/versions | 2 +-
gitian/versions.alpha | 2 +-
gitian/versions.beta | 2 +-
gitian/versions.nightly | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/gitian/versions b/gitian/versions
index 6118eac..d1dfa22 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -29,7 +29,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.5
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 8018692..02e2bbd 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -37,7 +37,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.5
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
diff --git a/gitian/versions.beta b/gitian/versions.beta
index f9fb037..6444915 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -28,7 +28,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.2
-MEEK_TAG=0.18
+MEEK_TAG=0.25
NOTOFONTS_TAG=720e34851382ee3c1ef024d8dffb68ffbfb234c2
GITIAN_TAG=tor-browser-builder-3.x-6
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index b3ec60f..ffa3809 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -40,7 +40,7 @@ FTEPROXY_TAG=master
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=master
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
1
0

08 Nov '16
commit bd1da40b8ac70aabc1c1793d649430a1dcbbc1f8
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Nov 8 13:33:24 2016 +0000
Bug 19646: Bump meek tag to 0.25
---
gitian/versions | 2 +-
gitian/versions.alpha | 2 +-
gitian/versions.beta | 2 +-
gitian/versions.nightly | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/gitian/versions b/gitian/versions
index 85b2a7a..de92243 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -33,7 +33,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.5
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 97cf78f..65acf45 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -33,7 +33,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.5
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 8452954..2564e41 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -27,7 +27,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.2
-MEEK_TAG=0.18
+MEEK_TAG=0.25
NOTOFONTS_TAG=720e34851382ee3c1ef024d8dffb68ffbfb234c2
GITIAN_TAG=tor-browser-builder-3.x-6
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index 22e9742..781d4ae 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -40,7 +40,7 @@ FTEPROXY_TAG=master
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=master
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
1
0

08 Nov '16
commit 3308ef8028c10c900ee5c914cf9bb653ec498167
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Nov 8 13:33:24 2016 +0000
Bug 19646: Bump meek tag to 0.25
---
gitian/versions | 2 +-
gitian/versions.alpha | 2 +-
gitian/versions.beta | 2 +-
gitian/versions.nightly | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/gitian/versions b/gitian/versions
index a61c4aa..71faeff 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -33,7 +33,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.5
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 90f8d4a..5dd5488 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -33,7 +33,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.5
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 6226f77..222f529 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -27,7 +27,7 @@ FTEPROXY_TAG=597f8378f6f4f3de570b8e1064c2e4cb8d67fbd0 # tag 0.2.19
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=0.2
-MEEK_TAG=0.18
+MEEK_TAG=0.25
NOTOFONTS_TAG=720e34851382ee3c1ef024d8dffb68ffbfb234c2
GITIAN_TAG=tor-browser-builder-3.x-6
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index eaf1a28..f9cfbfb 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -40,7 +40,7 @@ FTEPROXY_TAG=master
LIBDMG_TAG=dfd5e5cc3dc1191e37d3c3a6118975afdd1d7014
TXSOCKSX_TAG=216eb0894a1755872f4789f9458aa6cf543b8433 # unsigned habnabit/1.13.0.2
GOPTLIB_TAG=master
-MEEK_TAG=0.24
+MEEK_TAG=0.25
FAKETIME_TAG=70aa6b394d9341522dffe8a5a5cf5929e82cc6b9 # unsigned v0.9.6
GOED25519_TAG=c4161f4c7483313562781c61b9a20aba73daf9de
GOSIPHASH_TAG=42ba037e748c9062a75e0924705c43b893edefcd
1
0

08 Nov '16
commit 0194cfb1ce4019d9d34ac3fa32a05ae242bd4c55
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Nov 8 11:44:49 2016 +0000
Updating dgoulet's bridge
---
Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/PTConfigs/bridge_prefs.js b/Bundle-Data/PTConfigs/bridge_prefs.js
index c4752c1..e188c26 100644
--- a/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/Bundle-Data/PTConfigs/bridge_prefs.js
@@ -33,7 +33,7 @@ pref("extensions.torlauncher.default_bridge.obfs4.15", "obfs4 154.35.22.9:80 C73
pref("extensions.torlauncher.default_bridge.obfs4.16", "obfs4 154.35.22.9:443 C73ADBAC8ADFDBF0FC0F3F4E8091C0107D093716 cert=gEGKc5WN/bSjFa6UkG9hOcft1tuK+cV8hbZ0H6cqXiMPLqSbCh2Q3PHe5OOr6oMVORhoJA iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.17", "obfs4 154.35.22.12:4148 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.18", "obfs4 154.35.22.13:6041 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.19", "obfs4 192.95.36.142:443 445AAA9309486821673F1BAD2F5DA31D57BA14A1 cert=G2f9hXO446LRm6zZo6i5ayMwk7q9PzcGu5ZNCbx+rYsoyJvWLl/RenYJeOZfsNc4m+KcSw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.19", "obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=0");
// Not used yet
// pref("extensions.torlauncher.default_bridge.obfs4.20", "obfs4 85.17.30.79:443 FC259A04A328A07FED1413E9FC6526530D9FD87A cert=RutxZlu8BtyP+y0NX7bAVD41+J/qXNhHUrKjFkRSdiBAhIHIQLhKQ2HxESAKZprn/lR3KA iat-mode=0");
1
0
commit 08da98bfd734581660db11e0cc599a5a362fdccf
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Nov 8 11:44:49 2016 +0000
Updating dgoulet's bridge
---
Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/PTConfigs/bridge_prefs.js b/Bundle-Data/PTConfigs/bridge_prefs.js
index c4752c1..e188c26 100644
--- a/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/Bundle-Data/PTConfigs/bridge_prefs.js
@@ -33,7 +33,7 @@ pref("extensions.torlauncher.default_bridge.obfs4.15", "obfs4 154.35.22.9:80 C73
pref("extensions.torlauncher.default_bridge.obfs4.16", "obfs4 154.35.22.9:443 C73ADBAC8ADFDBF0FC0F3F4E8091C0107D093716 cert=gEGKc5WN/bSjFa6UkG9hOcft1tuK+cV8hbZ0H6cqXiMPLqSbCh2Q3PHe5OOr6oMVORhoJA iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.17", "obfs4 154.35.22.12:4148 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.18", "obfs4 154.35.22.13:6041 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.19", "obfs4 192.95.36.142:443 445AAA9309486821673F1BAD2F5DA31D57BA14A1 cert=G2f9hXO446LRm6zZo6i5ayMwk7q9PzcGu5ZNCbx+rYsoyJvWLl/RenYJeOZfsNc4m+KcSw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.19", "obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=0");
// Not used yet
// pref("extensions.torlauncher.default_bridge.obfs4.20", "obfs4 85.17.30.79:443 FC259A04A328A07FED1413E9FC6526530D9FD87A cert=RutxZlu8BtyP+y0NX7bAVD41+J/qXNhHUrKjFkRSdiBAhIHIQLhKQ2HxESAKZprn/lR3KA iat-mode=0");
1
0
commit 6f0f3056e1cc896ee56ff03d5e306a672b17b75a
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Nov 8 11:44:49 2016 +0000
Updating dgoulet's bridge
---
Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/PTConfigs/bridge_prefs.js b/Bundle-Data/PTConfigs/bridge_prefs.js
index c4752c1..e188c26 100644
--- a/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/Bundle-Data/PTConfigs/bridge_prefs.js
@@ -33,7 +33,7 @@ pref("extensions.torlauncher.default_bridge.obfs4.15", "obfs4 154.35.22.9:80 C73
pref("extensions.torlauncher.default_bridge.obfs4.16", "obfs4 154.35.22.9:443 C73ADBAC8ADFDBF0FC0F3F4E8091C0107D093716 cert=gEGKc5WN/bSjFa6UkG9hOcft1tuK+cV8hbZ0H6cqXiMPLqSbCh2Q3PHe5OOr6oMVORhoJA iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.17", "obfs4 154.35.22.12:4148 00DC6C4FA49A65BD1472993CF6730D54F11E0DBB cert=N86E9hKXXXVz6G7w2z8wFfhIDztDAzZ/3poxVePHEYjbKDWzjkRDccFMAnhK75fc65pYSg iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.18", "obfs4 154.35.22.13:6041 FE7840FE1E21FE0A0639ED176EDA00A3ECA1E34D cert=fKnzxr+m+jWXXQGCaXe4f2gGoPXMzbL+bTBbXMYXuK0tMotd+nXyS33y2mONZWU29l81CA iat-mode=0");
-pref("extensions.torlauncher.default_bridge.obfs4.19", "obfs4 192.95.36.142:443 445AAA9309486821673F1BAD2F5DA31D57BA14A1 cert=G2f9hXO446LRm6zZo6i5ayMwk7q9PzcGu5ZNCbx+rYsoyJvWLl/RenYJeOZfsNc4m+KcSw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.19", "obfs4 192.95.36.142:443 CDF2E852BF539B82BD10E27E9115A31734E378C2 cert=qUVQ0srL1JI/vO6V6m/24anYXiJD3QP2HgzUKQtQ7GRqqUvs7P+tG43RtAqdhLOALP7DJQ iat-mode=0");
// Not used yet
// pref("extensions.torlauncher.default_bridge.obfs4.20", "obfs4 85.17.30.79:443 FC259A04A328A07FED1413E9FC6526530D9FD87A cert=RutxZlu8BtyP+y0NX7bAVD41+J/qXNhHUrKjFkRSdiBAhIHIQLhKQ2HxESAKZprn/lR3KA iat-mode=0");
1
0

[tor-browser-bundle/hardened-builds] Bug 20582: move tor-browser specific strings to config.yml
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit 4fb93b748090ae3e13201f76dac033a0350116e9
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Sat Nov 5 20:23:02 2016 +0100
Bug 20582: move tor-browser specific strings to config.yml
---
tools/update-responses/config.yml | 5 +++++
tools/update-responses/update_responses | 26 +++++++++++++++-----------
2 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/tools/update-responses/config.yml b/tools/update-responses/config.yml
index f7edb24..022cea2 100644
--- a/tools/update-responses/config.yml
+++ b/tools/update-responses/config.yml
@@ -1,4 +1,9 @@
---
+appname_marfile: tor-browser
+appname_bundle_osx: TorBrowser
+appname_bundle_linux: tor-browser
+appname_bundle_win: torbrowser-install
+appdir_osx: TorBrowser.app
releases_dir: ../../gitian
download:
archive_url: https://archive.torproject.org/tor-package-archive/torbrowser
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index 69535c9..bef5615 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -82,13 +82,14 @@ sub get_sha512_hex_of_file {
sub get_version_files {
my ($config, $version) = @_;
return if $config->{versions}{$version}{files};
+ my $appname = $config->{appname_marfile};
my $files = {};
my $vdir = "$releases_dir/$version";
my $download_url = "$config->{download}{mars_url}/$version";
opendir(my $d, $vdir) or exit_error "Error opening directory $vdir";
foreach my $file (readdir $d) {
next unless -f "$vdir/$file";
- if ($file =~ m/^tor-browser-([^-]+)-${version}_(.+)\.mar$/) {
+ if ($file =~ m/^$appname-([^-]+)-${version}_(.+)\.mar$/) {
my ($os, $lang) = ($1, $2);
$files->{$os}{$lang}{complete} = {
type => 'complete',
@@ -99,7 +100,7 @@ sub get_version_files {
};
next;
}
- if ($file =~ m/^tor-browser-([^-]+)-(.+)-${version}_(.+)\.incremental\.mar$/) {
+ if ($file =~ m/^$appname-([^-]+)-(.+)-${version}_(.+)\.incremental\.mar$/) {
my ($os, $from_version, $lang) = ($1, $2, $3);
$files->{$os}{$lang}{partial}{$from_version} = {
type => 'partial',
@@ -123,11 +124,11 @@ sub get_version_downloads {
foreach my $file (readdir $d) {
next unless -f "$vdir/$file";
my ($os, $lang);
- if ($file =~ m/^TorBrowser-$version-osx64_(.+).dmg$/) {
+ if ($file =~ m/^$config->{appname_bundle_osx}-$version-osx64_(.+).dmg$/) {
($os, $lang) = ('osx64', $1);
- } elsif ($file =~ m/^tor-browser-(linux32|linux64)-${version}_(.+).tar.xz$/) {
+ } elsif ($file =~ m/^$config->{appname_bundle_linux}-(linux32|linux64)-${version}_(.+).tar.xz$/) {
($os, $lang) = ($1, $2);
- } elsif ($file =~ m/^torbrowser-install-${version}_(.+).exe$/) {
+ } elsif ($file =~ m/^$config->{appname_bundle_win}-${version}_(.+).exe$/) {
($os, $lang) = ('win32', $1);
} else {
next;
@@ -168,13 +169,14 @@ sub extract_mar {
}
sub mar_filename {
- my ($version, $os, $lang) = @_;
- "$releases_dir/$version/tor-browser-$os-${version}_$lang.mar";
+ my ($appname, $version, $os, $lang) = @_;
+ "$releases_dir/$version/$appname-$os-${version}_$lang.mar";
}
sub create_incremental_mar {
my ($config, $pm, $from_version, $new_version, $os, $lang) = @_;
- my $mar_file = "tor-browser-$os-${from_version}-${new_version}_$lang.incremental.mar";
+ my $appname = $config->{appname_marfile};
+ my $mar_file = "$appname-$os-${from_version}-${new_version}_$lang.incremental.mar";
print "Starting $mar_file\n";
my $mar_file_path = "$releases_dir/$new_version/$mar_file";
my $download_url = "$config->{download}{mars_url}/$new_version";
@@ -191,8 +193,8 @@ sub create_incremental_mar {
};
return if $pm->start($finished_file);
my $tmpdir = File::Temp->newdir();
- extract_mar(mar_filename($from_version, $os, $lang), "$tmpdir/A");
- extract_mar(mar_filename($new_version, $os, $lang), "$tmpdir/B");
+ extract_mar(mar_filename($appname, $from_version, $os, $lang), "$tmpdir/A");
+ extract_mar(mar_filename($appname, $new_version, $os, $lang), "$tmpdir/B");
my ($out, $err, $success) = capture_exec('make_incremental_update.sh',
$mar_file_path, "$tmpdir/A", "$tmpdir/B");
if (!$success) {
@@ -246,7 +248,9 @@ sub get_buildinfos {
foreach my $lang (keys %{$files->{$os}}) {
next unless $files->{$os}{$lang}{complete};
my $tmpdir = File::Temp->newdir();
- extract_mar(mar_filename($version, $os, $lang), "$tmpdir");
+ extract_mar(
+ mar_filename($config->{appname_marfile}, $version, $os, $lang),
+ "$tmpdir");
my $appfile = "$tmpdir/application.ini" if -f "$tmpdir/application.ini";
$appfile = "$tmpdir/Contents/Resources/application.ini"
if -f "$tmpdir/Contents/Resources/application.ini";
1
0

[tor-browser-bundle/master] Bug 20582: move tor-browser specific strings to config.yml
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit 7cf56c0d1732a6eccb6bdf93fe0f1fdb0749b4a2
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Sat Nov 5 20:23:02 2016 +0100
Bug 20582: move tor-browser specific strings to config.yml
---
tools/update-responses/config.yml | 5 +++++
tools/update-responses/update_responses | 30 +++++++++++++++++-------------
2 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/tools/update-responses/config.yml b/tools/update-responses/config.yml
index 8c047b5..0305733 100644
--- a/tools/update-responses/config.yml
+++ b/tools/update-responses/config.yml
@@ -1,4 +1,9 @@
---
+appname_marfile: tor-browser
+appname_bundle_osx: TorBrowser
+appname_bundle_linux: tor-browser
+appname_bundle_win: torbrowser-install
+appdir_osx: TorBrowser.app
releases_dir: ../../gitian
download:
archive_url: https://archive.torproject.org/tor-package-archive/torbrowser
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index bca3386..a89a18a 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -82,13 +82,14 @@ sub get_sha512_hex_of_file {
sub get_version_files {
my ($config, $version) = @_;
return if $config->{versions}{$version}{files};
+ my $appname = $config->{appname_marfile};
my $files = {};
my $vdir = "$releases_dir/$version";
my $download_url = "$config->{download}{mars_url}/$version";
opendir(my $d, $vdir) or exit_error "Error opening directory $vdir";
foreach my $file (readdir $d) {
next unless -f "$vdir/$file";
- if ($file =~ m/^tor-browser-([^-]+)-${version}_(.+)\.mar$/) {
+ if ($file =~ m/^$appname-([^-]+)-${version}_(.+)\.mar$/) {
my ($os, $lang) = ($1, $2);
$files->{$os}{$lang}{complete} = {
type => 'complete',
@@ -99,7 +100,7 @@ sub get_version_files {
};
next;
}
- if ($file =~ m/^tor-browser-([^-]+)-(.+)-${version}_(.+)\.incremental\.mar$/) {
+ if ($file =~ m/^$appname-([^-]+)-(.+)-${version}_(.+)\.incremental\.mar$/) {
my ($os, $from_version, $lang) = ($1, $2, $3);
$files->{$os}{$lang}{partial}{$from_version} = {
type => 'partial',
@@ -123,11 +124,11 @@ sub get_version_downloads {
foreach my $file (readdir $d) {
next unless -f "$vdir/$file";
my ($os, $lang);
- if ($file =~ m/^TorBrowser-$version-osx64_(.+).dmg$/) {
+ if ($file =~ m/^$config->{appname_bundle_osx}-$version-osx64_(.+).dmg$/) {
($os, $lang) = ('osx64', $1);
- } elsif ($file =~ m/^tor-browser-(linux32|linux64)-${version}_(.+).tar.xz$/) {
+ } elsif ($file =~ m/^$config->{appname_bundle_linux}-(linux32|linux64)-${version}_(.+).tar.xz$/) {
($os, $lang) = ($1, $2);
- } elsif ($file =~ m/^torbrowser-install-${version}_(.+).exe$/) {
+ } elsif ($file =~ m/^$config->{appname_bundle_win}-${version}_(.+).exe$/) {
($os, $lang) = ('win32', $1);
} else {
next;
@@ -168,13 +169,14 @@ sub extract_mar {
}
sub mar_filename {
- my ($version, $os, $lang) = @_;
- "$releases_dir/$version/tor-browser-$os-${version}_$lang.mar";
+ my ($appname, $version, $os, $lang) = @_;
+ "$releases_dir/$version/$appname-$os-${version}_$lang.mar";
}
sub create_incremental_mar {
my ($config, $pm, $from_version, $new_version, $os, $lang) = @_;
- my $mar_file = "tor-browser-$os-${from_version}-${new_version}_$lang.incremental.mar";
+ my $appname = $config->{appname_marfile};
+ my $mar_file = "$appname-$os-${from_version}-${new_version}_$lang.incremental.mar";
my $mar_file_path = "$releases_dir/$new_version/$mar_file";
if ($ENV{MAR_SKIP_EXISTING} && -f $mar_file_path) {
print "Skipping $mar_file\n";
@@ -195,11 +197,11 @@ sub create_incremental_mar {
};
return if $pm->start($finished_file);
my $tmpdir = File::Temp->newdir();
- extract_mar(mar_filename($from_version, $os, $lang), "$tmpdir/A");
- extract_mar(mar_filename($new_version, $os, $lang), "$tmpdir/B");
+ extract_mar(mar_filename($appname, $from_version, $os, $lang), "$tmpdir/A");
+ extract_mar(mar_filename($appname, $new_version, $os, $lang), "$tmpdir/B");
if ($ENV{CHECK_CODESIGNATURE_EXISTS}) {
- unless (-f "$tmpdir/A/TorBrowser.app/Contents/_CodeSignature/CodeResources"
- && -f "$tmpdir/B/TorBrowser.app/Contents/_CodeSignature/CodeResources") {
+ unless (-f "$tmpdir/A/$config->{appdir_osx}/Contents/_CodeSignature/CodeResources"
+ && -f "$tmpdir/B/$config->{appdir_osx}/Contents/_CodeSignature/CodeResources") {
exit_error "Missing code signature while creating $mar_file";
}
}
@@ -256,7 +258,9 @@ sub get_buildinfos {
foreach my $lang (keys %{$files->{$os}}) {
next unless $files->{$os}{$lang}{complete};
my $tmpdir = File::Temp->newdir();
- extract_mar(mar_filename($version, $os, $lang), "$tmpdir");
+ extract_mar(
+ mar_filename($config->{appname_marfile}, $version, $os, $lang),
+ "$tmpdir");
my $appfile = "$tmpdir/application.ini" if -f "$tmpdir/application.ini";
$appfile = "$tmpdir/Contents/Resources/application.ini"
if -f "$tmpdir/Contents/Resources/application.ini";
1
0

[tor-browser/tor-browser-45.4.0esr-6.0-1] fixup! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit 9e41f6e33dd6798617928768ca20c6525caa0e73
Author: difw <something@something>
Date: Thu Jul 28 12:15:05 2016 -0700
fixup! Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing
Switch Default to DuckDuckGo HTTPS. Add .onion.
---
browser/app/profile/000-tor-browser.js | 4 ++--
browser/locales/en-US/searchplugins/ddg-onion.xml | 11 +++++++++++
browser/locales/en-US/searchplugins/ddg.xml | 4 ++--
browser/locales/en-US/searchplugins/list.txt | 1 +
4 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index c60b341..a5c0e7f 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -268,7 +268,7 @@ pref("browser.uiCustomization.state", "{\"placements\":{\"PanelUI-contents\":[\"
// Putting the search engine prefs into this file to fix #11236.
// Default search engine
-pref("browser.search.defaultenginename", "Disconnect");
+pref("browser.search.defaultenginename", "DuckDuckGo");
// Make sure we use the same search engine regardless of locale
pref("browser.search.geoSpecificDefaults", false);
@@ -276,7 +276,7 @@ pref("browser.search.geoSpecificDefaults", false);
// Somewhat surprisingly we get some random behavior if we specify more than
// two search engines as below. See
// https://bugzilla.mozilla.org/show_bug.cgi?id=1126722 for details.
-pref("browser.search.order.extra.1", "Disconnect");
+pref("browser.search.order.extra.1", "DuckDuckGo");
pref("browser.search.order.extra.2", "YouTube");
// Hacks/workarounds: Direct2D seems to crash w/ lots of video cards w/ MinGW?
diff --git a/browser/locales/en-US/searchplugins/ddg-onion.xml b/browser/locales/en-US/searchplugins/ddg-onion.xml
new file mode 100644
index 0000000..009da7e
--- /dev/null
+++ b/browser/locales/en-US/searchplugins/ddg-onion.xml
@@ -0,0 +1,11 @@
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
+<ShortName>DuckDuckGoOnion</ShortName>
+<Description>Duck Duck Go Onion</Description>
+<InputEncoding>UTF-8</InputEncoding>
+<Image height="16" width="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAB8lBMVEUAAADkRQzjPwPjQQXkRQ3iPwTiQQXgPQPeQgrcOwPVNgDVNQDWOgbTMwDRMgDQMwDSMwDRNwTQLgDRJgDSJwDSLgDSNwTjOgDiOADjOQDkPADhQAXzs5v+/fv////0vKbiRQvgPQHpdUr85NzuknPdKgDcIwDnZzj2w7HqeU/gPQLsimb/+PftjWn97Obpb0LdJQDeLQDtjmvsi2jgSBDnbULgOQD/39HgLQDeMgDpeFLgSBH0v670uqbaJQD2qImWvP/G1Ob5+/3u//+fvvXyp47dMwDaLwD0u6v0v6/aNQDiXi/aKQD3qozU7/8gSY2vvtg0ZK/OqLDaKQHYKgLgWTfaNADZMgDZMADZLADzqpD7//+xwdz//9H/5Bn/7Bn//ADofADYMADYMQDZOgPXLgDiZDj//97/0AD3tQDvlgHZOgbXLATXMADWMgDfXjLVLQD///z+0AD/3Rn/yRnwnQDcVjbVMQDyv67wuKTSJwDRHQD+8O/tg3/iQQDwhAHnawHWMADvtKfyva7XQxHga0bQGQD2vbH/u8LXIQCmPQzja07XQxLliGn99fPkcVHvhnGZ5VguvUU5wktBwCcAgxzydVv/8/XmiGngdlL+ysi3+I8LtCE80V6P3YmX4sDleljSNQLzr6D7sKPXNQTSIwAEAbMrAAAAF3RSTlMARqSkRvPz80PTpKRG3fPe3hio9/eoGP50jNsAAAABYktHRB5yCiArAAAAyElEQVQYGQXBvUqCYRiA4fu2V9Tn+UQddI3aCpxaOoU6iU4gcqqpoYbALXBuCuoYmttamq
JDiEoh4YP+MOi6BNCh+uYKEGiOVNCXXxA2XDVV/UyfKbRCXTLQWAxbP2vt8Ue/uYDvfim91615sb2um6rqtrr/NFb1cUf1Ybd06areU6lSlYpK79jzK1SyJOkfhOl8JGEcqV5zoKrTRqO6yUzIzNu46ijdM1VV9bhuUJ/nZURExLRzUiPQm3kKXHi4BAEGOmOi78A/L1QoU/VHoTsAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTQtMDEtMTlUMjA6MDE6MTEtMDU6MDAuET6cAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE0LTAxLTE5VDIwOjAxOjExLTA1OjAwX0yGIAAAAABJRU5ErkJggg==</Image>
+<Url type="text/html" method="POST" template="http://3g2upl4pq6kufc4m.onion/html/">
+ <Param name="q" value="{searchTerms}"/>
+</Url>
+<SearchForm>http://3g2upl4pq6kufc4m.onion/html/</SearchForm>
+</SearchPlugin>
+
diff --git a/browser/locales/en-US/searchplugins/ddg.xml b/browser/locales/en-US/searchplugins/ddg.xml
index d82cdbd..aceb0ac 100644
--- a/browser/locales/en-US/searchplugins/ddg.xml
+++ b/browser/locales/en-US/searchplugins/ddg.xml
@@ -22,9 +22,9 @@ AScg7HAnIOz2JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs9icg7HAnIOwBAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAJyDsJicg7IAnIOyzJyDs5icg7OYnIOyzJyDsgCcg7CYAAAAAAAAAAAAAAAAA
AAAA+B8AAPAPAADAAwAAwAMAAIABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAACAAQAAwAMAAMAD
AADwDwAA+B8AAA==</Image>
-<Url type="text/html" method="POST" template="http://3g2upl4pq6kufc4m.onion/html/">
+<Url type="text/html" method="POST" template="https://duckduckgo.com/">
<Param name="q" value="{searchTerms}"/>
</Url>
-<SearchForm>http://3g2upl4pq6kufc4m.onion/html/</SearchForm>
+<SearchForm>https://duckduckgo.com/</SearchForm>
</SearchPlugin>
diff --git a/browser/locales/en-US/searchplugins/list.txt b/browser/locales/en-US/searchplugins/list.txt
index 71b6c0f..0b4f1fb 100644
--- a/browser/locales/en-US/searchplugins/list.txt
+++ b/browser/locales/en-US/searchplugins/list.txt
@@ -2,6 +2,7 @@ disconnect
youtube
twitter
wikipedia
+ddg-onion
startpage
yahoo
google
1
0

[tor-browser/tor-browser-45.4.0esr-6.0-1] fixup! fixup! Regression tests for "Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing"
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit b21cda730fcbb6a1d6ca7a2dff8533598c01f9db
Author: Georg Koppen <gk(a)torproject.org>
Date: Sat Jul 30 10:36:40 2016 +0000
fixup! fixup! Regression tests for "Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing"
Fixup typo.
---
tbb-tests/browser_tor_omnibox.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tbb-tests/browser_tor_omnibox.js b/tbb-tests/browser_tor_omnibox.js
index 082dd84..e18b2a8 100644
--- a/tbb-tests/browser_tor_omnibox.js
+++ b/tbb-tests/browser_tor_omnibox.js
@@ -8,7 +8,7 @@ function test() {
engineIDs = browserSearchService.getEngines().map(e => e.identifier);
// Check that we have the correct engines installed, in the right order.
- is(engineIDs[0], "ddg", "Default search engine is disconnect");
+ is(engineIDs[0], "ddg", "Default search engine is duckduckgo");
is(engineIDs[1], "youtube", "Secondary search engine is youtube");
is(engineIDs[2], "google", "Google is third search engine");
}
1
0

[tor-browser/tor-browser-45.4.0esr-6.0-1] fixup! Regression tests for "Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing"
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit 91b048b4a146b32467206f13729a24cc13d506bc
Author: difw <something@something>
Date: Fri Jul 29 09:32:22 2016 -0700
fixup! Regression tests for "Omnibox: Add DDG, Startpage, Disconnect, Youtube, Twitter; remove Amazon, eBay, bing"
Update tests.
---
tbb-tests/browser_tor_omnibox.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tbb-tests/browser_tor_omnibox.js b/tbb-tests/browser_tor_omnibox.js
index 8648551..082dd84 100644
--- a/tbb-tests/browser_tor_omnibox.js
+++ b/tbb-tests/browser_tor_omnibox.js
@@ -8,7 +8,7 @@ function test() {
engineIDs = browserSearchService.getEngines().map(e => e.identifier);
// Check that we have the correct engines installed, in the right order.
- is(engineIDs[0], "disconnect", "Default search engine is disconnect");
+ is(engineIDs[0], "ddg", "Default search engine is disconnect");
is(engineIDs[1], "youtube", "Secondary search engine is youtube");
is(engineIDs[2], "google", "Google is third search engine");
}
1
0

[tor-browser-bundle/maint-6.0] Bug 20118: Don't unpack HTTPS Everywhere anymore
by gk@torproject.org 08 Nov '16
by gk@torproject.org 08 Nov '16
08 Nov '16
commit b373d46c616682000ff07029eaa4a113e29b286e
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Sep 9 17:30:44 2016 +0000
Bug 20118: Don't unpack HTTPS Everywhere anymore
Starting with version 5.2.2 HTTPS Everywhere is not unpacked anymore.
We should keep it unpacked as well, especially as that fixes usability
issues like #20033.
---
gitian/descriptors/linux/gitian-bundle.yml | 9 +++------
gitian/descriptors/mac/gitian-bundle.yml | 9 +++------
gitian/descriptors/windows/gitian-bundle.yml | 9 +++------
3 files changed, 9 insertions(+), 18 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-bundle.yml b/gitian/descriptors/linux/gitian-bundle.yml
index 0316148..8086bf5 100644
--- a/gitian/descriptors/linux/gitian-bundle.yml
+++ b/gitian/descriptors/linux/gitian-bundle.yml
@@ -81,7 +81,7 @@ script: |
# directory named tor-browser (instead of tor-browser_en-US). Therefore we
# stage everything under tor-browser-stage to avoid a conflict.
TB_STAGE_DIR=tor-browser-stage
- mkdir -p ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/profile.default/extensions/https-everywhere-eff(a)eff.org
+ mkdir -p ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/profile.default/extensions
mkdir -p ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/profile.meek-http-helper/extensions
mkdir -p ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/Caches
mkdir -p ${TB_STAGE_DIR}/Browser/TorBrowser/Docs/sources/
@@ -119,16 +119,13 @@ script: |
rm -f .git/refs/heads/master
./makexpi.sh
# Since 5.0.2 a .xpi for AMO is built, too. We don't need it.
- rm ./pkg/*-amo.xpi
- cp pkg/*.xpi ../${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/profile.default/extensions/https-everywhere(a)eff.org.xpi
+ rm pkg/*-amo.xpi
+ cp pkg/*.xpi ../${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/profile.default/extensions/https-everywhere-eff(a)eff.org.xpi
cd ..
#
cp *.xpi ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/profile.default/extensions/
cd ${TB_STAGE_DIR}/Browser/TorBrowser/Data/Browser/profile.default/extensions
mv noscript(a)noscript.net.xpi {73a6fe31-595d-460b-a920-fcc0f8843232}.xpi
- cd https-everywhere-eff(a)eff.org/
- unzip ../https-everywhere(a)eff.org.xpi
- rm ../https-everywhere(a)eff.org.xpi
cd ~/build
#
cd meek/firefox
diff --git a/gitian/descriptors/mac/gitian-bundle.yml b/gitian/descriptors/mac/gitian-bundle.yml
index d644a56..4f12174 100644
--- a/gitian/descriptors/mac/gitian-bundle.yml
+++ b/gitian/descriptors/mac/gitian-bundle.yml
@@ -104,7 +104,7 @@ script: |
MARTOOLS=~/build/mar-tools
#
mkdir -p $OUTDIR/
- mkdir -p $TORBROWSER_NAME.app/$EXTSPATH/https-everywhere-eff(a)eff.org
+ mkdir -p $TORBROWSER_NAME.app/$EXTSPATH
mkdir -p $TORBROWSER_NAME.app/$MEEKPROFILEPATH/extensions
mkdir -p $TORBROWSER_NAME.app/$DOCSPATH/sources
mkdir -p $TORBROWSER_NAME.app/Contents/MacOS
@@ -139,16 +139,13 @@ script: |
rm -f .git/refs/heads/master
./makexpi.sh
# Since 5.0.2 a .xpi for AMO is built, too. We don't need it.
- rm ./pkg/*-amo.xpi
- cp pkg/*.xpi ../$TORBROWSER_NAME.app/$EXTSPATH/https-everywhere(a)eff.org.xpi
+ rm pkg/*-amo.xpi
+ cp pkg/*.xpi ../$TORBROWSER_NAME.app/$EXTSPATH/https-everywhere-eff(a)eff.org.xpi
cd ..
#
cp *.xpi ./$TORBROWSER_NAME.app/$EXTSPATH/
cd $TORBROWSER_NAME.app/$EXTSPATH/
mv noscript(a)noscript.net.xpi {73a6fe31-595d-460b-a920-fcc0f8843232}.xpi
- cd https-everywhere-eff(a)eff.org
- unzip ../https-everywhere(a)eff.org.xpi
- rm ../https-everywhere(a)eff.org.xpi
cd ~/build/
#
cd meek/firefox
diff --git a/gitian/descriptors/windows/gitian-bundle.yml b/gitian/descriptors/windows/gitian-bundle.yml
index d065f60..e563308 100644
--- a/gitian/descriptors/windows/gitian-bundle.yml
+++ b/gitian/descriptors/windows/gitian-bundle.yml
@@ -76,7 +76,7 @@ script: |
export PATH=$INSTDIR/nsis/bin:$PATH
#
mkdir -p $OUTDIR/
- mkdir -p tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/profile.default/extensions/https-everywhere-eff(a)eff.org
+ mkdir -p tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/profile.default/extensions
mkdir -p tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/profile.meek-http-helper/extensions
mkdir -p tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/Caches
mkdir -p tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Docs/sources
@@ -109,16 +109,13 @@ script: |
rm -f .git/refs/heads/master
./makexpi.sh
# Since 5.0.2 a .xpi for AMO is built, too. We don't need it.
- rm ./pkg/*-amo.xpi
- cp ./pkg/*.xpi ../tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/profile.default/extensions/https-everywhere(a)eff.org.xpi
+ rm pkg/*-amo.xpi
+ cp pkg/*.xpi ../tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/profile.default/extensions/https-everywhere-eff(a)eff.org.xpi
cd ..
#
cp *.xpi tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/profile.default/extensions
cd tbb-windows-installer/"Tor Browser"/Browser/TorBrowser/Data/Browser/profile.default/extensions
mv noscript(a)noscript.net.xpi {73a6fe31-595d-460b-a920-fcc0f8843232}.xpi
- cd https-everywhere-eff(a)eff.org
- unzip ../https-everywhere(a)eff.org.xpi
- rm ../https-everywhere(a)eff.org.xpi
cd ~/build/
#
cd meek/firefox
1
0

[tor-browser-bundle/hardened-builds] Bug 20583: make the downloads.json file reproducible
by gk@torproject.org 07 Nov '16
by gk@torproject.org 07 Nov '16
07 Nov '16
commit 4df28e4afbd833126d4f9c3409795c6890b31b74
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Sat Nov 5 19:46:09 2016 +0100
Bug 20583: make the downloads.json file reproducible
---
tools/update-responses/update_responses | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index 498132e..69535c9 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -369,7 +369,8 @@ sub write_downloads_json {
version => $version,
downloads => get_version_downloads($config, $version),
};
- write_htdocs($channel, 'downloads.json', encode_json($data));
+ write_htdocs($channel, 'downloads.json',
+ JSON->new->utf8->canonical->encode($data));
}
}
1
0

[tor-browser-bundle/maint-6.0] Bug 20583: make the downloads.json file reproducible
by gk@torproject.org 07 Nov '16
by gk@torproject.org 07 Nov '16
07 Nov '16
commit 5d9099aa9406a0084aa89df85fe165488b151e60
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Sat Nov 5 19:46:09 2016 +0100
Bug 20583: make the downloads.json file reproducible
---
tools/update-responses/update_responses | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index faa1037..6f6d8b1 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -344,7 +344,8 @@ sub write_downloads_json {
version => $version,
downloads => get_version_downloads($config, $version),
};
- write_htdocs($channel, 'downloads.json', encode_json($data));
+ write_htdocs($channel, 'downloads.json',
+ JSON->new->utf8->canonical->encode($data));
}
}
1
0

[tor-browser-bundle/master] Bug 20583: make the downloads.json file reproducible
by gk@torproject.org 07 Nov '16
by gk@torproject.org 07 Nov '16
07 Nov '16
commit a442c22cd7771bd717558b0d7d41ee478f7a190f
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Sat Nov 5 19:46:09 2016 +0100
Bug 20583: make the downloads.json file reproducible
---
tools/update-responses/update_responses | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses
index ceba144..bca3386 100755
--- a/tools/update-responses/update_responses
+++ b/tools/update-responses/update_responses
@@ -379,7 +379,8 @@ sub write_downloads_json {
version => $version,
downloads => get_version_downloads($config, $version),
};
- write_htdocs($channel, 'downloads.json', encode_json($data));
+ write_htdocs($channel, 'downloads.json',
+ JSON->new->utf8->canonical->encode($data));
}
}
1
0

[tor-browser-bundle/hardened-builds] Bug 20023: Upgrade Go to 1.7.3.
by gk@torproject.org 07 Nov '16
by gk@torproject.org 07 Nov '16
07 Nov '16
commit a10116149af502d483bea0a347a880eb2c7faf42
Author: David Fifield <david(a)bamsoftware.com>
Date: Sun Apr 10 08:32:54 2016 +0000
Bug 20023: Upgrade Go to 1.7.3.
Go 1.7 has a necessary fix for macOS Sierra that is not in Go 1.6.3 or
earlier:
https://github.com/golang/go/commit/2da5633eb9091608047881953f75b489a3134cdc
meek was unstable on macOS Sierra when compiled with Go 1.4.3 or 1.6.3.
Reported by tordevSZ0: https://bugs.torproject.org/20250.
We need to use the Mac OS X 10.7 SDK (not 10.6) to build Go 1.7 and
later:
https://bugs.torproject.org/20023#comment:6
We add -std=gnu99 to CFLAGS when building Go. A piece of new C code uses
c99 features. Other code uses "asm", which requires gnu99.
https://bugs.torproject.org/20023#comment:6
https://trac.macports.org/ticket/52506
We hack one of the source files with sed to remove -D__MAC_OS_X_VERSION_MAX_ALLOWED=1060,
which otherwise causes the build to fail, thinking a couple of functions
are unavailable.
https://github.com/golang/go/issues/17732
---
gitian/descriptors/mac/gitian-pluggable-transports.yml | 12 +++++++-----
gitian/versions | 4 ++--
gitian/versions.alpha | 4 ++--
gitian/versions.beta | 4 ++--
gitian/versions.nightly | 4 ++--
5 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index d6a71f2..bae9dbe 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -47,6 +47,7 @@ files:
- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
+- "MacOSX10.7.sdk.tar.gz"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
- "gmp-mac64-utils.zip"
@@ -66,6 +67,8 @@ script: |
#
sudo dpkg -i *.deb
tar xaf multiarch-darwin*tar.xz
+ # The 10.7 SDK is needed for Go: https://bugs.torproject.org/20023#comment:6
+ tar xaf MacOSX10.7.sdk.tar.gz
export PATH="$PATH:$HOME/build/apple-osx/bin/"
unzip -d $INSTDIR gmp-mac64-utils.zip
unzip -d $INSTDIR openssl-mac64-utils.zip
@@ -78,10 +81,6 @@ script: |
export CXX=$HOME/build/apple-osx/bin/i686-apple-darwin11-g++
# http://bugs.python.org/issue9437
export LDSHARED="$CC -pthread -shared"
- # XXX Clean up these flags?
- export CFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1 -I$INSTDIR/gmp/include -L$INSTDIR/gmp/lib"
- export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1 -I$INSTDIR/gmp/include -L$INSTDIR/gmp/lib"
- export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
# Building go 1.4.x
# This is needed to bootstrap the go that we actually use
@@ -101,7 +100,7 @@ script: |
# https://github.com/golang/go/issues/15457
CC_FOR_TARGET="$(pwd)/cc-for-target"
echo "#!/bin/sh" > "$CC_FOR_TARGET"
- echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS -isysroot $HOME/build/MacOSX10.7.sdk -std=gnu99 \"\$@\"" >> "$CC_FOR_TARGET"
chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
@@ -109,6 +108,9 @@ script: |
export GOARCH=386
tar xvf go.tar.gz
cd go/src
+ # Remove a preprocessor directive that causes problems when building with the 10.7 SDK.
+ # https://github.com/golang/go/issues/17732
+ sed -i -e '/^#cgo CFLAGS:/s/-D__MAC_OS_X_VERSION_MAX_ALLOWED=1060//' crypto/x509/root_cgo_darwin.go
CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/versions b/gitian/versions
index d276d33..6118eac 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -58,7 +58,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -112,7 +112,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 295439e..8018692 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -67,7 +67,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
ELFUTILS_VER=0.160
@@ -121,7 +121,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=608df76dec2d34de6558249d8af4cbee21eceddbcb580d666f7a5a583ca3303a
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 2a78a8c..f9fb037 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -51,7 +51,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -102,7 +102,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index ab47af1..b3ec60f 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -70,7 +70,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
ELFUTILS_VER=0.160
@@ -124,7 +124,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=608df76dec2d34de6558249d8af4cbee21eceddbcb580d666f7a5a583ca3303a
1
0

07 Nov '16
commit 824043e9b60c322c4c95b91478acadd0412a2e6d
Author: David Fifield <david(a)bamsoftware.com>
Date: Sun Apr 10 08:32:54 2016 +0000
Bug 20023: Upgrade Go to 1.7.3.
Go 1.7 has a necessary fix for macOS Sierra that is not in Go 1.6.3 or
earlier:
https://github.com/golang/go/commit/2da5633eb9091608047881953f75b489a3134cdc
meek was unstable on macOS Sierra when compiled with Go 1.4.3 or 1.6.3.
Reported by tordevSZ0: https://bugs.torproject.org/20250.
We need to use the Mac OS X 10.7 SDK (not 10.6) to build Go 1.7 and
later:
https://bugs.torproject.org/20023#comment:6
We add -std=gnu99 to CFLAGS when building Go. A piece of new C code uses
c99 features. Other code uses "asm", which requires gnu99.
https://bugs.torproject.org/20023#comment:6
https://trac.macports.org/ticket/52506
We hack one of the source files with sed to remove -D__MAC_OS_X_VERSION_MAX_ALLOWED=1060,
which otherwise causes the build to fail, thinking a couple of functions
are unavailable.
https://github.com/golang/go/issues/17732
---
gitian/descriptors/mac/gitian-pluggable-transports.yml | 12 +++++++-----
gitian/versions | 4 ++--
gitian/versions.alpha | 4 ++--
gitian/versions.beta | 4 ++--
gitian/versions.nightly | 4 ++--
5 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index cb7ac5c..8fc4df7 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -47,6 +47,7 @@ files:
- "go14.tar.gz"
- "go.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
+- "MacOSX10.7.sdk.tar.gz"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
- "gmp-mac64-utils.zip"
@@ -80,6 +81,8 @@ script: |
export PATH="/usr/sbin:/sbin:$PATH"
sudo dpkg -i *.deb
tar xaf multiarch-darwin*tar.xz
+ # The 10.7 SDK is needed for Go: https://bugs.torproject.org/20023#comment:6
+ tar xaf MacOSX10.7.sdk.tar.gz
export PATH="$PATH:$HOME/build/apple-osx/bin/"
if [ "z$INCLUDE_FTE" = "z1" ]; then
unzip -d $INSTDIR gmp-mac64-utils.zip
@@ -97,10 +100,6 @@ script: |
export CXX=$HOME/build/apple-osx/bin/i686-apple-darwin11-g++
# http://bugs.python.org/issue9437
export LDSHARED="$CC -pthread -shared"
- # XXX Clean up these flags?
- export CFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
- export CXXFLAGS="-m64 -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/i686-apple-darwin10/4.2.1$FTE_EXTRA_CFLAGS"
- export LDFLAGS="-L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -F/usr/lib/apple/SDKs/MacOSX10.6.sdk/System/Library/Frameworks -mmacosx-version-min=10.5"
# Building go 1.4.x
# This is needed to bootstrap the go that we actually use
@@ -120,7 +119,7 @@ script: |
# https://github.com/golang/go/issues/15457
CC_FOR_TARGET="$(pwd)/cc-for-target"
echo "#!/bin/sh" > "$CC_FOR_TARGET"
- echo "exec $CC $CFLAGS $LDFLAGS \"\$@\"" >> "$CC_FOR_TARGET"
+ echo "exec $CC $CFLAGS $LDFLAGS -isysroot $HOME/build/MacOSX10.7.sdk -std=gnu99 \"\$@\"" >> "$CC_FOR_TARGET"
chmod +x "$CC_FOR_TARGET"
# http://golang.org/doc/install/source#environment
export GOPATH="$HOME/go"
@@ -128,6 +127,9 @@ script: |
export GOARCH=386
tar xvf go.tar.gz
cd go/src
+ # Remove a preprocessor directive that causes problems when building with the 10.7 SDK.
+ # https://github.com/golang/go/issues/17732
+ sed -i -e '/^#cgo CFLAGS:/s/-D__MAC_OS_X_VERSION_MAX_ALLOWED=1060//' crypto/x509/root_cgo_darwin.go
CGO_ENABLED=1 CC_FOR_TARGET="$CC_FOR_TARGET" CC= CFLAGS= LDFLAGS= ./make.bash
cd ../..
export PATH="$PATH:$PWD/go/bin"
diff --git a/gitian/versions b/gitian/versions
index ef57d6a..a61c4aa 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 898e781..90f8d4a 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -62,7 +62,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -114,7 +114,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
diff --git a/gitian/versions.beta b/gitian/versions.beta
index 8ac35ae..6226f77 100755
--- a/gitian/versions.beta
+++ b/gitian/versions.beta
@@ -49,7 +49,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
## File names for the source packages
OPENSSL_PACKAGE=openssl-${OPENSSL_VER}.tar.gz
@@ -96,7 +96,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index f6dbb68..eaf1a28 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -69,7 +69,7 @@ SETUPTOOLS_VER=1.4
PARSLEY_VER=1.2
# We need a Go 1.4 to bootstrap later versions; see https://golang.org/doc/install/source#go14
GO14_VER=1.4.3
-GO_VER=1.6.3
+GO_VER=1.7.3
NSIS_VER=2.51
## File names for the source packages
@@ -121,7 +121,7 @@ PY2EXE_HASH=610a8800de3d973ed5ed4ac505ab42ad058add18a68609ac09e6cf3598ef056c
SETUPTOOLS_HASH=75d288687066ed124311d6ca5f40ffa92a0e81adcd7fff318c6e84082713cf39
PARSLEY_HASH=50d30cee70770fd44db7cea421cb2fb75af247c3a1cd54885c06b30a7c85dd23
GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
-GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
+GO_HASH=79430a0027a09b0b3ad57e214c4c1acfdd7af290961dd08d322818895af1ef44
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
1
0

[torbutton/master] Bug 20347: Remove "Custom" checkbox; show "Restore defaults" button
by gk@torproject.org 07 Nov '16
by gk@torproject.org 07 Nov '16
07 Nov '16
commit e59f6df84dcfde500f41eefb608dd878a7fc9d6b
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Mon Oct 17 17:25:59 2016 -0700
Bug 20347: Remove "Custom" checkbox; show "Restore defaults" button
This patch moves the security slider code from torbutton.js
to its own file (security-prefs.js) and refactors it.
---
src/chrome/content/preferences.js | 149 ++++++------------
src/chrome/content/preferences.xul | 53 ++++---
src/chrome/content/torbutton.js | 309 ++++---------------------------------
src/chrome/locale/en/torbutton.dtd | 5 +-
src/modules/security-prefs.js | 130 ++++++++++++++++
src/modules/utils.js | 21 ++-
6 files changed, 256 insertions(+), 411 deletions(-)
diff --git a/src/chrome/content/preferences.js b/src/chrome/content/preferences.js
index 1d85cde..7856ef1 100644
--- a/src/chrome/content/preferences.js
+++ b/src/chrome/content/preferences.js
@@ -1,105 +1,44 @@
-// Bug 1506 P1: Most of this code needs to go away. See also Bug 3100.
-
-// PREFERences dialog functions
-// torbutton_prefs_init() -- on dialog load
-// torbutton_prefs_save() -- on dialog save
-
-const Cc = Components.classes, Ci = Components.interfaces;
-
-
-function torbutton_prefs_init(doc) {
- torbutton_log(2, "called prefs_init()");
-
- var o_torprefs = torbutton_get_prefbranch('extensions.torbutton.');
-
- let sec_slider = doc.getElementById('torbutton_sec_slider');
- let sec_custom = doc.getElementById('torbutton_sec_custom');
- let custom_values = o_torprefs.getBoolPref('security_custom');
- sec_slider.value = o_torprefs.getIntPref('security_slider');
- sec_custom.checked = custom_values;
- sec_custom.disabled = !custom_values;
- torbutton_set_slider_text(doc, sec_custom.checked);
- // If the custom checkbox is checked and the user is done with dragging
- // uncheck the checkbox to allow setting the (newly) chosen security level.
- sec_slider.dragStateChanged = function(isDragging) {
- if (!isDragging && sec_custom.checked) {
- sec_custom.checked = false;
- sec_custom.disabled = true;
- }
- }
- sec_slider.valueChanged = function(which, newValue, userChanged) {
- torbutton_set_slider_text(doc, false);
- }
-}
-
-function torbutton_prefs_save(doc) {
- // Disable the Accept button once the user clicked on it as clicking on
- // our active Accept button more than once can lead to all sort of weird
- // behavior. See bug 11763 for an example.
- doc.documentElement.getButton("accept").disabled = true;
- torbutton_log(2, "called prefs_save()");
- var o_torprefs = torbutton_get_prefbranch('extensions.torbutton.');
-
- o_torprefs.setBoolPref('security_custom',
- doc.getElementById('torbutton_sec_custom').checked);
- o_torprefs.setIntPref('security_slider',
- doc.getElementById('torbutton_sec_slider').value);
-
- // If we have non-custom Security Slider settings update them now.
- if (!o_torprefs.getBoolPref('security_custom')) {
- let wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
- let win = wm.getMostRecentWindow("navigator:browser");
- win.torbutton_update_security_slider();
- }
-}
-
-function torbutton_toggle_slider(doc, pos) {
- doc.getElementById("torbutton_sec_slider").value = pos;
- // Make sure the custom checkbox is unchecked as the user seems to want one
- // of the defined security levels.
- let sec_custom = doc.getElementById("torbutton_sec_custom");
- if (sec_custom.checked) {
- sec_custom.checked = false;
- }
- torbutton_set_slider_text(doc, false);
-}
-
-function torbutton_set_slider_text(doc, custom) {
- let level = doc.getElementById("torbutton_sec_slider").value;
- if (custom) {
- level = 5;
- }
- switch (level) {
- case (1):
- doc.getElementById("desc_low").collapsed = true;
- doc.getElementById("desc_medium_low").collapsed = true;
- doc.getElementById("desc_medium_high").collapsed = true;
- doc.getElementById("desc_high").collapsed = false;
- break;
- case (2):
- doc.getElementById("desc_low").collapsed = true;
- doc.getElementById("desc_medium_low").collapsed = true;
- doc.getElementById("desc_medium_high").collapsed = false;
- doc.getElementById("desc_high").collapsed = true;
- break;
- case (3):
- doc.getElementById("desc_low").collapsed = true;
- doc.getElementById("desc_medium_low").collapsed = false;
- doc.getElementById("desc_medium_high").collapsed = true;
- doc.getElementById("desc_high").collapsed = true;
- break;
- case (4):
- doc.getElementById("desc_low").collapsed = false;
- doc.getElementById("desc_medium_low").collapsed = true;
- doc.getElementById("desc_medium_high").collapsed = true;
- doc.getElementById("desc_high").collapsed = true;
- break;
- case (5):
- doc.getElementById("desc_low").collapsed = true;
- doc.getElementById("desc_medium_low").collapsed = true;
- doc.getElementById("desc_medium_high").collapsed = true;
- doc.getElementById("desc_high").collapsed = true;
- break;
- }
-}
+// # Security Settings User Interface
+
+// Utilities
+let { utils: Cu } = Components;
+let { getBoolPref, getIntPref, setBoolPref, setIntPref } =
+ Cu.import("resource://gre/modules/Services.jsm").Services.prefs;
+
+// Description elements have the follow names.
+const descNames =
+ [, "desc_high", "desc_medium_high", "desc_medium_low", "desc_low"];
+
+// A single `state` object that reflects the user settings in this UI.
+let state = { slider : 0, custom : false};
+
+// Set the desired slider value and update UI.
+function torbutton_set_slider(sliderPosition) {
+ state.slider = sliderPosition;
+ let slider = document.getElementById("torbutton_sec_slider");
+ slider.value = sliderPosition;
+ let descs = descNames.map(name => document.getElementById(name));
+ descs.forEach((desc, i) => desc.collapsed = sliderPosition !== i);
+};
+
+// Set the desired custom value and update UI.
+function torbutton_set_custom(customValue) {
+ state.custom = customValue;
+ let sliderSettings = document.getElementById("torbutton_slider_settings");
+ let customSettings = document.getElementById("torbutton_custom_settings");
+ sliderSettings.hidden = customValue;
+ customSettings.hidden = !customValue;
+};
+
+// Read prefs 'extensions.torbutton.security_slider' and
+// 'extensions.torbutton.security_custom', and initialize the UI.
+function torbutton_init_security_ui() {
+ torbutton_set_slider(getIntPref("extensions.torbutton.security_slider"));
+ torbutton_set_custom(getBoolPref("extensions.torbutton.security_custom"));
+};
+
+// Write the two prefs from the current settings.
+function torbutton_save_security_settings() {
+ setIntPref("extensions.torbutton.security_slider", state.slider);
+ setBoolPref("extensions.torbutton.security_custom", state.custom);
+};
diff --git a/src/chrome/content/preferences.xul b/src/chrome/content/preferences.xul
index 574932e..53abd7f 100644
--- a/src/chrome/content/preferences.xul
+++ b/src/chrome/content/preferences.xul
@@ -10,64 +10,59 @@
title="&torbutton.prefs.security_settings;"
buttons="accept,cancel"
persist="screenX screenY width height"
- onload="torbutton_prefs_init(document)"
+ onload="torbutton_init_security_ui()"
align="stretch"
pack="center"
- maxheight="350"
+ maxheight="300"
+ minwidth="300"
maxwidth="400"
- ondialogaccept="torbutton_prefs_save(document)" >
+ ondialogaccept="torbutton_save_security_settings()"
+ width="400" >
<script type="application/x-javascript" src="torbutton_util.js"/>
<script type="application/x-javascript" src="preferences.js"/>
<vbox flex="1" align="stretch">
<groupbox align="stretch" flex="1"> <!-- security settings container -->
<caption label="&torbutton.prefs.sec_caption;"/>
- <hbox flex="1" align="stretch">
+ <hbox id="torbutton_slider_settings" flex="1" align="stretch" hidden="false">
<vbox>
<hbox height="200">
<vbox>
<scale id="torbutton_sec_slider" flex="1" min="1" max="4"
- movetoclick="true" orient="vertical"/>
+ movetoclick="true" orient="vertical"
+ onchange="torbutton_set_slider(this.value)"/>
</vbox>
<vbox>
<hbox flex="1" align="start">
<description id="torbutton_sec_high"
- tooltip="high_preview"
- onclick="torbutton_toggle_slider(document, 1);">
+ onclick="torbutton_set_slider(1);"
+ tooltip="high_preview">
&torbutton.prefs.sec_high;
</description>
</hbox>
<hbox flex="1" align="center">
<description id="torbutton_sec_med_high"
- tooltip="mh_preview"
- onclick="torbutton_toggle_slider(document, 2);">
+ onclick="torbutton_set_slider(2);"
+ tooltip="mh_preview">
&torbutton.prefs.sec_med_high;
</description>
</hbox>
<hbox flex="1" align="center">
<description id="torbutton_sec_med_low"
- tooltip="ml_preview"
- onclick="torbutton_toggle_slider(document, 3);">
+ onclick="torbutton_set_slider(3);"
+ tooltip="ml_preview">
&torbutton.prefs.sec_med_low;
</description>
</hbox>
<hbox flex="1" align="end">
<description id="torbutton_sec_low"
- tooltip="low_preview"
- onclick="torbutton_toggle_slider(document, 4);">
+ onclick="torbutton_set_slider(4);"
+ tooltip="low_preview">
&torbutton.prefs.sec_low;
</description>
</hbox>
</vbox>
</hbox>
- <hbox>
- <!-- We are using |oncommand| instead of |onclick| as the former does
- not fire if the checkbox is disabled and it does fire after the
- checkbox adapted its state. -->
- <checkbox id="torbutton_sec_custom" flex="1"
- oncommand="torbutton_set_slider_text(document, event.target.checked);"
- label="&torbutton.prefs.sec_custom;"/>
- </hbox>
</vbox>
<!-- A width of 400 is already too much for OS X it seems. The above
spacer tag would basically be useless and the layout ugly. -->
@@ -161,6 +156,20 @@
</vbox>
</vbox>
</hbox>
+ <vbox id="torbutton_custom_settings"
+ hidden="true"
+ width="300"
+ height="200"
+ style="overflow:auto;">
+ <description>
+ &torbutton.prefs.custom_warning;
+ </description>
+ <hbox>
+ <button id="torbutton_restore_defaults_button"
+ oncommand="torbutton_set_custom(false);"
+ label="&torbutton.prefs.restore_defaults;"/>
+ </hbox>
+ </vbox>
</groupbox>
</vbox>
@@ -200,4 +209,4 @@
<html:br></html:br>
<html:div>&torbutton.prefs.sec_low_usable_desc;</html:div>
</tooltip>
-</dialog>
+ </dialog>
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index 9a8b9e2..60f12d6 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -11,6 +11,7 @@ let { LoadContextInfo } = Cu.import('resource://gre/modules/LoadContextInfo.jsm'
let { Services } = Cu.import("resource://gre/modules/Services.jsm");
let { showDialog } = Cu.import("resource://torbutton/modules/utils.js");
let { unescapeTorString } = Cu.import("resource://torbutton/modules/utils.js");
+let SecurityPrefs = Cu.import("resource://torbutton/modules/security-prefs.js");
const k_tb_last_browser_version_pref = "extensions.torbutton.lastBrowserVersion";
const k_tb_browser_update_needed_pref = "extensions.torbutton.updateNeeded";
@@ -45,8 +46,6 @@ var m_tb_orig_BrowserOnAboutPageLoad = null;
var m_tb_domWindowUtils = window.QueryInterface(Ci.nsIInterfaceRequestor).
getInterface(Ci.nsIDOMWindowUtils);
-var m_tb_sliderUpdate = false;
-
// Bug 1506 P1: This object is only for updating the UI for toggling and style
var torbutton_window_pref_observer =
{
@@ -86,11 +85,7 @@ var torbutton_unique_pref_observer =
m_tb_prefs.addObserver("network.cookie", this, false);
m_tb_prefs.addObserver("browser.privatebrowsing.autostart", this, false);
m_tb_prefs.addObserver("javascript", this, false);
- m_tb_prefs.addObserver("gfx", this, false);
m_tb_prefs.addObserver("noscript", this, false);
- m_tb_prefs.addObserver("media", this, false);
- m_tb_prefs.addObserver("mathml", this, false);
- m_tb_prefs.addObserver("svg", this, false);
m_tb_prefs.addObserver("plugin.disable", this, false);
m_tb_prefs.addObserver("privacy.thirdparty.isolate", this, false);
m_tb_prefs.addObserver("privacy.resistFingerprinting", this, false);
@@ -107,11 +102,10 @@ var torbutton_unique_pref_observer =
m_tb_prefs.removeObserver("network.cookie", this);
m_tb_prefs.removeObserver("browser.privatebrowsing.autostart", this);
m_tb_prefs.removeObserver("javascript", this);
- m_tb_prefs.removeObserver("gfx", this);
m_tb_prefs.removeObserver("noscript", this);
- m_tb_prefs.removeObserver("media", this);
- m_tb_prefs.removeObserver("mathml", this);
- m_tb_prefs.removeObserver("svg", this);
+ m_tb_prefs.removeObserver("plugin.disable", this);
+ m_tb_prefs.removeObserver("privacy.thirdparty.isolate", this);
+ m_tb_prefs.removeObserver("privacy.resistFingerprinting", this);
var observerService = Cc["@mozilla.org/observer-service;1"].
getService(Ci.nsIObserverService);
@@ -149,7 +143,9 @@ var torbutton_unique_pref_observer =
}
if (topic != "nsPref:changed") return;
-
+ if (data.startsWith("noscript.")) {
+ torbutton_update_noscript_button();
+ }
switch (data) {
case "network.cookie.cookieBehavior":
var val = m_tb_prefs.getIntPref("network.cookie.cookieBehavior");
@@ -180,42 +176,6 @@ var torbutton_unique_pref_observer =
case "extensions.torbutton.hide_sync_ui":
torbutton_update_sync_ui();
break;
- case "gfx.font_rendering.opentype_svg.enabled":
- case "javascript.options.ion.content":
- case "javascript.options.typeinference":
- case "noscript.forbidMedia":
- case "media.webaudio.enabled":
- case "mathml.disabled":
- case "javascript.options.baselinejit.content":
- case "noscript.forbidFonts":
- case "noscript.globalHttpsWhitelist":
- case "noscript.global":
- case "svg.in-content.enabled":
- // |m_tb_slider_update| is only set if the user updated a
- // preference under control of the security slider via the
- // slider on the Torbutton dialog. This in turn means we can
- // skip the code dealing with setting/unsetting the custom mode
- // in this case.
- if (!m_tb_sliderUpdate) {
- // Do we already have custom settings?
- let customSlider = m_tb_prefs.
- getBoolPref("extensions.torbutton.security_custom");
- // A preference governed by the security slider got changed
- // but we are not in custom mode yet. Change that.
- if (!customSlider) {
- m_tb_prefs.
- setBoolPref("extensions.torbutton.security_custom",
- true);
- } else {
- // We are in custom mode. Check whether all prefs are
- // reset and reset the mode if so. Otherwise we remain
- // in custom mode.
- torbutton_log(4, "custom mode and we got: " + data);
- torbutton_security_slider_custom_check(m_tb_prefs.
- getIntPref("extensions.torbutton.security_slider"));
- }
- }
- break;
}
}
}
@@ -269,7 +229,9 @@ function torbutton_init_toolbutton()
// called once per browser window.. This might belong in a component.
function torbutton_init() {
torbutton_log(3, 'called init()');
-
+
+ SecurityPrefs.initialize();
+
if (m_tb_wasinited) {
return;
}
@@ -372,12 +334,6 @@ function torbutton_init() {
torbutton_on_abouttor_load(aEvent.target);
}, false, true);
- // Set some important security prefs according to the chosen security level
- // if there are no custom settings to respect.
- if (!m_tb_prefs.getBoolPref("extensions.torbutton.security_custom")) {
- torbutton_update_security_slider();
- }
-
// XXX: Get rid of the cached asmjs (or IndexedDB) files on disk in case we
// don't allow things saved to disk. This is an ad-hoc fix to work around
// #19417. Once this is properly solved we should remove this code again.
@@ -1805,228 +1761,6 @@ function torbutton_update_thirdparty_prefs() {
m_tb_prefs.savePrefFile(null);
}
-var torbutton_sec_ml_bool_prefs = {
- "javascript.options.ion.content" : false,
- "javascript.options.typeinference" : false,
- "noscript.forbidMedia" : true,
- "media.webaudio.enabled" : false,
- "mathml.disabled" : true
-};
-
-var torbutton_sec_mh_bool_prefs = {
- "javascript.options.baselinejit.content" : false,
- "gfx.font_rendering.opentype_svg.enabled" : false,
- "noscript.global" : false,
- "noscript.globalHttpsWhitelist" : true
-};
-
-var torbutton_sec_h_bool_prefs = {
- "noscript.forbidFonts" : true,
- "noscript.global" : false,
- "svg.in-content.enabled" : false
-};
-
-function torbutton_update_security_slider() {
- // Avoid checking the custom settings checkbox.
- m_tb_sliderUpdate = true;
- let mode = m_tb_prefs.getIntPref("extensions.torbutton.security_slider");
- let capValue = m_tb_prefs.getCharPref("capability.policy.maonoscript.sites");
- switch (mode) {
- case 1:
- for (p in torbutton_sec_ml_bool_prefs) {
- m_tb_prefs.setBoolPref(p, torbutton_sec_ml_bool_prefs[p])
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- m_tb_prefs.setBoolPref(p, torbutton_sec_mh_bool_prefs[p])
- // noscript.globalHttpsWhitelist is special: We don't want it in this
- // mode.
- if (p === "noscript.globalHttpsWhitelist") {
- m_tb_prefs.setBoolPref(p, !torbutton_sec_mh_bool_prefs[p])
- }
- }
- for (p in torbutton_sec_h_bool_prefs) {
- m_tb_prefs.setBoolPref(p, torbutton_sec_h_bool_prefs[p])
- }
- // Removing "https:" is needed due to a bug in older Noscript versions.
- // We leave that in for a while as there may be users that were affected
- // by this bug. Removing it immediately and having the auto-updater might
- // leave users exposed to the problem.
- if (capValue.indexOf(" https:") >= 0) {
- m_tb_prefs.setCharPref("capability.policy.maonoscript.sites",
- capValue.replace(" https:", ""));
- }
- break;
- case 2:
- for (p in torbutton_sec_ml_bool_prefs) {
- m_tb_prefs.setBoolPref(p, torbutton_sec_ml_bool_prefs[p])
- }
- // Order matters here as both the high mode and the medium-high mode
- // share some preferences/values. So, let's revert the high mode
- // preferences first and set the medium-high mode ones afterwards.
- for (p in torbutton_sec_h_bool_prefs) {
- m_tb_prefs.setBoolPref(p, !torbutton_sec_h_bool_prefs[p])
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- m_tb_prefs.setBoolPref(p, torbutton_sec_mh_bool_prefs[p])
- }
- break;
- case 3:
- for (p in torbutton_sec_ml_bool_prefs) {
- m_tb_prefs.setBoolPref(p, torbutton_sec_ml_bool_prefs[p])
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- m_tb_prefs.setBoolPref(p, !torbutton_sec_mh_bool_prefs[p])
- }
- for (p in torbutton_sec_h_bool_prefs) {
- m_tb_prefs.setBoolPref(p, !torbutton_sec_h_bool_prefs[p])
- }
- // Removing "https:" is needed due to a bug in older Noscript versions.
- // We leave that in for a while as there may be users that were affected
- // by this bug. Removing it immediately and having the auto-updater might
- // leave users exposed to the problem.
- if (capValue.indexOf(" https:") >= 0) {
- m_tb_prefs.setCharPref("capability.policy.maonoscript.sites",
- capValue.replace(" https:", ""));
- }
- break;
- case 4:
- for (p in torbutton_sec_ml_bool_prefs) {
- m_tb_prefs.setBoolPref(p, !torbutton_sec_ml_bool_prefs[p])
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- m_tb_prefs.setBoolPref(p, !torbutton_sec_mh_bool_prefs[p])
- }
- for (p in torbutton_sec_h_bool_prefs) {
- m_tb_prefs.setBoolPref(p, !torbutton_sec_h_bool_prefs[p])
- }
- // Removing "https:" is needed due to a bug in older Noscript versions.
- // We leave that in for a while as there may be users that were affected
- // by this bug. Removing it immediately and having the auto-updater might
- // leave users exposed to the problem.
- if (capValue.indexOf(" https:") >= 0) {
- m_tb_prefs.setCharPref("capability.policy.maonoscript.sites",
- capValue.replace(" https:", ""));
- }
- break;
- }
- /* Update the NoScript button to reflect any changes */
- try {
- let wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
- let browserEnumerator = wm.getEnumerator("navigator:browser");
-
- // Update every window's NoScript status...
- while (browserEnumerator.hasMoreElements()) {
- let win = browserEnumerator.getNext();
- win.noscriptOverlay._syncUINow();
- }
- torbutton_log(3, 'Updated NoScript status for security slider');
- } catch(e) {
- torbutton_log(4, 'Failed to update NoScript status for security slider: '+e);
- }
- torbutton_log(3, 'Security Slider Pref Update Complete');
- m_tb_sliderUpdate = false;
-}
-
-// The user (re)set a pref which is relevant to the security slider while she
-// was in custom mode. Check whether the preference values fit to the mode which
-// is still on the slider. Iff so, we are leaving the custom mode.
-function torbutton_security_slider_custom_check(mode) {
- let capValue = m_tb_prefs.getCharPref("capability.policy.maonoscript.sites");
- switch (mode) {
- case 1:
- for (p in torbutton_sec_ml_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) !== torbutton_sec_ml_bool_prefs[p]) {
- return;
- }
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) !== torbutton_sec_mh_bool_prefs[p]) {
- // We don't want to have the whitelist in high mode. JavaScript is
- // disabled globally.
- if (p === "noscript.globalHttpsWhitelist") {
- continue;
- }
- return;
- }
- }
- for (p in torbutton_sec_h_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) !== torbutton_sec_h_bool_prefs[p]) {
- return;
- }
- }
- // We are still here which means all preferences are properly reset. Leave
- // custom mode.
- m_tb_prefs.setBoolPref("extensions.torbutton.security_custom", false);
- break;
- case 2:
- for (p in torbutton_sec_ml_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) !== torbutton_sec_ml_bool_prefs[p]) {
- return;
- }
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) !== torbutton_sec_mh_bool_prefs[p]) {
- return;
- }
- }
- for (p in torbutton_sec_h_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) === torbutton_sec_h_bool_prefs[p]) {
- // We have the whitelist and JavaScript is disabled in medium-high
- // mode as well.
- if (p === "noscript.global") {
- continue;
- }
- return;
- }
- }
- // We are still here which means all preferences are properly reset. Leave
- // custom mode.
- m_tb_prefs.setBoolPref("extensions.torbutton.security_custom", false);
- break;
- case 3:
- for (p in torbutton_sec_ml_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) !== torbutton_sec_ml_bool_prefs[p]) {
- return;
- }
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) === torbutton_sec_mh_bool_prefs[p]) {
- return;
- }
- }
- for (p in torbutton_sec_h_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) === torbutton_sec_h_bool_prefs[p]) {
- return;
- }
- }
- // We are still here which means all preferences are properly reset. Leave
- // custom mode.
- m_tb_prefs.setBoolPref("extensions.torbutton.security_custom", false);
- break;
- case 4:
- for (p in torbutton_sec_ml_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) === torbutton_sec_ml_bool_prefs[p]) {
- return;
- }
- }
- for (p in torbutton_sec_mh_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) === torbutton_sec_mh_bool_prefs[p]) {
- return;
- }
- }
- for (p in torbutton_sec_h_bool_prefs) {
- if (m_tb_prefs.getBoolPref(p) === torbutton_sec_h_bool_prefs[p]) {
- return;
- }
- }
- // We are still here which means all preferences are properly reset. Leave
- // custom mode.
- m_tb_prefs.setBoolPref("extensions.torbutton.security_custom", false);
- break;
- }
-}
-
function torbutton_close_tabs_on_new_identity() {
var close_newnym = m_tb_prefs.getBoolPref("extensions.torbutton.close_newnym");
if (!close_newnym) {
@@ -2829,4 +2563,27 @@ function torbutton_update_sync_ui()
}
}
+// Update the NoScript button to reflect any changes to noscript prefs
+function torbutton_update_noscript_button()
+{
+ // Make sure pref values have fully propagated inside NoScript before
+ // we sync the UI.
+ setTimeout(() => {
+ try {
+ let wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Components.interfaces.nsIWindowMediator);
+ let browserEnumerator = wm.getEnumerator("navigator:browser");
+ // Update every window's NoScript status...
+ while (browserEnumerator.hasMoreElements()) {
+ let win = browserEnumerator.getNext();
+ win.noscriptOverlay._syncUINow();
+ }
+ torbutton_log(3, 'Updated NoScript status for security settings');
+ } catch (e) {
+ torbutton_log(4, 'Failed to update NoScript status for security setings: '+e);
+ }
+ }, 0);
+}
+
+
//vim:set ts=4
diff --git a/src/chrome/locale/en/torbutton.dtd b/src/chrome/locale/en/torbutton.dtd
index 56f663e..0c10406 100644
--- a/src/chrome/locale/en/torbutton.dtd
+++ b/src/chrome/locale/en/torbutton.dtd
@@ -11,7 +11,9 @@
<!ENTITY torbutton.context_menu.cookieProtections "Cookie Protections…">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Click to initialize Torbutton">
-<!ENTITY torbutton.prefs.security_settings "Security Settings">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser Security Settings">
+<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
+<!ENTITY torbutton.prefs.custom_warning "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.">
<!ENTITY torbutton.cookiedialog.title "Manage Cookie Protections">
<!ENTITY torbutton.cookiedialog.lockCol "Protected">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
@@ -57,5 +59,4 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript is disabled by default on all sites.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Some fonts and icons may display incorrectly.">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Website-provided font files are blocked.">
-<!ENTITY torbutton.prefs.sec_custom "Custom Values">
<!ENTITY torbutton.circuit_display.title "Tor circuit for this site">
diff --git a/src/modules/security-prefs.js b/src/modules/security-prefs.js
new file mode 100644
index 0000000..3710862
--- /dev/null
+++ b/src/modules/security-prefs.js
@@ -0,0 +1,130 @@
+// # Security Settings prefs (as controlled by the Security Slider)
+
+// ### Utilities
+
+let {classes: Cc, utils: Cu } = Components;
+let { getBoolPref, setBoolPref, getIntPref, setIntPref } =
+ Cu.import("resource://gre/modules/Services.jsm").Services.prefs;
+let { bindPref } =
+ Cu.import("resource://torbutton/modules/utils.js");
+let logger = Components.classes["@torproject.org/torbutton-logger;1"]
+ .getService(Components.interfaces.nsISupports).wrappedJSObject;
+let log = (level, msg) => logger.log(level, msg);
+
+// ### Constants
+
+// __kSecuritySettings__.
+// A table of all prefs bound to the security slider, and the value
+// for each security setting.
+const kSecuritySettings = {
+ // Preference name : [0, 1-high 2-mh 3-ml 4-low]
+ "javascript.options.ion.content" : [, false, false, false, true ],
+ "javascript.options.typeinference" : [, false, false, false, true ],
+ "noscript.forbidMedia" : [, true, true, true, false],
+ "media.webaudio.enabled" : [, false, false, false, true ],
+ "mathml.disabled" : [, true, true, true, false],
+ "javascript.options.baselinejit.content" : [, false, false, true, true ],
+ "gfx.font_rendering.opentype_svg.enabled" : [, false, false, true, true ],
+ "noscript.global" : [, false, false, true, true ],
+ "noscript.globalHttpsWhitelist" : [, false, true, false, false],
+ "noscript.forbidFonts" : [, true, false, false, false],
+ "svg.in-content.enabled" : [, false, true, true, true ],
+};
+
+// The Security Settings prefs in question.
+const kSliderPref = "extensions.torbutton.security_slider";
+const kCustomPref = "extensions.torbutton.security_custom";
+
+// ### Prefs
+
+// __write_setting_to_prefs(settingIndex)__.
+// Take a given setting index and write the appropriate pref values
+// to the pref database.
+var write_setting_to_prefs = function (settingIndex) {
+ Object.keys(kSecuritySettings).forEach(
+ prefName => setBoolPref(
+ prefName, kSecuritySettings[prefName][settingIndex]));
+};
+
+// __read_setting_from_prefs()__.
+// Read the current pref values, and decide if any of our
+// security settings matches. Otherwise return null.
+var read_setting_from_prefs = function () {
+ let prefNames = Object.keys(kSecuritySettings);
+ for (let settingIndex of [1, 2, 3, 4]) {
+ let possibleSetting = true;
+ // For the given settingIndex, check if all current pref values
+ // match the setting.
+ for (let prefName of prefNames) {
+ if (kSecuritySettings[prefName][settingIndex] !==
+ getBoolPref(prefName)) {
+ possibleSetting = false;
+ }
+ }
+ if (possibleSetting) {
+ // We have a match!
+ return settingIndex;
+ }
+ }
+ // No matching setting; return null.
+ return null;
+};
+
+// __watch_security_prefs(onSettingChanged)__.
+// Whenever a pref bound to the security slider changes, onSettingChanged
+// is called with the new security setting value (1,2,3,4 or null).
+// Returns a zero-arg function that ends this binding.
+var watch_security_prefs = function (onSettingChanged) {
+ let prefNames = Object.keys(kSecuritySettings);
+ let unbindFuncs = [];
+ for (let prefName of prefNames) {
+ unbindFuncs.push(bindPref(
+ prefName, () => onSettingChanged(read_setting_from_prefs())));
+ }
+ // Call all the unbind functions.
+ return () => unbindFuncs.forEach(unbind => unbind());
+};
+
+// __initialized__.
+// Have we called initialize() yet?
+var initialized = false;
+
+// __initialize()__.
+// Defines the behavior of "extensions.torbutton.security_custom",
+// "extensions.torbutton.security_slider", and the security-sensitive
+// prefs declared in kSecuritySettings.
+var initialize = function () {
+ // Only run once.
+ if (initialized) {
+ return;
+ }
+ log(4, "Initializing security-prefs.js");
+ initialized = true;
+ // When security_custom is set to false, apply security_slider setting
+ // to the security-sensitive prefs.
+ bindPref(kCustomPref, function (custom) {
+ if (custom === false) {
+ write_setting_to_prefs(getIntPref(kSliderPref));
+ }
+ });
+ // If security_slider is given a new value, then security_custom should
+ // be set to false.
+ bindPref(kSliderPref, function (prefIndex) {
+ setBoolPref(kCustomPref, false);
+ write_setting_to_prefs(prefIndex);
+ });
+ // If a security-sensitive pref changes, then decide if the set of pref values
+ // constitutes a security_slider setting or a custom value.
+ watch_security_prefs(settingIndex => {
+ if (settingIndex === null) {
+ setBoolPref(kCustomPref, true);
+ } else {
+ setIntPref(kSliderPref, settingIndex);
+ setBoolPref(kCustomPref, false);
+ }
+ });
+ log(4, "security-prefs.js initialization complete");
+};
+
+// Export initialize() function for external use.
+let EXPORTED_SYMBOLS = ["initialize"];
diff --git a/src/modules/utils.js b/src/modules/utils.js
index b303485..507f008 100644
--- a/src/modules/utils.js
+++ b/src/modules/utils.js
@@ -23,11 +23,11 @@ var getPrefValue = function (prefName) {
}
};
-// __bindPrefAndInit(prefName, prefHandler)__
-// Applies prefHandler to the current value of pref specified by prefName.
-// Re-applies prefHandler whenever the value of the pref changes.
+// __bindPref(prefName, prefHandler, init)__
+// Applies prefHandler whenever the value of the pref changes.
+// If init is true, applies prefHandler to the current value.
// Returns a zero-arg function that unbinds the pref.
-var bindPrefAndInit = function (prefName, prefHandler) {
+var bindPref = function (prefName, prefHandler, init = false) {
let update = () => { prefHandler(getPrefValue(prefName)); },
observer = { observe : function (subject, topic, data) {
if (data === prefName) {
@@ -35,10 +35,19 @@ var bindPrefAndInit = function (prefName, prefHandler) {
}
} };
prefs.addObserver(prefName, observer, false);
- update();
+ if (init) {
+ update();
+ }
return () => { prefs.removeObserver(prefName, observer); };
};
+// __bindPrefAndInit(prefName, prefHandler)__
+// Applies prefHandler to the current value of pref specified by prefName.
+// Re-applies prefHandler whenever the value of the pref changes.
+// Returns a zero-arg function that unbinds the pref.
+var bindPrefAndInit = (prefName, prefHandler) =>
+ bindPref(prefName, prefHandler, true);
+
// ## Environment variables
// __env__.
@@ -173,5 +182,5 @@ var unescapeTorString = function(str) {
};
// Export utility functions for external use.
-let EXPORTED_SYMBOLS = ["bindPrefAndInit", "getPrefValue", "getEnv",
+let EXPORTED_SYMBOLS = ["bindPref", "bindPrefAndInit", "getEnv", "getPrefValue",
"showDialog", "unescapeTorString"];
1
0

[torbutton/maint-1.9.5] Bug 20414.1: Strings for 2016 Tor Browser donation banner
by gk@torproject.org 07 Nov '16
by gk@torproject.org 07 Nov '16
07 Nov '16
commit 9e479e559d65297f5ae322eb89f6740f0156cd1d
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Fri Oct 28 12:49:15 2016 -0700
Bug 20414.1: Strings for 2016 Tor Browser donation banner
---
src/chrome/locale/en/aboutTor.properties | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/chrome/locale/en/aboutTor.properties b/src/chrome/locale/en/aboutTor.properties
index d607324..76192f4 100644
--- a/src/chrome/locale/en/aboutTor.properties
+++ b/src/chrome/locale/en/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
1
0

[torbutton/master] Bug 20414.1: Strings for 2016 Tor Browser donation banner
by gk@torproject.org 03 Nov '16
by gk@torproject.org 03 Nov '16
03 Nov '16
commit 269031f7aba449312189f73753e616fb82e5af48
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Fri Oct 28 12:49:15 2016 -0700
Bug 20414.1: Strings for 2016 Tor Browser donation banner
---
src/chrome/locale/en/aboutTor.properties | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/chrome/locale/en/aboutTor.properties b/src/chrome/locale/en/aboutTor.properties
index d607324..76192f4 100644
--- a/src/chrome/locale/en/aboutTor.properties
+++ b/src/chrome/locale/en/aboutTor.properties
@@ -19,3 +19,10 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.donate=Donate Now!
+aboutTor.donationBanner.heart=Tor is at the heart of Internet freedom
+aboutTor.donationBanner.tagline1=Millions of People Depend on Tor for Online Security & Privacy
+aboutTor.donationBanner.tagline2=A Network of People Protecting People
+aboutTor.donationBanner.tagline3=Surveillance = Oppression
+aboutTor.donationBanner.tagline4=Protecting Journalists, Activists & Whistleblowers Since 2006
1
0

[tor-launcher/maint-0.2.9] Bug 19646: Mac OS: wrong location for meek browser profile
by gk@torproject.org 03 Nov '16
by gk@torproject.org 03 Nov '16
03 Nov '16
commit 0082643cd0b88f34cb56501b6631307616b8cc1d
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Nov 2 11:41:12 2016 -0400
Bug 19646: Mac OS: wrong location for meek browser profile
Set an TOR_BROWSER_TOR_DATA_DIR environment variable before starting tor.
meek-client-torbrowser uses this on OSX to determine the location of the
meek browser profile.
---
src/components/tl-process.js | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/components/tl-process.js b/src/components/tl-process.js
index 403bc56..a91059b 100644
--- a/src/components/tl-process.js
+++ b/src/components/tl-process.js
@@ -417,13 +417,18 @@ TorProcessService.prototype =
args.push("1");
}
+ // Set an environment variable that points to the Tor data directory.
+ // This is used by meek-client-torbrowser to find the location for
+ // the meek browser profile.
+ let env = Cc["@mozilla.org/process/environment;1"]
+ .getService(Ci.nsIEnvironment);
+ env.set("TOR_BROWSER_TOR_DATA_DIR", dataDir.path);
+
// On Windows, prepend the Tor program directory to PATH. This is
// needed so that pluggable transports can find OpenSSL DLLs, etc.
// See https://trac.torproject.org/projects/tor/ticket/10845
if (TorLauncherUtil.isWindows)
{
- var env = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
var path = exeFile.parent.path;
if (env.exists("PATH"))
path += ";" + env.get("PATH");
1
0

[tor-launcher/maint-0.2.10] Bug 19646: Mac OS: wrong location for meek browser profile
by gk@torproject.org 03 Nov '16
by gk@torproject.org 03 Nov '16
03 Nov '16
commit 4eee281bf774f8cf4f2d8a2549573b7a89f72407
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Nov 2 11:41:12 2016 -0400
Bug 19646: Mac OS: wrong location for meek browser profile
Set an TOR_BROWSER_TOR_DATA_DIR environment variable before starting tor.
meek-client-torbrowser uses this on OSX to determine the location of the
meek browser profile.
---
src/components/tl-process.js | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/components/tl-process.js b/src/components/tl-process.js
index 777a253..717c338 100644
--- a/src/components/tl-process.js
+++ b/src/components/tl-process.js
@@ -449,13 +449,18 @@ TorProcessService.prototype =
args.push("1");
}
+ // Set an environment variable that points to the Tor data directory.
+ // This is used by meek-client-torbrowser to find the location for
+ // the meek browser profile.
+ let env = Cc["@mozilla.org/process/environment;1"]
+ .getService(Ci.nsIEnvironment);
+ env.set("TOR_BROWSER_TOR_DATA_DIR", dataDir.path);
+
// On Windows, prepend the Tor program directory to PATH. This is
// needed so that pluggable transports can find OpenSSL DLLs, etc.
// See https://trac.torproject.org/projects/tor/ticket/10845
if (TorLauncherUtil.isWindows)
{
- var env = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
var path = exeFile.parent.path;
if (env.exists("PATH"))
path += ";" + env.get("PATH");
1
0

[tor-launcher/master] Bug 19646: Mac OS: wrong location for meek browser profile
by gk@torproject.org 03 Nov '16
by gk@torproject.org 03 Nov '16
03 Nov '16
commit 5ac452d86f93ee15ba3722afc606be862e8f3686
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Nov 2 11:41:12 2016 -0400
Bug 19646: Mac OS: wrong location for meek browser profile
Set an TOR_BROWSER_TOR_DATA_DIR environment variable before starting tor.
meek-client-torbrowser uses this on OSX to determine the location of the
meek browser profile.
---
src/components/tl-process.js | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/components/tl-process.js b/src/components/tl-process.js
index de71d45..3284049 100644
--- a/src/components/tl-process.js
+++ b/src/components/tl-process.js
@@ -445,13 +445,18 @@ TorProcessService.prototype =
args.push("1");
}
+ // Set an environment variable that points to the Tor data directory.
+ // This is used by meek-client-torbrowser to find the location for
+ // the meek browser profile.
+ let env = Cc["@mozilla.org/process/environment;1"]
+ .getService(Ci.nsIEnvironment);
+ env.set("TOR_BROWSER_TOR_DATA_DIR", dataDir.path);
+
// On Windows, prepend the Tor program directory to PATH. This is
// needed so that pluggable transports can find OpenSSL DLLs, etc.
// See https://trac.torproject.org/projects/tor/ticket/10845
if (TorLauncherUtil.isWindows)
{
- var env = Cc["@mozilla.org/process/environment;1"]
- .getService(Ci.nsIEnvironment);
var path = exeFile.parent.path;
if (env.exists("PATH"))
path += ";" + env.get("PATH");
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 1311275 - use protocol service directly instead of NS_GetFileFromURLSpec; r=mayhemer
by gk@torproject.org 01 Nov '16
by gk@torproject.org 01 Nov '16
01 Nov '16
commit 3c39c36f1f0ad11dbf332b538bc71cc89336cbae
Author: Liang-Heng Chen <xeonchen(a)mozilla.com>
Date: Wed Oct 19 20:34:00 2016 +0200
Bug 1311275 - use protocol service directly instead of NS_GetFileFromURLSpec; r=mayhemer
MozReview-Commit-ID: 26ElbTXr6fI
--HG--
extra : rebase_source : bad92dfad90b4cee8a850cdf29a85832f16f8149
This is a backport we need due to an assertion failure caused by a
previous patch (see: #20304). Fixes bug 20490.
---
netwerk/socket/nsSOCKSIOLayer.cpp | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/netwerk/socket/nsSOCKSIOLayer.cpp b/netwerk/socket/nsSOCKSIOLayer.cpp
index d20fe7f..4151767 100644
--- a/netwerk/socket/nsSOCKSIOLayer.cpp
+++ b/netwerk/socket/nsSOCKSIOLayer.cpp
@@ -19,9 +19,8 @@
#include "nsIDNSListener.h"
#include "nsICancelable.h"
#include "nsThreadUtils.h"
-#include "nsIURL.h"
#include "nsIFile.h"
-#include "nsNetUtil.h"
+#include "nsIFileProtocolHandler.h"
#include "mozilla/Logging.h"
#include "mozilla/net/DNS.h"
#include "mozilla/unused.h"
@@ -135,9 +134,21 @@ private:
nsresult rv;
MOZ_ASSERT(aProxyAddr);
+ nsCOMPtr<nsIProtocolHandler> protocolHandler(
+ do_GetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "file", &rv));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
+ nsCOMPtr<nsIFileProtocolHandler> fileHandler(
+ do_QueryInterface(protocolHandler, &rv));
+ if (NS_WARN_IF(NS_FAILED(rv))) {
+ return rv;
+ }
+
nsCOMPtr<nsIFile> socketFile;
- rv = NS_GetFileFromURLSpec(aDomainSocketPath,
- getter_AddRefs(socketFile));
+ rv = fileHandler->GetFileFromURLSpec(aDomainSocketPath,
+ getter_AddRefs(socketFile));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 1270277, HasDataMatchingFlavors should only return true for text/unicode, r=snorp
by gk@torproject.org 28 Oct '16
by gk@torproject.org 28 Oct '16
28 Oct '16
commit dc9533fe8ec258aff8bf7c99c9d20586e6f58e5a
Author: Neil Deakin <neil(a)mozilla.com>
Date: Wed May 11 10:04:19 2016 -0400
Bug 1270277, HasDataMatchingFlavors should only return true for text/unicode, r=snorp
---
dom/base/test/test_bug116083.html | 23 +++++++++++++++--------
widget/android/nsClipboard.cpp | 9 ++++++++-
2 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/dom/base/test/test_bug116083.html b/dom/base/test/test_bug116083.html
index dfdef8d..0d37242 100644
--- a/dom/base/test/test_bug116083.html
+++ b/dom/base/test/test_bug116083.html
@@ -52,15 +52,22 @@ const Cc = SpecialPowers.Cc;
const Ci = SpecialPowers.Ci;
function hasExpectedFlavors() {
- var flavors = [
- "text/plain",
- "text/html",
- "application/x-moz-nativehtml",
- ];
var cb = Cc["@mozilla.org/widget/clipboard;1"].
getService(Ci.nsIClipboard);
- return cb.hasDataMatchingFlavors(flavors, flavors.length,
- cb.kGlobalClipboard);
+
+ ok(cb.hasDataMatchingFlavors(["text/unicode"], 1, cb.kGlobalClipboard),
+ "The clipboard has text/unicode");
+
+ // Android only supports plain text
+ if (navigator.appVersion.indexOf("Android") == -1) {
+ ok(cb.hasDataMatchingFlavors(["text/html"], 1, cb.kGlobalClipboard),
+ "The clipboard has text/html");
+ }
+
+ if (navigator.appVersion.indexOf("Win") >= 0) {
+ ok(cb.hasDataMatchingFlavors(["application/x-moz-nativehtml"], 1, cb.kGlobalClipboard),
+ "The clipboard has application/x-moz-nativehtml");
+ }
}
function nextTest() {
@@ -77,7 +84,7 @@ function nextTest() {
synthesizeKey("C", {accelKey: true});
}, function() {
ok(true, div.getAttribute("style") + " passed");
- ok(hasExpectedFlavors(), "The clipboard has the expected flavors");
+ hasExpectedFlavors();
div.parentNode.removeChild(div);
nextTest();
}, function() {
diff --git a/widget/android/nsClipboard.cpp b/widget/android/nsClipboard.cpp
index cf8675b..9a49bb0 100644
--- a/widget/android/nsClipboard.cpp
+++ b/widget/android/nsClipboard.cpp
@@ -97,7 +97,14 @@ nsClipboard::HasDataMatchingFlavors(const char **aFlavorList,
*aHasText = false;
if (aWhichClipboard != kGlobalClipboard)
return NS_ERROR_NOT_IMPLEMENTED;
- *aHasText = widget::Clipboard::HasText();
+
+ for (uint32_t k = 0; k < aLength; k++) {
+ if (strcmp(aFlavorList[k], kUnicodeMime) == 0) {
+ *aHasText = widget::Clipboard::HasText();
+ break;
+ }
+ }
+
return NS_OK;
}
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 1273371, don't use the searchbar for this test, instead use a separate textbox, r=gijs
by gk@torproject.org 28 Oct '16
by gk@torproject.org 28 Oct '16
28 Oct '16
commit 0aa148499aaa1748036e9e89567c6e709dd16dbc
Author: Neil Deakin <neil(a)mozilla.com>
Date: Mon Oct 17 13:55:16 2016 -0400
Bug 1273371, don't use the searchbar for this test, instead use a separate textbox, r=gijs
This and the previous two commits fix bug 20442 in our bug tracker.
---
.../test/general/browser_clipboard_pastefile.js | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/browser/base/content/test/general/browser_clipboard_pastefile.js b/browser/base/content/test/general/browser_clipboard_pastefile.js
index 094628f..55acc2b 100644
--- a/browser/base/content/test/general/browser_clipboard_pastefile.js
+++ b/browser/base/content/test/general/browser_clipboard_pastefile.js
@@ -2,15 +2,16 @@
// event.clipboardData.
add_task(function*() {
- var searchbar = document.getElementById("searchbar");
+ var textbox = document.createElement("textbox");
+ document.documentElement.appendChild(textbox);
- searchbar.focus();
- searchbar.value = "Text";
- searchbar.select();
+ textbox.focus();
+ textbox.value = "Text";
+ textbox.select();
yield new Promise((resolve, reject) => {
- searchbar.addEventListener("copy", function copyEvent(event) {
- searchbar.removeEventListener("copy", copyEvent, true);
+ textbox.addEventListener("copy", function copyEvent(event) {
+ textbox.removeEventListener("copy", copyEvent, true);
event.clipboardData.setData("text/plain", "Alternate");
// For this test, it doesn't matter that the file isn't actually a file.
event.clipboardData.setData("application/x-moz-file", "Sample");
@@ -36,11 +37,11 @@ add_task(function*() {
});
is (output, "Passed", "Paste file");
- searchbar.focus();
+ textbox.focus();
yield new Promise((resolve, reject) => {
- searchbar.addEventListener("paste", function copyEvent(event) {
- searchbar.removeEventListener("paste", copyEvent, true);
+ textbox.addEventListener("paste", function copyEvent(event) {
+ textbox.removeEventListener("paste", copyEvent, true);
let dt = event.clipboardData;
is(dt.types.length, 3, "number of types");
@@ -55,5 +56,7 @@ add_task(function*() {
EventUtils.synthesizeKey("v", { accelKey: true });
});
+ document.documentElement.removeChild(textbox);
+
yield BrowserTestUtils.removeTab(tab);
});
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 1249522, when a file is present, only specify file type, r=smaug
by gk@torproject.org 28 Oct '16
by gk@torproject.org 28 Oct '16
28 Oct '16
commit 3bfc8bc8ea3a87010c2203f752af19b29bf4c0b2
Author: Neil Deakin <neil(a)mozilla.com>
Date: Wed May 11 10:04:19 2016 -0400
Bug 1249522, when a file is present, only specify file type, r=smaug
---
browser/base/content/test/general/browser.ini | 2 +
.../test/general/browser_clipboard_pastefile.js | 59 +++++++++++++++++++++
.../content/test/general/clipboard_pastefile.html | 37 +++++++++++++
dom/events/DataTransfer.cpp | 60 +++++++++++++---------
dom/events/DataTransfer.h | 3 +-
.../mochitest/chrome/test_sanityChromeUtils.xul | 4 +-
6 files changed, 139 insertions(+), 26 deletions(-)
diff --git a/browser/base/content/test/general/browser.ini b/browser/base/content/test/general/browser.ini
index 44e5d15..3224ce5 100644
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -25,6 +25,7 @@ support-files =
bug792517.html
bug792517.sjs
bug839103.css
+ clipboard_pastefile.html
discovery.html
domplate_test.js
download_page.html
@@ -283,6 +284,7 @@ skip-if = os == 'win' || e10s # Bug 1159268 - Need a content-process safe versio
[browser_canonizeURL.js]
skip-if = e10s # Bug 1094510 - test hits the network in e10s mode only
[browser_clipboard.js]
+[browser_clipboard_pastefile.js]
[browser_contentAreaClick.js]
[browser_contextSearchTabPosition.js]
skip-if = os == "mac" || e10s # bug 967013; e10s: bug 1094761 - test hits the network in e10s, causing next test to crash
diff --git a/browser/base/content/test/general/browser_clipboard_pastefile.js b/browser/base/content/test/general/browser_clipboard_pastefile.js
new file mode 100644
index 0000000..094628f
--- /dev/null
+++ b/browser/base/content/test/general/browser_clipboard_pastefile.js
@@ -0,0 +1,59 @@
+// This test is used to check that pasting files removes all non-file data from
+// event.clipboardData.
+
+add_task(function*() {
+ var searchbar = document.getElementById("searchbar");
+
+ searchbar.focus();
+ searchbar.value = "Text";
+ searchbar.select();
+
+ yield new Promise((resolve, reject) => {
+ searchbar.addEventListener("copy", function copyEvent(event) {
+ searchbar.removeEventListener("copy", copyEvent, true);
+ event.clipboardData.setData("text/plain", "Alternate");
+ // For this test, it doesn't matter that the file isn't actually a file.
+ event.clipboardData.setData("application/x-moz-file", "Sample");
+ event.preventDefault();
+ resolve();
+ }, true)
+
+ EventUtils.synthesizeKey("c", { accelKey: true });
+ });
+
+ let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser,
+ "https://example.com/browser/browser/base/content/test/general/clipboard_pas…");
+ let browser = tab.linkedBrowser;
+
+ yield ContentTask.spawn(browser, { }, function* (arg) {
+ content.document.getElementById("input").focus();
+ });
+
+ yield BrowserTestUtils.synthesizeKey("v", { accelKey: true }, browser);
+
+ let output = yield ContentTask.spawn(browser, { }, function* (arg) {
+ return content.document.getElementById("output").textContent;
+ });
+ is (output, "Passed", "Paste file");
+
+ searchbar.focus();
+
+ yield new Promise((resolve, reject) => {
+ searchbar.addEventListener("paste", function copyEvent(event) {
+ searchbar.removeEventListener("paste", copyEvent, true);
+
+ let dt = event.clipboardData;
+ is(dt.types.length, 3, "number of types");
+ ok(dt.types.contains("text/plain"), "text/plain exists in types");
+ ok(dt.mozTypesAt(0).contains("text/plain"), "text/plain exists in mozTypesAt");
+ is(dt.getData("text/plain"), "Alternate", "text/plain returned in getData");
+ is(dt.mozGetDataAt("text/plain", 0), "Alternate", "text/plain returned in mozGetDataAt");
+
+ resolve();
+ }, true);
+
+ EventUtils.synthesizeKey("v", { accelKey: true });
+ });
+
+ yield BrowserTestUtils.removeTab(tab);
+});
diff --git a/browser/base/content/test/general/clipboard_pastefile.html b/browser/base/content/test/general/clipboard_pastefile.html
new file mode 100644
index 0000000..fcbf60e
--- /dev/null
+++ b/browser/base/content/test/general/clipboard_pastefile.html
@@ -0,0 +1,37 @@
+<html><body>
+<script>
+function checkPaste(event)
+{
+ let output = document.getElementById("output");
+ output.textContent = checkPasteHelper(event);
+}
+
+function checkPasteHelper(event)
+{
+ let dt = event.clipboardData;
+ if (dt.types.length != 2)
+ return "Wrong number of types; got " + dt.types.length;
+
+ for (let type of dt.types) {
+ if (type != "Files" && type != "application/x-moz-file")
+ return "Invalid type for types; got" + type;
+ }
+
+ for (let type of dt.mozTypesAt(0)) {
+ if (type != "Files" && type != "application/x-moz-file")
+ return "Invalid type for mozTypesAt; got" + type;
+ }
+
+ if (dt.getData("text/plain"))
+ return "text/plain found with getData";
+ if (dt.mozGetDataAt("text/plain", 0))
+ return "text/plain found with mozGetDataAt";
+
+ return "Passed";
+}
+</script>
+
+<input id="input" onpaste="checkPaste(event)">
+<div id="output"></div>
+
+</body></html>
diff --git a/dom/events/DataTransfer.cpp b/dom/events/DataTransfer.cpp
index 2ad0eff..a6c9342 100644
--- a/dom/events/DataTransfer.cpp
+++ b/dom/events/DataTransfer.cpp
@@ -359,25 +359,8 @@ DataTransfer::GetFiles(nsIDOMFileList** aFileList)
already_AddRefed<DOMStringList>
DataTransfer::Types()
{
- RefPtr<DOMStringList> types = new DOMStringList();
- if (mItems.Length()) {
- bool addFile = false;
- const nsTArray<TransferItem>& item = mItems[0];
- for (uint32_t i = 0; i < item.Length(); i++) {
- const nsString& format = item[i].mFormat;
- types->Add(format);
- if (!addFile) {
- addFile = format.EqualsASCII(kFileMime) ||
- format.EqualsASCII("application/x-moz-file-promise");
- }
- }
-
- if (addFile) {
- types->Add(NS_LITERAL_STRING("Files"));
- }
- }
-
- return types.forget();
+ ErrorResult rv;
+ return MozTypesAt(0, rv);
}
NS_IMETHODIMP
@@ -545,7 +528,7 @@ DataTransfer::GetMozSourceNode(nsIDOMNode** aSourceNode)
}
already_AddRefed<DOMStringList>
-DataTransfer::MozTypesAt(uint32_t aIndex, ErrorResult& aRv)
+DataTransfer::MozTypesAt(uint32_t aIndex, ErrorResult& aRv) const
{
// Only the first item is valid for clipboard events
if (aIndex > 0 &&
@@ -557,10 +540,28 @@ DataTransfer::MozTypesAt(uint32_t aIndex, ErrorResult& aRv)
RefPtr<DOMStringList> types = new DOMStringList();
if (aIndex < mItems.Length()) {
+ bool addFile = false;
// note that you can retrieve the types regardless of their principal
- nsTArray<TransferItem>& item = mItems[aIndex];
- for (uint32_t i = 0; i < item.Length(); i++)
- types->Add(item[i].mFormat);
+ const nsTArray<TransferItem>& item = mItems[aIndex];
+ for (uint32_t i = 0; i < item.Length(); i++) {
+ const nsString& format = item[i].mFormat;
+ types->Add(format);
+ if (!addFile) {
+ addFile = format.EqualsASCII(kFileMime);
+ }
+ }
+
+ if (addFile) {
+ // If this is a content caller, and a file is in the data transfer, remove
+ // the non-file types. This prevents alternate text forms of the file
+ // from being returned.
+ if (!nsContentUtils::LegacyIsCallerChromeOrNativeCode()) {
+ types->Clear();
+ types->Add(NS_LITERAL_STRING(kFileMime));
+ }
+
+ types->Add(NS_LITERAL_STRING("Files"));
+ }
}
return types.forget();
@@ -602,12 +603,23 @@ DataTransfer::GetDataAtInternal(const nsAString& aFormat, uint32_t aIndex,
return NS_ERROR_DOM_INDEX_SIZE_ERR;
}
-
nsAutoString format;
GetRealFormat(aFormat, format);
nsTArray<TransferItem>& item = mItems[aIndex];
+ // If this is a content caller, and a file is in the data transfer, only
+ // return the file type.
+ if (!format.EqualsLiteral(kFileMime) &&
+ !nsContentUtils::IsSystemPrincipal(aSubjectPrincipal)) {
+ uint32_t count = item.Length();
+ for (uint32_t i = 0; i < count; i++) {
+ if (item[i].mFormat.EqualsLiteral(kFileMime)) {
+ return NS_OK;
+ }
+ }
+ }
+
// Check if the caller is allowed to access the drag data. Callers with
// chrome privileges can always read the data. During the
// drop event, allow retrieving the data except in the case where the
diff --git a/dom/events/DataTransfer.h b/dom/events/DataTransfer.h
index 2b1f90a..48fbac9 100644
--- a/dom/events/DataTransfer.h
+++ b/dom/events/DataTransfer.h
@@ -165,7 +165,8 @@ public:
}
}
already_AddRefed<DOMStringList> MozTypesAt(uint32_t aIndex,
- mozilla::ErrorResult& aRv);
+ mozilla::ErrorResult& aRv) const;
+
void MozClearDataAt(const nsAString& aFormat, uint32_t aIndex,
mozilla::ErrorResult& aRv);
void MozSetDataAt(JSContext* aCx, const nsAString& aFormat,
diff --git a/testing/mochitest/chrome/test_sanityChromeUtils.xul b/testing/mochitest/chrome/test_sanityChromeUtils.xul
index ca1915b..f3ac45d 100644
--- a/testing/mochitest/chrome/test_sanityChromeUtils.xul
+++ b/testing/mochitest/chrome/test_sanityChromeUtils.xul
@@ -65,7 +65,9 @@
var dragfile = [[
{ type : "application/x-moz-file",
data : testFile,
- eqTest : function(actualData, expectedData) {return expectedData.equals(actualData);} }
+ eqTest : function(actualData, expectedData) {return expectedData.equals(actualData);} },
+ { type : "Files",
+ data : null }
]];
function doOnDrop(aEvent) {
1
0

[tor-launcher/maint-0.2.10] Bug 20185: Avoid using Unix domain socket paths that are too long
by gk@torproject.org 27 Oct '16
by gk@torproject.org 27 Oct '16
27 Oct '16
commit c916965ec2fe0b29c30414bb3c0ce3bf6ca207c5
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Oct 27 12:02:57 2016 -0400
Bug 20185: Avoid using Unix domain socket paths that are too long
Enforce a maximum length of 100 for Unix domain socket paths.
If $XDG_RUNTIME_DIR is set, create a unique subdirectory within that
directory and place the control and SOCKS sockets there if the
resulting paths will not be too long
else if the length of <tor-data-dir>/control.socket is less than 100
characters, place both sockets under <tor-data-dir> (this is compatible
with the Tor Browser 6.5a3 behavior)
else create a unique subdirectory under /tmp and place the sockets there.
The unique subdirectory that is created under $XDG_RUNTIME_DIR or /tmp
will be named Tor if no such directory exists; otherwise, an integer
suffix will be appended until a new, uniquely named directory is found
such as /tmp/Tor-1.
Also, when starting tor, only include a SocksPort argument if a Unix
domain socket path or a host/port is available.
---
src/components/tl-process.js | 30 +++--
src/modules/tl-util.jsm | 254 ++++++++++++++++++++++++++++++++++---------
2 files changed, 223 insertions(+), 61 deletions(-)
diff --git a/src/components/tl-process.js b/src/components/tl-process.js
index 166a8ae..777a253 100644
--- a/src/components/tl-process.js
+++ b/src/components/tl-process.js
@@ -142,7 +142,11 @@ TorProcessService.prototype =
this.mObsSvc.notifyObservers(null, "TorProcessExited", null);
- if (!this.mIsQuitting)
+ if (this.mIsQuitting)
+ {
+ TorLauncherUtil.cleanupTempDirectories();
+ }
+ else
{
this.mProtocolSvc.TorCleanupConnection();
@@ -399,15 +403,21 @@ TorProcessService.prototype =
// a TCP port and an IPC port (e.g., a Unix domain socket).
if (socksPortInfo)
{
- let socksPortArg = (socksPortInfo.ipcFile)
- ? this._ipcPortArg(socksPortInfo.ipcFile)
- : socksPortInfo.host + ':' + socksPortInfo.port;
- let socksPortFlags = TorLauncherUtil.getCharPref(
- "extensions.torlauncher.socks_port_flags");
- if (socksPortFlags)
- socksPortArg += ' ' + socksPortFlags;
- args.push("SocksPort");
- args.push(socksPortArg);
+ let socksPortArg;
+ if (socksPortInfo.ipcFile)
+ socksPortArg = this._ipcPortArg(socksPortInfo.ipcFile)
+ else if (socksPortInfo.host && (socksPortInfo.port != 0))
+ socksPortArg = socksPortInfo.host + ':' + socksPortInfo.port;
+
+ if (socksPortArg)
+ {
+ let socksPortFlags = TorLauncherUtil.getCharPref(
+ "extensions.torlauncher.socks_port_flags");
+ if (socksPortFlags)
+ socksPortArg += ' ' + socksPortFlags;
+ args.push("SocksPort");
+ args.push(socksPortArg);
+ }
}
var pid = this._getpid();
diff --git a/src/modules/tl-util.jsm b/src/modules/tl-util.jsm
index a18f779..313a51b 100644
--- a/src/modules/tl-util.jsm
+++ b/src/modules/tl-util.jsm
@@ -247,6 +247,14 @@ let TorLauncherUtil = // Public
} catch (e) {}
},
+ clearUserPref: function(aPrefName)
+ {
+ try
+ {
+ TLUtilInternal.mPrefsSvc.clearUserPref(aPrefName);
+ } catch (e) {}
+ },
+
// Currently, this returns a random permutation of an array, bridgeArray.
// Later, we might want to change this function to weight based on the
// bridges' bandwidths.
@@ -377,22 +385,97 @@ let TorLauncherUtil = // Public
if (!aTorFileType)
return null;
- let isRelativePath = true;
+ let torFile; // an nsIFile to be returned
+ let path; // a relative or absolute path that will determine torFile
+
+ let isRelativePath = false;
let isUserData = (aTorFileType != "tor") &&
(aTorFileType != "torrc-defaults");
let isControlIPC = ("control_ipc" == aTorFileType);
let isSOCKSIPC = ("socks_ipc" == aTorFileType);
let isIPC = isControlIPC || isSOCKSIPC;
+ let checkIPCPathLen = true;
+
+ const kControlIPCFileName = "control.socket";
+ const kSOCKSIPCFileName = "socks.socket";
+ let extraIPCPathLen = (isSOCKSIPC) ? 2 : 0;
+ let ipcFileName;
+ if (isControlIPC)
+ ipcFileName = kControlIPCFileName;
+ else if (isSOCKSIPC)
+ ipcFileName = kSOCKSIPCFileName;
+
+ // If this is the first request for an IPC path during this browser
+ // session, remove the old temporary directory. This helps to keep /tmp
+ // clean if the browser crashes or is killed.
+ let ipcDirPath;
+ if (isIPC && TLUtilInternal.mIsFirstIPCPathRequest)
+ {
+ this.cleanupTempDirectories();
+ TLUtilInternal.mIsFirstIPCPathRequest = false;
+ }
+ else
+ {
+ // Retrieve path for IPC objects (it may have already been determined).
+ ipcDirPath = this.getCharPref(TLUtilInternal.kIPCDirPrefName);
+ }
+
+ // First, check the _path preference for this file type.
let prefName = "extensions.torlauncher." + aTorFileType + "_path";
- let path = this.getCharPref(prefName);
+ path = this.getCharPref(prefName);
if (path)
{
let re = (this.isWindows) ? /^[A-Za-z]:\\/ : /^\//;
isRelativePath = !re.test(path);
+ checkIPCPathLen = false; // always try to use path if provided in pref
}
- else
+ else if (isIPC)
+ {
+ if (ipcDirPath)
+ {
+ // We have already determined where IPC objects will be placed.
+ torFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ torFile.initWithPath(ipcDirPath);
+ torFile.append(ipcFileName);
+ checkIPCPathLen = false; // already checked.
+ }
+ else
+ {
+ // If XDG_RUNTIME_DIR is set, use it as the base directory for IPC
+ // objects (e.g., Unix domain sockets) -- assuming it is not too long.
+ let env = Cc["@mozilla.org/process/environment;1"]
+ .getService(Ci.nsIEnvironment);
+ if (env.exists("XDG_RUNTIME_DIR"))
+ {
+ let ipcDir = TLUtilInternal._createUniqueIPCDir(
+ env.get("XDG_RUNTIME_DIR"));
+ if (ipcDir)
+ {
+ let f = ipcDir.clone();
+ f.append(ipcFileName);
+ if (TLUtilInternal._isIPCPathLengthOK(f.path, extraIPCPathLen))
+ {
+ torFile = f;
+ checkIPCPathLen = false; // no need to check again.
+
+ // Store directory path so it can be reused for other IPC objects
+ // and so it can be removed during exit.
+ this.setCharPref(TLUtilInternal.kIPCDirPrefName, ipcDir.path);
+ }
+ else
+ {
+ // too long; remove the directory that we just created.
+ ipcDir.remove(false);
+ }
+ }
+ }
+ }
+ }
+
+ if (!path && !torFile)
{
- // Get default path.
+ // No preference and no pre-determined IPC path: use a default path.
+ isRelativePath = true;
if (TLUtilInternal._isUserDataOutsideOfAppDir)
{
// This block is used for the TorBrowser-Data/ case.
@@ -417,10 +500,8 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlIPC)
- path = "Tor/control.socket";
- else if (isSOCKSIPC)
- path = "Tor/socks.socket";
+ else if (isIPC)
+ path = "Tor/" + ipcFileName;
}
else // Linux and others.
{
@@ -432,10 +513,8 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlIPC)
- path = "Tor/control.socket";
- else if (isSOCKSIPC)
- path = "Tor/socks.socket";
+ else if (isIPC)
+ path = "Tor/" + ipcFileName;
}
}
else if (this.isWindows)
@@ -461,67 +540,90 @@ let TorLauncherUtil = // Public
path = "Data/Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Data/Tor";
- else if (isControlIPC)
- path = "Data/Tor/control.socket";
- else if (isSOCKSIPC)
- path = "Data/Tor/socks.socket";
+ else if (isIPC)
+ path = "Data/Tor/" + ipcFileName;
}
- }
- if (!path)
- return null;
+ if (!path)
+ return null;
+ }
try
{
- let f;
- if (isRelativePath)
+ if (path)
{
- // Turn 'path' into an absolute path.
- if (TLUtilInternal._isUserDataOutsideOfAppDir)
+ if (isRelativePath)
{
- let baseDir = isUserData ? TLUtilInternal._dataDir
- : TLUtilInternal._appDir;
- f = baseDir.clone();
+ // Turn 'path' into an absolute path.
+ if (TLUtilInternal._isUserDataOutsideOfAppDir)
+ {
+ let baseDir = isUserData ? TLUtilInternal._dataDir
+ : TLUtilInternal._appDir;
+ torFile = baseDir.clone();
+ }
+ else
+ {
+ torFile = TLUtilInternal._appDir.clone();
+ torFile.append("TorBrowser");
+ }
+ torFile.appendRelativePath(path);
}
else
{
- f = TLUtilInternal._appDir.clone();
- f.append("TorBrowser");
+ torFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ torFile.initWithPath(path);
}
- f.appendRelativePath(path);
- }
- else
- {
- f = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
- f.initWithPath(path);
- }
- if (!f.exists() && !isIPC && aCreate)
- {
- try
- {
- if ("tordatadir" == aTorFileType)
- f.create(f.DIRECTORY_TYPE, 0700);
- else
- f.create(f.NORMAL_FILE_TYPE, 0600);
- }
- catch (e)
+ if (!torFile.exists() && !isIPC && aCreate)
{
- TorLauncherLogger.safelog(4, "unable to create " + f.path + ": ", e);
- return null;
+ try
+ {
+ if ("tordatadir" == aTorFileType)
+ torFile.create(torFile.DIRECTORY_TYPE, 0700);
+ else
+ torFile.create(torFile.NORMAL_FILE_TYPE, 0600);
+ }
+ catch (e)
+ {
+ TorLauncherLogger.safelog(4,
+ "unable to create " + torFile.path + ": ", e);
+ return null;
+ }
}
}
// If the file exists or an IPC object was requested, normalize the path
// and return a file object. The control and SOCKS IPC objects will be
// created by tor.
- if (f.exists() || isIPC)
+ if (torFile.exists() || isIPC)
{
- try { f.normalize(); } catch(e) {}
- return f;
+ try { torFile.normalize(); } catch(e) {}
+
+ // Ensure that the IPC path length is short enough for use by the
+ // operating system. If not, create and use a unique directory under
+ // /tmp for all IPC objects. The created directory path is stored in
+ // a preference so it can be reused for other IPC objects and so it
+ // can be removed during exit.
+ if (isIPC && checkIPCPathLen &&
+ !TLUtilInternal._isIPCPathLengthOK(torFile.path, extraIPCPathLen))
+ {
+ torFile = TLUtilInternal._createUniqueIPCDir("/tmp");
+ if (!torFile)
+ {
+ TorLauncherLogger.log(4,
+ "failed to create unique directory under /tmp");
+ return null;
+ }
+
+ this.setCharPref(TLUtilInternal.kIPCDirPrefName, torFile.path);
+ torFile.append(ipcFileName);
+ }
+
+ return torFile;
}
- TorLauncherLogger.log(4, aTorFileType + " file not found: " + f.path);
+ TorLauncherLogger.log(4, aTorFileType + " file not found: "
+ + torFile.path);
}
catch(e)
{
@@ -531,6 +633,22 @@ let TorLauncherUtil = // Public
return null; // File not found or error (logged above).
}, // getTorFile()
+
+ cleanupTempDirectories: function()
+ {
+ try
+ {
+ let dirPath = this.getCharPref(TLUtilInternal.kIPCDirPrefName);
+ this.clearUserPref(TLUtilInternal.kIPCDirPrefName);
+ if (dirPath)
+ {
+ let f = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ f.initWithPath(dirPath);
+ if (f.exists())
+ f.remove(false); // Remove directory if it is empty
+ }
+ } catch(e) {}
+ },
};
@@ -541,6 +659,7 @@ let TLUtilInternal = // Private
{
kThunderbirdID: "{3550f703-e582-4d05-9a08-453d09bdfdc6}",
kInstantbirdID: "{33cb9019-c295-46dd-be21-8c4936574bee}",
+ kIPCDirPrefName: "extensions.torlauncher.tmp_ipc_dir",
mPrefsSvc : null,
mStringBundle : null,
@@ -550,6 +669,7 @@ let TLUtilInternal = // Private
// this._isUserDataOutsideOfAppDir)
mAppDir: null, // nsIFile (cached; access via this._appDir)
mDataDir: null, // nsIFile (cached; access via this._dataDir)
+ mIsFirstIPCPathRequest : true,
_init: function()
{
@@ -662,6 +782,38 @@ let TLUtilInternal = // Private
return this.mDataDir;
}, // get _dataDir
+ // Return true if aPath is short enough to be used as an IPC object path,
+ // e.g., for a Unix domain socket path. aExtraLen is the "delta" necessary
+ // to accommodate other IPC objects that have longer names; it is used to
+ // account for "control.socket" vs. "socks.socket" (we want to ensure that
+ // all IPC objects are placed in the same parent directory unless the user
+ // has set prefs or env vars to explicitly specify the path for an object).
+ // We enforce a maximum length of 100 because all operating systems allow
+ // at least 100 characters for Unix domain socket paths.
+ _isIPCPathLengthOK: function(aPath, aExtraLen)
+ {
+ const kMaxIPCPathLen = 100;
+ return aPath && ((aPath.length + aExtraLen) <= kMaxIPCPathLen);
+ },
+
+ // Returns an nsIFile or null if a unique directory could not be created.
+ _createUniqueIPCDir: function(aBasePath)
+ {
+ try
+ {
+ let d = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ d.initWithPath(aBasePath);
+ d.append("Tor");
+ d.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 0700);
+ return d;
+ }
+ catch (e)
+ {
+ TorLauncherLogger.safelog(4, "_createUniqueIPCDir failed for "
+ + aBasePath + ": ", e);
+ return null;
+ }
+ },
};
1
0

[tor-launcher/master] Bug 20185: Avoid using Unix domain socket paths that are too long
by gk@torproject.org 27 Oct '16
by gk@torproject.org 27 Oct '16
27 Oct '16
commit 4dd8f6130f931616cf014e0ded444c30e04c8bad
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Oct 27 12:02:57 2016 -0400
Bug 20185: Avoid using Unix domain socket paths that are too long
Enforce a maximum length of 100 for Unix domain socket paths.
If $XDG_RUNTIME_DIR is set, create a unique subdirectory within that
directory and place the control and SOCKS sockets there if the
resulting paths will not be too long
else if the length of <tor-data-dir>/control.socket is less than 100
characters, place both sockets under <tor-data-dir> (this is compatible
with the Tor Browser 6.5a3 behavior)
else create a unique subdirectory under /tmp and place the sockets there.
The unique subdirectory that is created under $XDG_RUNTIME_DIR or /tmp
will be named Tor if no such directory exists; otherwise, an integer
suffix will be appended until a new, uniquely named directory is found
such as /tmp/Tor-1.
Also, when starting tor, only include a SocksPort argument if a Unix
domain socket path or a host/port is available.
---
src/components/tl-process.js | 30 +++--
src/modules/tl-util.jsm | 254 ++++++++++++++++++++++++++++++++++---------
2 files changed, 223 insertions(+), 61 deletions(-)
diff --git a/src/components/tl-process.js b/src/components/tl-process.js
index 844aba1..de71d45 100644
--- a/src/components/tl-process.js
+++ b/src/components/tl-process.js
@@ -142,7 +142,11 @@ TorProcessService.prototype =
this.mObsSvc.notifyObservers(null, "TorProcessExited", null);
- if (!this.mIsQuitting)
+ if (this.mIsQuitting)
+ {
+ TorLauncherUtil.cleanupTempDirectories();
+ }
+ else
{
this.mProtocolSvc.TorCleanupConnection();
@@ -395,15 +399,21 @@ TorProcessService.prototype =
// a TCP port and an IPC port (e.g., a Unix domain socket).
if (socksPortInfo)
{
- let socksPortArg = (socksPortInfo.ipcFile)
- ? this._ipcPortArg(socksPortInfo.ipcFile)
- : socksPortInfo.host + ':' + socksPortInfo.port;
- let socksPortFlags = TorLauncherUtil.getCharPref(
- "extensions.torlauncher.socks_port_flags");
- if (socksPortFlags)
- socksPortArg += ' ' + socksPortFlags;
- args.push("SocksPort");
- args.push(socksPortArg);
+ let socksPortArg;
+ if (socksPortInfo.ipcFile)
+ socksPortArg = this._ipcPortArg(socksPortInfo.ipcFile)
+ else if (socksPortInfo.host && (socksPortInfo.port != 0))
+ socksPortArg = socksPortInfo.host + ':' + socksPortInfo.port;
+
+ if (socksPortArg)
+ {
+ let socksPortFlags = TorLauncherUtil.getCharPref(
+ "extensions.torlauncher.socks_port_flags");
+ if (socksPortFlags)
+ socksPortArg += ' ' + socksPortFlags;
+ args.push("SocksPort");
+ args.push(socksPortArg);
+ }
}
var pid = this._getpid();
diff --git a/src/modules/tl-util.jsm b/src/modules/tl-util.jsm
index a1256fd..2f8d14e 100644
--- a/src/modules/tl-util.jsm
+++ b/src/modules/tl-util.jsm
@@ -251,6 +251,14 @@ let TorLauncherUtil = // Public
} catch (e) {}
},
+ clearUserPref: function(aPrefName)
+ {
+ try
+ {
+ TLUtilInternal.mPrefsSvc.clearUserPref(aPrefName);
+ } catch (e) {}
+ },
+
// Currently, this returns a random permutation of an array, bridgeArray.
// Later, we might want to change this function to weight based on the
// bridges' bandwidths.
@@ -397,22 +405,97 @@ let TorLauncherUtil = // Public
if (!aTorFileType)
return null;
- let isRelativePath = true;
+ let torFile; // an nsIFile to be returned
+ let path; // a relative or absolute path that will determine torFile
+
+ let isRelativePath = false;
let isUserData = (aTorFileType != "tor") &&
(aTorFileType != "torrc-defaults");
let isControlIPC = ("control_ipc" == aTorFileType);
let isSOCKSIPC = ("socks_ipc" == aTorFileType);
let isIPC = isControlIPC || isSOCKSIPC;
+ let checkIPCPathLen = true;
+
+ const kControlIPCFileName = "control.socket";
+ const kSOCKSIPCFileName = "socks.socket";
+ let extraIPCPathLen = (isSOCKSIPC) ? 2 : 0;
+ let ipcFileName;
+ if (isControlIPC)
+ ipcFileName = kControlIPCFileName;
+ else if (isSOCKSIPC)
+ ipcFileName = kSOCKSIPCFileName;
+
+ // If this is the first request for an IPC path during this browser
+ // session, remove the old temporary directory. This helps to keep /tmp
+ // clean if the browser crashes or is killed.
+ let ipcDirPath;
+ if (isIPC && TLUtilInternal.mIsFirstIPCPathRequest)
+ {
+ this.cleanupTempDirectories();
+ TLUtilInternal.mIsFirstIPCPathRequest = false;
+ }
+ else
+ {
+ // Retrieve path for IPC objects (it may have already been determined).
+ ipcDirPath = this.getCharPref(TLUtilInternal.kIPCDirPrefName);
+ }
+
+ // First, check the _path preference for this file type.
let prefName = "extensions.torlauncher." + aTorFileType + "_path";
- let path = this.getCharPref(prefName);
+ path = this.getCharPref(prefName);
if (path)
{
let re = (this.isWindows) ? /^[A-Za-z]:\\/ : /^\//;
isRelativePath = !re.test(path);
+ checkIPCPathLen = false; // always try to use path if provided in pref
}
- else
+ else if (isIPC)
+ {
+ if (ipcDirPath)
+ {
+ // We have already determined where IPC objects will be placed.
+ torFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ torFile.initWithPath(ipcDirPath);
+ torFile.append(ipcFileName);
+ checkIPCPathLen = false; // already checked.
+ }
+ else
+ {
+ // If XDG_RUNTIME_DIR is set, use it as the base directory for IPC
+ // objects (e.g., Unix domain sockets) -- assuming it is not too long.
+ let env = Cc["@mozilla.org/process/environment;1"]
+ .getService(Ci.nsIEnvironment);
+ if (env.exists("XDG_RUNTIME_DIR"))
+ {
+ let ipcDir = TLUtilInternal._createUniqueIPCDir(
+ env.get("XDG_RUNTIME_DIR"));
+ if (ipcDir)
+ {
+ let f = ipcDir.clone();
+ f.append(ipcFileName);
+ if (TLUtilInternal._isIPCPathLengthOK(f.path, extraIPCPathLen))
+ {
+ torFile = f;
+ checkIPCPathLen = false; // no need to check again.
+
+ // Store directory path so it can be reused for other IPC objects
+ // and so it can be removed during exit.
+ this.setCharPref(TLUtilInternal.kIPCDirPrefName, ipcDir.path);
+ }
+ else
+ {
+ // too long; remove the directory that we just created.
+ ipcDir.remove(false);
+ }
+ }
+ }
+ }
+ }
+
+ if (!path && !torFile)
{
- // Get default path.
+ // No preference and no pre-determined IPC path: use a default path.
+ isRelativePath = true;
if (TLUtilInternal._isUserDataOutsideOfAppDir)
{
// This block is used for the TorBrowser-Data/ case.
@@ -437,10 +520,8 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlIPC)
- path = "Tor/control.socket";
- else if (isSOCKSIPC)
- path = "Tor/socks.socket";
+ else if (isIPC)
+ path = "Tor/" + ipcFileName;
}
else // Linux and others.
{
@@ -452,10 +533,8 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlIPC)
- path = "Tor/control.socket";
- else if (isSOCKSIPC)
- path = "Tor/socks.socket";
+ else if (isIPC)
+ path = "Tor/" + ipcFileName;
}
}
else if (this.isWindows)
@@ -481,67 +560,90 @@ let TorLauncherUtil = // Public
path = "Data/Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Data/Tor";
- else if (isControlIPC)
- path = "Data/Tor/control.socket";
- else if (isSOCKSIPC)
- path = "Data/Tor/socks.socket";
+ else if (isIPC)
+ path = "Data/Tor/" + ipcFileName;
}
- }
- if (!path)
- return null;
+ if (!path)
+ return null;
+ }
try
{
- let f;
- if (isRelativePath)
+ if (path)
{
- // Turn 'path' into an absolute path.
- if (TLUtilInternal._isUserDataOutsideOfAppDir)
+ if (isRelativePath)
{
- let baseDir = isUserData ? TLUtilInternal._dataDir
- : TLUtilInternal._appDir;
- f = baseDir.clone();
+ // Turn 'path' into an absolute path.
+ if (TLUtilInternal._isUserDataOutsideOfAppDir)
+ {
+ let baseDir = isUserData ? TLUtilInternal._dataDir
+ : TLUtilInternal._appDir;
+ torFile = baseDir.clone();
+ }
+ else
+ {
+ torFile = TLUtilInternal._appDir.clone();
+ torFile.append("TorBrowser");
+ }
+ torFile.appendRelativePath(path);
}
else
{
- f = TLUtilInternal._appDir.clone();
- f.append("TorBrowser");
+ torFile = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ torFile.initWithPath(path);
}
- f.appendRelativePath(path);
- }
- else
- {
- f = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
- f.initWithPath(path);
- }
- if (!f.exists() && !isIPC && aCreate)
- {
- try
- {
- if ("tordatadir" == aTorFileType)
- f.create(f.DIRECTORY_TYPE, 0700);
- else
- f.create(f.NORMAL_FILE_TYPE, 0600);
- }
- catch (e)
+ if (!torFile.exists() && !isIPC && aCreate)
{
- TorLauncherLogger.safelog(4, "unable to create " + f.path + ": ", e);
- return null;
+ try
+ {
+ if ("tordatadir" == aTorFileType)
+ torFile.create(torFile.DIRECTORY_TYPE, 0700);
+ else
+ torFile.create(torFile.NORMAL_FILE_TYPE, 0600);
+ }
+ catch (e)
+ {
+ TorLauncherLogger.safelog(4,
+ "unable to create " + torFile.path + ": ", e);
+ return null;
+ }
}
}
// If the file exists or an IPC object was requested, normalize the path
// and return a file object. The control and SOCKS IPC objects will be
// created by tor.
- if (f.exists() || isIPC)
+ if (torFile.exists() || isIPC)
{
- try { f.normalize(); } catch(e) {}
- return f;
+ try { torFile.normalize(); } catch(e) {}
+
+ // Ensure that the IPC path length is short enough for use by the
+ // operating system. If not, create and use a unique directory under
+ // /tmp for all IPC objects. The created directory path is stored in
+ // a preference so it can be reused for other IPC objects and so it
+ // can be removed during exit.
+ if (isIPC && checkIPCPathLen &&
+ !TLUtilInternal._isIPCPathLengthOK(torFile.path, extraIPCPathLen))
+ {
+ torFile = TLUtilInternal._createUniqueIPCDir("/tmp");
+ if (!torFile)
+ {
+ TorLauncherLogger.log(4,
+ "failed to create unique directory under /tmp");
+ return null;
+ }
+
+ this.setCharPref(TLUtilInternal.kIPCDirPrefName, torFile.path);
+ torFile.append(ipcFileName);
+ }
+
+ return torFile;
}
- TorLauncherLogger.log(4, aTorFileType + " file not found: " + f.path);
+ TorLauncherLogger.log(4, aTorFileType + " file not found: "
+ + torFile.path);
}
catch(e)
{
@@ -551,6 +653,22 @@ let TorLauncherUtil = // Public
return null; // File not found or error (logged above).
}, // getTorFile()
+
+ cleanupTempDirectories: function()
+ {
+ try
+ {
+ let dirPath = this.getCharPref(TLUtilInternal.kIPCDirPrefName);
+ this.clearUserPref(TLUtilInternal.kIPCDirPrefName);
+ if (dirPath)
+ {
+ let f = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ f.initWithPath(dirPath);
+ if (f.exists())
+ f.remove(false); // Remove directory if it is empty
+ }
+ } catch(e) {}
+ },
};
@@ -561,6 +679,7 @@ let TLUtilInternal = // Private
{
kThunderbirdID: "{3550f703-e582-4d05-9a08-453d09bdfdc6}",
kInstantbirdID: "{33cb9019-c295-46dd-be21-8c4936574bee}",
+ kIPCDirPrefName: "extensions.torlauncher.tmp_ipc_dir",
mPrefsSvc : null,
mStringBundle : null,
@@ -570,6 +689,7 @@ let TLUtilInternal = // Private
// this._isUserDataOutsideOfAppDir)
mAppDir: null, // nsIFile (cached; access via this._appDir)
mDataDir: null, // nsIFile (cached; access via this._dataDir)
+ mIsFirstIPCPathRequest : true,
_init: function()
{
@@ -682,6 +802,38 @@ let TLUtilInternal = // Private
return this.mDataDir;
}, // get _dataDir
+ // Return true if aPath is short enough to be used as an IPC object path,
+ // e.g., for a Unix domain socket path. aExtraLen is the "delta" necessary
+ // to accommodate other IPC objects that have longer names; it is used to
+ // account for "control.socket" vs. "socks.socket" (we want to ensure that
+ // all IPC objects are placed in the same parent directory unless the user
+ // has set prefs or env vars to explicitly specify the path for an object).
+ // We enforce a maximum length of 100 because all operating systems allow
+ // at least 100 characters for Unix domain socket paths.
+ _isIPCPathLengthOK: function(aPath, aExtraLen)
+ {
+ const kMaxIPCPathLen = 100;
+ return aPath && ((aPath.length + aExtraLen) <= kMaxIPCPathLen);
+ },
+
+ // Returns an nsIFile or null if a unique directory could not be created.
+ _createUniqueIPCDir: function(aBasePath)
+ {
+ try
+ {
+ let d = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile);
+ d.initWithPath(aBasePath);
+ d.append("Tor");
+ d.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 0700);
+ return d;
+ }
+ catch (e)
+ {
+ TorLauncherLogger.safelog(4, "_createUniqueIPCDir failed for "
+ + aBasePath + ": ", e);
+ return null;
+ }
+ },
};
1
0

[tor-launcher/maint-0.2.10] Bug 20429: Do not open progress window if TOR_SKIP_LAUNCH=1
by gk@torproject.org 27 Oct '16
by gk@torproject.org 27 Oct '16
27 Oct '16
commit 8aa78d3a78bbabe01759b63d837b09acdf53be42
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Oct 26 15:00:06 2016 -0400
Bug 20429: Do not open progress window if TOR_SKIP_LAUNCH=1
After saving tor settings, if TOR_SKIP_LAUNCH=1 or if
extensions.torlauncher.start_tor is false, avoid opening the progress
dialog to monitor bootstrap progress. This avoids displaying a progress
window that will not make progress (and the situation was made worse by
the fact that clicking Cancel set DisableNetwork=1).
Also, leave the network settings dialog open if we fail to set
DisableNetwork=0.
---
src/chrome/content/network-settings.js | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/chrome/content/network-settings.js b/src/chrome/content/network-settings.js
index 2736f08..dc54445 100644
--- a/src/chrome/content/network-settings.js
+++ b/src/chrome/content/network-settings.js
@@ -1055,11 +1055,22 @@ function useSettings()
{
var settings = {};
settings[kTorConfKeyDisableNetwork] = false;
- setConfAndReportErrors(settings, null);
+ let didApply = setConfAndReportErrors(settings, null);
+ if (!didApply)
+ return;
gProtocolSvc.TorSendCommand("SAVECONF");
gTorProcessService.TorClearBootstrapError();
+ // If we are not responsible for starting tor we do not monitor bootstrap
+ // status, so just close this dialog and return rather than opening the
+ // progress dialog (which will make no progress).
+ if (!TorLauncherUtil.shouldStartAndOwnTor)
+ {
+ close();
+ return;
+ }
+
gIsBootstrapComplete = gTorProcessService.TorIsBootstrapDone;
if (!gIsBootstrapComplete)
openProgressDialog();
1
0

[tor-launcher/maint-0.2.9] Bug 20429: Do not open progress window if TOR_SKIP_LAUNCH=1
by gk@torproject.org 27 Oct '16
by gk@torproject.org 27 Oct '16
27 Oct '16
commit 2014143e0081170267a34e3a102878999dee6a29
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Oct 26 15:00:06 2016 -0400
Bug 20429: Do not open progress window if TOR_SKIP_LAUNCH=1
After saving tor settings, if TOR_SKIP_LAUNCH=1 or if
extensions.torlauncher.start_tor is false, avoid opening the progress
dialog to monitor bootstrap progress. This avoids displaying a progress
window that will not make progress (and the situation was made worse by
the fact that clicking Cancel set DisableNetwork=1).
Also, leave the network settings dialog open if we fail to set
DisableNetwork=0.
---
src/chrome/content/network-settings.js | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/chrome/content/network-settings.js b/src/chrome/content/network-settings.js
index 2736f08..dc54445 100644
--- a/src/chrome/content/network-settings.js
+++ b/src/chrome/content/network-settings.js
@@ -1055,11 +1055,22 @@ function useSettings()
{
var settings = {};
settings[kTorConfKeyDisableNetwork] = false;
- setConfAndReportErrors(settings, null);
+ let didApply = setConfAndReportErrors(settings, null);
+ if (!didApply)
+ return;
gProtocolSvc.TorSendCommand("SAVECONF");
gTorProcessService.TorClearBootstrapError();
+ // If we are not responsible for starting tor we do not monitor bootstrap
+ // status, so just close this dialog and return rather than opening the
+ // progress dialog (which will make no progress).
+ if (!TorLauncherUtil.shouldStartAndOwnTor)
+ {
+ close();
+ return;
+ }
+
gIsBootstrapComplete = gTorProcessService.TorIsBootstrapDone;
if (!gIsBootstrapComplete)
openProgressDialog();
1
0

[tor-launcher/master] Bug 20429: Do not open progress window if TOR_SKIP_LAUNCH=1
by gk@torproject.org 27 Oct '16
by gk@torproject.org 27 Oct '16
27 Oct '16
commit c12d56470b7164c33b3cb2e48a90dc65151a9a26
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Oct 26 15:00:06 2016 -0400
Bug 20429: Do not open progress window if TOR_SKIP_LAUNCH=1
After saving tor settings, if TOR_SKIP_LAUNCH=1 or if
extensions.torlauncher.start_tor is false, avoid opening the progress
dialog to monitor bootstrap progress. This avoids displaying a progress
window that will not make progress (and the situation was made worse by
the fact that clicking Cancel set DisableNetwork=1).
Also, leave the network settings dialog open if we fail to set
DisableNetwork=0.
---
src/chrome/content/network-settings.js | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/src/chrome/content/network-settings.js b/src/chrome/content/network-settings.js
index e0d7d1c..5df4e1e 100644
--- a/src/chrome/content/network-settings.js
+++ b/src/chrome/content/network-settings.js
@@ -1209,11 +1209,22 @@ function useSettings()
{
var settings = {};
settings[kTorConfKeyDisableNetwork] = false;
- setConfAndReportErrors(settings, null);
+ let didApply = setConfAndReportErrors(settings, null);
+ if (!didApply)
+ return;
gProtocolSvc.TorSendCommand("SAVECONF");
gTorProcessService.TorClearBootstrapError();
+ // If we are not responsible for starting tor we do not monitor bootstrap
+ // status, so just close this dialog and return rather than opening the
+ // progress dialog (which will make no progress).
+ if (!TorLauncherUtil.shouldStartAndOwnTor)
+ {
+ close();
+ return;
+ }
+
gIsBootstrapComplete = gTorProcessService.TorIsBootstrapDone;
if (!gIsBootstrapComplete)
openProgressDialog();
1
0

[tor-browser/tor-browser-45.4.0esr-6.0-1] fixup! Bug 1070710 - Add mozilla::ViewRegion which assembles a LayoutDeviceIntRegion as NSViews. r=spohl
by gk@torproject.org 26 Oct '16
by gk@torproject.org 26 Oct '16
26 Oct '16
commit 41f1c54ad978155f964fca1100f0c2eda1bef88a
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Oct 25 23:01:20 2016 -0400
fixup! Bug 1070710 - Add mozilla::ViewRegion which assembles a LayoutDeviceIntRegion as NSViews. r=spohl
OSX: Fix a problem where clicking and dragging in the content area of a
window would sometimes cause the window to move. This is a fixup for an
error introduced while backporting a Mozilla patch for Tor bug 20204.
---
widget/cocoa/ViewRegion.mm | 1 -
1 file changed, 1 deletion(-)
diff --git a/widget/cocoa/ViewRegion.mm b/widget/cocoa/ViewRegion.mm
index 3459849..ee31889 100644
--- a/widget/cocoa/ViewRegion.mm
+++ b/widget/cocoa/ViewRegion.mm
@@ -56,7 +56,6 @@ ViewRegion::UpdateRegion(const LayoutDeviceIntRegion& aRegion,
}
[view setNeedsDisplay:YES];
mViews.AppendElement(view);
- iter.Next();
} else {
// Our new region is made of fewer rects than the old region, so we can
// remove this view. We only have a weak reference to it, so removing it
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] fixup! Bug 1070710 - Add mozilla::ViewRegion which assembles a LayoutDeviceIntRegion as NSViews. r=spohl
by gk@torproject.org 26 Oct '16
by gk@torproject.org 26 Oct '16
26 Oct '16
commit a6b4bb9a9d2769e8be110f2f0486b9ec74882575
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Oct 25 23:01:20 2016 -0400
fixup! Bug 1070710 - Add mozilla::ViewRegion which assembles a LayoutDeviceIntRegion as NSViews. r=spohl
OSX: Fix a problem where clicking and dragging in the content area of a
window would sometimes cause the window to move. This is a fixup for an
error introduced while backporting a Mozilla patch for Tor bug 20204.
---
widget/cocoa/ViewRegion.mm | 1 -
1 file changed, 1 deletion(-)
diff --git a/widget/cocoa/ViewRegion.mm b/widget/cocoa/ViewRegion.mm
index 3459849..ee31889 100644
--- a/widget/cocoa/ViewRegion.mm
+++ b/widget/cocoa/ViewRegion.mm
@@ -56,7 +56,6 @@ ViewRegion::UpdateRegion(const LayoutDeviceIntRegion& aRegion,
}
[view setNeedsDisplay:YES];
mViews.AppendElement(view);
- iter.Next();
} else {
// Our new region is made of fewer rects than the old region, so we can
// remove this view. We only have a weak reference to it, so removing it
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 1311044 - show error when connection to domain socket is failed; r=bagder
by gk@torproject.org 25 Oct '16
by gk@torproject.org 25 Oct '16
25 Oct '16
commit b91682cd038d63eb2dbec1303c2ab9a65a43775b
Author: Liang-Heng Chen <xeonchen(a)mozilla.com>
Date: Wed Oct 19 18:28:02 2016 +0800
Bug 1311044 - show error when connection to domain socket is failed; r=bagder
MozReview-Commit-ID: GtqKiMVwQyX
--HG--
extra : rebase_source : 04e3b258f06e7d3e196c241c96aa3cc92ec334da
---
netwerk/socket/nsSOCKSIOLayer.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/netwerk/socket/nsSOCKSIOLayer.cpp b/netwerk/socket/nsSOCKSIOLayer.cpp
index be69725..d20fe7f 100644
--- a/netwerk/socket/nsSOCKSIOLayer.cpp
+++ b/netwerk/socket/nsSOCKSIOLayer.cpp
@@ -515,10 +515,16 @@ nsSOCKSSocketInfo::ConnectToProxy(PRFileDesc *fd)
status = fd->lower->methods->connect(fd->lower, &prProxy, mTimeout);
if (status != PR_SUCCESS) {
PRErrorCode c = PR_GetError();
+
// If EINPROGRESS, return now and check back later after polling
if (c == PR_WOULD_BLOCK_ERROR || c == PR_IN_PROGRESS_ERROR) {
mState = SOCKS_CONNECTING_TO_PROXY;
return status;
+ } else if (IsHostDomainSocket()) {
+ LOGERROR(("socks: connect to domain socket failed (%d)", c));
+ PR_SetError(PR_CONNECT_REFUSED_ERROR, 0);
+ mState = SOCKS_FAILED;
+ return status;
}
}
} while (status != PR_SUCCESS);
1
0

[tor-browser-bundle/master] Bug 20210: in dmg2mar, extract old mar file to copy permissions to the new one
by gk@torproject.org 21 Oct '16
by gk@torproject.org 21 Oct '16
21 Oct '16
commit 97acdebccac65377317068cdbfae6def9bb67309
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Mon Oct 17 19:23:17 2016 +0200
Bug 20210: in dmg2mar, extract old mar file to copy permissions to the new one
7z does not currently extract file permissions from the dmg files
so we also extract the old mar file to copy the permissions.
---
tools/dmg2mar | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/tools/dmg2mar b/tools/dmg2mar
index 010761e..8eaebe8 100755
--- a/tools/dmg2mar
+++ b/tools/dmg2mar
@@ -31,6 +31,7 @@
use strict;
use IO::CaptureOutput qw(capture_exec);
use File::Slurp;
+use File::Find;
use Parallel::ForkManager;
use Cwd;
@@ -110,6 +111,27 @@ sub convert_files {
my (undef, $err, $success) = capture_exec('7z', 'x', "-o$tmpdir",
$file->{filename});
exit_error "Error extracting $file->{filename}: $err" unless $success;
+
+ # 7z does not currently extract file permissions from the dmg files
+ # so we also extract the old mar file to copy the permissions
+ # https://trac.torproject.org/projects/tor/ticket/20210
+ my $tmpdir_oldmar = File::Temp->newdir();
+ my $oldmar = getcwd . '/' . $output;
+ exit_error "Error extracting $output"
+ unless system('mar', '-C', $tmpdir_oldmar, '-x', $oldmar) == 0;
+ my $wanted = sub {
+ my $file = $File::Find::name;
+ $file =~ s{^$tmpdir/TorBrowser\.app/}{};
+ if (-f "$tmpdir_oldmar/$file") {
+ my (undef, undef, $mode) = stat("$tmpdir_oldmar/$file");
+ chmod $mode, $File::Find::name;
+ return;
+ }
+ chmod 0644, $File::Find::name if -f $File::Find::name;
+ chmod 0755, $File::Find::name if -d $File::Find::name;
+ };
+ find($wanted, "$tmpdir/TorBrowser.app");
+
unlink $output;
(undef, $err, $success) = capture_exec('make_full_update.sh', '-q',
$output, "$tmpdir/TorBrowser.app");
1
0

[tor-browser-bundle/hardened-builds] Bug 20422: Fall back to SHA256 check for PyCrypto
by gk@torproject.org 21 Oct '16
by gk@torproject.org 21 Oct '16
21 Oct '16
commit 51f62d0c35e4c0587618f586fcfacae377933497
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Oct 21 13:00:34 2016 +0000
Bug 20422: Fall back to SHA256 check for PyCrypto
The subkey that signed PyCrypto back in the days expired. We fall back
to the SHA256 check (which we already did in addition to the signature
check).
---
gitian/fetch-inputs.sh | 6 +++---
gitian/verify-tags.sh | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/gitian/fetch-inputs.sh b/gitian/fetch-inputs.sh
index c663051..bbd2c88 100755
--- a/gitian/fetch-inputs.sh
+++ b/gitian/fetch-inputs.sh
@@ -113,11 +113,11 @@ update_git() {
##############################################################################
# Get+verify sigs that exist
-for i in OPENSSL BINUTILS GCC PYCRYPTO PYTHON_MSI GMP ELFUTILS
+for i in OPENSSL BINUTILS GCC PYTHON_MSI GMP ELFUTILS
do
PACKAGE="${i}_PACKAGE"
URL="${i}_URL"
- if [ "${i}" == "PYCRYPTO" -o "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
+ if [ "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
SUFFIX="asc"
else
SUFFIX="sig"
@@ -162,7 +162,7 @@ do
get "${!PACKAGE}" "${MIRROR_URL_ASN}${!PACKAGE}"
done
-for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO14 GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO14 GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
do
URL="${i}_URL"
PACKAGE="${i}_PACKAGE"
diff --git a/gitian/verify-tags.sh b/gitian/verify-tags.sh
index 8277fca..b7c45c4 100755
--- a/gitian/verify-tags.sh
+++ b/gitian/verify-tags.sh
@@ -123,11 +123,11 @@ selfrando $SELFRANDO_TAG
EOF
# Verify signatures on signed packages
-for i in OPENSSL BINUTILS GCC PYCRYPTO PYTHON_MSI GMP ELFUTILS
+for i in OPENSSL BINUTILS GCC PYTHON_MSI GMP ELFUTILS
do
PACKAGE="${i}_PACKAGE"
URL="${i}_URL"
- if [ "${i}" == "PYCRYPTO" -o "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
+ if [ "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
SUFFIX="asc"
else
SUFFIX="sig"
1
0

[tor-browser-bundle/maint-6.0] Bug 20422: Fall back to SHA256 check for PyCrypto
by gk@torproject.org 21 Oct '16
by gk@torproject.org 21 Oct '16
21 Oct '16
commit bfc9d71a999e0902011684610a9dcfb97319ae10
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Oct 21 13:00:34 2016 +0000
Bug 20422: Fall back to SHA256 check for PyCrypto
The subkey that signed PyCrypto back in the days expired. We fall back
to the SHA256 check (which we already did in addition to the signature
check).
---
gitian/fetch-inputs.sh | 6 +++---
gitian/verify-tags.sh | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/gitian/fetch-inputs.sh b/gitian/fetch-inputs.sh
index 99b984b..b5adfc2 100755
--- a/gitian/fetch-inputs.sh
+++ b/gitian/fetch-inputs.sh
@@ -113,11 +113,11 @@ update_git() {
##############################################################################
# Get+verify sigs that exist
-for i in OPENSSL BINUTILS GCC PYCRYPTO PYTHON_MSI GMP
+for i in OPENSSL BINUTILS GCC PYTHON_MSI GMP
do
PACKAGE="${i}_PACKAGE"
URL="${i}_URL"
- if [ "${i}" == "PYCRYPTO" -o "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
+ if [ "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
SUFFIX="asc"
else
SUFFIX="sig"
@@ -162,7 +162,7 @@ do
get "${!PACKAGE}" "${MIRROR_URL_ASN}${!PACKAGE}"
done
-for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
do
URL="${i}_URL"
PACKAGE="${i}_PACKAGE"
diff --git a/gitian/verify-tags.sh b/gitian/verify-tags.sh
index e006fb0..33b54a4 100755
--- a/gitian/verify-tags.sh
+++ b/gitian/verify-tags.sh
@@ -125,11 +125,11 @@ noto-fonts $NOTOFONTS_TAG
EOF
# Verify signatures on signed packages
-for i in OPENSSL BINUTILS GCC PYCRYPTO PYTHON_MSI GMP
+for i in OPENSSL BINUTILS GCC PYTHON_MSI GMP
do
PACKAGE="${i}_PACKAGE"
URL="${i}_URL"
- if [ "${i}" == "PYCRYPTO" -o "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
+ if [ "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
SUFFIX="asc"
else
SUFFIX="sig"
1
0

[tor-browser-bundle/master] Bug 20422: Fall back to SHA256 check for PyCrypto
by gk@torproject.org 21 Oct '16
by gk@torproject.org 21 Oct '16
21 Oct '16
commit d8c56ab1d5db728adddc0376a266ea842f0e4872
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Oct 21 13:00:34 2016 +0000
Bug 20422: Fall back to SHA256 check for PyCrypto
The subkey that signed PyCrypto back in the days expired. We fall back
to the SHA256 check (which we already did in addition to the signature
check).
---
gitian/fetch-inputs.sh | 6 +++---
gitian/verify-tags.sh | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/gitian/fetch-inputs.sh b/gitian/fetch-inputs.sh
index ca43637..50daec0 100755
--- a/gitian/fetch-inputs.sh
+++ b/gitian/fetch-inputs.sh
@@ -113,11 +113,11 @@ update_git() {
##############################################################################
# Get+verify sigs that exist
-for i in OPENSSL BINUTILS GCC PYCRYPTO PYTHON_MSI GMP
+for i in OPENSSL BINUTILS GCC PYTHON_MSI GMP
do
PACKAGE="${i}_PACKAGE"
URL="${i}_URL"
- if [ "${i}" == "PYCRYPTO" -o "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
+ if [ "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
SUFFIX="asc"
else
SUFFIX="sig"
@@ -162,7 +162,7 @@ do
get "${!PACKAGE}" "${MIRROR_URL_ASN}${!PACKAGE}"
done
-for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO14 GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN
+for i in ZOPEINTERFACE TWISTED PY2EXE SETUPTOOLS PARSLEY GO14 GO STIXMATHFONT NOTOEMOJIFONT NOTOJPFONT NOTOKRFONT NOTOSCFONT NOTOTCFONT NSIS NSIS_DEBIAN PYCRYPTO
do
URL="${i}_URL"
PACKAGE="${i}_PACKAGE"
diff --git a/gitian/verify-tags.sh b/gitian/verify-tags.sh
index baea827..d95b0e0 100755
--- a/gitian/verify-tags.sh
+++ b/gitian/verify-tags.sh
@@ -125,11 +125,11 @@ noto-fonts $NOTOFONTS_TAG
EOF
# Verify signatures on signed packages
-for i in OPENSSL BINUTILS GCC PYCRYPTO PYTHON_MSI GMP
+for i in OPENSSL BINUTILS GCC PYTHON_MSI GMP
do
PACKAGE="${i}_PACKAGE"
URL="${i}_URL"
- if [ "${i}" == "PYCRYPTO" -o "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
+ if [ "${i}" == "PYTHON_MSI" -o "${i}" == "OPENSSL" ]; then
SUFFIX="asc"
else
SUFFIX="sig"
1
0

[tor-launcher/maint-0.2.10] Bug 20111: use Unix domain sockets for SOCKS port by default
by gk@torproject.org 20 Oct '16
by gk@torproject.org 20 Oct '16
20 Oct '16
commit 239131f5747385e832d6d12f30382ce00056591b
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Oct 20 09:59:20 2016 -0400
Bug 20111: use Unix domain sockets for SOCKS port by default
New preferences:
extensions.torlauncher.socks_port_use_ipc (Boolean; defaults to true)
extensions.torlauncher.socks_ipc_path (override default IPC path)
extensions.torlauncher.socks_port_flags (SocksPort flags)
Also added support for the TOR_SOCKS_IPC_PATH environment variable.
Consistently use IPC to refer to Unix domain sockets.
Renamed preferences:
extensions.torlauncher.control_port_use_socket is now
extensions.torlauncher.control_port_use_ipc
extensions.torlauncher.control_socket_path is now
extensions.torlauncher.control_ipc_path
Renamed the TOR_CONTROL_SOCKET env variable to TOR_CONTROL_IPC_PATH.
Change _strUnescape() to throw and fix hex and octal unescaping.
---
src/components/tl-process.js | 31 ++++-
src/components/tl-protocol.js | 248 ++++++++++++++++++++++++++++----------
src/defaults/preferences/prefs.js | 27 +++--
src/modules/tl-util.jsm | 30 +++--
4 files changed, 252 insertions(+), 84 deletions(-)
diff --git a/src/components/tl-process.js b/src/components/tl-process.js
index 1883013..166a8ae 100644
--- a/src/components/tl-process.js
+++ b/src/components/tl-process.js
@@ -334,8 +334,9 @@ TorProcessService.prototype =
var torrcDefaultsFile =
TorLauncherUtil.getTorFile("torrc-defaults", false);
var hashedPassword = this.mProtocolSvc.TorGetPassword(true);
- var controlSocketFile = this.mProtocolSvc.TorGetControlSocketFile();
+ var controlIPCFile = this.mProtocolSvc.TorGetControlIPCFile();
var controlPort = this.mProtocolSvc.TorGetControlPort();
+ var socksPortInfo = this.mProtocolSvc.TorGetSOCKSPortInfo();
var detailsKey;
if (!exeFile)
@@ -382,10 +383,10 @@ TorProcessService.prototype =
args.push(hashedPassword);
// Include a ControlPort argument to support switching between
- // a TCP port and a Unix domain socket.
+ // a TCP port and an IPC port (e.g., a Unix domain socket).
let controlPortArg;
- if (controlSocketFile)
- controlPortArg = "unix:" + controlSocketFile.path;
+ if (controlIPCFile)
+ controlPortArg = this._ipcPortArg(controlIPCFile);
else if (controlPort)
controlPortArg = "" + controlPort;
if (controlPortArg)
@@ -394,6 +395,21 @@ TorProcessService.prototype =
args.push(controlPortArg);
}
+ // Include a SocksPort argument to support switching between
+ // a TCP port and an IPC port (e.g., a Unix domain socket).
+ if (socksPortInfo)
+ {
+ let socksPortArg = (socksPortInfo.ipcFile)
+ ? this._ipcPortArg(socksPortInfo.ipcFile)
+ : socksPortInfo.host + ':' + socksPortInfo.port;
+ let socksPortFlags = TorLauncherUtil.getCharPref(
+ "extensions.torlauncher.socks_port_flags");
+ if (socksPortFlags)
+ socksPortArg += ' ' + socksPortFlags;
+ args.push("SocksPort");
+ args.push(socksPortArg);
+ }
+
var pid = this._getpid();
if (0 != pid)
{
@@ -458,6 +474,13 @@ TorProcessService.prototype =
}
}, // _startTor()
+ // Return a ControlPort or SocksPort argument for aIPCFile (an nsIFile).
+ // The result is unix:/path or unix:"/path with spaces" with appropriate
+ // C-style escaping within the path portion.
+ _ipcPortArg: function(aIPCFile)
+ {
+ return "unix:" + this.mProtocolSvc.TorEscapeString(aIPCFile.path);
+ },
_controlTor: function()
{
diff --git a/src/components/tl-protocol.js b/src/components/tl-protocol.js
index d394b53..12f3910 100644
--- a/src/components/tl-protocol.js
+++ b/src/components/tl-protocol.js
@@ -38,10 +38,10 @@ function TorProtocolService()
.getService(Ci.nsIEnvironment);
// Determine how Tor Launcher will connect to the Tor control port.
// Environment variables get top priority followed by preferences.
- if (!isWindows && env.exists("TOR_CONTROL_SOCKET"))
+ if (!isWindows && env.exists("TOR_CONTROL_IPC_PATH"))
{
- let socketPath = env.get("TOR_CONTROL_SOCKET");
- this.mControlSocketFile = new FileUtils.File(socketPath);
+ let ipcPath = env.get("TOR_CONTROL_IPC_PATH");
+ this.mControlIPCFile = new FileUtils.File(ipcPath);
}
else
{
@@ -51,13 +51,10 @@ function TorProtocolService()
if (env.exists("TOR_CONTROL_PORT"))
this.mControlPort = parseInt(env.get("TOR_CONTROL_PORT"), 10);
- let useSocket = !isWindows && TorLauncherUtil.getBoolPref(
- "extensions.torlauncher.control_port_use_socket", true);
- if (!this.mControlHost && !this.mControlPort && useSocket)
- {
- this.mControlSocketFile = TorLauncherUtil.getTorFile("control_socket",
- false);
- }
+ let useIPC = !isWindows && TorLauncherUtil.getBoolPref(
+ "extensions.torlauncher.control_port_use_ipc", true);
+ if (!this.mControlHost && !this.mControlPort && useIPC)
+ this.mControlIPCFile = TorLauncherUtil.getTorFile("control_ipc", false);
else
{
if (!this.mControlHost)
@@ -75,7 +72,9 @@ function TorProtocolService()
// Populate mControlPassword so it is available when starting tor.
if (env.exists("TOR_CONTROL_PASSWD"))
+ {
this.mControlPassword = env.get("TOR_CONTROL_PASSWD");
+ }
else if (env.exists("TOR_CONTROL_COOKIE_AUTH_FILE"))
{
// TODO: test this code path (TOR_CONTROL_COOKIE_AUTH_FILE).
@@ -86,6 +85,117 @@ function TorProtocolService()
if (!this.mControlPassword)
this.mControlPassword = this._generateRandomPassword();
+
+ // Determine what kind of SOCKS port Tor and the browser will use.
+ // On Windows (where Unix domain sockets are not supported), TCP is
+ // always used.
+ //
+ // The following environment variables are supported and take
+ // precedence over preferences:
+ // TOR_SOCKS_IPC_PATH (file system path; ignored on Windows)
+ // TOR_SOCKS_HOST
+ // TOR_SOCKS_PORT
+ //
+ // The following preferences are consulted:
+ // network.proxy.socks
+ // network.proxy.socks_port
+ // extensions.torlauncher.socks_port_use_ipc (Boolean)
+ // extensions.torlauncher.socks_ipc_path (file system path)
+ // If extensions.torlauncher.socks_ipc_path is empty, a default
+ // path is used (<tor-data-directory>/socks.socket).
+ //
+ // When using TCP, if a value is not defined via an env variable it is
+ // taken from the corresponding browser preference if possible. The
+ // exceptions are:
+ // If network.proxy.socks contains a file: URL, a default value of
+ // "127.0.0.1" is used instead.
+ // If the network.proxy.socks_port value is 0, a default value of
+ // 9150 is used instead.
+ //
+ // Supported scenarios:
+ // 1. By default, an IPC object at a default path is used.
+ // 2. If extensions.torlauncher.socks_port_use_ipc is set to false,
+ // a TCP socket at 127.0.0.1:9150 is used, unless different values
+ // are set in network.proxy.socks and network.proxy.socks_port.
+ // 3. If the TOR_SOCKS_IPC_PATH env var is set, an IPC object at that
+ // path is used (e.g., a Unix domain socket).
+ // 4. If the TOR_SOCKS_HOST and/or TOR_SOCKS_PORT env vars are set, TCP
+ // is used. Values not set via env vars will be taken from the
+ // network.proxy.socks and network.proxy.socks_port prefs as described
+ // above.
+ // 5. If extensions.torlauncher.socks_port_use_ipc is true and
+ // extensions.torlauncher.socks_ipc_path is set, an IPC object at
+ // the specified path is used.
+ // 6. Tor Launcher is disabled. Torbutton will respect the env vars if
+ // present; if not, the values in network.proxy.socks and
+ // network.proxy.socks_port are used without modification.
+
+ let useIPC;
+ this.mSOCKSPortInfo = { ipcFile: undefined, host: undefined, port: 0 };
+ if (!isWindows && env.exists("TOR_SOCKS_IPC_PATH"))
+ {
+ let ipcPath = env.get("TOR_SOCKS_IPC_PATH");
+ this.mSOCKSPortInfo.ipcFile = new FileUtils.File(ipcPath);
+ useIPC = true;
+ }
+ else
+ {
+ // Check for TCP host and port environment variables.
+ if (env.exists("TOR_SOCKS_HOST"))
+ {
+ this.mSOCKSPortInfo.host = env.get("TOR_SOCKS_HOST");
+ useIPC = false;
+ }
+ if (env.exists("TOR_SOCKS_PORT"))
+ {
+ this.mSOCKSPortInfo.port = parseInt(env.get("TOR_SOCKS_PORT"), 10);
+ useIPC = false;
+ }
+ }
+
+ if (useIPC === undefined)
+ {
+ useIPC = !isWindows && TorLauncherUtil.getBoolPref(
+ "extensions.torlauncher.socks_port_use_ipc", true);
+ }
+
+ // Fill in missing SOCKS info from prefs.
+ if (useIPC)
+ {
+ if (!this.mSOCKSPortInfo.ipcFile)
+ {
+ this.mSOCKSPortInfo.ipcFile =
+ TorLauncherUtil.getTorFile("socks_ipc", false);
+ }
+ }
+ else
+ {
+ if (!this.mSOCKSPortInfo.host)
+ {
+ let socksAddr = TorLauncherUtil.getCharPref("network.proxy.socks",
+ "127.0.0.1");
+ let socksAddrHasHost = (socksAddr && !socksAddr.startsWith("file:"));
+ this.mSOCKSPortInfo.host = socksAddrHasHost ? socksAddr : "127.0.0.1";
+ }
+
+ if (!this.mSOCKSPortInfo.port)
+ {
+ let socksPort = TorLauncherUtil.getIntPref("network.proxy.socks_port",
+ 0);
+ this.mSOCKSPortInfo.port = (socksPort != 0) ? socksPort : 9150;
+ }
+ }
+
+ TorLauncherLogger.log(3, "SOCKS port type: " + (useIPC ? "IPC" : "TCP"));
+ if (useIPC)
+ {
+ TorLauncherLogger.log(3, "ipcFile: " + this.mSOCKSPortInfo.ipcFile.path);
+ }
+ else
+ {
+ TorLauncherLogger.log(3, "SOCKS host: " + this.mSOCKSPortInfo.host);
+ TorLauncherLogger.log(3, "SOCKS port: " + this.mSOCKSPortInfo.port);
+ }
}
catch(e)
{
@@ -164,12 +274,12 @@ TorProtocolService.prototype =
kCmdStatusOK: 250,
kCmdStatusEventNotification: 650,
- TorGetControlSocketFile: function()
+ TorGetControlIPCFile: function()
{
- if (!this.mControlSocketFile)
+ if (!this.mControlIPCFile)
return undefined;
- return this.mControlSocketFile.clone();
+ return this.mControlIPCFile.clone();
},
TorGetControlPort: function()
@@ -184,6 +294,18 @@ TorProtocolService.prototype =
return (aPleaseHash) ? this._hashPassword(pw) : pw;
},
+ TorGetSOCKSPortInfo: function()
+ {
+ return this.mSOCKSPortInfo;
+ },
+
+ // Escape non-ASCII characters for use within the Tor Control protocol.
+ // Returns a string.
+ TorEscapeString: function(aStr)
+ {
+ return this._strEscape(aStr);
+ },
+
// NOTE: Many Tor protocol functions return a reply object, which is a
// a JavaScript object that has the following fields:
// reply.statusCode -- integer, e.g., 250
@@ -373,11 +495,13 @@ TorProtocolService.prototype =
else
{
token = tokenAndVal.substring(0, idx);
- var valObj = {};
- if (!this._strUnescape(tokenAndVal.substring(idx + 1), valObj))
- continue; // skip this token/value pair.
+ try
+ {
+ val = this._strUnescape(tokenAndVal.substring(idx + 1));
+ } catch (e) {}
- val = valObj.result;
+ if (!val)
+ continue; // skip this token/value pair.
}
if ("BOOTSTRAP" == token)
@@ -548,8 +672,9 @@ TorProtocolService.prototype =
mConsoleSvc: null,
mControlPort: null,
mControlHost: null,
- mControlSocketFile: null, // An nsIFile if using a UNIX domain socket.
+ mControlIPCFile: null, // An nsIFile if using IPC for control port.
mControlPassword: null, // JS string that contains hex-encoded password.
+ mSOCKSPortInfo: null, // An object that contains ipcFile, host, port.
mControlConnection: null, // This is cached and reused.
mEventMonitorConnection: null,
mEventMonitorBuffer: null,
@@ -600,27 +725,28 @@ TorProtocolService.prototype =
let sts = Cc["@mozilla.org/network/socket-transport-service;1"]
.getService(Ci.nsISocketTransportService);
let socket;
- if (this.mControlSocketFile)
+ if (this.mControlIPCFile)
{
- let exists = this.mControlSocketFile.exists();
+ let exists = this.mControlIPCFile.exists();
if (!exists)
{
- TorLauncherLogger.log(5, "Control port socket does not exist: " +
- this.mControlSocketFile.path);
+ TorLauncherLogger.log(5, "Control port IPC object does not exist: " +
+ this.mControlIPCFile.path);
}
else
{
- let isSpecial = this.mControlSocketFile.isSpecial();
+ let isSpecial = this.mControlIPCFile.isSpecial();
if (!isSpecial)
{
- TorLauncherLogger.log(5, "Control port socket is not a socket: " +
- this.mControlSocketFile.path);
+ TorLauncherLogger.log(5,
+ "Control port IPC object is not a special file: " +
+ this.mControlIPCFile.path);
}
else
{
- TorLauncherLogger.log(2, "Opening control connection to socket " +
- this.mControlSocketFile.path);
- socket = sts.createUnixDomainTransport(this.mControlSocketFile);
+ TorLauncherLogger.log(2, "Opening control connection to " +
+ this.mControlIPCFile.path);
+ socket = sts.createUnixDomainTransport(this.mControlIPCFile);
}
}
}
@@ -855,14 +981,16 @@ TorProtocolService.prototype =
}
else
{
- var valObj = {};
- if (!this._strUnescape(line.substring(prefixLen), valObj))
+ try
{
- TorLauncherLogger.safelog(4, "Invalid string within " + aCmd +
+ let s = this._strUnescape(line.substring(prefixLen));
+ tmpArray.push(s);
+ }
+ catch (e)
+ {
+ TorLauncherLogger.safelog(4, e + " within " + aCmd +
" response: ", line);
}
- else
- tmpArray.push(valObj.result);
}
}
@@ -954,25 +1082,20 @@ TorProtocolService.prototype =
// Unescape Tor Control string aStr (removing surrounding "" and \ escapes).
// Based on Vidalia's src/common/stringutil.cpp:string_unescape().
- // Returns true if successful and sets aResultObj.result.
- _strUnescape: function(aStr, aResultObj)
+ // Returns the unescaped string. Throws upon failure.
+ // Within Torbutton, the file modules/utils.js also contains a copy of
+ // _strUnescape().
+ _strUnescape: function(aStr)
{
- if (!aResultObj)
- return false;
-
if (!aStr)
- {
- aResultObj.result = aStr;
- return true;
- }
+ return aStr;
var len = aStr.length;
if ((len < 2) || ('"' != aStr.charAt(0)) || ('"' != aStr.charAt(len - 1)))
- {
- aResultObj.result = aStr;
- return true;
- }
+ return aStr;
+ const kHexRE = /[0-9A-Fa-f]{2}/;
+ const kOctalRE = /[0-7]{3}/;
var rv = "";
var i = 1;
var lastCharIndex = len - 2;
@@ -982,7 +1105,7 @@ TorProtocolService.prototype =
if ('\\' == c)
{
if (++i > lastCharIndex)
- return false; // error: \ without next character.
+ throw new Error("missing character after \\");
c = aStr.charAt(i);
if ('n' == c)
@@ -994,24 +1117,26 @@ TorProtocolService.prototype =
else if ('x' == c)
{
if ((i + 2) > lastCharIndex)
- return false; // error: not enough hex characters.
+ throw new Error("not enough hex characters");
- var val = parseInt(aStr.substr(i, 2), 16);
- if (isNaN(val))
- return false; // error: invalid hex characters.
+ let s = aStr.substr(i + 1, 2);
+ if (!kHexRE.test(s))
+ throw new Error("invalid hex character");
+ let val = parseInt(s, 16);
rv += String.fromCharCode(val);
- i += 2;
+ i += 3;
}
else if (this._isDigit(c))
{
- if ((i + 3) > lastCharIndex)
- return false; // error: not enough octal characters.
+ let s = aStr.substr(i, 3);
+ if ((i + 2) > lastCharIndex)
+ throw new Error("not enough octal characters");
- var val = parseInt(aStr.substr(i, 3), 8);
- if (isNaN(val))
- return false; // error: invalid octal characters.
+ if (!kOctalRE.test(s))
+ throw new Error("invalid octal character");
+ let val = parseInt(s, 8);
rv += String.fromCharCode(val);
i += 3;
}
@@ -1022,7 +1147,7 @@ TorProtocolService.prototype =
}
}
else if ('"' == c)
- return false; // error: unescaped double quote in middle of string.
+ throw new Error("unescaped \" within string");
else
{
rv += c;
@@ -1031,10 +1156,7 @@ TorProtocolService.prototype =
}
// Convert from UTF-8 to Unicode. TODO: is UTF-8 always used in protocol?
- rv = decodeURIComponent(escape(rv));
-
- aResultObj.result = rv;
- return true;
+ return decodeURIComponent(escape(rv));
}, // _strUnescape()
// Returns a random 16 character password, hex-encoded.
@@ -1188,6 +1310,8 @@ TorProtocolService.prototype =
return rv;
},
+ // Within Torbutton, the file modules/utils.js also contains a copy of
+ // _isDigit().
_isDigit: function(aChar)
{
const kRE = /^\d$/;
diff --git a/src/defaults/preferences/prefs.js b/src/defaults/preferences/prefs.js
index 0f197de..ea5ea80 100644
--- a/src/defaults/preferences/prefs.js
+++ b/src/defaults/preferences/prefs.js
@@ -5,17 +5,30 @@ pref("extensions.torlauncher.loglevel", 4); // 1=verbose, 2=debug, 3=info, 4=no
pref("extensions.torlauncher.logmethod", 1); // 0=stdout, 1=errorconsole, 2=debuglog
pref("extensions.torlauncher.max_tor_log_entries", 1000);
-// By default, a Unix domain socket at a default location is used for
-// the Tor control port.
-// Change control_port_use_socket to false to use a TCP connection
-// instead, as defined by control_host and control_port.
-// Modify control_socket_path to override the default socket location. If a
+// By default, an IPC object (e.g., a Unix domain socket) at a default
+// location is used for the Tor control port.
+// Change control_port_use_ipc to false to use a TCP connection instead, as
+// defined by control_host and control_port.
+// Modify control_ipc_path to override the default IPC object location. If a
// relative path is used, it is handled like torrc_path (see below).
-pref("extensions.torlauncher.control_port_use_socket", true);
-pref("extensions.torlauncher.control_socket_path", "");
+pref("extensions.torlauncher.control_port_use_ipc", true);
+pref("extensions.torlauncher.control_ipc_path", "");
pref("extensions.torlauncher.control_host", "127.0.0.1");
pref("extensions.torlauncher.control_port", 9151);
+// By default, an IPC object (e.g., a Unix domain socket) at a default
+// location is used for the Tor SOCKS port.
+// Change socks_port_use_ipc to false to use a TCP connection. When a
+// TCP connection is used, the host is taken from the network.proxy.socks
+// pref and the port is taken from the network.proxy.socks_port pref.
+// Modify socks_ipc_path to override the default IPC object location. If a
+// relative path is used, it is handled like torrc_path (see below).
+// Modify socks_port_flags to use a different set of SocksPort flags (but be
+// careful).
+pref("extensions.torlauncher.socks_port_use_ipc", true);
+pref("extensions.torlauncher.socks_ipc_path", "");
+pref("extensions.torlauncher.socks_port_flags", "IPv6Traffic PreferIPv6 KeepAliveIsolateSOCKSAuth");
+
// The tor_path is relative to the application directory. On Linux and
// Windows this is the Browser/ directory that contains the firefox
// executables, and on Mac OS it is the TorBrowser.app directory.
diff --git a/src/modules/tl-util.jsm b/src/modules/tl-util.jsm
index 9709e0e..a18f779 100644
--- a/src/modules/tl-util.jsm
+++ b/src/modules/tl-util.jsm
@@ -368,8 +368,8 @@ let TorLauncherUtil = // Public
},
// Returns an nsIFile.
- // If aTorFileType is "control_socket", aCreate is ignored and there is
- // no requirement that the socket exists.
+ // If aTorFileType is "control_ipc" or "socks_ipc", aCreate is ignored
+ // and there is no requirement that the IPC object exists.
// For all other file types, null is returned if the file does not exist
// and it cannot be created (it will be created if aCreate is true).
getTorFile: function(aTorFileType, aCreate)
@@ -380,7 +380,9 @@ let TorLauncherUtil = // Public
let isRelativePath = true;
let isUserData = (aTorFileType != "tor") &&
(aTorFileType != "torrc-defaults");
- let isControlSocket = ("control_socket" == aTorFileType);
+ let isControlIPC = ("control_ipc" == aTorFileType);
+ let isSOCKSIPC = ("socks_ipc" == aTorFileType);
+ let isIPC = isControlIPC || isSOCKSIPC;
let prefName = "extensions.torlauncher." + aTorFileType + "_path";
let path = this.getCharPref(prefName);
if (path)
@@ -415,8 +417,10 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlSocket)
+ else if (isControlIPC)
path = "Tor/control.socket";
+ else if (isSOCKSIPC)
+ path = "Tor/socks.socket";
}
else // Linux and others.
{
@@ -428,8 +432,10 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlSocket)
+ else if (isControlIPC)
path = "Tor/control.socket";
+ else if (isSOCKSIPC)
+ path = "Tor/socks.socket";
}
}
else if (this.isWindows)
@@ -455,8 +461,10 @@ let TorLauncherUtil = // Public
path = "Data/Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Data/Tor";
- else if (isControlSocket)
+ else if (isControlIPC)
path = "Data/Tor/control.socket";
+ else if (isSOCKSIPC)
+ path = "Data/Tor/socks.socket";
}
}
@@ -488,7 +496,7 @@ let TorLauncherUtil = // Public
f.initWithPath(path);
}
- if (!f.exists() && !isControlSocket && aCreate)
+ if (!f.exists() && !isIPC && aCreate)
{
try
{
@@ -504,10 +512,10 @@ let TorLauncherUtil = // Public
}
}
- // If the file exists or the control socket was requested, normalize
- // the path and return a file object. The control socket will be
+ // If the file exists or an IPC object was requested, normalize the path
+ // and return a file object. The control and SOCKS IPC objects will be
// created by tor.
- if (f.exists() || isControlSocket)
+ if (f.exists() || isIPC)
{
try { f.normalize(); } catch(e) {}
return f;
@@ -518,7 +526,7 @@ let TorLauncherUtil = // Public
catch(e)
{
TorLauncherLogger.safelog(4, "getTorFile " + aTorFileType +
- " failed for " + path + ": ", e);
+ " failed for " + path + ": ", e);
}
return null; // File not found or error (logged above).
1
0

20 Oct '16
commit e7a9367be0b0b18c2cfbac774e4edcd7d3bcaaf8
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Sep 15 13:35:37 2016 +0000
Version bump for a better tag
---
src/install.rdf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/install.rdf b/src/install.rdf
index 96f9a66..06c3413 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -7,7 +7,7 @@
<em:creator>The Tor Project, Inc.</em:creator>
<em:contributor>Pearl Crescent, LLC</em:contributor>
<em:id>tor-launcher(a)torproject.org</em:id>
- <em:version>0.2.10</em:version>
+ <em:version>0.2.10.1</em:version>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html</em:homepageURL>
<em:updateURL>data:text/plain,</em:updateURL>
<em:updateKey>-</em:updateKey>
1
0

[tor-launcher/master] Bug 20111: use Unix domain sockets for SOCKS port by default
by gk@torproject.org 20 Oct '16
by gk@torproject.org 20 Oct '16
20 Oct '16
commit 8ca52414916c3d8bc2a2974017d759901ddc1736
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Oct 20 09:59:20 2016 -0400
Bug 20111: use Unix domain sockets for SOCKS port by default
New preferences:
extensions.torlauncher.socks_port_use_ipc (Boolean; defaults to true)
extensions.torlauncher.socks_ipc_path (override default IPC path)
extensions.torlauncher.socks_port_flags (SocksPort flags)
Also added support for the TOR_SOCKS_IPC_PATH environment variable.
Consistently use IPC to refer to Unix domain sockets.
Renamed preferences:
extensions.torlauncher.control_port_use_socket is now
extensions.torlauncher.control_port_use_ipc
extensions.torlauncher.control_socket_path is now
extensions.torlauncher.control_ipc_path
Renamed the TOR_CONTROL_SOCKET env variable to TOR_CONTROL_IPC_PATH.
Change _strUnescape() to throw and fix hex and octal unescaping.
---
src/components/tl-process.js | 31 ++++-
src/components/tl-protocol.js | 248 ++++++++++++++++++++++++++++----------
src/defaults/preferences/prefs.js | 27 +++--
src/modules/tl-util.jsm | 30 +++--
4 files changed, 252 insertions(+), 84 deletions(-)
diff --git a/src/components/tl-process.js b/src/components/tl-process.js
index db074b4..844aba1 100644
--- a/src/components/tl-process.js
+++ b/src/components/tl-process.js
@@ -330,8 +330,9 @@ TorProcessService.prototype =
var torrcDefaultsFile =
TorLauncherUtil.getTorFile("torrc-defaults", false);
var hashedPassword = this.mProtocolSvc.TorGetPassword(true);
- var controlSocketFile = this.mProtocolSvc.TorGetControlSocketFile();
+ var controlIPCFile = this.mProtocolSvc.TorGetControlIPCFile();
var controlPort = this.mProtocolSvc.TorGetControlPort();
+ var socksPortInfo = this.mProtocolSvc.TorGetSOCKSPortInfo();
var detailsKey;
if (!exeFile)
@@ -378,10 +379,10 @@ TorProcessService.prototype =
args.push(hashedPassword);
// Include a ControlPort argument to support switching between
- // a TCP port and a Unix domain socket.
+ // a TCP port and an IPC port (e.g., a Unix domain socket).
let controlPortArg;
- if (controlSocketFile)
- controlPortArg = "unix:" + controlSocketFile.path;
+ if (controlIPCFile)
+ controlPortArg = this._ipcPortArg(controlIPCFile);
else if (controlPort)
controlPortArg = "" + controlPort;
if (controlPortArg)
@@ -390,6 +391,21 @@ TorProcessService.prototype =
args.push(controlPortArg);
}
+ // Include a SocksPort argument to support switching between
+ // a TCP port and an IPC port (e.g., a Unix domain socket).
+ if (socksPortInfo)
+ {
+ let socksPortArg = (socksPortInfo.ipcFile)
+ ? this._ipcPortArg(socksPortInfo.ipcFile)
+ : socksPortInfo.host + ':' + socksPortInfo.port;
+ let socksPortFlags = TorLauncherUtil.getCharPref(
+ "extensions.torlauncher.socks_port_flags");
+ if (socksPortFlags)
+ socksPortArg += ' ' + socksPortFlags;
+ args.push("SocksPort");
+ args.push(socksPortArg);
+ }
+
var pid = this._getpid();
if (0 != pid)
{
@@ -454,6 +470,13 @@ TorProcessService.prototype =
}
}, // _startTor()
+ // Return a ControlPort or SocksPort argument for aIPCFile (an nsIFile).
+ // The result is unix:/path or unix:"/path with spaces" with appropriate
+ // C-style escaping within the path portion.
+ _ipcPortArg: function(aIPCFile)
+ {
+ return "unix:" + this.mProtocolSvc.TorEscapeString(aIPCFile.path);
+ },
_controlTor: function()
{
diff --git a/src/components/tl-protocol.js b/src/components/tl-protocol.js
index d394b53..12f3910 100644
--- a/src/components/tl-protocol.js
+++ b/src/components/tl-protocol.js
@@ -38,10 +38,10 @@ function TorProtocolService()
.getService(Ci.nsIEnvironment);
// Determine how Tor Launcher will connect to the Tor control port.
// Environment variables get top priority followed by preferences.
- if (!isWindows && env.exists("TOR_CONTROL_SOCKET"))
+ if (!isWindows && env.exists("TOR_CONTROL_IPC_PATH"))
{
- let socketPath = env.get("TOR_CONTROL_SOCKET");
- this.mControlSocketFile = new FileUtils.File(socketPath);
+ let ipcPath = env.get("TOR_CONTROL_IPC_PATH");
+ this.mControlIPCFile = new FileUtils.File(ipcPath);
}
else
{
@@ -51,13 +51,10 @@ function TorProtocolService()
if (env.exists("TOR_CONTROL_PORT"))
this.mControlPort = parseInt(env.get("TOR_CONTROL_PORT"), 10);
- let useSocket = !isWindows && TorLauncherUtil.getBoolPref(
- "extensions.torlauncher.control_port_use_socket", true);
- if (!this.mControlHost && !this.mControlPort && useSocket)
- {
- this.mControlSocketFile = TorLauncherUtil.getTorFile("control_socket",
- false);
- }
+ let useIPC = !isWindows && TorLauncherUtil.getBoolPref(
+ "extensions.torlauncher.control_port_use_ipc", true);
+ if (!this.mControlHost && !this.mControlPort && useIPC)
+ this.mControlIPCFile = TorLauncherUtil.getTorFile("control_ipc", false);
else
{
if (!this.mControlHost)
@@ -75,7 +72,9 @@ function TorProtocolService()
// Populate mControlPassword so it is available when starting tor.
if (env.exists("TOR_CONTROL_PASSWD"))
+ {
this.mControlPassword = env.get("TOR_CONTROL_PASSWD");
+ }
else if (env.exists("TOR_CONTROL_COOKIE_AUTH_FILE"))
{
// TODO: test this code path (TOR_CONTROL_COOKIE_AUTH_FILE).
@@ -86,6 +85,117 @@ function TorProtocolService()
if (!this.mControlPassword)
this.mControlPassword = this._generateRandomPassword();
+
+ // Determine what kind of SOCKS port Tor and the browser will use.
+ // On Windows (where Unix domain sockets are not supported), TCP is
+ // always used.
+ //
+ // The following environment variables are supported and take
+ // precedence over preferences:
+ // TOR_SOCKS_IPC_PATH (file system path; ignored on Windows)
+ // TOR_SOCKS_HOST
+ // TOR_SOCKS_PORT
+ //
+ // The following preferences are consulted:
+ // network.proxy.socks
+ // network.proxy.socks_port
+ // extensions.torlauncher.socks_port_use_ipc (Boolean)
+ // extensions.torlauncher.socks_ipc_path (file system path)
+ // If extensions.torlauncher.socks_ipc_path is empty, a default
+ // path is used (<tor-data-directory>/socks.socket).
+ //
+ // When using TCP, if a value is not defined via an env variable it is
+ // taken from the corresponding browser preference if possible. The
+ // exceptions are:
+ // If network.proxy.socks contains a file: URL, a default value of
+ // "127.0.0.1" is used instead.
+ // If the network.proxy.socks_port value is 0, a default value of
+ // 9150 is used instead.
+ //
+ // Supported scenarios:
+ // 1. By default, an IPC object at a default path is used.
+ // 2. If extensions.torlauncher.socks_port_use_ipc is set to false,
+ // a TCP socket at 127.0.0.1:9150 is used, unless different values
+ // are set in network.proxy.socks and network.proxy.socks_port.
+ // 3. If the TOR_SOCKS_IPC_PATH env var is set, an IPC object at that
+ // path is used (e.g., a Unix domain socket).
+ // 4. If the TOR_SOCKS_HOST and/or TOR_SOCKS_PORT env vars are set, TCP
+ // is used. Values not set via env vars will be taken from the
+ // network.proxy.socks and network.proxy.socks_port prefs as described
+ // above.
+ // 5. If extensions.torlauncher.socks_port_use_ipc is true and
+ // extensions.torlauncher.socks_ipc_path is set, an IPC object at
+ // the specified path is used.
+ // 6. Tor Launcher is disabled. Torbutton will respect the env vars if
+ // present; if not, the values in network.proxy.socks and
+ // network.proxy.socks_port are used without modification.
+
+ let useIPC;
+ this.mSOCKSPortInfo = { ipcFile: undefined, host: undefined, port: 0 };
+ if (!isWindows && env.exists("TOR_SOCKS_IPC_PATH"))
+ {
+ let ipcPath = env.get("TOR_SOCKS_IPC_PATH");
+ this.mSOCKSPortInfo.ipcFile = new FileUtils.File(ipcPath);
+ useIPC = true;
+ }
+ else
+ {
+ // Check for TCP host and port environment variables.
+ if (env.exists("TOR_SOCKS_HOST"))
+ {
+ this.mSOCKSPortInfo.host = env.get("TOR_SOCKS_HOST");
+ useIPC = false;
+ }
+ if (env.exists("TOR_SOCKS_PORT"))
+ {
+ this.mSOCKSPortInfo.port = parseInt(env.get("TOR_SOCKS_PORT"), 10);
+ useIPC = false;
+ }
+ }
+
+ if (useIPC === undefined)
+ {
+ useIPC = !isWindows && TorLauncherUtil.getBoolPref(
+ "extensions.torlauncher.socks_port_use_ipc", true);
+ }
+
+ // Fill in missing SOCKS info from prefs.
+ if (useIPC)
+ {
+ if (!this.mSOCKSPortInfo.ipcFile)
+ {
+ this.mSOCKSPortInfo.ipcFile =
+ TorLauncherUtil.getTorFile("socks_ipc", false);
+ }
+ }
+ else
+ {
+ if (!this.mSOCKSPortInfo.host)
+ {
+ let socksAddr = TorLauncherUtil.getCharPref("network.proxy.socks",
+ "127.0.0.1");
+ let socksAddrHasHost = (socksAddr && !socksAddr.startsWith("file:"));
+ this.mSOCKSPortInfo.host = socksAddrHasHost ? socksAddr : "127.0.0.1";
+ }
+
+ if (!this.mSOCKSPortInfo.port)
+ {
+ let socksPort = TorLauncherUtil.getIntPref("network.proxy.socks_port",
+ 0);
+ this.mSOCKSPortInfo.port = (socksPort != 0) ? socksPort : 9150;
+ }
+ }
+
+ TorLauncherLogger.log(3, "SOCKS port type: " + (useIPC ? "IPC" : "TCP"));
+ if (useIPC)
+ {
+ TorLauncherLogger.log(3, "ipcFile: " + this.mSOCKSPortInfo.ipcFile.path);
+ }
+ else
+ {
+ TorLauncherLogger.log(3, "SOCKS host: " + this.mSOCKSPortInfo.host);
+ TorLauncherLogger.log(3, "SOCKS port: " + this.mSOCKSPortInfo.port);
+ }
}
catch(e)
{
@@ -164,12 +274,12 @@ TorProtocolService.prototype =
kCmdStatusOK: 250,
kCmdStatusEventNotification: 650,
- TorGetControlSocketFile: function()
+ TorGetControlIPCFile: function()
{
- if (!this.mControlSocketFile)
+ if (!this.mControlIPCFile)
return undefined;
- return this.mControlSocketFile.clone();
+ return this.mControlIPCFile.clone();
},
TorGetControlPort: function()
@@ -184,6 +294,18 @@ TorProtocolService.prototype =
return (aPleaseHash) ? this._hashPassword(pw) : pw;
},
+ TorGetSOCKSPortInfo: function()
+ {
+ return this.mSOCKSPortInfo;
+ },
+
+ // Escape non-ASCII characters for use within the Tor Control protocol.
+ // Returns a string.
+ TorEscapeString: function(aStr)
+ {
+ return this._strEscape(aStr);
+ },
+
// NOTE: Many Tor protocol functions return a reply object, which is a
// a JavaScript object that has the following fields:
// reply.statusCode -- integer, e.g., 250
@@ -373,11 +495,13 @@ TorProtocolService.prototype =
else
{
token = tokenAndVal.substring(0, idx);
- var valObj = {};
- if (!this._strUnescape(tokenAndVal.substring(idx + 1), valObj))
- continue; // skip this token/value pair.
+ try
+ {
+ val = this._strUnescape(tokenAndVal.substring(idx + 1));
+ } catch (e) {}
- val = valObj.result;
+ if (!val)
+ continue; // skip this token/value pair.
}
if ("BOOTSTRAP" == token)
@@ -548,8 +672,9 @@ TorProtocolService.prototype =
mConsoleSvc: null,
mControlPort: null,
mControlHost: null,
- mControlSocketFile: null, // An nsIFile if using a UNIX domain socket.
+ mControlIPCFile: null, // An nsIFile if using IPC for control port.
mControlPassword: null, // JS string that contains hex-encoded password.
+ mSOCKSPortInfo: null, // An object that contains ipcFile, host, port.
mControlConnection: null, // This is cached and reused.
mEventMonitorConnection: null,
mEventMonitorBuffer: null,
@@ -600,27 +725,28 @@ TorProtocolService.prototype =
let sts = Cc["@mozilla.org/network/socket-transport-service;1"]
.getService(Ci.nsISocketTransportService);
let socket;
- if (this.mControlSocketFile)
+ if (this.mControlIPCFile)
{
- let exists = this.mControlSocketFile.exists();
+ let exists = this.mControlIPCFile.exists();
if (!exists)
{
- TorLauncherLogger.log(5, "Control port socket does not exist: " +
- this.mControlSocketFile.path);
+ TorLauncherLogger.log(5, "Control port IPC object does not exist: " +
+ this.mControlIPCFile.path);
}
else
{
- let isSpecial = this.mControlSocketFile.isSpecial();
+ let isSpecial = this.mControlIPCFile.isSpecial();
if (!isSpecial)
{
- TorLauncherLogger.log(5, "Control port socket is not a socket: " +
- this.mControlSocketFile.path);
+ TorLauncherLogger.log(5,
+ "Control port IPC object is not a special file: " +
+ this.mControlIPCFile.path);
}
else
{
- TorLauncherLogger.log(2, "Opening control connection to socket " +
- this.mControlSocketFile.path);
- socket = sts.createUnixDomainTransport(this.mControlSocketFile);
+ TorLauncherLogger.log(2, "Opening control connection to " +
+ this.mControlIPCFile.path);
+ socket = sts.createUnixDomainTransport(this.mControlIPCFile);
}
}
}
@@ -855,14 +981,16 @@ TorProtocolService.prototype =
}
else
{
- var valObj = {};
- if (!this._strUnescape(line.substring(prefixLen), valObj))
+ try
{
- TorLauncherLogger.safelog(4, "Invalid string within " + aCmd +
+ let s = this._strUnescape(line.substring(prefixLen));
+ tmpArray.push(s);
+ }
+ catch (e)
+ {
+ TorLauncherLogger.safelog(4, e + " within " + aCmd +
" response: ", line);
}
- else
- tmpArray.push(valObj.result);
}
}
@@ -954,25 +1082,20 @@ TorProtocolService.prototype =
// Unescape Tor Control string aStr (removing surrounding "" and \ escapes).
// Based on Vidalia's src/common/stringutil.cpp:string_unescape().
- // Returns true if successful and sets aResultObj.result.
- _strUnescape: function(aStr, aResultObj)
+ // Returns the unescaped string. Throws upon failure.
+ // Within Torbutton, the file modules/utils.js also contains a copy of
+ // _strUnescape().
+ _strUnescape: function(aStr)
{
- if (!aResultObj)
- return false;
-
if (!aStr)
- {
- aResultObj.result = aStr;
- return true;
- }
+ return aStr;
var len = aStr.length;
if ((len < 2) || ('"' != aStr.charAt(0)) || ('"' != aStr.charAt(len - 1)))
- {
- aResultObj.result = aStr;
- return true;
- }
+ return aStr;
+ const kHexRE = /[0-9A-Fa-f]{2}/;
+ const kOctalRE = /[0-7]{3}/;
var rv = "";
var i = 1;
var lastCharIndex = len - 2;
@@ -982,7 +1105,7 @@ TorProtocolService.prototype =
if ('\\' == c)
{
if (++i > lastCharIndex)
- return false; // error: \ without next character.
+ throw new Error("missing character after \\");
c = aStr.charAt(i);
if ('n' == c)
@@ -994,24 +1117,26 @@ TorProtocolService.prototype =
else if ('x' == c)
{
if ((i + 2) > lastCharIndex)
- return false; // error: not enough hex characters.
+ throw new Error("not enough hex characters");
- var val = parseInt(aStr.substr(i, 2), 16);
- if (isNaN(val))
- return false; // error: invalid hex characters.
+ let s = aStr.substr(i + 1, 2);
+ if (!kHexRE.test(s))
+ throw new Error("invalid hex character");
+ let val = parseInt(s, 16);
rv += String.fromCharCode(val);
- i += 2;
+ i += 3;
}
else if (this._isDigit(c))
{
- if ((i + 3) > lastCharIndex)
- return false; // error: not enough octal characters.
+ let s = aStr.substr(i, 3);
+ if ((i + 2) > lastCharIndex)
+ throw new Error("not enough octal characters");
- var val = parseInt(aStr.substr(i, 3), 8);
- if (isNaN(val))
- return false; // error: invalid octal characters.
+ if (!kOctalRE.test(s))
+ throw new Error("invalid octal character");
+ let val = parseInt(s, 8);
rv += String.fromCharCode(val);
i += 3;
}
@@ -1022,7 +1147,7 @@ TorProtocolService.prototype =
}
}
else if ('"' == c)
- return false; // error: unescaped double quote in middle of string.
+ throw new Error("unescaped \" within string");
else
{
rv += c;
@@ -1031,10 +1156,7 @@ TorProtocolService.prototype =
}
// Convert from UTF-8 to Unicode. TODO: is UTF-8 always used in protocol?
- rv = decodeURIComponent(escape(rv));
-
- aResultObj.result = rv;
- return true;
+ return decodeURIComponent(escape(rv));
}, // _strUnescape()
// Returns a random 16 character password, hex-encoded.
@@ -1188,6 +1310,8 @@ TorProtocolService.prototype =
return rv;
},
+ // Within Torbutton, the file modules/utils.js also contains a copy of
+ // _isDigit().
_isDigit: function(aChar)
{
const kRE = /^\d$/;
diff --git a/src/defaults/preferences/prefs.js b/src/defaults/preferences/prefs.js
index 500fe2f..875c300 100644
--- a/src/defaults/preferences/prefs.js
+++ b/src/defaults/preferences/prefs.js
@@ -9,17 +9,30 @@ pref("extensions.torlauncher.loglevel", 4); // 1=verbose, 2=debug, 3=info, 4=no
pref("extensions.torlauncher.logmethod", 1); // 0=stdout, 1=errorconsole, 2=debuglog
pref("extensions.torlauncher.max_tor_log_entries", 1000);
-// By default, a Unix domain socket at a default location is used for
-// the Tor control port.
-// Change control_port_use_socket to false to use a TCP connection
-// instead, as defined by control_host and control_port.
-// Modify control_socket_path to override the default socket location. If a
+// By default, an IPC object (e.g., a Unix domain socket) at a default
+// location is used for the Tor control port.
+// Change control_port_use_ipc to false to use a TCP connection instead, as
+// defined by control_host and control_port.
+// Modify control_ipc_path to override the default IPC object location. If a
// relative path is used, it is handled like torrc_path (see below).
-pref("extensions.torlauncher.control_port_use_socket", true);
-pref("extensions.torlauncher.control_socket_path", "");
+pref("extensions.torlauncher.control_port_use_ipc", true);
+pref("extensions.torlauncher.control_ipc_path", "");
pref("extensions.torlauncher.control_host", "127.0.0.1");
pref("extensions.torlauncher.control_port", 9151);
+// By default, an IPC object (e.g., a Unix domain socket) at a default
+// location is used for the Tor SOCKS port.
+// Change socks_port_use_ipc to false to use a TCP connection. When a
+// TCP connection is used, the host is taken from the network.proxy.socks
+// pref and the port is taken from the network.proxy.socks_port pref.
+// Modify socks_ipc_path to override the default IPC object location. If a
+// relative path is used, it is handled like torrc_path (see below).
+// Modify socks_port_flags to use a different set of SocksPort flags (but be
+// careful).
+pref("extensions.torlauncher.socks_port_use_ipc", true);
+pref("extensions.torlauncher.socks_ipc_path", "");
+pref("extensions.torlauncher.socks_port_flags", "IPv6Traffic PreferIPv6 KeepAliveIsolateSOCKSAuth");
+
// The tor_path is relative to the application directory. On Linux and
// Windows this is the Browser/ directory that contains the firefox
// executables, and on Mac OS it is the TorBrowser.app directory.
diff --git a/src/modules/tl-util.jsm b/src/modules/tl-util.jsm
index 85b5fbe..a1256fd 100644
--- a/src/modules/tl-util.jsm
+++ b/src/modules/tl-util.jsm
@@ -388,8 +388,8 @@ let TorLauncherUtil = // Public
},
// Returns an nsIFile.
- // If aTorFileType is "control_socket", aCreate is ignored and there is
- // no requirement that the socket exists.
+ // If aTorFileType is "control_ipc" or "socks_ipc", aCreate is ignored
+ // and there is no requirement that the IPC object exists.
// For all other file types, null is returned if the file does not exist
// and it cannot be created (it will be created if aCreate is true).
getTorFile: function(aTorFileType, aCreate)
@@ -400,7 +400,9 @@ let TorLauncherUtil = // Public
let isRelativePath = true;
let isUserData = (aTorFileType != "tor") &&
(aTorFileType != "torrc-defaults");
- let isControlSocket = ("control_socket" == aTorFileType);
+ let isControlIPC = ("control_ipc" == aTorFileType);
+ let isSOCKSIPC = ("socks_ipc" == aTorFileType);
+ let isIPC = isControlIPC || isSOCKSIPC;
let prefName = "extensions.torlauncher." + aTorFileType + "_path";
let path = this.getCharPref(prefName);
if (path)
@@ -435,8 +437,10 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlSocket)
+ else if (isControlIPC)
path = "Tor/control.socket";
+ else if (isSOCKSIPC)
+ path = "Tor/socks.socket";
}
else // Linux and others.
{
@@ -448,8 +452,10 @@ let TorLauncherUtil = // Public
path = "Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Tor";
- else if (isControlSocket)
+ else if (isControlIPC)
path = "Tor/control.socket";
+ else if (isSOCKSIPC)
+ path = "Tor/socks.socket";
}
}
else if (this.isWindows)
@@ -475,8 +481,10 @@ let TorLauncherUtil = // Public
path = "Data/Tor/torrc";
else if ("tordatadir" == aTorFileType)
path = "Data/Tor";
- else if (isControlSocket)
+ else if (isControlIPC)
path = "Data/Tor/control.socket";
+ else if (isSOCKSIPC)
+ path = "Data/Tor/socks.socket";
}
}
@@ -508,7 +516,7 @@ let TorLauncherUtil = // Public
f.initWithPath(path);
}
- if (!f.exists() && !isControlSocket && aCreate)
+ if (!f.exists() && !isIPC && aCreate)
{
try
{
@@ -524,10 +532,10 @@ let TorLauncherUtil = // Public
}
}
- // If the file exists or the control socket was requested, normalize
- // the path and return a file object. The control socket will be
+ // If the file exists or an IPC object was requested, normalize the path
+ // and return a file object. The control and SOCKS IPC objects will be
// created by tor.
- if (f.exists() || isControlSocket)
+ if (f.exists() || isIPC)
{
try { f.normalize(); } catch(e) {}
return f;
@@ -538,7 +546,7 @@ let TorLauncherUtil = // Public
catch(e)
{
TorLauncherLogger.safelog(4, "getTorFile " + aTorFileType +
- " failed for " + path + ": ", e);
+ " failed for " + path + ": ", e);
}
return null; // File not found or error (logged above).
1
0

[torbutton/master] Bug 20111: use Unix domain sockets for SOCKS port by default
by gk@torproject.org 20 Oct '16
by gk@torproject.org 20 Oct '16
20 Oct '16
commit f4980a6c647ea780eacc922846e81c0d992cbd13
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Oct 11 15:37:47 2016 -0400
Bug 20111: use Unix domain sockets for SOCKS port by default
Retrieve SOCKS port configuration from Tor Launcher if available.
Support the TOR_SOCKS_IPC_PATH environment variable.
Consistently use IPC to refer to Unix domain sockets.
Enhance torbutton_local_tor_check() to correctly handle spaces and
escaped characters within the 'GETINFO net/listeners/socks' response.
Within startup-observer.js, use Services.jsm, Cc and similar
constants, and remove unused code.
---
src/chrome/content/tor-circuit-display.js | 12 +--
src/chrome/content/torbutton.js | 64 +++++++++-------
src/components/startup-observer.js | 117 +++++++++++++++++++-----------
src/modules/tor-control-port.js | 51 +++++++------
src/modules/utils.js | 101 +++++++++++++++++++++++++-
5 files changed, 242 insertions(+), 103 deletions(-)
diff --git a/src/chrome/content/tor-circuit-display.js b/src/chrome/content/tor-circuit-display.js
index f1cf2aa..c58c6d7 100644
--- a/src/chrome/content/tor-circuit-display.js
+++ b/src/chrome/content/tor-circuit-display.js
@@ -6,7 +6,7 @@
// with docco.js to produce pretty documentation.
//
// This script is to be embedded in torbutton.xul. It defines a single global
-// function, createTorCircuitDisplay(socketFile, host, port, password), which
+// function, createTorCircuitDisplay(ipcFile, host, port, password), which
// activates the automatic Tor circuit display for the current tab and any
// future tabs.
//
@@ -16,9 +16,9 @@
/* global document, gBrowser, Components */
// ### Main function
-// __createTorCircuitDisplay(socketFile, host, port, password, enablePrefName)__.
+// __createTorCircuitDisplay(ipcFile, host, port, password, enablePrefName)__.
// The single function that prepares tor circuit display. Connects to a tor
-// control port with the given socketFile or host plus port, and password, and
+// control port with the given ipcFile or host plus port, and password, and
// binds to a named bool pref whose value determines whether the circuit display
// is enabled or disabled.
let createTorCircuitDisplay = (function () {
@@ -312,11 +312,11 @@ let syncDisplayWithSelectedTab = (function() {
// ## Main function
-// __setupDisplay(socketFile, host, port, password, enablePrefName)__.
+// __setupDisplay(ipcFile, host, port, password, enablePrefName)__.
// Once called, the Tor circuit display will be started whenever
// the "enablePref" is set to true, and stopped when it is set to false.
// A reference to this function (called createTorCircuitDisplay) is exported as a global.
-let setupDisplay = function (socketFile, host, port, password, enablePrefName) {
+let setupDisplay = function (ipcFile, host, port, password, enablePrefName) {
let myController = null,
stopCollectingIsolationData = null,
stop = function() {
@@ -330,7 +330,7 @@ let setupDisplay = function (socketFile, host, port, password, enablePrefName) {
},
start = function () {
if (!myController) {
- myController = controller(socketFile, host, port || 9151, password,
+ myController = controller(ipcFile, host, port || 9151, password,
function (err) {
// An error has occurred.
logger.eclog(5, err);
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index d2824cb..9a8b9e2 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -10,6 +10,7 @@
let { LoadContextInfo } = Cu.import('resource://gre/modules/LoadContextInfo.jsm');
let { Services } = Cu.import("resource://gre/modules/Services.jsm");
let { showDialog } = Cu.import("resource://torbutton/modules/utils.js");
+let { unescapeTorString } = Cu.import("resource://torbutton/modules/utils.js");
const k_tb_last_browser_version_pref = "extensions.torbutton.lastBrowserVersion";
const k_tb_browser_update_needed_pref = "extensions.torbutton.updateNeeded";
@@ -33,9 +34,9 @@ var m_tb_window_width = window.outerWidth;
var m_tb_tbb = false;
-var m_tb_control_socket_file = null; // Set if using a UNIX domain socket.
-var m_tb_control_port = null; // Set if not using a socket.
-var m_tb_control_host = null; // Set if not using a socket.
+var m_tb_control_ipc_file = null; // Set if using IPC (UNIX domain socket).
+var m_tb_control_port = null; // Set if using TCP.
+var m_tb_control_host = null; // Set if using TCP.
var m_tb_control_pass = null;
var m_tb_control_desc = null; // For logging.
@@ -327,15 +328,15 @@ function torbutton_init() {
m_tb_control_pass = tlps.TorGetPassword(false);
} catch(e) {}
- // Try to get control port socket (an nsIFile) from Tor Launcher, since
- // Tor Launcher knows how to handle its own preferences and how to
+ // Try to get the control port IPC file (an nsIFile) from Tor Launcher,
+ // since Tor Launcher knows how to handle its own preferences and how to
// resolve relative paths.
try {
- m_tb_control_socket_file = tlps.TorGetControlSocketFile();
+ m_tb_control_ipc_file = tlps.TorGetControlIPCFile();
} catch(e) {}
- if (m_tb_control_socket_file) {
- m_tb_control_desc = m_tb_control_socket_file.path;
+ if (m_tb_control_ipc_file) {
+ m_tb_control_desc = m_tb_control_ipc_file.path;
} else {
if (environ.exists("TOR_CONTROL_PORT")) {
m_tb_control_port = environ.get("TOR_CONTROL_PORT");
@@ -438,7 +439,7 @@ function torbutton_init() {
torbutton_notify_if_update_needed();
torbutton_update_sync_ui();
- createTorCircuitDisplay(m_tb_control_socket_file, m_tb_control_host,
+ createTorCircuitDisplay(m_tb_control_ipc_file, m_tb_control_host,
m_tb_control_port, m_tb_control_pass,
"extensions.torbutton.display_circuit");
@@ -1009,8 +1010,8 @@ function torbutton_send_ctrl_cmd(command) {
let sts = Cc["@mozilla.org/network/socket-transport-service;1"]
.getService(Ci.nsISocketTransportService);
let socket;
- if (m_tb_control_socket_file) {
- socket = sts.createUnixDomainTransport(m_tb_control_socket_file);
+ if (m_tb_control_ipc_file) {
+ socket = sts.createUnixDomainTransport(m_tb_control_ipc_file);
} else {
socket = sts.createTransport(null, 0, m_tb_control_host,
m_tb_control_port, null);
@@ -1350,7 +1351,7 @@ function torbutton_do_new_identity() {
torbutton_log(3, "New Identity: Sending NEWNYM");
// We only support TBB for newnym.
- if (!m_tb_control_pass || (!m_tb_control_socket_file && !m_tb_control_port)) {
+ if (!m_tb_control_pass || (!m_tb_control_ipc_file && !m_tb_control_port)) {
var warning = torbutton_get_property_string("torbutton.popup.no_newnym");
torbutton_log(5, "Torbutton cannot safely newnym. It does not have access to the Tor Control Port.");
window.alert(warning);
@@ -1508,7 +1509,7 @@ function torbutton_do_tor_check()
const kEnvUseTransparentProxy = "TOR_TRANSPROXY";
var env = Cc["@mozilla.org/process/environment;1"]
.getService(Ci.nsIEnvironment);
- if ((m_tb_control_socket_file || m_tb_control_port) &&
+ if ((m_tb_control_ipc_file || m_tb_control_port) &&
!env.exists(kEnvUseTransparentProxy) &&
!env.exists(kEnvSkipControlPortTest) &&
m_tb_prefs.getBoolPref("extensions.torbutton.local_tor_check")) {
@@ -1559,19 +1560,20 @@ function torbutton_local_tor_check()
}
// Sample response: net/listeners/socks="127.0.0.1:9149" "127.0.0.1:9150"
- // First, check for command argument prefix.
+ // First, check for and remove the command argument prefix.
if (0 != resp.indexOf(kCmdArg + '=')) {
logUnexpectedResponse();
return false;
}
+ resp = resp.substr(kCmdArg.length + 1);
// Retrieve configured proxy settings and check each listener against them.
- // When a Unix domain socket is configured, a file URL should be present in
- // network.proxy.socks.
+ // When the SOCKS prefs are set to use IPC (e.g., a Unix domain socket), a
+ // file URL should be present in network.proxy.socks.
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=1211567
let socksAddr = m_tb_prefs.getCharPref("network.proxy.socks");
let socksPort = m_tb_prefs.getIntPref("network.proxy.socks_port");
- let socketPath;
+ let socksIPCPath;
if (socksAddr && socksAddr.startsWith("file:")) {
// Convert the file URL to a file path.
try {
@@ -1579,19 +1581,29 @@ function torbutton_local_tor_check()
.getService(Ci.nsIIOService);
let fph = ioService.getProtocolHandler("file")
.QueryInterface(Ci.nsIFileProtocolHandler);
- socketPath = fph.getFileFromURLSpec(socksAddr).path;
+ socksIPCPath = fph.getFileFromURLSpec(socksAddr).path;
} catch (e) {
- torbutton_log(5, "Local Tor check: Unix domain socket error: " + e);
+ torbutton_log(5, "Local Tor check: IPC file error: " + e);
return false;
}
} else {
socksAddr = removeBrackets(socksAddr);
}
- let addrArray = resp.substr(kCmdArg.length + 1).split(' ');
+ // Split into quoted strings. This code is adapted from utils.splitAtSpaces()
+ // within tor-control-port.js; someday this code should use the entire
+ // tor-control-port.js framework.
+ let addrArray = [];
+ resp.replace(/((\S*?"(.*?)")+\S*|\S+)/g, function (a, captured) {
+ addrArray.push(captured);
+ });
+
let foundSocksListener = false;
for (let i = 0; !foundSocksListener && (i < addrArray.length); ++i) {
- let addr = addrArray[i];
+ let addr;
+ try { addr = unescapeTorString(addrArray[i]); } catch (e) {}
+ if (!addr)
+ continue;
// Remove double quotes if present.
let len = addr.length;
@@ -1599,14 +1611,14 @@ function torbutton_local_tor_check()
addr = addr.substring(1, len - 1);
if (addr.startsWith("unix:")) {
- if (!socketPath)
+ if (!socksIPCPath)
continue;
// Check against the configured UNIX domain socket proxy.
let path = addr.substring(5);
- torbutton_log(2, "Tor socks listener (socket): " + path);
- foundSocksListener = (socketPath === path);
- } else if (!socketPath) {
+ torbutton_log(2, "Tor socks listener (Unix domain socket): " + path);
+ foundSocksListener = (socksIPCPath === path);
+ } else if (!socksIPCPath) {
// Check against the configured TCP proxy. We expect addr:port where addr
// may be an IPv6 address; that is, it may contain colon characters.
// Also, we remove enclosing square brackets before comparing addresses
@@ -2088,7 +2100,7 @@ function torbutton_check_protections()
// See https://trac.torproject.org/projects/tor/ticket/10353 for more info.
document.getElementById("torbutton-cookie-protector").hidden = m_tb_prefs.getBoolPref("browser.privatebrowsing.autostart");
- if (!m_tb_control_pass || (!m_tb_control_socket_file && !m_tb_control_port)) {
+ if (!m_tb_control_pass || (!m_tb_control_ipc_file && !m_tb_control_port)) {
document.getElementById("torbutton-new-identity").disabled = true;
}
diff --git a/src/components/startup-observer.js b/src/components/startup-observer.js
index f083482..6698b0b 100644
--- a/src/components/startup-observer.js
+++ b/src/components/startup-observer.js
@@ -15,6 +15,13 @@
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
+ "resource://gre/modules/FileUtils.jsm");
+
// Module specific constants
const kMODULE_NAME = "Startup";
@@ -22,10 +29,9 @@ const kMODULE_CONTRACTID = "@torproject.org/startup-observer;1";
const kMODULE_CID = Components.ID("06322def-6fde-4c06-aef6-47ae8e799629");
function StartupObserver() {
- this.logger = Components.classes["@torproject.org/torbutton-logger;1"]
- .getService(Components.interfaces.nsISupports).wrappedJSObject;
- this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranch);
+ this.logger = Cc["@torproject.org/torbutton-logger;1"]
+ .getService(Ci.nsISupports).wrappedJSObject;
+ this._prefs = Services.prefs;
this.logger.log(3, "Startup Observer created");
var env = Cc["@mozilla.org/process/environment;1"]
@@ -61,41 +67,74 @@ StartupObserver.prototype = {
// some weird proxy caching code that showed up in FF15.
// Otherwise, homepage domain loads fail forever.
setProxySettings: function() {
+ if (!this.is_tbb)
+ return;
+
// Bug 1506: Still want to get these env vars
- var environ = Components.classes["@mozilla.org/process/environment;1"]
- .getService(Components.interfaces.nsIEnvironment);
-
- if (environ.exists("TOR_SOCKS_PORT")) {
- if (this.is_tbb) {
- this._prefs.setIntPref('network.proxy.socks_port',
- parseInt(environ.get("TOR_SOCKS_PORT")));
- this._prefs.setBoolPref('network.proxy.socks_remote_dns', true);
- this._prefs.setIntPref('network.proxy.type', 1);
+ let environ = Cc["@mozilla.org/process/environment;1"]
+ .getService(Ci.nsIEnvironment);
+ if (environ.exists("TOR_TRANSPROXY")) {
+ this.logger.log(3, "Resetting Tor settings to transproxy");
+ this._prefs.setBoolPref("network.proxy.socks_remote_dns", false);
+ this._prefs.setIntPref("network.proxy.type", 0);
+ this._prefs.setIntPref("network.proxy.socks_port", 0);
+ this._prefs.setCharPref("network.proxy.socks", "");
+ } else {
+ // Try to retrieve SOCKS proxy settings from Tor Launcher.
+ let socksPortInfo;
+ try {
+ let tlps = Cc["@torproject.org/torlauncher-protocol-service;1"]
+ .getService(Ci.nsISupports).wrappedJSObject;
+ socksPortInfo = tlps.TorGetSOCKSPortInfo();
+ } catch(e) {}
+
+ // If Tor Launcher is not available, check environment variables.
+ if (!socksPortInfo) {
+ socksPortInfo = { ipcFile: undefined, host: undefined, port: 0 };
+
+ let isWindows = Services.appinfo.OS === "WINNT";
+ if (!isWindows && environ.exists("TOR_SOCKS_IPC_PATH")) {
+ socksPortInfo.ipcFile = new FileUtils.File(
+ environ.get("TOR_SOCKS_IPC_PATH"));
+ }
+ else
+ {
+ if (environ.exists("TOR_SOCKS_HOST"))
+ socksPortInfo.host = environ.get("TOR_SOCKS_HOST");
+ if (environ.exists("TOR_SOCKS_PORT"))
+ socksPortInfo.port = parseInt(environ.get("TOR_SOCKS_PORT"));
+ }
}
- this.logger.log(3, "Reset socks port to "+environ.get("TOR_SOCKS_PORT"));
- }
- if (environ.exists("TOR_SOCKS_HOST")) {
- if (this.is_tbb) {
- this._prefs.setCharPref('network.proxy.socks', environ.get("TOR_SOCKS_HOST"));
+ // Adjust network.proxy prefs.
+ if (socksPortInfo.ipcFile) {
+ let fph = Services.io.getProtocolHandler("file")
+ .QueryInterface(Ci.nsIFileProtocolHandler);
+ let fileURI = fph.newFileURI(socksPortInfo.ipcFile);
+ this.logger.log(3, "Reset socks to "+fileURI.spec);
+ this._prefs.setCharPref("network.proxy.socks", fileURI.spec);
+ this._prefs.setIntPref("network.proxy.socks_port", 0);
+ } else {
+ if (socksPortInfo.host) {
+ this._prefs.setCharPref("network.proxy.socks", socksPortInfo.host);
+ this.logger.log(3, "Reset socks host to "+socksPortInfo.host);
+ }
+ if (socksPortInfo.port) {
+ this._prefs.setIntPref("network.proxy.socks_port",
+ socksPortInfo.port);
+ this.logger.log(3, "Reset socks port to "+socksPortInfo.port);
+ }
}
- }
- if (environ.exists("TOR_TRANSPROXY")) {
- this.logger.log(3, "Resetting Tor settings to transproxy");
- if (this.is_tbb) {
- this._prefs.setBoolPref('network.proxy.socks_remote_dns', false);
- this._prefs.setIntPref('network.proxy.type', 0);
- this._prefs.setIntPref('network.proxy.socks_port', 0);
- this._prefs.setCharPref('network.proxy.socks', "");
+ if (socksPortInfo.ipcFile || socksPortInfo.host || socksPortInfo.port) {
+ this._prefs.setBoolPref("network.proxy.socks_remote_dns", true);
+ this._prefs.setIntPref("network.proxy.type", 1);
}
}
// Force prefs to be synced to disk
- var prefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
- prefService.savePrefFile(null);
-
+ this._prefs.savePrefFile(null);
+
this.logger.log(3, "Synced network settings to environment.");
},
@@ -109,16 +148,14 @@ StartupObserver.prototype = {
}
// In all cases, force prefs to be synced to disk
- var prefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
- prefService.savePrefFile(null);
+ this._prefs.savePrefFile(null);
},
QueryInterface: function(iid) {
- if (iid.equals(Components.interfaces.nsISupports)) {
+ if (iid.equals(Ci.nsISupports)) {
return this;
}
- if(iid.equals(Components.interfaces.nsIClassInfo)) {
+ if(iid.equals(Ci.nsIClassInfo)) {
return this;
}
return this;
@@ -141,12 +178,4 @@ StartupObserver.prototype = {
};
-/**
-* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
-* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
-*/
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-if (XPCOMUtils.generateNSGetFactory)
- var NSGetFactory = XPCOMUtils.generateNSGetFactory([StartupObserver]);
-else
- var NSGetModule = XPCOMUtils.generateNSGetModule([StartupObserver]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([StartupObserver]);
diff --git a/src/modules/tor-control-port.js b/src/modules/tor-control-port.js
index f23daed..a7f0434 100644
--- a/src/modules/tor-control-port.js
+++ b/src/modules/tor-control-port.js
@@ -10,7 +10,7 @@
// let { controller } = Components.utils.import("path/to/tor-control-port.js");
//
// See the last function defined in this file:
-// controller(socketFile, host, port, password, onError)
+// controller(ipcFile, host, port, password, onError)
// for usage of the controller function.
/* jshint esnext: true */
@@ -42,18 +42,18 @@ log("Loading tor-control-port.js\n");
// I/O utilities namespace
let io = {};
-// __io.asyncSocketStreams(socketFile, host, port)__.
+// __io.asyncSocketStreams(ipcFile, host, port)__.
// Creates a pair of asynchronous input and output streams for a socket at the
-// given socketFile or host and port.
-io.asyncSocketStreams = function (socketFile, host, port) {
+// given ipcFile or host and port.
+io.asyncSocketStreams = function (ipcFile, host, port) {
let sts = Cc["@mozilla.org/network/socket-transport-service;1"]
.getService(Components.interfaces.nsISocketTransportService),
UNBUFFERED = Ci.nsITransport.OPEN_UNBUFFERED;
// Create an instance of a socket transport.
let socketTransport;
- if (socketFile) {
- socketTransport = sts.createUnixDomainTransport(socketFile);
+ if (ipcFile) {
+ socketTransport = sts.createUnixDomainTransport(ipcFile);
} else {
socketTransport = sts.createTransport(null, 0, host, port, null);
}
@@ -99,16 +99,15 @@ io.pumpInputStream = function (inputStream, onInputData, onError) {
} }, null);
};
-// __io.asyncSocket(socketFile, host, port, onInputData, onError)__.
-// Creates an asynchronous, text-oriented UNIX domain socket (if socketFile
-// is defined) or TCP socket at host:port.
+// __io.asyncSocket(ipcFile, host, port, onInputData, onError)__.
+// Creates an asynchronous, text-oriented IPC socket (if ipcFile is defined)
+// or a TCP socket at host:port.
// The onInputData callback should accept a single argument, which will be called
// repeatedly, whenever incoming text arrives. Returns a socket object with two methods:
// socket.write(text) and socket.close(). onError will be passed the error object
// whenever a write fails.
-io.asyncSocket = function (socketFile, host, port, onInputData, onError) {
- let [inputStream, outputStream] = io.asyncSocketStreams(socketFile, host,
- port),
+io.asyncSocket = function (ipcFile, host, port, onInputData, onError) {
+ let [inputStream, outputStream] = io.asyncSocketStreams(ipcFile, host, port),
pendingWrites = [];
// Run an input stream pump to send incoming data to the onInputData callback.
io.pumpInputStream(inputStream, onInputData, onError);
@@ -253,8 +252,8 @@ io.matchRepliesToCommands = function (asyncSend, dispatcher) {
});
};
-// __io.controlSocket(socketFile, host, port, password, onError)__.
-// Instantiates and returns a socket to a tor ControlPort at socketFile or
+// __io.controlSocket(ipcFile, host, port, password, onError)__.
+// Instantiates and returns a socket to a tor ControlPort at ipcFile or
// host:port, authenticating with the given password. onError is called with an
// error object as its single argument whenever an error occurs. Example:
//
@@ -269,11 +268,11 @@ io.matchRepliesToCommands = function (asyncSend, dispatcher) {
// socket.removeNotificationCallback(callback);
// // Close the socket permanently
// socket.close();
-io.controlSocket = function (socketFile, host, port, password, onError) {
+io.controlSocket = function (ipcFile, host, port, password, onError) {
// Produce a callback dispatcher for Tor messages.
let mainDispatcher = io.callbackDispatcher(),
// Open the socket and convert format to Tor messages.
- socket = io.asyncSocket(socketFile, host, port,
+ socket = io.asyncSocket(ipcFile, host, port,
io.onDataFromOnLine(
io.onLineFromOnMessage(mainDispatcher.pushMessage)),
onError),
@@ -620,12 +619,12 @@ let tor = {};
// redundant instantiation of control sockets.
tor.controllerCache = {};
-// __tor.controller(socketFile, host, port, password, onError)__.
-// Creates a tor controller at the given socketFile or host and port, with the
+// __tor.controller(ipcFile, host, port, password, onError)__.
+// Creates a tor controller at the given ipcFile or host and port, with the
// given password.
// onError returns asynchronously whenever a connection error occurs.
-tor.controller = function (socketFile, host, port, password, onError) {
- let socket = io.controlSocket(socketFile, host, port, password, onError),
+tor.controller = function (ipcFile, host, port, password, onError) {
+ let socket = io.controlSocket(ipcFile, host, port, password, onError),
isOpen = true;
return { getInfo : key => info.getInfo(socket, key),
getConf : key => info.getConf(socket, key),
@@ -638,11 +637,11 @@ tor.controller = function (socketFile, host, port, password, onError) {
// ## Export
-// __controller(socketFile, host, port, password, onError)__.
+// __controller(ipcFile, host, port, password, onError)__.
// Instantiates and returns a controller object connected to a tor ControlPort
-// on socketFile or at host:port, authenticating with the given password, if
+// on ipcFile or at host:port, authenticating with the given password, if
// the controller doesn't yet exist. Otherwise returns the existing controller
-// to the given socketFile or host:port.
+// to the given ipcFile or host:port.
// onError is called with an error object as its single argument whenever
// an error occurs. Example:
//
@@ -653,13 +652,13 @@ tor.controller = function (socketFile, host, port, password, onError) {
// let replyPromise = c.getInfo("ip-to-country/16.16.16.16");
// // Close the controller permanently
// c.close();
-var controller = function (socketFile, host, port, password, onError) {
- let dest = (socketFile) ? "unix:" + socketFile.path : host + ":" + port,
+var controller = function (ipcFile, host, port, password, onError) {
+ let dest = (ipcFile) ? "unix:" + ipcFile.path : host + ":" + port,
maybeController = tor.controllerCache[dest];
return (tor.controllerCache[dest] =
(maybeController && maybeController.isOpen()) ?
maybeController :
- tor.controller(socketFile, host, port, password, onError));
+ tor.controller(ipcFile, host, port, password, onError));
};
// Export the controller function for external use.
diff --git a/src/modules/utils.js b/src/modules/utils.js
index 514ef51..b303485 100644
--- a/src/modules/utils.js
+++ b/src/modules/utils.js
@@ -74,5 +74,104 @@ var showDialog = function (parent, url, name, features) {
}
};
+// ## Tor control protocol utility functions
+
+let _torControl = {
+ // Unescape Tor Control string aStr (removing surrounding "" and \ escapes).
+ // Based on Vidalia's src/common/stringutil.cpp:string_unescape().
+ // Returns the unescaped string. Throws upon failure.
+ // Within Tor Launcher, the file components/tl-protocol.js also contains a
+ // copy of _strUnescape().
+ _strUnescape: function(aStr)
+ {
+ if (!aStr)
+ return aStr;
+
+ var len = aStr.length;
+ if ((len < 2) || ('"' != aStr.charAt(0)) || ('"' != aStr.charAt(len - 1)))
+ return aStr;
+
+ const kHexRE = /[0-9A-Fa-f]{2}/;
+ const kOctalRE = /[0-7]{3}/;
+ var rv = "";
+ var i = 1;
+ var lastCharIndex = len - 2;
+ while (i <= lastCharIndex)
+ {
+ var c = aStr.charAt(i);
+ if ('\\' == c)
+ {
+ if (++i > lastCharIndex)
+ throw new Error("missing character after \\");
+
+ c = aStr.charAt(i);
+ if ('n' == c)
+ rv += '\n';
+ else if ('r' == c)
+ rv += '\r';
+ else if ('t' == c)
+ rv += '\t';
+ else if ('x' == c)
+ {
+ if ((i + 2) > lastCharIndex)
+ throw new Error("not enough hex characters");
+
+ let s = aStr.substr(i + 1, 2);
+ if (!kHexRE.test(s))
+ throw new Error("invalid hex characters");
+
+ let val = parseInt(s, 16);
+ rv += String.fromCharCode(val);
+ i += 3;
+ }
+ else if (this._isDigit(c))
+ {
+ let s = aStr.substr(i, 3);
+ if ((i + 2) > lastCharIndex)
+ throw new Error("not enough octal characters");
+
+ if (!kOctalRE.test(s))
+ throw new Error("invalid octal characters");
+
+ let val = parseInt(s, 8);
+ rv += String.fromCharCode(val);
+ i += 3;
+ }
+ else // "\\" and others
+ {
+ rv += c;
+ ++i;
+ }
+ }
+ else if ('"' == c)
+ throw new Error("unescaped \" within string");
+ else
+ {
+ rv += c;
+ ++i;
+ }
+ }
+
+ // Convert from UTF-8 to Unicode. TODO: is UTF-8 always used in protocol?
+ return decodeURIComponent(escape(rv));
+ }, // _strUnescape()
+
+ // Within Tor Launcher, the file components/tl-protocol.js also contains a
+ // copy of _isDigit().
+ _isDigit: function(aChar)
+ {
+ const kRE = /^\d$/;
+ return aChar && kRE.test(aChar);
+ },
+}; // _torControl
+
+// __unescapeTorString(str, resultObj)__.
+// Unescape Tor Control string str (removing surrounding "" and \ escapes).
+// Returns the unescaped string. Throws upon failure.
+var unescapeTorString = function(str) {
+ return _torControl._strUnescape(str);
+};
+
// Export utility functions for external use.
-let EXPORTED_SYMBOLS = ["bindPrefAndInit", "getPrefValue", "getEnv", "showDialog"];
+let EXPORTED_SYMBOLS = ["bindPrefAndInit", "getPrefValue", "getEnv",
+ "showDialog", "unescapeTorString"];
1
0
commit 70e5f3b26c7e4d22158b02757681170ac0daadf5
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Tue Oct 18 11:29:27 2016 -0700
Bug 20394: Remove obsolete code
---
src/chrome/content/contents.rdf | 50 ------------------------------------
src/chrome/content/torbutton.js | 23 ++---------------
src/chrome/content/torbutton_util.js | 8 +-----
src/chrome/skin/contents.rdf | 45 --------------------------------
4 files changed, 3 insertions(+), 123 deletions(-)
diff --git a/src/chrome/content/contents.rdf b/src/chrome/content/contents.rdf
deleted file mode 100644
index c7afa3a..0000000
--- a/src/chrome/content/contents.rdf
+++ /dev/null
@@ -1,50 +0,0 @@
-<!-- Bug 1506 P0: This is old FF2 cruft. It does not need to exist. -->
-<?xml version="1.0"?>
-
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
-
- <Seq about="urn:mozilla:package:root">
- <li resource="urn:mozilla:package:torbutton"/>
- </Seq>
-
- <Description about="urn:mozilla:package:torbutton"
- chrome:athor="Scott Squires"
- chrome:displayName="Torbutton"
- chrome:extension="true"
- chrome:name="torbutton">
- </Description>
-
- <Seq about="urn:mozilla:overlays">
- <!-- firefox 0.9 and 1.0 -->
- <li resource="chrome://browser/content/browser.xul"/>
- <li resource="chrome://browser/content/pref/pref-connection.xul"/>
- <!-- thunderbird -->
- <li resource="chrome://messenger/content/messenger.xul"/>
- <li resource="chrome://messenger/content/messengercompose/messengercompose.xul"/>
- <!-- torbutton -->
- <li resource="chrome://torbutton/content/torbutton.xul"/>
- </Seq>
-
- <!-- firefox 0.9 and 1.0 -->
- <Seq about="chrome://browser/content/browser.xul">
- <li>chrome://torbutton/content/torbutton.xul</li>
- </Seq>
- <Seq about="chrome://browser/content/pref/pref-connection.xul">
- <li>chrome://torbutton/content/pref-connection.xul</li>
- </Seq>
-
- <!-- thunderbird -->
- <Seq about="chrome://messenger/content/messenger.xul">
- <li>chrome://torbutton/content/torbutton_tb.xul</li>
- </Seq>
- <Seq about="chrome://messenger/content/messengercompose/messengercompose.xul">
- <li>chrome://torbutton/content/torbutton_tb.xul</li>
- </Seq>
-
- <!-- torbutton -->
- <Seq about="chrome://torbutton/content/torbutton.xul">
- <li>chrome://torbutton/content/popup.xul</li>
- </Seq>
-
-</RDF>
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index 3c05047..d2824cb 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -1,4 +1,4 @@
-// Bug 1506 P0-P5: This is the main Torbutton overlay file. Much needs to be
+// Bug 1506 P1-P5: This is the main Torbutton overlay file. Much needs to be
// preserved here, but in an ideal world, most of this code should perhaps be
// moved into an XPCOM service, and much can also be tossed. See also
// individual 1506 comments for details.
@@ -2110,25 +2110,6 @@ function torbutton_open_prefs_dialog() {
torbutton_log(2, 'opened preferences window');
}
-// Bug 1506 P0: Support code for checking Firefox versions. Not needed.
-function torbutton_gecko_compare(aVersion) {
- var ioService = Components.classes["@mozilla.org/network/io-service;1"]
- .getService(Components.interfaces.nsIIOService);
- var httpProtocolHandler = ioService.getProtocolHandler("http")
- .QueryInterface(Components.interfaces.nsIHttpProtocolHandler);
- var versionComparator = null;
-
- if ("nsIVersionComparator" in Components.interfaces) {
- versionComparator = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
- .getService(Components.interfaces.nsIVersionComparator);
- } else {
- versionComparator = Components.classes["@mozilla.org/updates/version-checker;1"]
- .getService(Components.interfaces.nsIVersionChecker);
- }
- var geckoVersion = httpProtocolHandler.misc.match(/rv:([0-9.]+)/)[1];
- return versionComparator.compare(aVersion, geckoVersion);
-}
-
// -------------- HISTORY & COOKIES ---------------------
// Bug 1506 P4: Used by New Identity if cookie protections are
@@ -2321,7 +2302,7 @@ function torbutton_do_startup()
}
}
-// Bug 1506 P0: Perform version check when a new tab is opened.
+// Perform version check when a new tab is opened.
function torbutton_new_tab(event)
{
// listening for new tabs
diff --git a/src/chrome/content/torbutton_util.js b/src/chrome/content/torbutton_util.js
index f1263f1..e6de768 100644
--- a/src/chrome/content/torbutton_util.js
+++ b/src/chrome/content/torbutton_util.js
@@ -1,4 +1,4 @@
-// Bug 1506 P0-P3: These utility functions might be useful, but
+// Bug 1506 P1-P3: These utility functions might be useful, but
// you probably just want to rewrite them or use the underlying
// code directly. I don't see any of them as essential for 1506,
// really.
@@ -8,12 +8,6 @@ var m_tb_torlog = Components.classes["@torproject.org/torbutton-logger;1"]
var m_tb_string_bundle = torbutton_get_stringbundle();
-// Bug 1506 P0: Use the log service directly
-function torbutton_eclog(nLevel, sMsg) {
- m_tb_torlog.eclog(nLevel, sMsg);
- return true;
-}
-
function torbutton_safelog(nLevel, sMsg, scrub) {
m_tb_torlog.safe_log(nLevel, sMsg, scrub);
return true;
diff --git a/src/chrome/skin/contents.rdf b/src/chrome/skin/contents.rdf
deleted file mode 100644
index 53bde17..0000000
--- a/src/chrome/skin/contents.rdf
+++ /dev/null
@@ -1,45 +0,0 @@
-<!-- Bug 1506 P0: This is old FF2 cruft. It does not need to exist. -->
-<?xml version="1.0"?>
-
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
-
- <Seq about="urn:mozilla:skin:root">
- <li resource="urn:mozilla:skin:classic/1.0"/>
- </Seq>
-
- <Description about="urn:mozilla:skin:classic/1.0">
- <chrome:packages>
- <Seq about="urn:mozilla:skin:classic/1.0:packages">
- <li resource="urn:mozilla:skin:classic/1.0:torbutton"/>
- </Seq>
- </chrome:packages>
- </Description>
-
- <Seq about="urn:mozilla:stylesheets">
- <li resource="chrome://global/content/customizeToolbar.xul"/>
- <!-- firefox -->
- <li resource="chrome://browser/content/browser.xul"/>
- <!-- thunderbird -->
- <li resource="chrome://messenger/content/messenger.xul"/>
- <li resource="chrome://messenger/content/messengercompose/messengercompose.xul"/>
- </Seq>
-
- <Seq about="chrome://global/content/customizeToolbar.xul">
- <li>chrome://torbutton/skin/torbutton.css</li>
- </Seq>
-
- <!-- firefox -->
- <Seq about="chrome://browser/content/browser.xul">
- <li>chrome://torbutton/skin/torbutton.css</li>
- </Seq>
-
- <!-- thunderbird -->
- <Seq about="chrome://messenger/content/messenger.xul">
- <li>chrome://torbutton/skin/torbutton.css</li>
- </Seq>
- <Seq about="chrome://messenger/content/messengercompose/messengercompose.xul">
- <li>chrome://torbutton/skin/torbutton.css</li>
- </Seq>
-
-</RDF>
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] fixup! TB4: Tor Browser's Firefox preference overrides.
by gk@torproject.org 19 Oct '16
by gk@torproject.org 19 Oct '16
19 Oct '16
commit 62d6468cedbdd1ae08b1e4a7192184c3aa92137c
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Tue Oct 18 18:10:41 2016 -0700
fixup! TB4: Tor Browser's Firefox preference overrides.
Fixes #20399 by removing obsolete preferences related to our font
fingerprinting defense.
---
browser/app/profile/000-tor-browser.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index 13af485..1f1db9e 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -112,8 +112,6 @@ pref("webgl.disable-extensions", true);
pref("webgl.disable-fail-if-major-performance-caveat", true);
pref("dom.battery.enabled", false); // fingerprinting due to differing OS implementations
pref("dom.network.enabled",false); // fingerprinting due to differing OS implementations
-pref("browser.display.max_font_attempts",10);
-pref("browser.display.max_font_count",10);
pref("gfx.downloadable_fonts.fallback_delay", -1);
pref("general.appname.override", "Netscape");
pref("general.appversion.override", "5.0 (Windows)");
1
0

19 Oct '16
commit 2d88aa4d7239c3d386c69396c8d0d40ddd23a952
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Tue Oct 18 17:23:45 2016 -0700
Bug 20399: Remove obsolete font attempt prefs
---
src/chrome/content/torbutton.js | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index 5b03ba0..3c05047 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -1746,12 +1746,6 @@ function torbutton_update_fingerprinting_prefs() {
if (m_tb_tbb) {
if (mode) {
- // Use TBB pref defaults for these two.
- if(m_tb_prefs.prefHasUserValue("browser.display.max_font_attempts"))
- m_tb_prefs.clearUserPref("browser.display.max_font_attempts");
- if(m_tb_prefs.prefHasUserValue("browser.display.max_font_count"))
- m_tb_prefs.clearUserPref("browser.display.max_font_count");
-
// Governed also by the spoof_english dialog..
if (m_tb_prefs.getBoolPref("extensions.torbutton.spoof_english")) {
m_tb_prefs.setCharPref("intl.accept_languages", "en-US, en");
@@ -1762,9 +1756,6 @@ function torbutton_update_fingerprinting_prefs() {
m_tb_prefs.setBoolPref("javascript.use_us_english_locale", false);
}
} else {
- m_tb_prefs.setIntPref("browser.display.max_font_attempts",-1);
- m_tb_prefs.setIntPref("browser.display.max_font_count",-1);
-
if(m_tb_prefs.prefHasUserValue("intl.accept_languages"))
m_tb_prefs.clearUserPref("intl.accept_languages");
}
1
0

18 Oct '16
commit 2cef75462d4a7f640b4586c0cd50b6679b9fc7ae
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Mon Oct 17 14:21:36 2016 -0700
Bug 20388: Consolidate Services.prefs references
---
src/chrome/content/torbutton.js | 76 ++++++++++++++++-------------------------
1 file changed, 29 insertions(+), 47 deletions(-)
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index fa4009a..5b03ba0 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -18,9 +18,10 @@ const k_tb_tor_check_failed_topic = "Torbutton:TorCheckFailed";
const k_tb_tor_resize_warn_pref =
"extensions.torbutton.startup_resize_period"
+var m_tb_prefs = Services.prefs;
+
// status
var m_tb_wasinited = false;
-var m_tb_prefs = false;
var m_tb_plugin_string = false;
var m_tb_is_main_window = false;
var m_tb_hidden_browser = false;
@@ -50,16 +51,12 @@ var torbutton_window_pref_observer =
{
register: function()
{
- var pref_service = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranchInternal);
- this._branch = pref_service.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
- this._branch.addObserver("extensions.torbutton", this, false);
+ m_tb_prefs.addObserver("extensions.torbutton", this, false);
},
unregister: function()
{
- if (!this._branch) return;
- this._branch.removeObserver("extensions.torbutton", this);
+ m_tb_prefs.removeObserver("extensions.torbutton", this);
},
// topic: what event occurred
@@ -84,21 +81,18 @@ var torbutton_unique_pref_observer =
register: function()
{
this.forced_ua = false;
- var pref_service = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranchInternal);
- this._branch = pref_service.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
- this._branch.addObserver("extensions.torbutton", this, false);
- this._branch.addObserver("network.cookie", this, false);
- this._branch.addObserver("browser.privatebrowsing.autostart", this, false);
- this._branch.addObserver("javascript", this, false);
- this._branch.addObserver("gfx", this, false);
- this._branch.addObserver("noscript", this, false);
- this._branch.addObserver("media", this, false);
- this._branch.addObserver("mathml", this, false);
- this._branch.addObserver("svg", this, false);
- this._branch.addObserver("plugin.disable", this, false);
- this._branch.addObserver("privacy.thirdparty.isolate", this, false);
- this._branch.addObserver("privacy.resistFingerprinting", this, false);
+ m_tb_prefs.addObserver("extensions.torbutton", this, false);
+ m_tb_prefs.addObserver("network.cookie", this, false);
+ m_tb_prefs.addObserver("browser.privatebrowsing.autostart", this, false);
+ m_tb_prefs.addObserver("javascript", this, false);
+ m_tb_prefs.addObserver("gfx", this, false);
+ m_tb_prefs.addObserver("noscript", this, false);
+ m_tb_prefs.addObserver("media", this, false);
+ m_tb_prefs.addObserver("mathml", this, false);
+ m_tb_prefs.addObserver("svg", this, false);
+ m_tb_prefs.addObserver("plugin.disable", this, false);
+ m_tb_prefs.addObserver("privacy.thirdparty.isolate", this, false);
+ m_tb_prefs.addObserver("privacy.resistFingerprinting", this, false);
// We observe xpcom-category-entry-added for plugins w/ Gecko-Content-Viewers
var observerService = Cc["@mozilla.org/observer-service;1"].
@@ -108,16 +102,15 @@ var torbutton_unique_pref_observer =
unregister: function()
{
- if (!this._branch) return;
- this._branch.removeObserver("extensions.torbutton", this);
- this._branch.removeObserver("network.cookie", this);
- this._branch.removeObserver("browser.privatebrowsing.autostart", this);
- this._branch.removeObserver("javascript", this);
- this._branch.removeObserver("gfx", this);
- this._branch.removeObserver("noscript", this);
- this._branch.removeObserver("media", this);
- this._branch.removeObserver("mathml", this);
- this._branch.removeObserver("svg", this);
+ m_tb_prefs.removeObserver("extensions.torbutton", this);
+ m_tb_prefs.removeObserver("network.cookie", this);
+ m_tb_prefs.removeObserver("browser.privatebrowsing.autostart", this);
+ m_tb_prefs.removeObserver("javascript", this);
+ m_tb_prefs.removeObserver("gfx", this);
+ m_tb_prefs.removeObserver("noscript", this);
+ m_tb_prefs.removeObserver("media", this);
+ m_tb_prefs.removeObserver("mathml", this);
+ m_tb_prefs.removeObserver("svg", this);
var observerService = Cc["@mozilla.org/observer-service;1"].
getService(Ci.nsIObserverService);
@@ -281,9 +274,6 @@ function torbutton_init() {
}
m_tb_wasinited = true;
- m_tb_prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranch);
-
// Determine if we are running inside Tor Browser.
var cur_version;
try {
@@ -1342,9 +1332,7 @@ function torbutton_do_new_identity() {
torbutton_log(3, "New Identity: Syncing prefs");
// Force prefs to be synced to disk
- var prefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
- prefService.savePrefFile(null);
+ m_tb_prefs.savePrefFile(null);
torbutton_log(3, "New Identity: Clearing permissions");
@@ -1750,9 +1738,7 @@ function torbutton_update_disk_prefs() {
} catch (e) {}
// Force prefs to be synced to disk
- var prefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
- prefService.savePrefFile(null);
+ m_tb_prefs.savePrefFile(null);
}
function torbutton_update_fingerprinting_prefs() {
@@ -1797,9 +1783,7 @@ function torbutton_update_fingerprinting_prefs() {
// XXX: How do we undo timezone?
// Force prefs to be synced to disk
- var prefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
- prefService.savePrefFile(null);
+ m_tb_prefs.savePrefFile(null);
}
function torbutton_update_thirdparty_prefs() {
@@ -1815,9 +1799,7 @@ function torbutton_update_thirdparty_prefs() {
m_tb_prefs.setBoolPref("security.enable_tls_session_tickets", !isolate);
// Force prefs to be synced to disk
- var prefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
- prefService.savePrefFile(null);
+ m_tb_prefs.savePrefFile(null);
}
var torbutton_sec_ml_bool_prefs = {
1
0

[tor-browser-bundle/master] Bug 20184: OS X builds are still not reproducible
by gk@torproject.org 18 Oct '16
by gk@torproject.org 18 Oct '16
18 Oct '16
commit 04a9af0eb1e6466ce6a7007a46d73fb7a38442e8
Author: Georg Koppen <gk(a)torproject.org>
Date: Sun Oct 9 11:12:43 2016 +0000
Bug 20184: OS X builds are still not reproducible
We ecountered on some machines failures to reproduce OS X builds.
The investigation seems to indicate that our old toolchain plays a
crucial role in this.
This patch replaces this old toolchain with a more modern clang/cctools
for building the tor part of the bundle. Resorting to `faketime` again
was necessary to cope with inserted timestamps.
---
gitian/descriptors/mac/gitian-tor.yml | 44 +++++++++++++++++++++++------------
1 file changed, 29 insertions(+), 15 deletions(-)
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index f2f4b01..ee1d848 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -4,19 +4,21 @@ distro: "debian"
suites:
- "wheezy"
architectures:
-- "i386"
+- "amd64"
packages:
- "unzip"
- "automake"
+- "faketime"
- "zip"
reference_datetime: "2000-01-01 00:00:00"
remotes:
- "url": "https://git.torproject.org/tor.git"
"dir": "tor"
files:
-- "versions"
+- "clang-linux64-wheezy-utils.zip"
+- "cctools.tar.gz"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
-- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
+- "versions"
- "dzip.sh"
- "openssl-mac64-utils.zip"
- "libevent-mac64-utils.zip"
@@ -33,35 +35,47 @@ script: |
fi
export TZ=UTC
export LC_ALL=C
- export REFERENCE_DATETIME
+ export FAKETIME=$REFERENCE_DATETIME
umask 0022
#
mkdir -p $INSTDIR/bin/
mkdir -p $TORBINDIR/
mkdir -p $TORCONFIGDIR/
mkdir -p $OUTDIR/
- #
- # dpkg requires sbin directories in the PATH
- export PATH="/usr/sbin:/sbin:$PATH"
- sudo dpkg -i *.deb
- tar xaf multiarch-darwin*tar.xz
- export PATH="$PATH:$HOME/build/apple-osx/bin/"
+
+ # Extracting and copying all the necessary utilities and libraries. We still
+ # need the 10.6 SDK if we want to support OSX 10.6.
+ ar x apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb
+ tar xaf data.tar.gz
+ tar xaf cctools.tar.gz
+ unzip clang-linux64-wheezy-utils.zip
unzip -d $INSTDIR openssl-mac64-utils.zip
unzip -d $INSTDIR libevent-mac64-utils.zip
cp $INSTDIR/libevent/lib/libevent-*.dylib $TORBINDIR/
LIBEVENT_FILE=`basename $INSTDIR/libevent/lib/libevent-*.dylib`
+ # Setting the proper flags and variables
+ # ld needs libLTO.so from llvm
+ export LD_LIBRARY_PATH="/home/debian/build/clang/lib"
+ export PATH="/home/debian/build/cctools/bin:$PATH"
+ CROSS_CCTOOLS_PATH="/home/debian/build/cctools"
+ CROSS_SYSROOT="/home/debian/build/usr/lib/apple/SDKs/MacOSX10.6.sdk"
+ FLAGS="-target x86_64-apple-darwin10 -mlinker-version=136 -B $CROSS_CCTOOLS_PATH/bin -isysroot $CROSS_SYSROOT"
+ export CC="/home/debian/build/clang/bin/clang $FLAGS"
+ export CXX="/home/debian/build/clang/bin/clang++ $FLAGS"
+ export CPP="/home/debian/build/clang/bin/clang $FLAGS -E"
+ export LLVMCONFIG="/home/debian/build/clang/bin/llvm-config"
+ export LDFLAGS="-Wl,-syslibroot,$CROSS_SYSROOT -Wl,-dead_strip"
+
# Building tor
- # XXX Clean up these flags?
- export CFLAGS="-m64 -I${INSTDIR}/openssl/include -I/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/include/ -I/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I. -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -mmacosx-version-min=10.5"
- export LDFLAGS="-m64 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -mmacosx-version-min=10.5"
cd tor
git update-index --refresh -q
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
./autogen.sh
find -type f -print0 | xargs -0 touch --date="$REFERENCE_DATETIME"
- ./configure --enable-static-openssl --disable-asciidoc --host=i686-apple-darwin11 --with-libevent-dir=$INSTDIR/libevent --with-openssl-dir=$INSTDIR/openssl --prefix=$INSTDIR
+ ./configure --enable-static-openssl --disable-asciidoc --host=x86_64-apple-darwin10 --with-libevent-dir=$INSTDIR/libevent --with-openssl-dir=$INSTDIR/openssl --prefix=$INSTDIR
+ export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
make $MAKEOPTS
make install
cd $INSTDIR
@@ -69,7 +83,7 @@ script: |
cp share/tor/geoip $TORCONFIGDIR/
cp share/tor/geoip6 $TORCONFIGDIR/
cd $TORBINDIR/
- i686-apple-darwin11-install_name_tool -change $INSTDIR/libevent/lib/$LIBEVENT_FILE @executable_path/$LIBEVENT_FILE tor
+ x86_64-apple-darwin10-install_name_tool -change $INSTDIR/libevent/lib/$LIBEVENT_FILE @executable_path/$LIBEVENT_FILE tor
# Grabbing the result
cd $INSTDIR
1
0

17 Oct '16
commit 7a0efdf6a99969007792d418a6bbfd5e0da4b3cf
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Thu Oct 6 21:58:50 2016 -0700
Bug 18093: Remove 'Restore Defaults' button
---
src/chrome/content/preferences.js | 57 ------------------------------------
src/chrome/content/preferences.xul | 4 +--
src/chrome/content/torbutton_util.js | 24 ---------------
src/chrome/locale/en/torbutton.dtd | 1 -
4 files changed, 1 insertion(+), 85 deletions(-)
diff --git a/src/chrome/content/preferences.js b/src/chrome/content/preferences.js
index 28f5955..1d85cde 100644
--- a/src/chrome/content/preferences.js
+++ b/src/chrome/content/preferences.js
@@ -54,63 +54,6 @@ function torbutton_prefs_save(doc) {
}
}
-function torbutton_prefs_reset_defaults() {
- var o_torprefs = torbutton_get_prefbranch('extensions.torbutton.');
- var tmpcnt = new Object();
- var children;
- var i;
- var loglevel = o_torprefs.getIntPref("loglevel");
- var logmthd = o_torprefs.getIntPref("logmethod");
-
- torbutton_log(3, "Starting Pref reset");
-
- // 1. Clear torbutton settings
- // 2. Clear browser proxy settings
- // 3. Reset Security Slider settings
-
- // XXX Warning: The only reason this works is because of Firefox's
- // threading model. As soon as a pref is changed, all observers
- // are notified by that same thread, immediately. Since torbutton's
- // security state is driven by proxy pref observers, this
- // causes everything to be reset in a linear order. If firefox
- // ever makes pref observers asynchonous, this will all break.
-
- children = o_torprefs.getChildList("" , tmpcnt);
- for(i = 0; i < children.length; i++) {
- if(o_torprefs.prefHasUserValue(children[i]))
- o_torprefs.clearUserPref(children[i]);
- }
-
- // Keep logging the same.
- o_torprefs.setIntPref("loglevel", loglevel);
- o_torprefs.setIntPref("logmethod", logmthd);
-
- torbutton_log(3, "Resetting browser prefs");
-
- // Reset browser prefs that torbutton touches just in case
- // they get horked. Better everything gets set back to default
- // than some arcane pref gets wedged with no clear way to fix it.
- // Technical users who tuned these by themselves will be able to fix it.
- // It's the non-technical ones we should make it easy for
- torbutton_reset_browser_prefs();
-
- // Resetting the Security Slider preferences
- var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
- var win = wm.getMostRecentWindow("navigator:browser");
- o_torprefs.setBoolPref('security_custom', false);
- o_torprefs.setIntPref('security_slider', 4);
- win.torbutton_update_security_slider();
-
- torbutton_log(4, "Preferences reset to defaults");
- torbutton_prefs_init(window.document);
-
- // In all cases, force prefs to be synced to disk
- var prefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
- prefService.savePrefFile(null);
-}
-
function torbutton_toggle_slider(doc, pos) {
doc.getElementById("torbutton_sec_slider").value = pos;
// Make sure the custom checkbox is unchecked as the user seems to want one
diff --git a/src/chrome/content/preferences.xul b/src/chrome/content/preferences.xul
index 62f649f..574932e 100644
--- a/src/chrome/content/preferences.xul
+++ b/src/chrome/content/preferences.xul
@@ -8,9 +8,7 @@
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml"
title="&torbutton.prefs.security_settings;"
- buttons="accept,cancel,extra1"
- buttonlabelextra1="&torbutton.prefs.restore_defaults;"
- ondialogextra1="torbutton_prefs_reset_defaults();"
+ buttons="accept,cancel"
persist="screenX screenY width height"
onload="torbutton_prefs_init(document)"
align="stretch"
diff --git a/src/chrome/content/torbutton_util.js b/src/chrome/content/torbutton_util.js
index 1558ced..f1263f1 100644
--- a/src/chrome/content/torbutton_util.js
+++ b/src/chrome/content/torbutton_util.js
@@ -52,30 +52,6 @@ function torbutton_get_prefbranch(branch_name) {
return o_branch;
}
-// Bug 1506 P3: This would be a semi-polite thing to do on uninstall
-// for pure Firefox users. The most polite thing would be to save
-// all their original prefs.. But meh?
-function torbutton_reset_browser_prefs() {
- var o_all_prefs = torbutton_get_prefbranch('');
- var prefs = ["network.http.sendSecureXSiteReferrer",
- "network.http.sendRefererHeader", "dom.storage.enabled",
- "extensions.update.enabled", "app.update.enabled",
- "app.update.auto", "browser.search.update",
- "browser.cache.memory.enable", "network.http.use-cache",
- "browser.cache.disk.enable", "browser.safebrowsing.enabled",
- "browser.send_pings", "browser.safebrowsing.remoteLookups",
- "network.security.ports.banned", "browser.search.suggest.enabled",
- "security.enable_java", "browser.history_expire_days",
- "browser.download.manager.retention", "browser.formfill.enable",
- "signon.rememberSignons", "plugin.disable_full_page_plugin_for_types",
- "browser.bookmarks.livemark_refresh_seconds",
- "network.cookie.lifetimePolicy" ];
- for(var i = 0; i < prefs.length; i++) {
- if(o_all_prefs.prefHasUserValue(prefs[i]))
- o_all_prefs.clearUserPref(prefs[i]);
- }
-}
-
// load localization strings
function torbutton_get_stringbundle()
{
diff --git a/src/chrome/locale/en/torbutton.dtd b/src/chrome/locale/en/torbutton.dtd
index 0ea18e5..56f663e 100644
--- a/src/chrome/locale/en/torbutton.dtd
+++ b/src/chrome/locale/en/torbutton.dtd
@@ -12,7 +12,6 @@
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Click to initialize Torbutton">
<!ENTITY torbutton.prefs.security_settings "Security Settings">
-<!ENTITY torbutton.prefs.restore_defaults "Restore Defaults">
<!ENTITY torbutton.cookiedialog.title "Manage Cookie Protections">
<!ENTITY torbutton.cookiedialog.lockCol "Protected">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
1
0

[tor-browser-bundle/master] Revert "Bug 13893: Make Tor Browser compatible with EMET"
by gk@torproject.org 17 Oct '16
by gk@torproject.org 17 Oct '16
17 Oct '16
commit 48b0c33bf651baaaa972e81490b3896dd332437e
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Oct 17 11:52:19 2016 +0000
Revert "Bug 13893: Make Tor Browser compatible with EMET"
This reverts commit 0348263efd1cb8a9eca8737f3dc7734ef75e0966.
Firefox is not ready for GCC 6 yet. See #20381 for further details.
---
gitian/descriptors/windows/gitian-utils.yml | 7 -
gitian/patches/gcc_62_1.patch | 23 -
gitian/patches/gcc_62_2.patch | 1198 ---------------------------
gitian/versions.alpha | 6 +-
gitian/versions.nightly | 6 +-
5 files changed, 6 insertions(+), 1234 deletions(-)
diff --git a/gitian/descriptors/windows/gitian-utils.yml b/gitian/descriptors/windows/gitian-utils.yml
index d3598e2..9c31834 100644
--- a/gitian/descriptors/windows/gitian-utils.yml
+++ b/gitian/descriptors/windows/gitian-utils.yml
@@ -35,8 +35,6 @@ files:
- "nsis.tar.bz2"
- "nsis-debian.tar.xz"
- "nsis-missing-unistd-include.patch"
-- "gcc_62_1.patch"
-- "gcc_62_2.patch"
script: |
INSTDIR="$HOME/install"
source versions
@@ -81,11 +79,6 @@ script: |
mkdir gcc
cd gcc
tar -xjvf ../gcc.tar.bz2
- cd gcc-*
- # Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77459.
- patch -p1 < ~/build/gcc_62_1.patch
- patch -p1 < ~/build/gcc_62_2.patch
- cd ..
# We don't want to link against msvcrt.dll due to bug 9084.
i686-w64-mingw32-g++ -dumpspecs > ~/build/msvcr100.spec
sed 's/msvcrt/msvcr100/' -i ~/build/msvcr100.spec
diff --git a/gitian/patches/gcc_62_1.patch b/gitian/patches/gcc_62_1.patch
deleted file mode 100644
index 7ca36d8..0000000
--- a/gitian/patches/gcc_62_1.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 1ec6206ea80ceb5df843ea0bc4ef04d9ab17257e Mon Sep 17 00:00:00 2001
-From: Georg Koppen <gk(a)torproject.org>
-Date: Wed, 14 Sep 2016 12:53:19 +0000
-Subject: [PATCH 1/2] Revert "2015-09-17 Catherine Moore
- <clm(a)codesourcery.com>"
-
-This reverts commit a63a17505346bb3a91ce3de6fe238264c4d849ac.
-
-diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc
-index f25304c..308802e 100644
---- a/libstdc++-v3/src/c++11/debug.cc
-+++ b/libstdc++-v3/src/c++11/debug.cc
-@@ -32,7 +32,6 @@
- #include <debug/safe_local_iterator.h>
-
- #include <cassert>
--#include <cstdio>
-
- #include <algorithm> // for std::min
- #include <functional> // for _Hash_impl
---
-2.9.3
-
diff --git a/gitian/patches/gcc_62_2.patch b/gitian/patches/gcc_62_2.patch
deleted file mode 100644
index 7dbd826..0000000
--- a/gitian/patches/gcc_62_2.patch
+++ /dev/null
@@ -1,1198 +0,0 @@
-From 0fbc32fdb5e0119877b0fd608d8855af0e4e376e Mon Sep 17 00:00:00 2001
-From: Georg Koppen <gk(a)torproject.org>
-Date: Wed, 14 Sep 2016 12:54:30 +0000
-Subject: [PATCH 2/2] =?UTF-8?q?Revert=20"2015-09-17=20=20Fran=C3=A7ois=20D?=
- =?UTF-8?q?umont=20=20<fdumont(a)gcc.gnu.org>"?=
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This reverts commit 426075db14da88357dd104345b5edea369f1d5c6.
-
-diff --git a/libstdc++-v3/include/debug/formatter.h b/libstdc++-v3/include/debug/formatter.h
-index 72db612..7d4f027 100644
---- a/libstdc++-v3/include/debug/formatter.h
-+++ b/libstdc++-v3/include/debug/formatter.h
-@@ -132,13 +132,6 @@ namespace __gnu_debug
-
- class _Error_formatter
- {
-- // Tags denoting the type of parameter for construction
-- struct _Is_iterator { };
-- struct _Is_iterator_value_type { };
-- struct _Is_sequence { };
-- struct _Is_instance { };
--
-- public:
- /// Whether an iterator is constant, mutable, or unknown
- enum _Constness
- {
-@@ -160,6 +153,13 @@ namespace __gnu_debug
- __last_state
- };
-
-+ // Tags denoting the type of parameter for construction
-+ struct _Is_iterator { };
-+ struct _Is_iterator_value_type { };
-+ struct _Is_sequence { };
-+ struct _Is_instance { };
-+
-+ public:
- // A parameter that may be referenced by an error message
- struct _Parameter
- {
-@@ -375,16 +375,15 @@ namespace __gnu_debug
-
- void
- _M_print_field(const _Error_formatter* __formatter,
-- const char* __name) const _GLIBCXX_DEPRECATED;
-+ const char* __name) const;
-
- void
-- _M_print_description(const _Error_formatter* __formatter)
-- const _GLIBCXX_DEPRECATED;
-+ _M_print_description(const _Error_formatter* __formatter) const;
- };
-
- template<typename _Iterator>
-- _Error_formatter&
-- _M_iterator(const _Iterator& __it, const char* __name = 0)
-+ const _Error_formatter&
-+ _M_iterator(const _Iterator& __it, const char* __name = 0) const
- {
- if (_M_num_parameters < std::size_t(__max_parameters))
- _M_parameters[_M_num_parameters++] = _Parameter(__it, __name,
-@@ -393,59 +392,57 @@ namespace __gnu_debug
- }
-
- template<typename _Iterator>
-- _Error_formatter&
-+ const _Error_formatter&
- _M_iterator_value_type(const _Iterator& __it,
-- const char* __name = 0)
-+ const char* __name = 0) const
- {
-- if (_M_num_parameters < __max_parameters)
-+ if (_M_num_parameters < std::size_t(__max_parameters))
- _M_parameters[_M_num_parameters++] =
- _Parameter(__it, __name, _Is_iterator_value_type());
- return *this;
- }
-
-- _Error_formatter&
-- _M_integer(long __value, const char* __name = 0)
-+ const _Error_formatter&
-+ _M_integer(long __value, const char* __name = 0) const
- {
-- if (_M_num_parameters < __max_parameters)
-+ if (_M_num_parameters < std::size_t(__max_parameters))
- _M_parameters[_M_num_parameters++] = _Parameter(__value, __name);
- return *this;
- }
-
-- _Error_formatter&
-- _M_string(const char* __value, const char* __name = 0)
-+ const _Error_formatter&
-+ _M_string(const char* __value, const char* __name = 0) const
- {
-- if (_M_num_parameters < __max_parameters)
-+ if (_M_num_parameters < std::size_t(__max_parameters))
- _M_parameters[_M_num_parameters++] = _Parameter(__value, __name);
- return *this;
- }
-
- template<typename _Sequence>
-- _Error_formatter&
-- _M_sequence(const _Sequence& __seq, const char* __name = 0)
-+ const _Error_formatter&
-+ _M_sequence(const _Sequence& __seq, const char* __name = 0) const
- {
-- if (_M_num_parameters < __max_parameters)
-+ if (_M_num_parameters < std::size_t(__max_parameters))
- _M_parameters[_M_num_parameters++] = _Parameter(__seq, __name,
- _Is_sequence());
- return *this;
- }
-
- template<typename _Type>
-- _Error_formatter&
-- _M_instance(const _Type& __inst, const char* __name = 0)
-+ const _Error_formatter&
-+ _M_instance(const _Type& __inst, const char* __name = 0) const
- {
-- if (_M_num_parameters < __max_parameters)
-+ if (_M_num_parameters < std::size_t(__max_parameters))
- _M_parameters[_M_num_parameters++] = _Parameter(__inst, __name,
- _Is_instance());
- return *this;
- }
-
-- _Error_formatter&
-- _M_message(const char* __text)
-+ const _Error_formatter&
-+ _M_message(const char* __text) const
- { _M_text = __text; return *this; }
-
-- // Kept const qualifier for backward compatibility, to keep the same
-- // exported symbol.
-- _Error_formatter&
-+ const _Error_formatter&
- _M_message(_Debug_msg_id __id) const throw ();
-
- _GLIBCXX_NORETURN void
-@@ -453,38 +450,40 @@ namespace __gnu_debug
-
- template<typename _Tp>
- void
-- _M_format_word(char*, int, const char*, _Tp)
-- const throw () _GLIBCXX_DEPRECATED;
-+ _M_format_word(char*, int, const char*, _Tp) const throw ();
-
- void
-- _M_print_word(const char* __word) const _GLIBCXX_DEPRECATED;
-+ _M_print_word(const char* __word) const;
-
- void
-- _M_print_string(const char* __string) const _GLIBCXX_DEPRECATED;
-+ _M_print_string(const char* __string) const;
-
- private:
-- _Error_formatter(const char* __file, unsigned int __line)
-- : _M_file(__file), _M_line(__line), _M_num_parameters(0), _M_text(0)
-- { }
-+ _Error_formatter(const char* __file, std::size_t __line)
-+ : _M_file(__file), _M_line(__line), _M_num_parameters(0), _M_text(0),
-+ _M_max_length(78), _M_column(1), _M_first_line(true), _M_wordwrap(false)
-+ { _M_get_max_length(); }
-
- void
-- _M_get_max_length() const throw () _GLIBCXX_DEPRECATED;
-+ _M_get_max_length() const throw ();
-
- enum { __max_parameters = 9 };
-
- const char* _M_file;
-- unsigned int _M_line;
-- _Parameter _M_parameters[__max_parameters];
-- unsigned int _M_num_parameters;
-- const char* _M_text;
-+ std::size_t _M_line;
-+ mutable _Parameter _M_parameters[__max_parameters];
-+ mutable std::size_t _M_num_parameters;
-+ mutable const char* _M_text;
-+ mutable std::size_t _M_max_length;
-+ enum { _M_indent = 4 } ;
-+ mutable std::size_t _M_column;
-+ mutable bool _M_first_line;
-+ mutable bool _M_wordwrap;
-
- public:
-- static _Error_formatter&
-- _M_at(const char* __file, unsigned int __line)
-- {
-- static _Error_formatter __formatter(__file, __line);
-- return __formatter;
-- }
-+ static _Error_formatter
-+ _M_at(const char* __file, std::size_t __line)
-+ { return _Error_formatter(__file, __line); }
- };
- } // namespace __gnu_debug
-
-diff --git a/libstdc++-v3/src/c++11/debug.cc b/libstdc++-v3/src/c++11/debug.cc
-index 308802e..8f7eaa3 100644
---- a/libstdc++-v3/src/c++11/debug.cc
-+++ b/libstdc++-v3/src/c++11/debug.cc
-@@ -22,19 +22,18 @@
- // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- // <http://www.gnu.org/licenses/>.
-
--#include <bits/move.h>
--#include <bits/stl_iterator_base_types.h>
--
--#include <debug/formatter.h>
-+#include <debug/debug.h>
- #include <debug/safe_base.h>
- #include <debug/safe_unordered_base.h>
- #include <debug/safe_iterator.h>
- #include <debug/safe_local_iterator.h>
--
-+#include <algorithm>
- #include <cassert>
--
--#include <algorithm> // for std::min
--#include <functional> // for _Hash_impl
-+#include <cstring>
-+#include <cctype>
-+#include <cstdio>
-+#include <cstdlib>
-+#include <functional>
-
- #include <cxxabi.h> // for __cxa_demangle
-
-@@ -525,123 +524,37 @@ namespace __gnu_debug
-
- namespace
- {
-- using _Error_formatter = __gnu_debug::_Error_formatter;
-- using _Parameter = __gnu_debug::_Error_formatter::_Parameter;
--
-- template<typename _Tp>
-- int
-- format_word(char* buf, int n, const char* fmt, _Tp s)
-- { return std::min(__builtin_snprintf(buf, n, fmt, s), n - 1); }
--
-- void
-- get_max_length(std::size_t& max_length)
-- {
-- const char* nptr = std::getenv("GLIBCXX_DEBUG_MESSAGE_LENGTH");
-- if (nptr)
-- {
-- char* endptr;
-- const unsigned long ret = std::strtoul(nptr, &endptr, 0);
-- if (*nptr != '\0' && *endptr == '\0')
-- max_length = ret;
-- }
-- }
--
-- struct PrintContext
-- {
-- PrintContext()
-- : _M_max_length(78), _M_column(1), _M_first_line(true), _M_wordwrap(false)
-- { get_max_length(_M_max_length); }
--
-- std::size_t _M_max_length;
-- enum { _M_indent = 4 } ;
-- std::size_t _M_column;
-- bool _M_first_line;
-- bool _M_wordwrap;
-- };
--
-- void
-- print_word(PrintContext& ctx, const char* word,
-- std::ptrdiff_t count = -1)
-- {
-- size_t length = count >= 0 ? count : __builtin_strlen(word);
-- if (length == 0)
-- return;
--
-- // Consider first '\n' at begining cause it impacts column.
-- if (word[0] == '\n')
-- {
-- fprintf(stderr, "\n");
-- ctx._M_column = 1;
-- ++word;
-- --length;
--
-- if (length == 0)
-- return;
-- }
--
-- size_t visual_length
-- = isspace(word[length - 1]) ? length - 1 : length;
-- if (visual_length == 0
-- || !ctx._M_wordwrap
-- || (ctx._M_column + visual_length < ctx._M_max_length)
-- || (visual_length >= ctx._M_max_length && ctx._M_column == 1))
-- {
-- // If this isn't the first line, indent
-- if (ctx._M_column == 1 && !ctx._M_first_line)
-- {
-- char spacing[ctx._M_indent + 1];
-- for (int i = 0; i < ctx._M_indent; ++i)
-- spacing[i] = ' ';
-- spacing[ctx._M_indent] = '\0';
-- fprintf(stderr, "%s", spacing);
-- ctx._M_column += ctx._M_indent;
-- }
--
-- int written = fprintf(stderr, "%s", word);
--
-- if (word[length - 1] == '\n')
-- {
-- ctx._M_first_line = false;
-- ctx._M_column = 1;
-- }
-- else
-- ctx._M_column += written;
-- }
-- else
-- {
-- print_word(ctx, "\n", 1);
-- print_word(ctx, word, count);
-- }
-- }
--
- void
-- print_type(PrintContext& ctx,
-- const type_info* info,
-- const char* unknown_name)
-+ print_type(const __gnu_debug::_Error_formatter* __formatter,
-+ const type_info* __info,
-+ const char* __unknown_name)
- {
-- if (!info)
-- print_word(ctx, unknown_name);
-+ if (!__info)
-+ __formatter->_M_print_word(__unknown_name);
- else
- {
-- int status;
-- char* demangled_name =
-- __cxxabiv1::__cxa_demangle(info->name(), NULL, NULL, &status);
-- print_word(ctx, status == 0 ? demangled_name : info->name());
-- free(demangled_name);
-+ int __status;
-+ char* __demangled_name =
-+ __cxxabiv1::__cxa_demangle(__info->name(), NULL, NULL, &__status);
-+ __formatter->_M_print_word(__status == 0
-+ ? __demangled_name : __info->name());
-+ free(__demangled_name);
- }
- }
-
- bool
-- print_field(PrintContext& ctx,
-- const char* name, const _Parameter::_Type& type)
-+ print_field(
-+ const __gnu_debug::_Error_formatter* __formatter,
-+ const char* __name,
-+ const __gnu_debug::_Error_formatter::_Parameter::_Type& __variant)
- {
-- if (__builtin_strcmp(name, "name") == 0)
-+ if (strcmp(__name, "name") == 0)
- {
-- assert(type._M_name);
-- print_word(ctx, type._M_name);
-+ assert(__variant._M_name);
-+ __formatter->_M_print_word(__variant._M_name);
- }
-- else if (__builtin_strcmp(name, "type") == 0)
-- print_type(ctx, type._M_type, "<unknown type>");
-+ else if (strcmp(__name, "type") == 0)
-+ print_type(__formatter, __variant._M_type, "<unknown type>");
- else
- return false;
-
-@@ -649,17 +562,21 @@ namespace
- }
-
- bool
-- print_field(PrintContext& ctx,
-- const char* name, const _Parameter::_Instance& inst)
-+ print_field(
-+ const __gnu_debug::_Error_formatter* __formatter,
-+ const char* __name,
-+ const __gnu_debug::_Error_formatter::_Parameter::_Instance& __variant)
- {
-- const _Parameter::_Type& type = inst;
-- if (print_field(ctx, name, type))
-+ const __gnu_debug::_Error_formatter::_Parameter::_Type& __type = __variant;
-+ if (print_field(__formatter, __name, __type))
- { }
-- else if (__builtin_strcmp(name, "address") == 0)
-+ else if (strcmp(__name, "address") == 0)
- {
-- char buf[64];
-- int ret = __builtin_sprintf(buf, "%p", inst._M_address);
-- print_word(ctx, buf, ret);
-+ const int __bufsize = 64;
-+ char __buf[__bufsize];
-+ __formatter->_M_format_word(__buf, __bufsize, "%p",
-+ __variant._M_address);
-+ __formatter->_M_print_word(__buf);
- }
- else
- return false;
-@@ -668,390 +585,278 @@ namespace
- }
-
- void
-- print_field(PrintContext& ctx, const _Parameter& param, const char* name)
-- {
-- assert(param._M_kind != _Parameter::__unused_param);
-- const int bufsize = 64;
-- char buf[bufsize];
--
-- const auto& variant = param._M_variant;
-- switch (param._M_kind)
-- {
-- case _Parameter::__iterator:
-- {
-- const auto& iterator = variant._M_iterator;
-- if (print_field(ctx, name, iterator))
-- { }
-- else if (__builtin_strcmp(name, "constness") == 0)
-- {
-- static const char*
-- constness_names[_Error_formatter::__last_constness] =
-- {
-- "<unknown>",
-- "constant",
-- "mutable"
-- };
-- print_word(ctx, constness_names[iterator._M_constness]);
-- }
-- else if (__builtin_strcmp(name, "state") == 0)
-- {
-- static const char*
-- state_names[_Error_formatter::__last_state] =
-- {
-- "<unknown>",
-- "singular",
-- "dereferenceable (start-of-sequence)",
-- "dereferenceable",
-- "past-the-end",
-- "before-begin"
-- };
-- print_word(ctx, state_names[iterator._M_state]);
-- }
-- else if (__builtin_strcmp(name, "sequence") == 0)
-- {
-- assert(iterator._M_sequence);
-- int written = __builtin_sprintf(buf, "%p", iterator._M_sequence);
-- print_word(ctx, buf, written);
-- }
-- else if (__builtin_strcmp(name, "seq_type") == 0)
-- print_type(ctx, iterator._M_seq_type, "<unknown seq_type>");
-- else
-- assert(false);
-- }
-- break;
--
-- case _Parameter::__sequence:
-- if (!print_field(ctx, name, variant._M_sequence))
-- assert(false);
-- break;
--
-- case _Parameter::__integer:
-- if (__builtin_strcmp(name, "name") == 0)
-- {
-- assert(variant._M_integer._M_name);
-- print_word(ctx, variant._M_integer._M_name);
-- }
-- else
-- assert(false);
-- break;
--
-- case _Parameter::__string:
-- if (__builtin_strcmp(name, "name") == 0)
-- {
-- assert(variant._M_string._M_name);
-- print_word(ctx, variant._M_string._M_name);
-- }
-- else
-- assert(false);
-- break;
--
-- case _Parameter::__instance:
-- if (!print_field(ctx, name, variant._M_instance))
-- assert(false);
-- break;
--
-- case _Parameter::__iterator_value_type:
-- if (!print_field(ctx, name, variant._M_iterator_value_type))
-- assert(false);
-- break;
--
-- default:
-- assert(false);
-- break;
-- }
-- }
--
-- void
-- print_description(PrintContext& ctx, const _Parameter::_Type& type)
-+ print_description(
-+ const __gnu_debug::_Error_formatter* __formatter,
-+ const __gnu_debug::_Error_formatter::_Parameter::_Type& __variant)
- {
-- if (type._M_name)
-+ if (__variant._M_name)
- {
-- const int bufsize = 64;
-- char buf[bufsize];
-- int written
-- = format_word(buf, bufsize, "\"%s\"", type._M_name);
-- print_word(ctx, buf, written);
-+ const int __bufsize = 64;
-+ char __buf[__bufsize];
-+ __formatter->_M_format_word(__buf, __bufsize, "\"%s\"",
-+ __variant._M_name);
-+ __formatter->_M_print_word(__buf);
- }
-
-- print_word(ctx, " {\n");
-+ __formatter->_M_print_word(" {\n");
-
-- if (type._M_type)
-+ if (__variant._M_type)
- {
-- print_word(ctx, " type = ");
-- print_type(ctx, type._M_type, "<unknown type>");
-- print_word(ctx, ";\n");
-+ __formatter->_M_print_word(" type = ");
-+ print_type(__formatter, __variant._M_type, "<unknown type>");
-+ __formatter->_M_print_word(";\n");
- }
- }
-
-+
- void
-- print_description(PrintContext& ctx, const _Parameter::_Instance& inst)
-+ print_description(
-+ const __gnu_debug::_Error_formatter* __formatter,
-+ const __gnu_debug::_Error_formatter::_Parameter::_Instance& __variant)
- {
-- const int bufsize = 64;
-- char buf[bufsize];
-+ const int __bufsize = 64;
-+ char __buf[__bufsize];
-
-- if (inst._M_name)
-+ if (__variant._M_name)
- {
-- int written
-- = format_word(buf, bufsize, "\"%s\" ", inst._M_name);
-- print_word(ctx, buf, written);
-+ __formatter->_M_format_word(__buf, __bufsize, "\"%s\" ",
-+ __variant._M_name);
-+ __formatter->_M_print_word(__buf);
- }
-
-- int written
-- = __builtin_sprintf(buf, "@ 0x%p {\n", inst._M_address);
-- print_word(ctx, buf, written);
-+ __formatter->_M_format_word(__buf, __bufsize, "@ 0x%p {\n",
-+ __variant._M_address);
-+ __formatter->_M_print_word(__buf);
-
-- if (inst._M_type)
-+ if (__variant._M_type)
- {
-- print_word(ctx, " type = ");
-- print_type(ctx, inst._M_type, "<unknown type>");
-+ __formatter->_M_print_word(" type = ");
-+ print_type(__formatter, __variant._M_type, "<unknown type>");
- }
- }
-+}
-
-+namespace __gnu_debug
-+{
- void
-- print_description(PrintContext& ctx, const _Parameter& param)
-+ _Error_formatter::_Parameter::
-+ _M_print_field(const _Error_formatter* __formatter, const char* __name) const
- {
-- const int bufsize = 128;
-- char buf[bufsize];
-+ assert(this->_M_kind != _Parameter::__unused_param);
-+ const int __bufsize = 64;
-+ char __buf[__bufsize];
-
-- const auto& variant = param._M_variant;
-- switch (param._M_kind)
-- {
-- case _Parameter::__iterator:
-+ switch (_M_kind)
-+ {
-+ case __iterator:
-+ if (print_field(__formatter, __name, _M_variant._M_iterator))
-+ { }
-+ else if (strcmp(__name, "constness") == 0)
- {
-- const auto& ite = variant._M_iterator;
--
-- print_word(ctx, "iterator ");
-- print_description(ctx, ite);
--
-- if (ite._M_type)
-- {
-- if (ite._M_constness != _Error_formatter::__unknown_constness)
-- {
-- print_word(ctx, " (");
-- print_field(ctx, param, "constness");
-- print_word(ctx, " iterator)");
-- }
--
-- print_word(ctx, ";\n");
-- }
--
-- if (ite._M_state != _Error_formatter::__unknown_state)
-+ static const char* __constness_names[__last_constness] =
- {
-- print_word(ctx, " state = ");
-- print_field(ctx, param, "state");
-- print_word(ctx, ";\n");
-- }
--
-- if (ite._M_sequence)
-+ "<unknown>",
-+ "constant",
-+ "mutable"
-+ };
-+ __formatter->_M_print_word(__constness_names[_M_variant.
-+ _M_iterator.
-+ _M_constness]);
-+ }
-+ else if (strcmp(__name, "state") == 0)
-+ {
-+ static const char* __state_names[__last_state] =
- {
-- print_word(ctx, " references sequence ");
-- if (ite._M_seq_type)
-- {
-- print_word(ctx, "with type '");
-- print_field(ctx, param, "seq_type");
-- print_word(ctx, "' ");
-- }
--
-- int written
-- = __builtin_sprintf(buf, "@ 0x%p\n", ite._M_sequence);
-- print_word(ctx, buf, written);
-- }
--
-- print_word(ctx, "}\n", 2);
-+ "<unknown>",
-+ "singular",
-+ "dereferenceable (start-of-sequence)",
-+ "dereferenceable",
-+ "past-the-end",
-+ "before-begin"
-+ };
-+ __formatter->_M_print_word(__state_names[_M_variant.
-+ _M_iterator._M_state]);
- }
-- break;
--
-- case _Parameter::__sequence:
-- print_word(ctx, "sequence ");
-- print_description(ctx, variant._M_sequence);
--
-- if (variant._M_sequence._M_type)
-- print_word(ctx, ";\n", 2);
--
-- print_word(ctx, "}\n", 2);
-- break;
--
-- case _Parameter::__instance:
-- print_word(ctx, "instance ");
-- print_description(ctx, variant._M_instance);
--
-- if (variant._M_instance._M_type)
-- print_word(ctx, ";\n", 2);
--
-- print_word(ctx, "}\n", 2);
-- break;
--
-- case _Parameter::__iterator_value_type:
-- print_word(ctx, "iterator::value_type ");
-- print_description(ctx, variant._M_iterator_value_type);
-- print_word(ctx, "}\n", 2);
-- break;
--
-- default:
-- break;
-- }
-+ else if (strcmp(__name, "sequence") == 0)
-+ {
-+ assert(_M_variant._M_iterator._M_sequence);
-+ __formatter->_M_format_word(__buf, __bufsize, "%p",
-+ _M_variant._M_iterator._M_sequence);
-+ __formatter->_M_print_word(__buf);
-+ }
-+ else if (strcmp(__name, "seq_type") == 0)
-+ print_type(__formatter, _M_variant._M_iterator._M_seq_type,
-+ "<unknown seq_type>");
-+ else
-+ assert(false);
-+ break;
-+ case __sequence:
-+ if (!print_field(__formatter, __name, _M_variant._M_sequence))
-+ assert(false);
-+ break;
-+ case __integer:
-+ if (strcmp(__name, "name") == 0)
-+ {
-+ assert(_M_variant._M_integer._M_name);
-+ __formatter->_M_print_word(_M_variant._M_integer._M_name);
-+ }
-+ else
-+ assert(false);
-+ break;
-+ case __string:
-+ if (strcmp(__name, "name") == 0)
-+ {
-+ assert(_M_variant._M_string._M_name);
-+ __formatter->_M_print_word(_M_variant._M_string._M_name);
-+ }
-+ else
-+ assert(false);
-+ break;
-+ case __instance:
-+ if (!print_field(__formatter, __name, _M_variant._M_instance))
-+ assert(false);
-+ break;
-+ case __iterator_value_type:
-+ if (!print_field(__formatter, __name, _M_variant._M_iterator_value_type))
-+ assert(false);
-+ break;
-+ default:
-+ assert(false);
-+ break;
-+ }
- }
-
- void
-- print_string(PrintContext& ctx, const char* string,
-- const _Parameter* parameters, std::size_t num_parameters)
-+ _Error_formatter::_Parameter::
-+ _M_print_description(const _Error_formatter* __formatter) const
- {
-- const char* start = string;
-- const int bufsize = 128;
-- char buf[bufsize];
-- int bufindex = 0;
-+ const int __bufsize = 128;
-+ char __buf[__bufsize];
-
-- while (*start)
-+ switch (_M_kind)
- {
-- if (isspace(*start))
-- {
-- buf[bufindex++] = *start++;
-- buf[bufindex] = '\0';
-- print_word(ctx, buf, bufindex);
-- bufindex = 0;
-- continue;
-- }
-+ case __iterator:
-+ __formatter->_M_print_word("iterator ");
-+ print_description(__formatter, _M_variant._M_iterator);
-
-- if (*start != '%')
-+ if (_M_variant._M_iterator._M_type)
- {
-- // Normal char.
-- buf[bufindex++] = *start++;
-- continue;
-- }
--
-- if (*++start == '%')
-- {
-- // Escaped '%'
-- buf[bufindex++] = *start++;
-- continue;
-+ if (_M_variant._M_iterator._M_constness != __unknown_constness)
-+ {
-+ __formatter->_M_print_word(" (");
-+ _M_print_field(__formatter, "constness");
-+ __formatter->_M_print_word(" iterator)");
-+ }
-+ __formatter->_M_print_word(";\n");
- }
-
-- // We are on a parameter property reference, we need to flush buffer
-- // first.
-- if (bufindex != 0)
-+ if (_M_variant._M_iterator._M_state != __unknown_state)
- {
-- buf[bufindex] = '\0';
-- print_word(ctx, buf, bufindex);
-- bufindex = 0;
-+ __formatter->_M_print_word(" state = ");
-+ _M_print_field(__formatter, "state");
-+ __formatter->_M_print_word(";\n");
- }
-
-- // Get the parameter number
-- assert(*start >= '1' && *start <= '9');
-- size_t param_index = *start - '0' - 1;
-- assert(param_index < num_parameters);
-- const auto& param = parameters[param_index];
--
-- // '.' separates the parameter number from the field
-- // name, if there is one.
-- ++start;
-- if (*start != '.')
-+ if (_M_variant._M_iterator._M_sequence)
- {
-- assert(*start == ';');
-- ++start;
-- if (param._M_kind == _Parameter::__integer)
-+ __formatter->_M_print_word(" references sequence ");
-+ if (_M_variant._M_iterator._M_seq_type)
- {
-- int written
-- = __builtin_sprintf(buf, "%ld",
-- param._M_variant._M_integer._M_value);
-- print_word(ctx, buf, written);
-+ __formatter->_M_print_word("with type `");
-+ _M_print_field(__formatter, "seq_type");
-+ __formatter->_M_print_word("' ");
- }
-- else if (param._M_kind == _Parameter::__string)
-- print_string(ctx, param._M_variant._M_string._M_value,
-- parameters, num_parameters);
-- continue;
-- }
-
-- // Extract the field name we want
-- const int max_field_len = 16;
-- char field[max_field_len];
-- int field_idx = 0;
-- ++start;
-- while (*start != ';')
-- {
-- assert(*start);
-- assert(field_idx < max_field_len - 1);
-- field[field_idx++] = *start++;
-+ __formatter->_M_format_word(__buf, __bufsize, "@ 0x%p\n",
-+ _M_variant._M_iterator._M_sequence);
-+ __formatter->_M_print_word(__buf);
- }
-- ++start;
-- field[field_idx] = '\0';
-
-- print_field(ctx, param, field);
-- }
-+ __formatter->_M_print_word("}\n");
-+ break;
-+ case __sequence:
-+ __formatter->_M_print_word("sequence ");
-+ print_description(__formatter, _M_variant._M_sequence);
-
-- // Might need to flush.
-- if (bufindex)
-- {
-- buf[bufindex] = '\0';
-- print_word(ctx, buf, bufindex);
-+ if (_M_variant._M_sequence._M_type)
-+ __formatter->_M_print_word(";\n");
-+
-+ __formatter->_M_print_word("}\n");
-+ break;
-+ case __instance:
-+ __formatter->_M_print_word("instance ");
-+ print_description(__formatter, _M_variant._M_instance);
-+
-+ if (_M_variant._M_instance._M_type)
-+ __formatter->_M_print_word(";\n");
-+
-+ __formatter->_M_print_word("}\n");
-+ break;
-+ case __iterator_value_type:
-+ __formatter->_M_print_word("iterator::value_type ");
-+ print_description(__formatter, _M_variant._M_iterator_value_type);
-+ __formatter->_M_print_word("}\n");
-+ break;
-+ default:
-+ break;
- }
- }
--}
-
--namespace __gnu_debug
--{
-- _Error_formatter&
-+ const _Error_formatter&
- _Error_formatter::_M_message(_Debug_msg_id __id) const throw ()
-- {
-- return const_cast<_Error_formatter*>(this)
-- ->_M_message(_S_debug_messages[__id]);
-- }
-+ { return this->_M_message(_S_debug_messages[__id]); }
-
- void
- _Error_formatter::_M_error() const
- {
-- const int bufsize = 128;
-- char buf[bufsize];
-+ const int __bufsize = 128;
-+ char __buf[__bufsize];
-
- // Emit file & line number information
-- bool go_to_next_line = false;
-- PrintContext ctx;
-+ _M_column = 1;
-+ _M_wordwrap = false;
- if (_M_file)
- {
-- int written = format_word(buf, bufsize, "%s:", _M_file);
-- print_word(ctx, buf, written);
-- go_to_next_line = true;
-+ _M_format_word(__buf, __bufsize, "%s:", _M_file);
-+ _M_print_word(__buf);
-+ _M_column += strlen(__buf);
- }
-
- if (_M_line > 0)
- {
-- int written = __builtin_sprintf(buf, "%u:", _M_line);
-- print_word(ctx, buf, written);
-- go_to_next_line = true;
-+ _M_format_word(__buf, __bufsize, "%u:", _M_line);
-+ _M_print_word(__buf);
-+ _M_column += strlen(__buf);
- }
-
-- if (go_to_next_line)
-- print_word(ctx, "\n", 1);
--
-- if (ctx._M_max_length)
-- ctx._M_wordwrap = true;
--
-- print_word(ctx, "Error: ");
-+ if (_M_max_length)
-+ _M_wordwrap = true;
-+ _M_print_word("error: ");
-
- // Print the error message
- assert(_M_text);
-- print_string(ctx, _M_text, _M_parameters, _M_num_parameters);
-- print_word(ctx, ".\n", 2);
-+ _M_print_string(_M_text);
-+ _M_print_word(".\n");
-
- // Emit descriptions of the objects involved in the operation
-- ctx._M_first_line = true;
-- ctx._M_wordwrap = false;
-- bool has_header = false;
-- for (unsigned int i = 0; i < _M_num_parameters; ++i)
-+ _M_wordwrap = false;
-+ bool __has_noninteger_parameters = false;
-+ for (unsigned int __i = 0; __i < _M_num_parameters; ++__i)
- {
-- switch (_M_parameters[i]._M_kind)
-+ switch (_M_parameters[__i]._M_kind)
- {
- case _Parameter::__iterator:
- case _Parameter::__sequence:
- case _Parameter::__instance:
- case _Parameter::__iterator_value_type:
-- if (!has_header)
-+ if (!__has_noninteger_parameters)
- {
-- print_word(ctx, "\nObjects involved in the operation:\n");
-- has_header = true;
-+ _M_first_line = true;
-+ _M_print_word("\nObjects involved in the operation:\n");
-+ __has_noninteger_parameters = true;
- }
-- print_description(ctx, _M_parameters[i]);
-+ _M_parameters[__i]._M_print_description(this);
- break;
--
- default:
- break;
- }
-@@ -1060,39 +865,172 @@ namespace __gnu_debug
- abort();
- }
-
-- // Deprecated methods kept for backward compatibility.
-- void
-- _Error_formatter::_Parameter::_M_print_field(
-- const _Error_formatter*, const char*) const
-- { }
--
-- void
-- _Error_formatter::_Parameter::_M_print_description(const _Error_formatter*) const
-- { }
--
- template<typename _Tp>
- void
-- _Error_formatter::_M_format_word(char*, int, const char*, _Tp)
-- const throw ()
-- { }
-+ _Error_formatter::_M_format_word(char* __buf,
-+ int __n __attribute__ ((__unused__)),
-+ const char* __fmt, _Tp __s) const throw ()
-+ {
-+#ifdef _GLIBCXX_USE_C99
-+ std::snprintf(__buf, __n, __fmt, __s);
-+#else
-+ std::sprintf(__buf, __fmt, __s);
-+#endif
-+ }
-
- void
-- _Error_formatter::_M_print_word(const char*) const
-- { }
-+ _Error_formatter::_M_print_word(const char* __word) const
-+ {
-+ if (!_M_wordwrap)
-+ {
-+ fprintf(stderr, "%s", __word);
-+ return;
-+ }
-+
-+ size_t __length = strlen(__word);
-+ if (__length == 0)
-+ return;
-+
-+ size_t __visual_length
-+ = __word[__length - 1] == '\n' ? __length - 1 : __length;
-+ if (__visual_length == 0
-+ || (_M_column + __visual_length < _M_max_length)
-+ || (__visual_length >= _M_max_length && _M_column == 1))
-+ {
-+ // If this isn't the first line, indent
-+ if (_M_column == 1 && !_M_first_line)
-+ {
-+ char __spacing[_M_indent + 1];
-+ for (int i = 0; i < _M_indent; ++i)
-+ __spacing[i] = ' ';
-+ __spacing[_M_indent] = '\0';
-+ fprintf(stderr, "%s", __spacing);
-+ _M_column += _M_indent;
-+ }
-+
-+ fprintf(stderr, "%s", __word);
-+
-+ if (__word[__length - 1] == '\n')
-+ {
-+ _M_first_line = false;
-+ _M_column = 1;
-+ }
-+ else
-+ _M_column += __length;
-+ }
-+ else
-+ {
-+ _M_print_word("\n");
-+ _M_print_word(__word);
-+ }
-+ }
-
- void
-- _Error_formatter::_M_print_string(const char*) const
-- { }
-+ _Error_formatter::
-+ _M_print_string(const char* __string) const
-+ {
-+ const char* __start = __string;
-+ const char* __finish = __start;
-+ const int __bufsize = 128;
-+ char __buf[__bufsize];
-+
-+ while (*__start)
-+ {
-+ if (*__start != '%')
-+ {
-+ // [__start, __finish) denotes the next word
-+ __finish = __start;
-+ while (isalnum(*__finish))
-+ ++__finish;
-+ if (__start == __finish)
-+ ++__finish;
-+ if (isspace(*__finish))
-+ ++__finish;
-+
-+ const ptrdiff_t __len = __finish - __start;
-+ assert(__len < __bufsize);
-+ memcpy(__buf, __start, __len);
-+ __buf[__len] = '\0';
-+ _M_print_word(__buf);
-+ __start = __finish;
-+
-+ // Skip extra whitespace
-+ while (*__start == ' ')
-+ ++__start;
-+
-+ continue;
-+ }
-+
-+ ++__start;
-+ assert(*__start);
-+ if (*__start == '%')
-+ {
-+ _M_print_word("%");
-+ ++__start;
-+ continue;
-+ }
-+
-+ // Get the parameter number
-+ assert(*__start >= '1' && *__start <= '9');
-+ size_t __param_index = *__start - '0' - 1;
-+ assert(__param_index < _M_num_parameters);
-+ const auto& __param = _M_parameters[__param_index];
-+
-+ // '.' separates the parameter number from the field
-+ // name, if there is one.
-+ ++__start;
-+ if (*__start != '.')
-+ {
-+ assert(*__start == ';');
-+ ++__start;
-+ __buf[0] = '\0';
-+ if (__param._M_kind == _Parameter::__integer)
-+ {
-+ _M_format_word(__buf, __bufsize, "%ld",
-+ __param._M_variant._M_integer._M_value);
-+ _M_print_word(__buf);
-+ }
-+ else if (__param._M_kind == _Parameter::__string)
-+ _M_print_string(__param._M_variant._M_string._M_value);
-+ continue;
-+ }
-+
-+ // Extract the field name we want
-+ enum { __max_field_len = 16 };
-+ char __field[__max_field_len];
-+ int __field_idx = 0;
-+ ++__start;
-+ while (*__start != ';')
-+ {
-+ assert(*__start);
-+ assert(__field_idx < __max_field_len-1);
-+ __field[__field_idx++] = *__start++;
-+ }
-+ ++__start;
-+ __field[__field_idx] = 0;
-+
-+ __param._M_print_field(this, __field);
-+ }
-+ }
-
- void
- _Error_formatter::_M_get_max_length() const throw ()
-- { }
-+ {
-+ const char* __nptr = std::getenv("GLIBCXX_DEBUG_MESSAGE_LENGTH");
-+ if (__nptr)
-+ {
-+ char* __endptr;
-+ const unsigned long __ret = std::strtoul(__nptr, &__endptr, 0);
-+ if (*__nptr != '\0' && *__endptr == '\0')
-+ _M_max_length = __ret;
-+ }
-+ }
-
- // Instantiations.
- template
- void
- _Error_formatter::_M_format_word(char*, int, const char*,
-- const void*) const;
-+ const void*) const;
-
- template
- void
-@@ -1101,10 +1039,10 @@ namespace __gnu_debug
- template
- void
- _Error_formatter::_M_format_word(char*, int, const char*,
-- std::size_t) const;
-+ std::size_t) const;
-
- template
- void
- _Error_formatter::_M_format_word(char*, int, const char*,
-- const char*) const;
-+ const char*) const;
- } // namespace __gnu_debug
---
-2.9.3
-
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index f0b32d9..898e781 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -25,7 +25,7 @@ LIBEVENT_TAG=release-2.0.22-stable
CMAKE_TAG=v2.8.12.2
LLVM_TAG=8f188e0ea735ac9383a65a0d1c846eb790c2ec74 # r247539
CLANG_TAG=592b43b609b42cffd1531a700c140e10766bf049 # r247539
-MINGW_TAG=4e270fefffda8f8123c0d64b77a6855dc3c732b1 # fix Fx compilation
+MINGW_TAG=a0cd5afeb60be3be0860e9a203314c10485bb9b8
PYPTLIB_TAG=pyptlib-0.0.6
OBFSPROXY_TAG=obfsproxy-0.2.12
LIBFTE_TAG=85ef8ae58dbf0d02ea26b627e343784b5574c428 # sketch master with fix
@@ -49,7 +49,7 @@ GMP_VER=5.1.3
FIREFOX_LANG_VER=$FIREFOX_VERSION
FIREFOX_LANG_BUILD=build1
BINUTILS_VER=2.24
-GCC_VER=6.2.0
+GCC_VER=5.1.0
CLANG_VER=r247539
PYTHON_VER=2.7.5
PYCRYPTO_VER=2.6.1
@@ -117,7 +117,7 @@ GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
-GCC_HASH=9944589fc722d3e66308c0ce5257788ebd7872982a718aa2516123940671b7c5
+GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
diff --git a/gitian/versions.nightly b/gitian/versions.nightly
index 20c4ae4..f6dbb68 100755
--- a/gitian/versions.nightly
+++ b/gitian/versions.nightly
@@ -32,7 +32,7 @@ LIBEVENT_TAG=release-2.0.22-stable
CMAKE_TAG=v2.8.12.2
LLVM_TAG=8f188e0ea735ac9383a65a0d1c846eb790c2ec74 # r247539
CLANG_TAG=592b43b609b42cffd1531a700c140e10766bf049 # r247539
-MINGW_TAG=4e270fefffda8f8123c0d64b77a6855dc3c732b1 # fix Fx compilation
+MINGW_TAG=a0cd5afeb60be3be0860e9a203314c10485bb9b8
PYPTLIB_TAG=master
OBFSPROXY_TAG=master
LIBFTE_TAG=master
@@ -56,7 +56,7 @@ GMP_VER=5.1.3
FIREFOX_LANG_VER=$FIREFOX_VERSION
FIREFOX_LANG_BUILD=build1
BINUTILS_VER=2.24
-GCC_VER=6.2.0
+GCC_VER=5.1.0
CLANG_VER=r247539
PYTHON_VER=2.7.5
PYCRYPTO_VER=2.6.1
@@ -124,7 +124,7 @@ GO14_HASH=9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
GO_HASH=6326aeed5f86cf18f16d6dc831405614f855e2d416a91fd3fdc334f772345b00
NSIS_HASH=43d4c9209847e35eb6e2c7cd5a7586e1445374c056c2c7899e40a080e17a1be7
NSIS_DEBIAN_HASH=1dee6957b4a4b8dfe69bcf28bc7f301a13b96b3fa5a394e36c8926ae781e774a
-GCC_HASH=9944589fc722d3e66308c0ce5257788ebd7872982a718aa2516123940671b7c5
+GCC_HASH=b7dafdf89cbb0e20333dbf5b5349319ae06e3d1a30bf3515b5488f7e89dca5ad
STIXMATHFONT_HASH=e3b0f712e2644438eee2d0dcd2b10b2d54f1b972039de95b2f8e800bae1adbd8
NOTOEMOJIFONT_HASH=415dc6290378574135b64c808dc640c1df7531973290c4970c51fdeb849cb0c5
NOTOJPFONT_HASH=3e8146c4ce0945f255cb9dbc12b392380af80bd117e0a60eae555c99c7e618da
1
0

17 Oct '16
commit 52fbcbfa9df65d56dce5b1654c4d56012b3ff6a9
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Sat Oct 15 19:59:16 2016 -0700
Bug 20373: Prevent redundant dialogs opening
---
src/chrome/content/torbutton.js | 14 +++++++-------
src/modules/utils.js | 24 +++++++++++++++++++++++-
2 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index 0f1046a..fa4009a 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -9,6 +9,7 @@
let { LoadContextInfo } = Cu.import('resource://gre/modules/LoadContextInfo.jsm');
let { Services } = Cu.import("resource://gre/modules/Services.jsm");
+let { showDialog } = Cu.import("resource://torbutton/modules/utils.js");
const k_tb_last_browser_version_pref = "extensions.torbutton.lastBrowserVersion";
const k_tb_browser_update_needed_pref = "extensions.torbutton.updateNeeded";
@@ -824,9 +825,7 @@ function torbutton_on_abouttor_load(aDoc) {
label: button_label,
accessKey: 'S',
popup: null,
- callback: function() {
- window.openDialog("chrome://torbutton/content/preferences.xul",
- "torbutton-preferences","chrome");}
+ callback: torbutton_open_prefs_dialog,
}];
let priority = box.PRIORITY_INFO_LOW;
@@ -2127,14 +2126,15 @@ function torbutton_check_protections()
// Bug 1506 P2: I think cookie protections is a neat feature.
function torbutton_open_cookie_dialog() {
- window.openDialog('chrome://torbutton/content/torcookiedialog.xul','Cookie Protections',
- 'centerscreen,chrome,dialog,modal,resizable');
+ showDialog(window, 'chrome://torbutton/content/torcookiedialog.xul',
+ 'Cookie Protections', 'centerscreen,chrome,dialog,modal,resizable');
}
// Bug 1506 P2/P3: Prefs are handled differently on android, I guess?
function torbutton_open_prefs_dialog() {
- window.openDialog("chrome://torbutton/content/preferences.xul","torbutton-preferences","centerscreen, chrome");
- torbutton_log(2, 'opened preferences window');
+ showDialog(window, "chrome://torbutton/content/preferences.xul",
+ "torbutton-preferences","centerscreen, chrome");
+ torbutton_log(2, 'opened preferences window');
}
// Bug 1506 P0: Support code for checking Firefox versions. Not needed.
diff --git a/src/modules/utils.js b/src/modules/utils.js
index eb0746b..514ef51 100644
--- a/src/modules/utils.js
+++ b/src/modules/utils.js
@@ -52,5 +52,27 @@ var getEnv = function (name) {
return env.exists(name) ? env.get(name) : undefined;
};
+// ## Windows
+
+// __dialogsByName__.
+// Map of window names to dialogs.
+let dialogsByName = {};
+
+// __showDialog(parent, url, name, features, arg1, arg2, ...)__.
+// Like window.openDialog, but if the window is already
+// open, just focuses it instead of opening a new one.
+var showDialog = function (parent, url, name, features) {
+ let existingDialog = dialogsByName[name];
+ if (existingDialog && !existingDialog.closed) {
+ existingDialog.focus();
+ return existingDialog;
+ } else {
+ let newDialog = parent.openDialog.apply(parent,
+ Array.slice(arguments, 1));
+ dialogsByName[name] = newDialog;
+ return newDialog;
+ }
+};
+
// Export utility functions for external use.
-let EXPORTED_SYMBOLS = ["bindPrefAndInit", "getPrefValue", "getEnv"];
+let EXPORTED_SYMBOLS = ["bindPrefAndInit", "getPrefValue", "getEnv", "showDialog"];
1
0

[tor-browser/tor-browser-45.4.0esr-6.5-1] Bug 20304: SOCKS socket does not support spaces and other special characters
by gk@torproject.org 17 Oct '16
by gk@torproject.org 17 Oct '16
17 Oct '16
commit 48a73d262e04c2a90cf660445568cbcf01e83b9c
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Oct 6 14:09:04 2016 -0400
Bug 20304: SOCKS socket does not support spaces and other special characters
Correctly decode file URL paths before using for them in
Unix domain socket paths.
The upstream bug is https://bugzilla.mozilla.org/show_bug.cgi?id=1308275.
---
netwerk/socket/nsSOCKSIOLayer.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/netwerk/socket/nsSOCKSIOLayer.cpp b/netwerk/socket/nsSOCKSIOLayer.cpp
index b26408d..be69725 100644
--- a/netwerk/socket/nsSOCKSIOLayer.cpp
+++ b/netwerk/socket/nsSOCKSIOLayer.cpp
@@ -20,6 +20,8 @@
#include "nsICancelable.h"
#include "nsThreadUtils.h"
#include "nsIURL.h"
+#include "nsIFile.h"
+#include "nsNetUtil.h"
#include "mozilla/Logging.h"
#include "mozilla/net/DNS.h"
#include "mozilla/unused.h"
@@ -133,17 +135,15 @@ private:
nsresult rv;
MOZ_ASSERT(aProxyAddr);
- nsCOMPtr<nsIURL> url = do_CreateInstance(NS_STANDARDURL_CONTRACTID, &rv);
+ nsCOMPtr<nsIFile> socketFile;
+ rv = NS_GetFileFromURLSpec(aDomainSocketPath,
+ getter_AddRefs(socketFile));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
- if (NS_WARN_IF(NS_FAILED(rv = url->SetSpec(aDomainSocketPath)))) {
- return rv;
- }
-
nsAutoCString path;
- if (NS_WARN_IF(NS_FAILED(rv = url->GetPath(path)))) {
+ if (NS_WARN_IF(NS_FAILED(rv = socketFile->GetNativePath(path)))) {
return rv;
}
1
0